From f0d23f88703c8502e43f5c965546381a0f0f7523 Mon Sep 17 00:00:00 2001 From: xushenghao Date: Tue, 21 Jan 2025 11:08:21 +0800 Subject: [PATCH] system --- User/system/bsp/adcs.c | 416 + User/system/bsp/adcs.h | 228 + User/system/bsp/bsp.c | 90 + User/system/bsp/bsp.h | 33 + User/system/bsp/dacs.c | 52 + User/system/bsp/dacs.h | 55 + User/system/bsp/dmas.h | 135 + User/system/bsp/eeprom.c | 91 + User/system/bsp/eeprom.h | 7 + User/system/bsp/flash.c | 550 + User/system/bsp/flash.h | 1725 +++ User/system/bsp/gpios.c | 76 + User/system/bsp/gpios.h | 170 + User/system/bsp/i2cs.c | 669 + User/system/bsp/i2cs.h | 127 + User/system/bsp/iwdgs.c | 39 + User/system/bsp/iwdgs.h | 45 + User/system/bsp/pwms.h | 90 + User/system/bsp/readme.md | 1 + User/system/bsp/spis.c | 811 ++ User/system/bsp/spis.h | 165 + User/system/bsp/tims.c | 1 + User/system/bsp/tims.h | 128 + User/system/bsp/uarts.c | 486 + User/system/bsp/uarts.h | 218 + User/system/btn.c | 248 + User/system/btn.h | 164 + User/system/delay.c | 188 + User/system/delay.h | 26 + User/system/driver/dac161p997.c | 154 + User/system/driver/dac161p997.h | 83 + User/system/driver/eeprom_fm24.c | 219 + User/system/driver/eeprom_fm24.h | 158 + User/system/driver/eeprom_lc02b.c | 171 + User/system/driver/eeprom_lc02b.h | 56 + User/system/driver/eeprom_m95.c | 331 + User/system/driver/eeprom_m95.h | 166 + User/system/driver/ntc_3950.c | 107 + User/system/driver/ntc_3950.h | 15 + User/system/driver/rtc_rx8010.c | 560 + User/system/driver/rtc_rx8010.h | 99 + User/system/driver/sht40.c | 181 + User/system/driver/sht40.h | 9 + User/system/driver/ssd1306_oled.c | 1011 ++ User/system/driver/ssd1306_oled.h | 80 + User/system/driver/tmc2240.c | 368 + User/system/driver/tmc2240.h | 372 + User/system/lib/bootload/bootload.c | 229 + User/system/lib/bootload/bootload.h | 102 + User/system/lib/bootload/readme.md | 50 + User/system/lib/bootload/test_ymodem.c | 79 + User/system/lib/bootload/ymodem.c | 633 + User/system/lib/bootload/ymodem.h | 180 + User/system/lib/control/custom/pid_c.c | 38 + User/system/lib/control/custom/pid_c.h | 34 + User/system/lib/control/custom/pid_g.c | 285 + User/system/lib/control/custom/pid_g.h | 65 + User/system/lib/control/custom/pid_hd.c | 166 + User/system/lib/control/custom/pid_hd.h | 66 + User/system/lib/control/custom/pid_x.c | 481 + User/system/lib/control/custom/pid_x.h | 71 + User/system/lib/control/custom/pid_zh.c | 467 + User/system/lib/control/custom/pid_zh.h | 73 + User/system/lib/control/custom/pid_zh1.c | 619 + User/system/lib/control/custom/pid_zh1.h | 63 + .../lib/control/custom/独立PID算法开发.md | 26 + User/system/lib/control/inc/pid.h | 252 + User/system/lib/control/inc/pid_auto_tune.h | 53 + User/system/lib/control/src/pid.c | 43 + User/system/lib/control/src/pid_auto_tune.c | 230 + User/system/lib/control/src/pid_common.c | 0 User/system/lib/control/src/pid_fuzzy.c | 896 ++ User/system/lib/control/src/pid_neural.c | 97 + .../lib/control/模糊PID控制器设计文档.md | 111 + User/system/lib/control/自整定.md | 1 + User/system/lib/examples/Makefile | 86 + User/system/lib/examples/simple_aes.c | 40 + User/system/lib/examples/simple_clist.c | 52 + User/system/lib/examples/simple_cmac.c | 33 + User/system/lib/examples/simple_cmd.c | 26 + .../lib/examples/simple_data_analysis.c | 178 + User/system/lib/examples/simple_sqqueue.c | 53 + .../lib/flashdb/examples/kvdb_basic_sample.c | 50 + .../flashdb/examples/kvdb_type_blob_sample.c | 63 + .../examples/kvdb_type_string_sample.c | 63 + .../system/lib/flashdb/examples/tsdb_sample.c | 126 + User/system/lib/flashdb/fal/fal.c | 62 + User/system/lib/flashdb/fal/fal.h | 151 + User/system/lib/flashdb/fal/fal_cfg.h | 56 + User/system/lib/flashdb/fal/fal_def.h | 153 + User/system/lib/flashdb/fal/fal_flash.c | 79 + User/system/lib/flashdb/fal/fal_partition.c | 525 + User/system/lib/flashdb/fal/fal_rtt.c | 934 ++ User/system/lib/flashdb/fal_eeprom24_port.c | 69 + User/system/lib/flashdb/fal_eeprom95_port.c | 87 + User/system/lib/flashdb/fdb.c | 157 + User/system/lib/flashdb/fdb_cfg.h | 50 + User/system/lib/flashdb/fdb_def.h | 385 + User/system/lib/flashdb/fdb_file.c | 318 + User/system/lib/flashdb/fdb_kvdb.c | 1967 +++ User/system/lib/flashdb/fdb_low_lvl.h | 69 + User/system/lib/flashdb/fdb_tsdb.c | 1024 ++ User/system/lib/flashdb/fdb_utils.c | 320 + User/system/lib/flashdb/flashdb.h | 79 + User/system/lib/flashdb/readme.md | 38 + User/system/lib/flow/README.md | 244 + User/system/lib/flow/example.c | 28 + User/system/lib/flow/flow.h | 129 + User/system/lib/flow/flow_core.c | 83 + User/system/lib/flow/flow_core.h | 106 + User/system/lib/flow/flow_def.h | 37 + User/system/lib/flow/flow_sem.h | 40 + User/system/lib/inc/aes.h | 161 + User/system/lib/inc/clist.h | 49 + User/system/lib/inc/cmac.h | 63 + User/system/lib/inc/cmd.h | 49 + User/system/lib/inc/data_analysis.h | 79 + User/system/lib/inc/data_type_def.h | 290 + User/system/lib/inc/debug.h | 21 + User/system/lib/inc/filter.h | 53 + User/system/lib/inc/fsm.h | 307 + User/system/lib/inc/lib.h | 140 + User/system/lib/inc/log.h | 45 + User/system/lib/inc/malloc.h | 45 + User/system/lib/inc/mlist.h | 268 + User/system/lib/inc/osel_arch.h | 181 + User/system/lib/inc/pbuf.h | 169 + User/system/lib/inc/sqqueue.h | 52 + User/system/lib/inc/storage.h | 52 + User/system/lib/inc/wl_flash.h | 108 + User/system/lib/lcd/font/HZ16x16.c | 9511 +++++++++++++++ User/system/lib/lcd/font/HZ18x18.c | 374 + User/system/lib/lcd/font/HZ20x20.c | 198 + User/system/lib/lcd/font/HZ24x24.c | 8317 +++++++++++++ User/system/lib/lcd/font/HZ32x32.c | 3765 ++++++ User/system/lib/lcd/font/LOGO.c | 10040 ++++++++++++++++ .../lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat | 13 + User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c | 87 + User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c | 167 + .../system/lib/lcd/gui/AntiAlias/GUIAAChar2.c | 201 + .../system/lib/lcd/gui/AntiAlias/GUIAAChar4.c | 129 + .../lib/lcd/gui/AntiAlias/GUIAACircle.c | 133 + User/system/lib/lcd/gui/AntiAlias/GUIAALib.c | 280 + User/system/lib/lcd/gui/AntiAlias/GUIAALine.c | 109 + User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c | 112 + .../lib/lcd/gui/AntiAlias/GUIAAPolyOut.c | 54 + User/system/lib/lcd/gui/AntiAlias/vssver.scc | Bin 0 -> 192 bytes User/system/lib/lcd/gui/Config/GUIConf.h | 39 + User/system/lib/lcd/gui/Config/GUITouchConf.h | 31 + User/system/lib/lcd/gui/Config/GUI_X.c | 90 + User/system/lib/lcd/gui/Config/LCDConf.h | 40 + User/system/lib/lcd/gui/Config/vssver.scc | Bin 0 -> 80 bytes .../lcd/gui/ConvertColor/CCConvertColor.bat | 25 + .../system/lib/lcd/gui/ConvertColor/LCDP111.c | 98 + .../system/lib/lcd/gui/ConvertColor/LCDP222.c | 98 + .../system/lib/lcd/gui/ConvertColor/LCDP233.c | 65 + .../system/lib/lcd/gui/ConvertColor/LCDP323.c | 65 + .../system/lib/lcd/gui/ConvertColor/LCDP332.c | 65 + .../lib/lcd/gui/ConvertColor/LCDP444_12.c | 70 + .../lib/lcd/gui/ConvertColor/LCDP444_12_1.c | 70 + .../lib/lcd/gui/ConvertColor/LCDP444_16.c | 70 + .../system/lib/lcd/gui/ConvertColor/LCDP555.c | 82 + .../system/lib/lcd/gui/ConvertColor/LCDP556.c | 82 + .../system/lib/lcd/gui/ConvertColor/LCDP565.c | 65 + .../system/lib/lcd/gui/ConvertColor/LCDP655.c | 82 + .../lib/lcd/gui/ConvertColor/LCDP8666.c | 104 + .../lib/lcd/gui/ConvertColor/LCDP8666_1.c | 82 + .../lib/lcd/gui/ConvertColor/LCDPM233.c | 65 + .../lib/lcd/gui/ConvertColor/LCDPM323.c | 65 + .../lib/lcd/gui/ConvertColor/LCDPM332.c | 65 + .../lib/lcd/gui/ConvertColor/LCDPM444_12.c | 70 + .../lib/lcd/gui/ConvertColor/LCDPM444_16.c | 70 + .../lib/lcd/gui/ConvertColor/LCDPM555.c | 82 + .../lib/lcd/gui/ConvertColor/LCDPM556.c | 82 + .../lib/lcd/gui/ConvertColor/LCDPM565.c | 65 + .../lib/lcd/gui/ConvertColor/LCDPM655.c | 82 + .../lib/lcd/gui/ConvertColor/vssver.scc | Bin 0 -> 416 bytes .../lib/lcd/gui/ConvertMono/CCConvertMono.bat | 5 + User/system/lib/lcd/gui/ConvertMono/LCDP0.c | 76 + User/system/lib/lcd/gui/ConvertMono/LCDP2.c | 81 + User/system/lib/lcd/gui/ConvertMono/LCDP4.c | 81 + .../system/lib/lcd/gui/ConvertMono/vssver.scc | Bin 0 -> 96 bytes User/system/lib/lcd/gui/Core/CCGUICore.bat | 199 + User/system/lib/lcd/gui/Core/GUI.h | 1420 +++ User/system/lib/lcd/gui/Core/GUI2DLib.c | 768 ++ User/system/lib/lcd/gui/Core/GUIAlloc.c | 548 + User/system/lib/lcd/gui/Core/GUIArc.c | 262 + User/system/lib/lcd/gui/Core/GUIChar.c | 113 + User/system/lib/lcd/gui/Core/GUICharLine.c | 145 + User/system/lib/lcd/gui/Core/GUICharM.c | 167 + User/system/lib/lcd/gui/Core/GUICharP.c | 121 + User/system/lib/lcd/gui/Core/GUICirc.c | 271 + User/system/lib/lcd/gui/Core/GUIColor2Index.c | 40 + User/system/lib/lcd/gui/Core/GUICore.c | 179 + User/system/lib/lcd/gui/Core/GUICurs.c | 423 + User/system/lib/lcd/gui/Core/GUIDebug.h | 173 + User/system/lib/lcd/gui/Core/GUIEncJS.c | 116 + User/system/lib/lcd/gui/Core/GUIIndex2Color.c | 40 + User/system/lib/lcd/gui/Core/GUIPolyE.c | 152 + User/system/lib/lcd/gui/Core/GUIPolyM.c | 41 + User/system/lib/lcd/gui/Core/GUIPolyR.c | 47 + User/system/lib/lcd/gui/Core/GUIRealloc.c | 65 + User/system/lib/lcd/gui/Core/GUIStream.c | 48 + User/system/lib/lcd/gui/Core/GUITask.c | 231 + User/system/lib/lcd/gui/Core/GUITime.c | 51 + User/system/lib/lcd/gui/Core/GUITimer.c | 273 + User/system/lib/lcd/gui/Core/GUIType.h | 385 + User/system/lib/lcd/gui/Core/GUIUC0.c | 74 + User/system/lib/lcd/gui/Core/GUIVal.c | 111 + User/system/lib/lcd/gui/Core/GUIValf.c | 110 + User/system/lib/lcd/gui/Core/GUIVersion.h | 27 + .../lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c | 61 + .../lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c | 49 + User/system/lib/lcd/gui/Core/GUI_AddBin.c | 49 + User/system/lib/lcd/gui/Core/GUI_AddDec.c | 38 + User/system/lib/lcd/gui/Core/GUI_AddDecMin.c | 39 + .../system/lib/lcd/gui/Core/GUI_AddDecShift.c | 137 + User/system/lib/lcd/gui/Core/GUI_AddHex.c | 54 + .../lib/lcd/gui/Core/GUI_AddKeyMsgHook.c | 40 + User/system/lib/lcd/gui/Core/GUI_BMP.c | 214 + .../lib/lcd/gui/Core/GUI_BMP_Serialize.c | 133 + .../lib/lcd/gui/Core/GUI_CalcColorDist.c | 81 + .../system/lib/lcd/gui/Core/GUI_ClearRectEx.c | 36 + .../lib/lcd/gui/Core/GUI_Color2VisColor.c | 58 + .../lib/lcd/gui/Core/GUI_ConfDefaults.h | 155 + .../lib/lcd/gui/Core/GUI_CursorArrowL.c | 36 + .../lib/lcd/gui/Core/GUI_CursorArrowLI.c | 36 + .../lib/lcd/gui/Core/GUI_CursorArrowLPx.c | 55 + .../lib/lcd/gui/Core/GUI_CursorArrowM.c | 36 + .../lib/lcd/gui/Core/GUI_CursorArrowMI.c | 36 + .../lib/lcd/gui/Core/GUI_CursorArrowMPx.c | 45 + .../lib/lcd/gui/Core/GUI_CursorArrowS.c | 36 + .../lib/lcd/gui/Core/GUI_CursorArrowSI.c | 36 + .../lib/lcd/gui/Core/GUI_CursorArrowSPx.c | 39 + .../lib/lcd/gui/Core/GUI_CursorCrossL.c | 38 + .../lib/lcd/gui/Core/GUI_CursorCrossLI.c | 38 + .../lib/lcd/gui/Core/GUI_CursorCrossLPx.c | 57 + .../lib/lcd/gui/Core/GUI_CursorCrossM.c | 38 + .../lib/lcd/gui/Core/GUI_CursorCrossMI.c | 38 + .../lib/lcd/gui/Core/GUI_CursorCrossMPx.c | 47 + .../lib/lcd/gui/Core/GUI_CursorCrossS.c | 39 + .../lib/lcd/gui/Core/GUI_CursorCrossSI.c | 38 + .../lib/lcd/gui/Core/GUI_CursorCrossSPx.c | 37 + .../lib/lcd/gui/Core/GUI_CursorHeaderM.c | 49 + .../lib/lcd/gui/Core/GUI_CursorHeaderMI.c | 49 + .../lib/lcd/gui/Core/GUI_CursorHeaderMPx.c | 49 + User/system/lib/lcd/gui/Core/GUI_CursorPal.c | 40 + User/system/lib/lcd/gui/Core/GUI_CursorPalI.c | 40 + User/system/lib/lcd/gui/Core/GUI_DispBin.c | 52 + User/system/lib/lcd/gui/Core/GUI_DispCEOL.c | 40 + User/system/lib/lcd/gui/Core/GUI_DispChar.c | 84 + User/system/lib/lcd/gui/Core/GUI_DispChars.c | 38 + User/system/lib/lcd/gui/Core/GUI_DispHex.c | 52 + User/system/lib/lcd/gui/Core/GUI_DispString.c | 85 + .../lib/lcd/gui/Core/GUI_DispStringAt.c | 40 + .../lib/lcd/gui/Core/GUI_DispStringAtCEOL.c | 37 + .../lib/lcd/gui/Core/GUI_DispStringHCenter.c | 41 + .../lib/lcd/gui/Core/GUI_DispStringInRect.c | 169 + .../lib/lcd/gui/Core/GUI_DispStringInRectEx.c | 115 + .../lcd/gui/Core/GUI_DispStringInRectMax.c | 40 + .../lib/lcd/gui/Core/GUI_DispStringLen.c | 45 + User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c | 88 + .../lib/lcd/gui/Core/GUI_DrawBitmapEx.c | 155 + .../lib/lcd/gui/Core/GUI_DrawBitmapExp.c | 62 + .../lib/lcd/gui/Core/GUI_DrawBitmapMag.c | 74 + .../lib/lcd/gui/Core/GUI_DrawFocusRect.c | 69 + User/system/lib/lcd/gui/Core/GUI_DrawGraph.c | 95 + User/system/lib/lcd/gui/Core/GUI_DrawHLine.c | 52 + User/system/lib/lcd/gui/Core/GUI_DrawPie.c | 66 + User/system/lib/lcd/gui/Core/GUI_DrawPixel.c | 50 + .../lib/lcd/gui/Core/GUI_DrawPolyline.c | 66 + User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c | 36 + User/system/lib/lcd/gui/Core/GUI_DrawVLine.c | 52 + User/system/lib/lcd/gui/Core/GUI_ErrorOut.c | 126 + User/system/lib/lcd/gui/Core/GUI_Exec.c | 62 + .../system/lib/lcd/gui/Core/GUI_FillPolygon.c | 275 + User/system/lib/lcd/gui/Core/GUI_FillRect.c | 51 + User/system/lib/lcd/gui/Core/GUI_FillRectEx.c | 37 + User/system/lib/lcd/gui/Core/GUI_FontIntern.h | 67 + .../lcd/gui/Core/GUI_GetBitmapPixelColor.c | 40 + .../lcd/gui/Core/GUI_GetBitmapPixelIndex.c | 64 + .../lib/lcd/gui/Core/GUI_GetClientRect.c | 51 + User/system/lib/lcd/gui/Core/GUI_GetColor.c | 76 + User/system/lib/lcd/gui/Core/GUI_GetDispPos.c | 58 + User/system/lib/lcd/gui/Core/GUI_GetFont.c | 40 + .../system/lib/lcd/gui/Core/GUI_GetFontInfo.c | 49 + .../lib/lcd/gui/Core/GUI_GetFontSizeY.c | 40 + .../lib/lcd/gui/Core/GUI_GetLineStyle.c | 40 + .../lib/lcd/gui/Core/GUI_GetStringDistX.c | 37 + .../lib/lcd/gui/Core/GUI_GetTextAlign.c | 40 + .../lib/lcd/gui/Core/GUI_GetTextExtend.c | 64 + .../system/lib/lcd/gui/Core/GUI_GetTextMode.c | 40 + .../lib/lcd/gui/Core/GUI_GetVersionString.c | 52 + .../lib/lcd/gui/Core/GUI_GetYSizeOfFont.c | 44 + User/system/lib/lcd/gui/Core/GUI_Goto.c | 92 + User/system/lib/lcd/gui/Core/GUI_InitLUT.c | 38 + User/system/lib/lcd/gui/Core/GUI_InvertRect.c | 56 + User/system/lib/lcd/gui/Core/GUI_IsInFont.c | 40 + User/system/lib/lcd/gui/Core/GUI_Log.c | 126 + User/system/lib/lcd/gui/Core/GUI_MOUSE.c | 60 + .../lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c | 135 + User/system/lib/lcd/gui/Core/GUI_MergeRect.c | 59 + User/system/lib/lcd/gui/Core/GUI_MoveRect.c | 41 + User/system/lib/lcd/gui/Core/GUI_OnKey.c | 147 + User/system/lib/lcd/gui/Core/GUI_PID.c | 86 + User/system/lib/lcd/gui/Core/GUI_Pen.c | 78 + User/system/lib/lcd/gui/Core/GUI_Private.h | 94 + User/system/lib/lcd/gui/Core/GUI_Protected.h | 404 + .../lib/lcd/gui/Core/GUI_RectsIntersect.c | 53 + User/system/lib/lcd/gui/Core/GUI_SIF.c | 69 + User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c | 168 + .../system/lib/lcd/gui/Core/GUI_SaveContext.c | 45 + User/system/lib/lcd/gui/Core/GUI_SelectLCD.c | 49 + .../system/lib/lcd/gui/Core/GUI_SelectLayer.c | 45 + User/system/lib/lcd/gui/Core/GUI_SetColor.c | 48 + .../lib/lcd/gui/Core/GUI_SetColorIndex.c | 50 + User/system/lib/lcd/gui/Core/GUI_SetDecChar.c | 47 + User/system/lib/lcd/gui/Core/GUI_SetDefault.c | 53 + .../system/lib/lcd/gui/Core/GUI_SetDrawMode.c | 43 + User/system/lib/lcd/gui/Core/GUI_SetFont.c | 42 + User/system/lib/lcd/gui/Core/GUI_SetLBorder.c | 47 + .../system/lib/lcd/gui/Core/GUI_SetLUTColor.c | 45 + .../lib/lcd/gui/Core/GUI_SetLUTColorEx.c | 108 + .../system/lib/lcd/gui/Core/GUI_SetLUTEntry.c | 38 + .../lib/lcd/gui/Core/GUI_SetLineStyle.c | 41 + User/system/lib/lcd/gui/Core/GUI_SetOrg.c | 41 + .../lib/lcd/gui/Core/GUI_SetPixelIndex.c | 58 + .../lib/lcd/gui/Core/GUI_SetTextAlign.c | 41 + .../system/lib/lcd/gui/Core/GUI_SetTextMode.c | 41 + .../lib/lcd/gui/Core/GUI_SetTextStyle.c | 81 + User/system/lib/lcd/gui/Core/GUI_TOUCH.c | 59 + .../lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c | 299 + .../lib/lcd/gui/Core/GUI_TOUCH_StoreState.c | 47 + .../lcd/gui/Core/GUI_TOUCH_StoreUnstable.c | 62 + User/system/lib/lcd/gui/Core/GUI_UC.c | 120 + .../lib/lcd/gui/Core/GUI_UC_DispString.c | 161 + .../lib/lcd/gui/Core/GUI_UC_EncodeNone.c | 108 + .../lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c | 153 + User/system/lib/lcd/gui/Core/GUI_VNC.h | 95 + User/system/lib/lcd/gui/Core/GUI_WaitEvent.c | 40 + User/system/lib/lcd/gui/Core/GUI_WaitKey.c | 46 + User/system/lib/lcd/gui/Core/GUI_Warn.c | 126 + User/system/lib/lcd/gui/Core/GUI_X.h | 79 + .../lib/lcd/gui/Core/GUI__AddSpaceHex.c | 40 + .../lib/lcd/gui/Core/GUI__CalcTextRect.c | 75 + .../lib/lcd/gui/Core/GUI__DivideRound.c | 44 + .../lib/lcd/gui/Core/GUI__DivideRound32.c | 47 + .../lib/lcd/gui/Core/GUI__GetFontSizeY.c | 36 + .../lib/lcd/gui/Core/GUI__GetNumChars.c | 44 + .../lib/lcd/gui/Core/GUI__HandleEOLine.c | 47 + .../lib/lcd/gui/Core/GUI__IntersectRect.c | 59 + .../lib/lcd/gui/Core/GUI__IntersectRects.c | 68 + User/system/lib/lcd/gui/Core/GUI__Read.c | 59 + .../system/lib/lcd/gui/Core/GUI__ReduceRect.c | 39 + User/system/lib/lcd/gui/Core/GUI__SetText.c | 51 + User/system/lib/lcd/gui/Core/GUI__Wrap.c | 161 + User/system/lib/lcd/gui/Core/GUI__memset.c | 81 + User/system/lib/lcd/gui/Core/GUI__memset16.c | 93 + User/system/lib/lcd/gui/Core/GUI__strcmp.c | 80 + User/system/lib/lcd/gui/Core/GUI__strlen.c | 46 + User/system/lib/lcd/gui/Core/LCD.c | 415 + User/system/lib/lcd/gui/Core/LCD.h | 538 + User/system/lib/lcd/gui/Core/LCDAA.c | 117 + User/system/lib/lcd/gui/Core/LCDColor.c | 181 + User/system/lib/lcd/gui/Core/LCDGetP.c | 61 + User/system/lib/lcd/gui/Core/LCDInfo.c | 57 + User/system/lib/lcd/gui/Core/LCDInfo0.c | 41 + User/system/lib/lcd/gui/Core/LCDInfo1.c | 53 + User/system/lib/lcd/gui/Core/LCDL0Delta.c | 516 + User/system/lib/lcd/gui/Core/LCDL0Mag.c | 260 + User/system/lib/lcd/gui/Core/LCDP1.c | 83 + .../lib/lcd/gui/Core/LCDP565_Index2Color.c | 62 + .../lib/lcd/gui/Core/LCDPM565_Index2Color.c | 62 + User/system/lib/lcd/gui/Core/LCDRLE4.c | 138 + User/system/lib/lcd/gui/Core/LCDRLE8.c | 165 + User/system/lib/lcd/gui/Core/LCDSIM.h | 90 + User/system/lib/lcd/gui/Core/LCD_API.c | 302 + .../lib/lcd/gui/Core/LCD_ConfDefaults.h | 740 ++ .../lib/lcd/gui/Core/LCD_DrawBitmap_565.c | 157 + .../lib/lcd/gui/Core/LCD_DrawBitmap_M565.c | 157 + User/system/lib/lcd/gui/Core/LCD_DrawVLine.c | 67 + .../lib/lcd/gui/Core/LCD_GetColorIndex.c | 45 + User/system/lib/lcd/gui/Core/LCD_GetEx.c | 585 + .../lib/lcd/gui/Core/LCD_GetNumDisplays.c | 38 + .../lib/lcd/gui/Core/LCD_GetPixelColor.c | 39 + .../lib/lcd/gui/Core/LCD_Index2ColorEx.c | 49 + User/system/lib/lcd/gui/Core/LCD_L0_Generic.c | 226 + User/system/lib/lcd/gui/Core/LCD_Mirror.c | 65 + .../lib/lcd/gui/Core/LCD_MixColors256.c | 57 + User/system/lib/lcd/gui/Core/LCD_Private.h | 117 + User/system/lib/lcd/gui/Core/LCD_Protected.h | 255 + User/system/lib/lcd/gui/Core/LCD_Rotate180.c | 265 + User/system/lib/lcd/gui/Core/LCD_RotateCCW.c | 268 + User/system/lib/lcd/gui/Core/LCD_RotateCW.c | 269 + User/system/lib/lcd/gui/Core/LCD_SelectLCD.c | 50 + User/system/lib/lcd/gui/Core/LCD_SetAPI.c | 61 + .../lib/lcd/gui/Core/LCD_SetClipRectEx.c | 47 + .../lib/lcd/gui/Core/LCD_UpdateColorIndices.c | 38 + User/system/lib/lcd/gui/Core/vssver.scc | Bin 0 -> 3488 bytes User/system/lib/lcd/gui/Font/CCGUIFont.BAT | 54 + User/system/lib/lcd/gui/Font/F08_1.c | 1017 ++ User/system/lib/lcd/gui/Font/F08_ASCII.c | 1182 ++ User/system/lib/lcd/gui/Font/F10S_1.c | 1293 ++ User/system/lib/lcd/gui/Font/F10S_ASCII.c | 1280 ++ User/system/lib/lcd/gui/Font/F10_1.c | 1687 +++ User/system/lib/lcd/gui/Font/F10_ASCII.c | 1281 ++ User/system/lib/lcd/gui/Font/F13B_1.c | 1581 +++ User/system/lib/lcd/gui/Font/F13B_ASCII.c | 1565 +++ User/system/lib/lcd/gui/Font/F13HB_1.c | 1587 +++ User/system/lib/lcd/gui/Font/F13HB_ASCII.c | 1563 +++ User/system/lib/lcd/gui/Font/F13H_1.c | 1586 +++ User/system/lib/lcd/gui/Font/F13H_ASCII.c | 1565 +++ User/system/lib/lcd/gui/Font/F13_1.c | 1581 +++ User/system/lib/lcd/gui/Font/F13_ASCII.c | 1565 +++ User/system/lib/lcd/gui/Font/F16B_1.c | 1873 +++ User/system/lib/lcd/gui/Font/F16B_ASCII.c | 1848 +++ User/system/lib/lcd/gui/Font/F16_1.c | 2453 ++++ User/system/lib/lcd/gui/Font/F16_1HK.c | 47 + User/system/lib/lcd/gui/Font/F16_ASCII.c | 1849 +++ User/system/lib/lcd/gui/Font/F16_HK.c | 3266 +++++ User/system/lib/lcd/gui/Font/F24B_1.c | 2642 ++++ User/system/lib/lcd/gui/Font/F24B_ASCII.c | 2608 ++++ User/system/lib/lcd/gui/Font/F24_1.c | 2642 ++++ User/system/lib/lcd/gui/Font/F24_ASCII.c | 2608 ++++ User/system/lib/lcd/gui/Font/F32B_1.c | 3410 ++++++ User/system/lib/lcd/gui/Font/F32B_ASCII.c | 3368 ++++++ User/system/lib/lcd/gui/Font/F32_1.c | 3410 ++++++ User/system/lib/lcd/gui/Font/F32_ASCII.c | 3368 ++++++ User/system/lib/lcd/gui/Font/F4x6.c | 815 ++ User/system/lib/lcd/gui/Font/F6x8.c | 2212 ++++ User/system/lib/lcd/gui/Font/F8x10_ASCII.c | 1290 ++ User/system/lib/lcd/gui/Font/F8x12_ASCII.c | 1482 +++ User/system/lib/lcd/gui/Font/F8x13_1.c | 1587 +++ User/system/lib/lcd/gui/Font/F8x13_ASCII.c | 1579 +++ User/system/lib/lcd/gui/Font/F8x15B_1.c | 1777 +++ User/system/lib/lcd/gui/Font/F8x15B_ASCII.c | 1770 +++ User/system/lib/lcd/gui/Font/F8x16.c | 3321 +++++ User/system/lib/lcd/gui/Font/F8x8.c | 2057 ++++ User/system/lib/lcd/gui/Font/FComic18B_1.c | 2068 ++++ .../system/lib/lcd/gui/Font/FComic18B_ASCII.c | 2079 ++++ User/system/lib/lcd/gui/Font/FComic24B_1.c | 2643 ++++ .../system/lib/lcd/gui/Font/FComic24B_ASCII.c | 2638 ++++ User/system/lib/lcd/gui/Font/FD24x32.c | 590 + User/system/lib/lcd/gui/Font/FD32.c | 612 + User/system/lib/lcd/gui/Font/FD36x48.c | 832 ++ User/system/lib/lcd/gui/Font/FD48.c | 832 ++ User/system/lib/lcd/gui/Font/FD48x64.c | 1072 ++ User/system/lib/lcd/gui/Font/FD60x80.c | 1313 ++ User/system/lib/lcd/gui/Font/FD64.c | 1073 ++ User/system/lib/lcd/gui/Font/FD80.c | 1313 ++ User/system/lib/lcd/gui/Font/vssver.scc | Bin 0 -> 848 bytes User/system/lib/lcd/gui/GUIDemo/CCGUIDemo.bat | 26 + User/system/lib/lcd/gui/GUIDemo/GUIDEMO.c | 444 + User/system/lib/lcd/gui/GUIDemo/GUIDEMO.h | 126 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Automotive.c | 625 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap.c | 1125 ++ .../lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap4bpp.c | 152 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Circle.c | 76 + .../lib/lcd/gui/GUIDemo/GUIDEMO_ColorBar.c | 166 + .../lib/lcd/gui/GUIDemo/GUIDEMO_ColorList.c | 118 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Cursor.c | 303 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Dialog.c | 272 + .../system/lib/lcd/gui/GUIDemo/GUIDEMO_Font.c | 1069 ++ .../lib/lcd/gui/GUIDemo/GUIDEMO_FrameWin.c | 128 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Graph.c | 421 + .../lcd/gui/GUIDemo/GUIDEMO_HardwareInfo.c | 108 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Intro.c | 165 + User/system/lib/lcd/gui/GUIDemo/GUIDEMO_LUT.c | 82 + .../lib/lcd/gui/GUIDemo/GUIDEMO_MemDevB.c | 157 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Messagebox.c | 55 + .../system/lib/lcd/gui/GUIDemo/GUIDEMO_Navi.c | 190 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Polygon.c | 147 + .../lib/lcd/gui/GUIDemo/GUIDEMO_ProgBar.c | 147 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Speed.c | 91 + .../lib/lcd/gui/GUIDemo/GUIDEMO_Touch.c | 388 + User/system/lib/lcd/gui/GUIDemo/Map.h | 5793 +++++++++ .../lib/lcd/gui/GUIDemo/SeggerLogoBlue.c | 907 ++ User/system/lib/lcd/gui/JPEG/CCGUIJPG.bat | 31 + User/system/lib/lcd/gui/JPEG/Doc/ReadMe.txt | 406 + User/system/lib/lcd/gui/JPEG/Doc/libjpeg.txt | 3025 +++++ .../system/lib/lcd/gui/JPEG/Doc/structure.txt | 969 ++ User/system/lib/lcd/gui/JPEG/Doc/vssver.scc | Bin 0 -> 80 bytes User/system/lib/lcd/gui/JPEG/GUI_JPEG.c | 409 + .../system/lib/lcd/gui/JPEG/Image/testimg.bmp | Bin 0 -> 35050 bytes .../system/lib/lcd/gui/JPEG/Image/testimg.jpg | Bin 0 -> 5756 bytes .../lib/lcd/gui/JPEG/Image/testimgp.jpg | Bin 0 -> 5645 bytes .../lib/lcd/gui/JPEG/Image/testorig.jpg | Bin 0 -> 5770 bytes .../lib/lcd/gui/JPEG/Image/testprog.jpg | Bin 0 -> 5655 bytes User/system/lib/lcd/gui/JPEG/Image/vssver.scc | Bin 0 -> 112 bytes User/system/lib/lcd/gui/JPEG/jcomapi.c | 97 + User/system/lib/lcd/gui/JPEG/jconfig.h | 100 + User/system/lib/lcd/gui/JPEG/jdapimin.c | 395 + User/system/lib/lcd/gui/JPEG/jdapistd.c | 275 + User/system/lib/lcd/gui/JPEG/jdcoefct.c | 737 ++ User/system/lib/lcd/gui/JPEG/jdcolor.c | 397 + User/system/lib/lcd/gui/JPEG/jdct.h | 163 + User/system/lib/lcd/gui/JPEG/jddctmgr.c | 266 + User/system/lib/lcd/gui/JPEG/jdhuff.c | 651 + User/system/lib/lcd/gui/JPEG/jdhuff.h | 193 + User/system/lib/lcd/gui/JPEG/jdinput.c | 381 + User/system/lib/lcd/gui/JPEG/jdmainct.c | 512 + User/system/lib/lcd/gui/JPEG/jdmarker.c | 1360 +++ User/system/lib/lcd/gui/JPEG/jdmaster.c | 557 + User/system/lib/lcd/gui/JPEG/jdmerge.c | 403 + User/system/lib/lcd/gui/JPEG/jdphuff.c | 668 + User/system/lib/lcd/gui/JPEG/jdpostct.c | 295 + User/system/lib/lcd/gui/JPEG/jdsample.c | 486 + User/system/lib/lcd/gui/JPEG/jdtrans.c | 143 + User/system/lib/lcd/gui/JPEG/jerror.c | 240 + User/system/lib/lcd/gui/JPEG/jerror.h | 291 + User/system/lib/lcd/gui/JPEG/jfdctflt.c | 171 + User/system/lib/lcd/gui/JPEG/jfdctfst.c | 224 + User/system/lib/lcd/gui/JPEG/jfdctint.c | 283 + User/system/lib/lcd/gui/JPEG/jidctflt.c | 245 + User/system/lib/lcd/gui/JPEG/jidctfst.c | 368 + User/system/lib/lcd/gui/JPEG/jidctint.c | 389 + User/system/lib/lcd/gui/JPEG/jidctred.c | 401 + User/system/lib/lcd/gui/JPEG/jinclude.h | 89 + User/system/lib/lcd/gui/JPEG/jmemmgr.c | 1071 ++ User/system/lib/lcd/gui/JPEG/jmemsys.h | 178 + User/system/lib/lcd/gui/JPEG/jmorecfg.h | 312 + User/system/lib/lcd/gui/JPEG/jpegint.h | 357 + User/system/lib/lcd/gui/JPEG/jpeglib.h | 1034 ++ User/system/lib/lcd/gui/JPEG/jquant1.c | 862 ++ User/system/lib/lcd/gui/JPEG/jquant2.c | 1312 ++ User/system/lib/lcd/gui/JPEG/jutils.c | 179 + User/system/lib/lcd/gui/JPEG/jversion.h | 14 + User/system/lib/lcd/gui/JPEG/vssver.scc | Bin 0 -> 672 bytes .../lib/lcd/gui/LCDDriver/CCLCDDriver.bat | 7 + User/system/lib/lcd/gui/LCDDriver/LCDDummy.c | 684 ++ User/system/lib/lcd/gui/LCDDriver/LCDNull.c | 168 + User/system/lib/lcd/gui/LCDDriver/LCDWin.c | 718 ++ User/system/lib/lcd/gui/LCDDriver/vssver.scc | Bin 0 -> 96 bytes .../system/lib/lcd/gui/MemDev/CCGUIMemDev.bat | 27 + User/system/lib/lcd/gui/MemDev/GUIDEV.c | 355 + User/system/lib/lcd/gui/MemDev/GUIDEV_1.c | 603 + User/system/lib/lcd/gui/MemDev/GUIDEV_16.c | 87 + User/system/lib/lcd/gui/MemDev/GUIDEV_8.c | 672 ++ User/system/lib/lcd/gui/MemDev/GUIDEV_AA.c | 161 + User/system/lib/lcd/gui/MemDev/GUIDEV_Auto.c | 100 + .../lib/lcd/gui/MemDev/GUIDEV_Banding.c | 143 + User/system/lib/lcd/gui/MemDev/GUIDEV_Clear.c | 66 + .../lib/lcd/gui/MemDev/GUIDEV_CmpWithLCD.c | 115 + .../lib/lcd/gui/MemDev/GUIDEV_CopyFromLCD.c | 92 + .../lib/lcd/gui/MemDev/GUIDEV_CreateFixed.c | 56 + .../lib/lcd/gui/MemDev/GUIDEV_GetDataPtr.c | 54 + .../lib/lcd/gui/MemDev/GUIDEV_GetXSize.c | 61 + .../lib/lcd/gui/MemDev/GUIDEV_GetYSize.c | 62 + .../lib/lcd/gui/MemDev/GUIDEV_Measure.c | 389 + .../lib/lcd/gui/MemDev/GUIDEV_ReduceYSize.c | 64 + .../system/lib/lcd/gui/MemDev/GUIDEV_SetOrg.c | 72 + User/system/lib/lcd/gui/MemDev/GUIDEV_Usage.c | 85 + .../lib/lcd/gui/MemDev/GUIDEV_UsageBM.c | 250 + User/system/lib/lcd/gui/MemDev/GUIDEV_Write.c | 81 + .../lib/lcd/gui/MemDev/GUIDEV_WriteAlpha.c | 132 + .../lib/lcd/gui/MemDev/GUIDEV_WriteEx.c | 272 + .../system/lib/lcd/gui/MemDev/GUIDEV_XY2PTR.c | 66 + .../lcd/gui/MultiLayer/CCGUIMultiLayer.bat | 6 + User/system/lib/lcd/gui/MultiLayer/LCD_1.c | 183 + User/system/lib/lcd/gui/MultiLayer/LCD_2.c | 183 + User/system/lib/lcd/gui/MultiLayer/LCD_3.c | 183 + User/system/lib/lcd/gui/MultiLayer/LCD_4.c | 183 + .../lcd/gui/MultiLayer/LCD_IncludeDriver.h | 97 + User/system/lib/lcd/gui/MultiLayer/vssver.scc | Bin 0 -> 128 bytes User/system/lib/lcd/gui/WM/CCWM.bat | 99 + User/system/lib/lcd/gui/WM/WM.c | 1733 +++ User/system/lib/lcd/gui/WM/WM.h | 537 + User/system/lib/lcd/gui/WM/WMMemDev.c | 73 + User/system/lib/lcd/gui/WM/WMTouch.c | 245 + User/system/lib/lcd/gui/WM/WM_AttachWindow.c | 86 + User/system/lib/lcd/gui/WM/WM_BringToBottom.c | 65 + User/system/lib/lcd/gui/WM/WM_BringToTop.c | 109 + User/system/lib/lcd/gui/WM/WM_Broadcast.c | 49 + .../system/lib/lcd/gui/WM/WM_CheckScrollPos.c | 95 + .../system/lib/lcd/gui/WM/WM_CriticalHandle.c | 67 + User/system/lib/lcd/gui/WM/WM_DIAG.c | 88 + User/system/lib/lcd/gui/WM/WM_EnableWindow.c | 75 + User/system/lib/lcd/gui/WM/WM_ForEachDesc.c | 46 + User/system/lib/lcd/gui/WM/WM_GUI.h | 58 + User/system/lib/lcd/gui/WM/WM_GetBkColor.c | 53 + User/system/lib/lcd/gui/WM/WM_GetClientRect.c | 73 + .../lib/lcd/gui/WM/WM_GetClientWindow.c | 47 + .../lib/lcd/gui/WM/WM_GetDesktopWindow.c | 42 + .../lib/lcd/gui/WM/WM_GetDesktopWindowEx.c | 47 + User/system/lib/lcd/gui/WM/WM_GetDiagInfo.c | 56 + User/system/lib/lcd/gui/WM/WM_GetDialogItem.c | 74 + User/system/lib/lcd/gui/WM/WM_GetFirstChild.c | 47 + User/system/lib/lcd/gui/WM/WM_GetFlags.c | 48 + .../lib/lcd/gui/WM/WM_GetFocussedWindow.c | 46 + User/system/lib/lcd/gui/WM/WM_GetId.c | 45 + User/system/lib/lcd/gui/WM/WM_GetInsideRect.c | 59 + .../lcd/gui/WM/WM_GetInsideRectExScrollbar.c | 75 + .../system/lib/lcd/gui/WM/WM_GetInvalidRect.c | 59 + .../system/lib/lcd/gui/WM/WM_GetNextSibling.c | 47 + User/system/lib/lcd/gui/WM/WM_GetOrg.c | 79 + User/system/lib/lcd/gui/WM/WM_GetParent.c | 47 + .../system/lib/lcd/gui/WM/WM_GetPrevSibling.c | 49 + .../lib/lcd/gui/WM/WM_GetScrollPartner.c | 49 + .../system/lib/lcd/gui/WM/WM_GetScrollState.c | 45 + User/system/lib/lcd/gui/WM/WM_GetScrollbar.c | 50 + User/system/lib/lcd/gui/WM/WM_GetWindowRect.c | 75 + User/system/lib/lcd/gui/WM/WM_GetWindowSize.c | 113 + User/system/lib/lcd/gui/WM/WM_HasCaptured.c | 42 + User/system/lib/lcd/gui/WM/WM_HasFocus.c | 42 + User/system/lib/lcd/gui/WM/WM_Hide.c | 59 + User/system/lib/lcd/gui/WM/WM_Intern.h | 197 + .../system/lib/lcd/gui/WM/WM_Intern_ConfDep.h | 43 + .../lib/lcd/gui/WM/WM_IsCompletelyVisible.c | 160 + User/system/lib/lcd/gui/WM/WM_IsEnabled.c | 48 + User/system/lib/lcd/gui/WM/WM_IsFocussable.c | 50 + User/system/lib/lcd/gui/WM/WM_IsVisible.c | 53 + User/system/lib/lcd/gui/WM/WM_IsWindow.c | 46 + User/system/lib/lcd/gui/WM/WM_MakeModal.c | 64 + User/system/lib/lcd/gui/WM/WM_Move.c | 127 + User/system/lib/lcd/gui/WM/WM_MoveChildTo.c | 55 + User/system/lib/lcd/gui/WM/WM_NotifyParent.c | 47 + User/system/lib/lcd/gui/WM/WM_OnKey.c | 59 + .../lib/lcd/gui/WM/WM_PID__GetPrevState.c | 44 + User/system/lib/lcd/gui/WM/WM_Paint.c | 64 + User/system/lib/lcd/gui/WM/WM_ResizeWindow.c | 74 + User/system/lib/lcd/gui/WM/WM_Screen2Win.c | 111 + .../lib/lcd/gui/WM/WM_SendMessageNoPara.c | 46 + User/system/lib/lcd/gui/WM/WM_SendToParent.c | 51 + User/system/lib/lcd/gui/WM/WM_SetAnchor.c | 57 + User/system/lib/lcd/gui/WM/WM_SetCallback.c | 54 + User/system/lib/lcd/gui/WM/WM_SetCapture.c | 85 + .../system/lib/lcd/gui/WM/WM_SetCaptureMove.c | 73 + .../system/lib/lcd/gui/WM/WM_SetCreateFlags.c | 45 + .../lib/lcd/gui/WM/WM_SetDesktopColor.c | 67 + User/system/lib/lcd/gui/WM/WM_SetFocus.c | 88 + .../lib/lcd/gui/WM/WM_SetFocusOnNextChild.c | 114 + .../lib/lcd/gui/WM/WM_SetFocusOnPrevChild.c | 112 + User/system/lib/lcd/gui/WM/WM_SetId.c | 45 + .../system/lib/lcd/gui/WM/WM_SetScrollState.c | 47 + User/system/lib/lcd/gui/WM/WM_SetScrollbar.c | 109 + User/system/lib/lcd/gui/WM/WM_SetSize.c | 53 + User/system/lib/lcd/gui/WM/WM_SetTrans.c | 93 + User/system/lib/lcd/gui/WM/WM_SetTransState.c | 62 + .../lib/lcd/gui/WM/WM_SetUserClipRect.c | 49 + User/system/lib/lcd/gui/WM/WM_SetXSize.c | 53 + User/system/lib/lcd/gui/WM/WM_SetYSize.c | 53 + User/system/lib/lcd/gui/WM/WM_SetpfPollPID.c | 45 + User/system/lib/lcd/gui/WM/WM_Show.c | 74 + User/system/lib/lcd/gui/WM/WM_StayOnTop.c | 80 + User/system/lib/lcd/gui/WM/WM_Timer.c | 112 + User/system/lib/lcd/gui/WM/WM_TimerExternal.c | 262 + User/system/lib/lcd/gui/WM/WM_UserData.c | 101 + User/system/lib/lcd/gui/WM/WM_Validate.c | 103 + .../system/lib/lcd/gui/WM/WM_ValidateWindow.c | 51 + User/system/lib/lcd/gui/WM/WM__ForEachDesc.c | 51 + .../lib/lcd/gui/WM/WM__GetFirstSibling.c | 45 + .../lib/lcd/gui/WM/WM__GetFocussedChild.c | 46 + .../lib/lcd/gui/WM/WM__GetLastSibling.c | 51 + User/system/lib/lcd/gui/WM/WM__GetOrg_AA.c | 61 + .../lib/lcd/gui/WM/WM__GetPrevSibling.c | 55 + User/system/lib/lcd/gui/WM/WM__IsAncestor.c | 76 + User/system/lib/lcd/gui/WM/WM__IsChild.c | 51 + User/system/lib/lcd/gui/WM/WM__IsEnabled.c | 46 + .../lib/lcd/gui/WM/WM__NotifyVisChanged.c | 82 + .../system/lib/lcd/gui/WM/WM__Screen2Client.c | 43 + User/system/lib/lcd/gui/WM/WM__SendMessage.c | 50 + .../lib/lcd/gui/WM/WM__SendMessageIfEnabled.c | 45 + .../lib/lcd/gui/WM/WM__SendMessageNoPara.c | 50 + .../lib/lcd/gui/WM/WM__UpdateChildPositions.c | 99 + User/system/lib/lcd/gui/WM/vssver.scc | Bin 0 -> 1632 bytes User/system/lib/lcd/gui/Widget/BUTTON.c | 455 + User/system/lib/lcd/gui/Widget/BUTTON.h | 166 + User/system/lib/lcd/gui/Widget/BUTTON_BMP.c | 48 + .../system/lib/lcd/gui/Widget/BUTTON_Bitmap.c | 49 + .../system/lib/lcd/gui/Widget/BUTTON_Create.c | 53 + .../lcd/gui/Widget/BUTTON_CreateIndirect.c | 51 + .../lib/lcd/gui/Widget/BUTTON_Default.c | 110 + User/system/lib/lcd/gui/Widget/BUTTON_Get.c | 106 + .../lib/lcd/gui/Widget/BUTTON_IsPressed.c | 51 + .../lib/lcd/gui/Widget/BUTTON_Private.h | 65 + .../lib/lcd/gui/Widget/BUTTON_SelfDraw.c | 50 + .../lib/lcd/gui/Widget/BUTTON_SetTextAlign.c | 49 + .../lcd/gui/Widget/BUTTON_StreamedBitmap.c | 51 + .../lib/lcd/gui/Widget/BUTTON__SetBitmapObj.c | 53 + .../system/lib/lcd/gui/Widget/CCGUIWidget.bat | 210 + User/system/lib/lcd/gui/Widget/CHECKBOX.c | 324 + User/system/lib/lcd/gui/Widget/CHECKBOX.h | 124 + .../lib/lcd/gui/Widget/CHECKBOX_Create.c | 43 + .../lcd/gui/Widget/CHECKBOX_CreateIndirect.c | 48 + .../lib/lcd/gui/Widget/CHECKBOX_Default.c | 114 + .../lib/lcd/gui/Widget/CHECKBOX_GetState.c | 49 + .../lib/lcd/gui/Widget/CHECKBOX_Image.c | 78 + .../lib/lcd/gui/Widget/CHECKBOX_IsChecked.c | 41 + .../lib/lcd/gui/Widget/CHECKBOX_Private.h | 103 + .../lib/lcd/gui/Widget/CHECKBOX_SetBkColor.c | 57 + .../lcd/gui/Widget/CHECKBOX_SetDefaultImage.c | 39 + .../lib/lcd/gui/Widget/CHECKBOX_SetFont.c | 50 + .../lib/lcd/gui/Widget/CHECKBOX_SetImage.c | 45 + .../lcd/gui/Widget/CHECKBOX_SetNumStates.c | 99 + .../lib/lcd/gui/Widget/CHECKBOX_SetSpacing.c | 50 + .../lib/lcd/gui/Widget/CHECKBOX_SetState.c | 50 + .../lib/lcd/gui/Widget/CHECKBOX_SetText.c | 49 + .../lcd/gui/Widget/CHECKBOX_SetTextAlign.c | 50 + .../lcd/gui/Widget/CHECKBOX_SetTextColor.c | 50 + User/system/lib/lcd/gui/Widget/DIALOG.c | 175 + User/system/lib/lcd/gui/Widget/DIALOG.h | 54 + .../system/lib/lcd/gui/Widget/DIALOG_Intern.h | 98 + User/system/lib/lcd/gui/Widget/DROPDOWN.c | 680 ++ User/system/lib/lcd/gui/Widget/DROPDOWN.h | 117 + .../lib/lcd/gui/Widget/DROPDOWN_Create.c | 40 + .../lcd/gui/Widget/DROPDOWN_CreateIndirect.c | 47 + .../lib/lcd/gui/Widget/DROPDOWN_DeleteItem.c | 57 + .../lcd/gui/Widget/DROPDOWN_InsertString.c | 69 + .../lib/lcd/gui/Widget/DROPDOWN_ItemSpacing.c | 68 + .../lib/lcd/gui/Widget/DROPDOWN_Private.h | 66 + .../lcd/gui/Widget/DROPDOWN_SetAutoScroll.c | 59 + .../lcd/gui/Widget/DROPDOWN_SetTextAlign.c | 49 + .../lcd/gui/Widget/DROPDOWN_SetTextHeight.c | 50 + User/system/lib/lcd/gui/Widget/EDIT.c | 872 ++ User/system/lib/lcd/gui/Widget/EDIT.h | 205 + User/system/lib/lcd/gui/Widget/EDITBin.c | 188 + User/system/lib/lcd/gui/Widget/EDITDec.c | 313 + User/system/lib/lcd/gui/Widget/EDITFloat.c | 93 + User/system/lib/lcd/gui/Widget/EDITHex.c | 223 + User/system/lib/lcd/gui/Widget/EDIT_Create.c | 48 + .../lib/lcd/gui/Widget/EDIT_CreateIndirect.c | 47 + User/system/lib/lcd/gui/Widget/EDIT_Default.c | 105 + .../lib/lcd/gui/Widget/EDIT_GetNumChars.c | 58 + User/system/lib/lcd/gui/Widget/EDIT_Private.h | 99 + .../lib/lcd/gui/Widget/EDIT_SetCursorAtChar.c | 55 + .../lib/lcd/gui/Widget/EDIT_SetInsertMode.c | 55 + User/system/lib/lcd/gui/Widget/EDIT_SetSel.c | 68 + .../lib/lcd/gui/Widget/EDIT_SetpfAddKeyEx.c | 52 + .../lcd/gui/Widget/EDIT_SetpfUpdateBuffer.c | 52 + User/system/lib/lcd/gui/Widget/FRAMEWIN.c | 621 + User/system/lib/lcd/gui/Widget/FRAMEWIN.h | 173 + .../lib/lcd/gui/Widget/FRAMEWIN_AddMenu.c | 71 + .../lib/lcd/gui/Widget/FRAMEWIN_Button.c | 64 + .../lib/lcd/gui/Widget/FRAMEWIN_ButtonClose.c | 96 + .../lib/lcd/gui/Widget/FRAMEWIN_ButtonMax.c | 142 + .../lib/lcd/gui/Widget/FRAMEWIN_ButtonMin.c | 135 + .../lib/lcd/gui/Widget/FRAMEWIN_Create.c | 50 + .../lcd/gui/Widget/FRAMEWIN_CreateIndirect.c | 44 + .../lib/lcd/gui/Widget/FRAMEWIN_Default.c | 141 + User/system/lib/lcd/gui/Widget/FRAMEWIN_Get.c | 90 + .../lib/lcd/gui/Widget/FRAMEWIN_IsMinMax.c | 69 + .../lib/lcd/gui/Widget/FRAMEWIN_MinMaxRest.c | 179 + .../lib/lcd/gui/Widget/FRAMEWIN_Private.h | 119 + .../lcd/gui/Widget/FRAMEWIN_SetBorderSize.c | 68 + .../lib/lcd/gui/Widget/FRAMEWIN_SetColors.c | 101 + .../lib/lcd/gui/Widget/FRAMEWIN_SetFont.c | 52 + .../lcd/gui/Widget/FRAMEWIN_SetResizeable.c | 546 + .../lcd/gui/Widget/FRAMEWIN_SetTitleHeight.c | 60 + .../lib/lcd/gui/Widget/FRAMEWIN_SetTitleVis.c | 95 + .../lcd/gui/Widget/FRAMEWIN__UpdateButtons.c | 91 + User/system/lib/lcd/gui/Widget/GUI_ARRAY.c | 334 + User/system/lib/lcd/gui/Widget/GUI_ARRAY.h | 69 + .../lib/lcd/gui/Widget/GUI_ARRAY_DeleteItem.c | 69 + .../lib/lcd/gui/Widget/GUI_ARRAY_InsertItem.c | 113 + .../lib/lcd/gui/Widget/GUI_ARRAY_ResizeItem.c | 64 + User/system/lib/lcd/gui/Widget/GUI_DRAW.c | 75 + .../lib/lcd/gui/Widget/GUI_DRAW_BITMAP.c | 97 + User/system/lib/lcd/gui/Widget/GUI_DRAW_BMP.c | 97 + .../lib/lcd/gui/Widget/GUI_DRAW_STREAMED.c | 97 + .../system/lib/lcd/gui/Widget/GUI_DRAW_Self.c | 101 + User/system/lib/lcd/gui/Widget/GUI_EditBin.c | 67 + User/system/lib/lcd/gui/Widget/GUI_EditDec.c | 67 + .../system/lib/lcd/gui/Widget/GUI_EditFloat.c | 71 + User/system/lib/lcd/gui/Widget/GUI_EditHex.c | 67 + .../lib/lcd/gui/Widget/GUI_EditString.c | 65 + User/system/lib/lcd/gui/Widget/GUI_HOOK.c | 55 + User/system/lib/lcd/gui/Widget/GUI_HOOK.h | 62 + User/system/lib/lcd/gui/Widget/HEADER.c | 714 ++ User/system/lib/lcd/gui/Widget/HEADER.h | 141 + User/system/lib/lcd/gui/Widget/HEADER_BMP.c | 50 + .../system/lib/lcd/gui/Widget/HEADER_Bitmap.c | 51 + .../system/lib/lcd/gui/Widget/HEADER_Create.c | 40 + .../lcd/gui/Widget/HEADER_CreateIndirect.c | 44 + .../lib/lcd/gui/Widget/HEADER_Private.h | 84 + .../lcd/gui/Widget/HEADER_StreamedBitmap.c | 51 + .../lib/lcd/gui/Widget/HEADER__SetDrawObj.c | 55 + User/system/lib/lcd/gui/Widget/LISTBOX.c | 1124 ++ User/system/lib/lcd/gui/Widget/LISTBOX.h | 175 + .../lib/lcd/gui/Widget/LISTBOX_Create.c | 50 + .../lcd/gui/Widget/LISTBOX_CreateIndirect.c | 45 + .../lib/lcd/gui/Widget/LISTBOX_Default.c | 108 + .../lib/lcd/gui/Widget/LISTBOX_DeleteItem.c | 70 + User/system/lib/lcd/gui/Widget/LISTBOX_Font.c | 69 + .../lib/lcd/gui/Widget/LISTBOX_GetItemText.c | 62 + .../lib/lcd/gui/Widget/LISTBOX_GetNumItems.c | 52 + .../lib/lcd/gui/Widget/LISTBOX_InsertString.c | 62 + .../lib/lcd/gui/Widget/LISTBOX_ItemDisabled.c | 95 + .../lib/lcd/gui/Widget/LISTBOX_ItemSpacing.c | 68 + .../lib/lcd/gui/Widget/LISTBOX_MultiSel.c | 139 + .../lib/lcd/gui/Widget/LISTBOX_Private.h | 119 + .../lib/lcd/gui/Widget/LISTBOX_ScrollStep.c | 60 + .../lcd/gui/Widget/LISTBOX_SetAutoScroll.c | 84 + .../lib/lcd/gui/Widget/LISTBOX_SetBkColor.c | 53 + .../lib/lcd/gui/Widget/LISTBOX_SetOwner.c | 53 + .../lib/lcd/gui/Widget/LISTBOX_SetOwnerDraw.c | 51 + .../gui/Widget/LISTBOX_SetScrollbarWidth.c | 53 + .../lib/lcd/gui/Widget/LISTBOX_SetString.c | 59 + .../lib/lcd/gui/Widget/LISTBOX_SetTextColor.c | 59 + User/system/lib/lcd/gui/Widget/LISTVIEW.c | 721 ++ User/system/lib/lcd/gui/Widget/LISTVIEW.h | 127 + .../lib/lcd/gui/Widget/LISTVIEW_Create.c | 48 + .../lcd/gui/Widget/LISTVIEW_CreateIndirect.c | 44 + .../lib/lcd/gui/Widget/LISTVIEW_Default.c | 80 + .../lcd/gui/Widget/LISTVIEW_DeleteColumn.c | 66 + .../lib/lcd/gui/Widget/LISTVIEW_DeleteRow.c | 100 + .../lib/lcd/gui/Widget/LISTVIEW_GetBkColor.c | 51 + .../lib/lcd/gui/Widget/LISTVIEW_GetFont.c | 51 + .../lib/lcd/gui/Widget/LISTVIEW_GetHeader.c | 50 + .../lcd/gui/Widget/LISTVIEW_GetNumColumns.c | 49 + .../lib/lcd/gui/Widget/LISTVIEW_GetNumRows.c | 49 + .../lib/lcd/gui/Widget/LISTVIEW_GetSel.c | 49 + .../lcd/gui/Widget/LISTVIEW_GetTextColor.c | 51 + .../lib/lcd/gui/Widget/LISTVIEW_Private.h | 120 + .../lib/lcd/gui/Widget/LISTVIEW_SetBkColor.c | 53 + .../lcd/gui/Widget/LISTVIEW_SetColumnWidth.c | 48 + .../lib/lcd/gui/Widget/LISTVIEW_SetFont.c | 51 + .../lib/lcd/gui/Widget/LISTVIEW_SetGridVis.c | 54 + .../lcd/gui/Widget/LISTVIEW_SetItemColor.c | 91 + .../lib/lcd/gui/Widget/LISTVIEW_SetItemText.c | 58 + .../lib/lcd/gui/Widget/LISTVIEW_SetLBorder.c | 50 + .../lib/lcd/gui/Widget/LISTVIEW_SetRBorder.c | 50 + .../lcd/gui/Widget/LISTVIEW_SetRowHeight.c | 54 + .../lib/lcd/gui/Widget/LISTVIEW_SetSel.c | 66 + .../lcd/gui/Widget/LISTVIEW_SetTextAlign.c | 55 + .../lcd/gui/Widget/LISTVIEW_SetTextColor.c | 52 + User/system/lib/lcd/gui/Widget/MENU.c | 1180 ++ User/system/lib/lcd/gui/Widget/MENU.h | 199 + User/system/lib/lcd/gui/Widget/MENU_Attach.c | 55 + .../lib/lcd/gui/Widget/MENU_CreateIndirect.c | 46 + User/system/lib/lcd/gui/Widget/MENU_Default.c | 139 + .../lib/lcd/gui/Widget/MENU_DeleteItem.c | 54 + .../lib/lcd/gui/Widget/MENU_DisableItem.c | 54 + .../lib/lcd/gui/Widget/MENU_EnableItem.c | 54 + User/system/lib/lcd/gui/Widget/MENU_GetItem.c | 58 + .../lib/lcd/gui/Widget/MENU_GetItemText.c | 58 + .../lib/lcd/gui/Widget/MENU_GetNumItems.c | 53 + .../lib/lcd/gui/Widget/MENU_InsertItem.c | 59 + User/system/lib/lcd/gui/Widget/MENU_Popup.c | 59 + User/system/lib/lcd/gui/Widget/MENU_Private.h | 131 + .../lib/lcd/gui/Widget/MENU_SetBkColor.c | 56 + .../lib/lcd/gui/Widget/MENU_SetBorderSize.c | 56 + User/system/lib/lcd/gui/Widget/MENU_SetFont.c | 55 + User/system/lib/lcd/gui/Widget/MENU_SetItem.c | 55 + .../lib/lcd/gui/Widget/MENU_SetTextColor.c | 56 + .../lib/lcd/gui/Widget/MENU__FindItem.c | 60 + User/system/lib/lcd/gui/Widget/MESSAGEBOX.c | 206 + User/system/lib/lcd/gui/Widget/MESSAGEBOX.h | 39 + User/system/lib/lcd/gui/Widget/MULTIEDIT.c | 1827 +++ User/system/lib/lcd/gui/Widget/MULTIEDIT.h | 122 + .../lib/lcd/gui/Widget/MULTIEDIT_Create.c | 40 + .../lcd/gui/Widget/MULTIEDIT_CreateIndirect.c | 45 + User/system/lib/lcd/gui/Widget/MULTIPAGE.c | 975 ++ User/system/lib/lcd/gui/Widget/MULTIPAGE.h | 113 + .../lib/lcd/gui/Widget/MULTIPAGE_Create.c | 42 + .../lcd/gui/Widget/MULTIPAGE_CreateIndirect.c | 45 + .../lib/lcd/gui/Widget/MULTIPAGE_Default.c | 109 + .../lib/lcd/gui/Widget/MULTIPAGE_Private.h | 61 + User/system/lib/lcd/gui/Widget/PROGBAR.c | 488 + User/system/lib/lcd/gui/Widget/PROGBAR.h | 82 + .../lib/lcd/gui/Widget/PROGBAR_Create.c | 48 + .../lcd/gui/Widget/PROGBAR_CreateIndirect.c | 45 + User/system/lib/lcd/gui/Widget/RADIO.c | 470 + User/system/lib/lcd/gui/Widget/RADIO.h | 128 + User/system/lib/lcd/gui/Widget/RADIO_Create.c | 42 + .../lib/lcd/gui/Widget/RADIO_CreateIndirect.c | 49 + .../system/lib/lcd/gui/Widget/RADIO_Default.c | 68 + User/system/lib/lcd/gui/Widget/RADIO_Image.c | 121 + .../system/lib/lcd/gui/Widget/RADIO_Private.h | 101 + .../lib/lcd/gui/Widget/RADIO_SetBkColor.c | 61 + .../lcd/gui/Widget/RADIO_SetDefaultImage.c | 52 + .../system/lib/lcd/gui/Widget/RADIO_SetFont.c | 56 + .../lib/lcd/gui/Widget/RADIO_SetGroupId.c | 181 + .../lib/lcd/gui/Widget/RADIO_SetImage.c | 59 + .../system/lib/lcd/gui/Widget/RADIO_SetText.c | 55 + .../lib/lcd/gui/Widget/RADIO_SetTextColor.c | 56 + User/system/lib/lcd/gui/Widget/SCROLLBAR.c | 616 + User/system/lib/lcd/gui/Widget/SCROLLBAR.h | 121 + .../lib/lcd/gui/Widget/SCROLLBAR_Create.c | 60 + .../lcd/gui/Widget/SCROLLBAR_CreateIndirect.c | 44 + .../lib/lcd/gui/Widget/SCROLLBAR_Defaults.c | 91 + .../lib/lcd/gui/Widget/SCROLLBAR_GetValue.c | 47 + .../lib/lcd/gui/Widget/SCROLLBAR_Private.h | 96 + .../lib/lcd/gui/Widget/SCROLLBAR_SetWidth.c | 47 + User/system/lib/lcd/gui/Widget/SLIDER.c | 534 + User/system/lib/lcd/gui/Widget/SLIDER.h | 114 + .../system/lib/lcd/gui/Widget/SLIDER_Create.c | 40 + .../lcd/gui/Widget/SLIDER_CreateIndirect.c | 44 + User/system/lib/lcd/gui/Widget/TEXT.c | 224 + User/system/lib/lcd/gui/Widget/TEXT.h | 141 + User/system/lib/lcd/gui/Widget/TEXT_Create.c | 48 + .../lib/lcd/gui/Widget/TEXT_CreateIndirect.c | 44 + User/system/lib/lcd/gui/Widget/TEXT_Private.h | 59 + .../lib/lcd/gui/Widget/TEXT_SetBkColor.c | 62 + User/system/lib/lcd/gui/Widget/TEXT_SetFont.c | 66 + User/system/lib/lcd/gui/Widget/TEXT_SetText.c | 56 + .../lib/lcd/gui/Widget/TEXT_SetTextAlign.c | 55 + .../lib/lcd/gui/Widget/TEXT_SetTextColor.c | 55 + User/system/lib/lcd/gui/Widget/WIDGET.c | 475 + User/system/lib/lcd/gui/Widget/WIDGET.h | 231 + .../lib/lcd/gui/Widget/WIDGET_Effect_3D.c | 163 + .../lib/lcd/gui/Widget/WIDGET_Effect_3D1L.c | 148 + .../lib/lcd/gui/Widget/WIDGET_Effect_3D2L.c | 160 + .../lib/lcd/gui/Widget/WIDGET_Effect_None.c | 118 + .../lib/lcd/gui/Widget/WIDGET_Effect_Simple.c | 124 + .../lcd/gui/Widget/WIDGET_FillStringInRect.c | 111 + .../lib/lcd/gui/Widget/WIDGET_SetEffect.c | 52 + .../lib/lcd/gui/Widget/WIDGET_SetWidth.c | 68 + User/system/lib/lcd/gui/Widget/WINDOW.c | 175 + .../lib/lcd/gui/Widget/WINDOW_Default.c | 36 + .../lib/lcd/gui/Widget/WINDOW_Private.h | 37 + User/system/lib/lcd/gui/Widget/vssver.scc | Bin 0 -> 3952 bytes .../lib/lcd/image/readme/1719196693709.png | Bin 0 -> 35517 bytes .../lib/lcd/image/readme/1719196745232.png | Bin 0 -> 61838 bytes User/system/lib/lcd/lcd_sharp.c | 453 + User/system/lib/lcd/lcd_sharp.h | 8 + User/system/lib/lcd/lcd_st7525.c | 444 + User/system/lib/lcd/lcd_st7525.h | 3 + User/system/lib/lcd/lcds.c | 43 + User/system/lib/lcd/lcds.h | 195 + User/system/lib/lcd/readme.md | 12 + User/system/lib/menu/menu.c | 905 ++ User/system/lib/menu/menu.h | 274 + User/system/lib/readme.md | 169 + User/system/lib/src/aes.c | 981 ++ User/system/lib/src/clist.c | 338 + User/system/lib/src/cmac.c | 159 + User/system/lib/src/cmd.c | 111 + User/system/lib/src/data_analysis.c | 468 + User/system/lib/src/debug.c | 48 + User/system/lib/src/filter.c | 156 + User/system/lib/src/lib.c | 860 ++ User/system/lib/src/malloc.c | 338 + User/system/lib/src/mlist.c | 149 + User/system/lib/src/pbuf.c | 401 + User/system/lib/src/sqqueue.c | 450 + User/system/lib/src/storage.c | 252 + User/system/lib/src/wl_flash.c | 314 + User/system/lib/unity/unity.c | 2582 ++++ User/system/lib/unity/unity.h | 687 ++ User/system/lib/unity/unity_config.h | 241 + User/system/lib/unity/unity_internals.h | 1181 ++ User/system/os.h | 34 + User/system/readme.txt | 4 + User/system/sys.c | 272 + User/system/sys.h | 75 + 945 files changed, 270180 insertions(+) create mode 100644 User/system/bsp/adcs.c create mode 100644 User/system/bsp/adcs.h create mode 100644 User/system/bsp/bsp.c create mode 100644 User/system/bsp/bsp.h create mode 100644 User/system/bsp/dacs.c create mode 100644 User/system/bsp/dacs.h create mode 100644 User/system/bsp/dmas.h create mode 100644 User/system/bsp/eeprom.c create mode 100644 User/system/bsp/eeprom.h create mode 100644 User/system/bsp/flash.c create mode 100644 User/system/bsp/flash.h create mode 100644 User/system/bsp/gpios.c create mode 100644 User/system/bsp/gpios.h create mode 100644 User/system/bsp/i2cs.c create mode 100644 User/system/bsp/i2cs.h create mode 100644 User/system/bsp/iwdgs.c create mode 100644 User/system/bsp/iwdgs.h create mode 100644 User/system/bsp/pwms.h create mode 100644 User/system/bsp/readme.md create mode 100644 User/system/bsp/spis.c create mode 100644 User/system/bsp/spis.h create mode 100644 User/system/bsp/tims.c create mode 100644 User/system/bsp/tims.h create mode 100644 User/system/bsp/uarts.c create mode 100644 User/system/bsp/uarts.h create mode 100644 User/system/btn.c create mode 100644 User/system/btn.h create mode 100644 User/system/delay.c create mode 100644 User/system/delay.h create mode 100644 User/system/driver/dac161p997.c create mode 100644 User/system/driver/dac161p997.h create mode 100644 User/system/driver/eeprom_fm24.c create mode 100644 User/system/driver/eeprom_fm24.h create mode 100644 User/system/driver/eeprom_lc02b.c create mode 100644 User/system/driver/eeprom_lc02b.h create mode 100644 User/system/driver/eeprom_m95.c create mode 100644 User/system/driver/eeprom_m95.h create mode 100644 User/system/driver/ntc_3950.c create mode 100644 User/system/driver/ntc_3950.h create mode 100644 User/system/driver/rtc_rx8010.c create mode 100644 User/system/driver/rtc_rx8010.h create mode 100644 User/system/driver/sht40.c create mode 100644 User/system/driver/sht40.h create mode 100644 User/system/driver/ssd1306_oled.c create mode 100644 User/system/driver/ssd1306_oled.h create mode 100644 User/system/driver/tmc2240.c create mode 100644 User/system/driver/tmc2240.h create mode 100644 User/system/lib/bootload/bootload.c create mode 100644 User/system/lib/bootload/bootload.h create mode 100644 User/system/lib/bootload/readme.md create mode 100644 User/system/lib/bootload/test_ymodem.c create mode 100644 User/system/lib/bootload/ymodem.c create mode 100644 User/system/lib/bootload/ymodem.h create mode 100644 User/system/lib/control/custom/pid_c.c create mode 100644 User/system/lib/control/custom/pid_c.h create mode 100644 User/system/lib/control/custom/pid_g.c create mode 100644 User/system/lib/control/custom/pid_g.h create mode 100644 User/system/lib/control/custom/pid_hd.c create mode 100644 User/system/lib/control/custom/pid_hd.h create mode 100644 User/system/lib/control/custom/pid_x.c create mode 100644 User/system/lib/control/custom/pid_x.h create mode 100644 User/system/lib/control/custom/pid_zh.c create mode 100644 User/system/lib/control/custom/pid_zh.h create mode 100644 User/system/lib/control/custom/pid_zh1.c create mode 100644 User/system/lib/control/custom/pid_zh1.h create mode 100644 User/system/lib/control/custom/独立PID算法开发.md create mode 100644 User/system/lib/control/inc/pid.h create mode 100644 User/system/lib/control/inc/pid_auto_tune.h create mode 100644 User/system/lib/control/src/pid.c create mode 100644 User/system/lib/control/src/pid_auto_tune.c create mode 100644 User/system/lib/control/src/pid_common.c create mode 100644 User/system/lib/control/src/pid_fuzzy.c create mode 100644 User/system/lib/control/src/pid_neural.c create mode 100644 User/system/lib/control/模糊PID控制器设计文档.md create mode 100644 User/system/lib/control/自整定.md create mode 100644 User/system/lib/examples/Makefile create mode 100644 User/system/lib/examples/simple_aes.c create mode 100644 User/system/lib/examples/simple_clist.c create mode 100644 User/system/lib/examples/simple_cmac.c create mode 100644 User/system/lib/examples/simple_cmd.c create mode 100644 User/system/lib/examples/simple_data_analysis.c create mode 100644 User/system/lib/examples/simple_sqqueue.c create mode 100644 User/system/lib/flashdb/examples/kvdb_basic_sample.c create mode 100644 User/system/lib/flashdb/examples/kvdb_type_blob_sample.c create mode 100644 User/system/lib/flashdb/examples/kvdb_type_string_sample.c create mode 100644 User/system/lib/flashdb/examples/tsdb_sample.c create mode 100644 User/system/lib/flashdb/fal/fal.c create mode 100644 User/system/lib/flashdb/fal/fal.h create mode 100644 User/system/lib/flashdb/fal/fal_cfg.h create mode 100644 User/system/lib/flashdb/fal/fal_def.h create mode 100644 User/system/lib/flashdb/fal/fal_flash.c create mode 100644 User/system/lib/flashdb/fal/fal_partition.c create mode 100644 User/system/lib/flashdb/fal/fal_rtt.c create mode 100644 User/system/lib/flashdb/fal_eeprom24_port.c create mode 100644 User/system/lib/flashdb/fal_eeprom95_port.c create mode 100644 User/system/lib/flashdb/fdb.c create mode 100644 User/system/lib/flashdb/fdb_cfg.h create mode 100644 User/system/lib/flashdb/fdb_def.h create mode 100644 User/system/lib/flashdb/fdb_file.c create mode 100644 User/system/lib/flashdb/fdb_kvdb.c create mode 100644 User/system/lib/flashdb/fdb_low_lvl.h create mode 100644 User/system/lib/flashdb/fdb_tsdb.c create mode 100644 User/system/lib/flashdb/fdb_utils.c create mode 100644 User/system/lib/flashdb/flashdb.h create mode 100644 User/system/lib/flashdb/readme.md create mode 100644 User/system/lib/flow/README.md create mode 100644 User/system/lib/flow/example.c create mode 100644 User/system/lib/flow/flow.h create mode 100644 User/system/lib/flow/flow_core.c create mode 100644 User/system/lib/flow/flow_core.h create mode 100644 User/system/lib/flow/flow_def.h create mode 100644 User/system/lib/flow/flow_sem.h create mode 100644 User/system/lib/inc/aes.h create mode 100644 User/system/lib/inc/clist.h create mode 100644 User/system/lib/inc/cmac.h create mode 100644 User/system/lib/inc/cmd.h create mode 100644 User/system/lib/inc/data_analysis.h create mode 100644 User/system/lib/inc/data_type_def.h create mode 100644 User/system/lib/inc/debug.h create mode 100644 User/system/lib/inc/filter.h create mode 100644 User/system/lib/inc/fsm.h create mode 100644 User/system/lib/inc/lib.h create mode 100644 User/system/lib/inc/log.h create mode 100644 User/system/lib/inc/malloc.h create mode 100644 User/system/lib/inc/mlist.h create mode 100644 User/system/lib/inc/osel_arch.h create mode 100644 User/system/lib/inc/pbuf.h create mode 100644 User/system/lib/inc/sqqueue.h create mode 100644 User/system/lib/inc/storage.h create mode 100644 User/system/lib/inc/wl_flash.h create mode 100644 User/system/lib/lcd/font/HZ16x16.c create mode 100644 User/system/lib/lcd/font/HZ18x18.c create mode 100644 User/system/lib/lcd/font/HZ20x20.c create mode 100644 User/system/lib/lcd/font/HZ24x24.c create mode 100644 User/system/lib/lcd/font/HZ32x32.c create mode 100644 User/system/lib/lcd/font/LOGO.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAALib.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAALine.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c create mode 100644 User/system/lib/lcd/gui/AntiAlias/vssver.scc create mode 100644 User/system/lib/lcd/gui/Config/GUIConf.h create mode 100644 User/system/lib/lcd/gui/Config/GUITouchConf.h create mode 100644 User/system/lib/lcd/gui/Config/GUI_X.c create mode 100644 User/system/lib/lcd/gui/Config/LCDConf.h create mode 100644 User/system/lib/lcd/gui/Config/vssver.scc create mode 100644 User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP111.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP222.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP233.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP323.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP332.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP555.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP556.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP565.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP655.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP8666.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM233.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM323.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM332.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM555.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM556.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM565.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/LCDPM655.c create mode 100644 User/system/lib/lcd/gui/ConvertColor/vssver.scc create mode 100644 User/system/lib/lcd/gui/ConvertMono/CCConvertMono.bat create mode 100644 User/system/lib/lcd/gui/ConvertMono/LCDP0.c create mode 100644 User/system/lib/lcd/gui/ConvertMono/LCDP2.c create mode 100644 User/system/lib/lcd/gui/ConvertMono/LCDP4.c create mode 100644 User/system/lib/lcd/gui/ConvertMono/vssver.scc create mode 100644 User/system/lib/lcd/gui/Core/CCGUICore.bat create mode 100644 User/system/lib/lcd/gui/Core/GUI.h create mode 100644 User/system/lib/lcd/gui/Core/GUI2DLib.c create mode 100644 User/system/lib/lcd/gui/Core/GUIAlloc.c create mode 100644 User/system/lib/lcd/gui/Core/GUIArc.c create mode 100644 User/system/lib/lcd/gui/Core/GUIChar.c create mode 100644 User/system/lib/lcd/gui/Core/GUICharLine.c create mode 100644 User/system/lib/lcd/gui/Core/GUICharM.c create mode 100644 User/system/lib/lcd/gui/Core/GUICharP.c create mode 100644 User/system/lib/lcd/gui/Core/GUICirc.c create mode 100644 User/system/lib/lcd/gui/Core/GUIColor2Index.c create mode 100644 User/system/lib/lcd/gui/Core/GUICore.c create mode 100644 User/system/lib/lcd/gui/Core/GUICurs.c create mode 100644 User/system/lib/lcd/gui/Core/GUIDebug.h create mode 100644 User/system/lib/lcd/gui/Core/GUIEncJS.c create mode 100644 User/system/lib/lcd/gui/Core/GUIIndex2Color.c create mode 100644 User/system/lib/lcd/gui/Core/GUIPolyE.c create mode 100644 User/system/lib/lcd/gui/Core/GUIPolyM.c create mode 100644 User/system/lib/lcd/gui/Core/GUIPolyR.c create mode 100644 User/system/lib/lcd/gui/Core/GUIRealloc.c create mode 100644 User/system/lib/lcd/gui/Core/GUIStream.c create mode 100644 User/system/lib/lcd/gui/Core/GUITask.c create mode 100644 User/system/lib/lcd/gui/Core/GUITime.c create mode 100644 User/system/lib/lcd/gui/Core/GUITimer.c create mode 100644 User/system/lib/lcd/gui/Core/GUIType.h create mode 100644 User/system/lib/lcd/gui/Core/GUIUC0.c create mode 100644 User/system/lib/lcd/gui/Core/GUIVal.c create mode 100644 User/system/lib/lcd/gui/Core/GUIValf.c create mode 100644 User/system/lib/lcd/gui/Core/GUIVersion.h create mode 100644 User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_AddBin.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_AddDec.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_AddDecMin.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_AddDecShift.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_AddHex.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_BMP.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorPal.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_CursorPalI.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispBin.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispCEOL.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispChar.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispChars.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispHex.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispString.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringAt.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DispStringLen.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawGraph.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawHLine.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawPie.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawPixel.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_DrawVLine.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_ErrorOut.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Exec.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_FillPolygon.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_FillRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_FillRectEx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_FontIntern.h create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetClientRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetColor.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetDispPos.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetFont.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetTextMode.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetVersionString.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Goto.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_InitLUT.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_InvertRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_IsInFont.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Log.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_MOUSE.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_MergeRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_MoveRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_OnKey.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_PID.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Pen.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Private.h create mode 100644 User/system/lib/lcd/gui/Core/GUI_Protected.h create mode 100644 User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SIF.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SaveContext.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SelectLCD.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SelectLayer.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetColor.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetDecChar.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetDefault.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetFont.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetLBorder.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetOrg.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetTextMode.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_TOUCH.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_UC.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_UC_DispString.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_VNC.h create mode 100644 User/system/lib/lcd/gui/Core/GUI_WaitEvent.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_WaitKey.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_Warn.c create mode 100644 User/system/lib/lcd/gui/Core/GUI_X.h create mode 100644 User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__DivideRound.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__DivideRound32.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__GetNumChars.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__IntersectRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__IntersectRects.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__Read.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__ReduceRect.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__SetText.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__Wrap.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__memset.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__memset16.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__strcmp.c create mode 100644 User/system/lib/lcd/gui/Core/GUI__strlen.c create mode 100644 User/system/lib/lcd/gui/Core/LCD.c create mode 100644 User/system/lib/lcd/gui/Core/LCD.h create mode 100644 User/system/lib/lcd/gui/Core/LCDAA.c create mode 100644 User/system/lib/lcd/gui/Core/LCDColor.c create mode 100644 User/system/lib/lcd/gui/Core/LCDGetP.c create mode 100644 User/system/lib/lcd/gui/Core/LCDInfo.c create mode 100644 User/system/lib/lcd/gui/Core/LCDInfo0.c create mode 100644 User/system/lib/lcd/gui/Core/LCDInfo1.c create mode 100644 User/system/lib/lcd/gui/Core/LCDL0Delta.c create mode 100644 User/system/lib/lcd/gui/Core/LCDL0Mag.c create mode 100644 User/system/lib/lcd/gui/Core/LCDP1.c create mode 100644 User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c create mode 100644 User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c create mode 100644 User/system/lib/lcd/gui/Core/LCDRLE4.c create mode 100644 User/system/lib/lcd/gui/Core/LCDRLE8.c create mode 100644 User/system/lib/lcd/gui/Core/LCDSIM.h create mode 100644 User/system/lib/lcd/gui/Core/LCD_API.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h create mode 100644 User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_DrawVLine.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_GetEx.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_L0_Generic.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_Mirror.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_MixColors256.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_Private.h create mode 100644 User/system/lib/lcd/gui/Core/LCD_Protected.h create mode 100644 User/system/lib/lcd/gui/Core/LCD_Rotate180.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_RotateCCW.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_RotateCW.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_SelectLCD.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_SetAPI.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_SetClipRectEx.c create mode 100644 User/system/lib/lcd/gui/Core/LCD_UpdateColorIndices.c create mode 100644 User/system/lib/lcd/gui/Core/vssver.scc create mode 100644 User/system/lib/lcd/gui/Font/CCGUIFont.BAT create mode 100644 User/system/lib/lcd/gui/Font/F08_1.c create mode 100644 User/system/lib/lcd/gui/Font/F08_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F10S_1.c create mode 100644 User/system/lib/lcd/gui/Font/F10S_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F10_1.c create mode 100644 User/system/lib/lcd/gui/Font/F10_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F13B_1.c create mode 100644 User/system/lib/lcd/gui/Font/F13B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F13HB_1.c create mode 100644 User/system/lib/lcd/gui/Font/F13HB_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F13H_1.c create mode 100644 User/system/lib/lcd/gui/Font/F13H_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F13_1.c create mode 100644 User/system/lib/lcd/gui/Font/F13_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F16B_1.c create mode 100644 User/system/lib/lcd/gui/Font/F16B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F16_1.c create mode 100644 User/system/lib/lcd/gui/Font/F16_1HK.c create mode 100644 User/system/lib/lcd/gui/Font/F16_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F16_HK.c create mode 100644 User/system/lib/lcd/gui/Font/F24B_1.c create mode 100644 User/system/lib/lcd/gui/Font/F24B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F24_1.c create mode 100644 User/system/lib/lcd/gui/Font/F24_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F32B_1.c create mode 100644 User/system/lib/lcd/gui/Font/F32B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F32_1.c create mode 100644 User/system/lib/lcd/gui/Font/F32_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F4x6.c create mode 100644 User/system/lib/lcd/gui/Font/F6x8.c create mode 100644 User/system/lib/lcd/gui/Font/F8x10_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F8x12_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F8x13_1.c create mode 100644 User/system/lib/lcd/gui/Font/F8x13_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F8x15B_1.c create mode 100644 User/system/lib/lcd/gui/Font/F8x15B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/F8x16.c create mode 100644 User/system/lib/lcd/gui/Font/F8x8.c create mode 100644 User/system/lib/lcd/gui/Font/FComic18B_1.c create mode 100644 User/system/lib/lcd/gui/Font/FComic18B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/FComic24B_1.c create mode 100644 User/system/lib/lcd/gui/Font/FComic24B_ASCII.c create mode 100644 User/system/lib/lcd/gui/Font/FD24x32.c create mode 100644 User/system/lib/lcd/gui/Font/FD32.c create mode 100644 User/system/lib/lcd/gui/Font/FD36x48.c create mode 100644 User/system/lib/lcd/gui/Font/FD48.c create mode 100644 User/system/lib/lcd/gui/Font/FD48x64.c create mode 100644 User/system/lib/lcd/gui/Font/FD60x80.c create mode 100644 User/system/lib/lcd/gui/Font/FD64.c create mode 100644 User/system/lib/lcd/gui/Font/FD80.c create mode 100644 User/system/lib/lcd/gui/Font/vssver.scc create mode 100644 User/system/lib/lcd/gui/GUIDemo/CCGUIDemo.bat create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO.h create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Automotive.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap4bpp.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Circle.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorBar.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorList.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Cursor.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Dialog.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Font.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_FrameWin.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Graph.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_HardwareInfo.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Intro.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_LUT.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_MemDevB.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Messagebox.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Navi.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Polygon.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ProgBar.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Speed.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Touch.c create mode 100644 User/system/lib/lcd/gui/GUIDemo/Map.h create mode 100644 User/system/lib/lcd/gui/GUIDemo/SeggerLogoBlue.c create mode 100644 User/system/lib/lcd/gui/JPEG/CCGUIJPG.bat create mode 100644 User/system/lib/lcd/gui/JPEG/Doc/ReadMe.txt create mode 100644 User/system/lib/lcd/gui/JPEG/Doc/libjpeg.txt create mode 100644 User/system/lib/lcd/gui/JPEG/Doc/structure.txt create mode 100644 User/system/lib/lcd/gui/JPEG/Doc/vssver.scc create mode 100644 User/system/lib/lcd/gui/JPEG/GUI_JPEG.c create mode 100644 User/system/lib/lcd/gui/JPEG/Image/testimg.bmp create mode 100644 User/system/lib/lcd/gui/JPEG/Image/testimg.jpg create mode 100644 User/system/lib/lcd/gui/JPEG/Image/testimgp.jpg create mode 100644 User/system/lib/lcd/gui/JPEG/Image/testorig.jpg create mode 100644 User/system/lib/lcd/gui/JPEG/Image/testprog.jpg create mode 100644 User/system/lib/lcd/gui/JPEG/Image/vssver.scc create mode 100644 User/system/lib/lcd/gui/JPEG/jcomapi.c create mode 100644 User/system/lib/lcd/gui/JPEG/jconfig.h create mode 100644 User/system/lib/lcd/gui/JPEG/jdapimin.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdapistd.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdcoefct.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdcolor.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdct.h create mode 100644 User/system/lib/lcd/gui/JPEG/jddctmgr.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdhuff.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdhuff.h create mode 100644 User/system/lib/lcd/gui/JPEG/jdinput.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdmainct.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdmarker.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdmaster.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdmerge.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdphuff.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdpostct.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdsample.c create mode 100644 User/system/lib/lcd/gui/JPEG/jdtrans.c create mode 100644 User/system/lib/lcd/gui/JPEG/jerror.c create mode 100644 User/system/lib/lcd/gui/JPEG/jerror.h create mode 100644 User/system/lib/lcd/gui/JPEG/jfdctflt.c create mode 100644 User/system/lib/lcd/gui/JPEG/jfdctfst.c create mode 100644 User/system/lib/lcd/gui/JPEG/jfdctint.c create mode 100644 User/system/lib/lcd/gui/JPEG/jidctflt.c create mode 100644 User/system/lib/lcd/gui/JPEG/jidctfst.c create mode 100644 User/system/lib/lcd/gui/JPEG/jidctint.c create mode 100644 User/system/lib/lcd/gui/JPEG/jidctred.c create mode 100644 User/system/lib/lcd/gui/JPEG/jinclude.h create mode 100644 User/system/lib/lcd/gui/JPEG/jmemmgr.c create mode 100644 User/system/lib/lcd/gui/JPEG/jmemsys.h create mode 100644 User/system/lib/lcd/gui/JPEG/jmorecfg.h create mode 100644 User/system/lib/lcd/gui/JPEG/jpegint.h create mode 100644 User/system/lib/lcd/gui/JPEG/jpeglib.h create mode 100644 User/system/lib/lcd/gui/JPEG/jquant1.c create mode 100644 User/system/lib/lcd/gui/JPEG/jquant2.c create mode 100644 User/system/lib/lcd/gui/JPEG/jutils.c create mode 100644 User/system/lib/lcd/gui/JPEG/jversion.h create mode 100644 User/system/lib/lcd/gui/JPEG/vssver.scc create mode 100644 User/system/lib/lcd/gui/LCDDriver/CCLCDDriver.bat create mode 100644 User/system/lib/lcd/gui/LCDDriver/LCDDummy.c create mode 100644 User/system/lib/lcd/gui/LCDDriver/LCDNull.c create mode 100644 User/system/lib/lcd/gui/LCDDriver/LCDWin.c create mode 100644 User/system/lib/lcd/gui/LCDDriver/vssver.scc create mode 100644 User/system/lib/lcd/gui/MemDev/CCGUIMemDev.bat create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_1.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_16.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_8.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_AA.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_Auto.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_Banding.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_Clear.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_CmpWithLCD.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_CopyFromLCD.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_CreateFixed.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_GetDataPtr.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_GetXSize.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_GetYSize.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_Measure.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_ReduceYSize.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_SetOrg.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_Usage.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_UsageBM.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_Write.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_WriteAlpha.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_WriteEx.c create mode 100644 User/system/lib/lcd/gui/MemDev/GUIDEV_XY2PTR.c create mode 100644 User/system/lib/lcd/gui/MultiLayer/CCGUIMultiLayer.bat create mode 100644 User/system/lib/lcd/gui/MultiLayer/LCD_1.c create mode 100644 User/system/lib/lcd/gui/MultiLayer/LCD_2.c create mode 100644 User/system/lib/lcd/gui/MultiLayer/LCD_3.c create mode 100644 User/system/lib/lcd/gui/MultiLayer/LCD_4.c create mode 100644 User/system/lib/lcd/gui/MultiLayer/LCD_IncludeDriver.h create mode 100644 User/system/lib/lcd/gui/MultiLayer/vssver.scc create mode 100644 User/system/lib/lcd/gui/WM/CCWM.bat create mode 100644 User/system/lib/lcd/gui/WM/WM.c create mode 100644 User/system/lib/lcd/gui/WM/WM.h create mode 100644 User/system/lib/lcd/gui/WM/WMMemDev.c create mode 100644 User/system/lib/lcd/gui/WM/WMTouch.c create mode 100644 User/system/lib/lcd/gui/WM/WM_AttachWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_BringToBottom.c create mode 100644 User/system/lib/lcd/gui/WM/WM_BringToTop.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Broadcast.c create mode 100644 User/system/lib/lcd/gui/WM/WM_CheckScrollPos.c create mode 100644 User/system/lib/lcd/gui/WM/WM_CriticalHandle.c create mode 100644 User/system/lib/lcd/gui/WM/WM_DIAG.c create mode 100644 User/system/lib/lcd/gui/WM/WM_EnableWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_ForEachDesc.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GUI.h create mode 100644 User/system/lib/lcd/gui/WM/WM_GetBkColor.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetClientRect.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetClientWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetDesktopWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetDesktopWindowEx.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetDiagInfo.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetDialogItem.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetFirstChild.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetFlags.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetFocussedWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetId.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetInsideRect.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetInsideRectExScrollbar.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetInvalidRect.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetNextSibling.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetOrg.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetParent.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetPrevSibling.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetScrollPartner.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetScrollState.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetScrollbar.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetWindowRect.c create mode 100644 User/system/lib/lcd/gui/WM/WM_GetWindowSize.c create mode 100644 User/system/lib/lcd/gui/WM/WM_HasCaptured.c create mode 100644 User/system/lib/lcd/gui/WM/WM_HasFocus.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Hide.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Intern.h create mode 100644 User/system/lib/lcd/gui/WM/WM_Intern_ConfDep.h create mode 100644 User/system/lib/lcd/gui/WM/WM_IsCompletelyVisible.c create mode 100644 User/system/lib/lcd/gui/WM/WM_IsEnabled.c create mode 100644 User/system/lib/lcd/gui/WM/WM_IsFocussable.c create mode 100644 User/system/lib/lcd/gui/WM/WM_IsVisible.c create mode 100644 User/system/lib/lcd/gui/WM/WM_IsWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_MakeModal.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Move.c create mode 100644 User/system/lib/lcd/gui/WM/WM_MoveChildTo.c create mode 100644 User/system/lib/lcd/gui/WM/WM_NotifyParent.c create mode 100644 User/system/lib/lcd/gui/WM/WM_OnKey.c create mode 100644 User/system/lib/lcd/gui/WM/WM_PID__GetPrevState.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Paint.c create mode 100644 User/system/lib/lcd/gui/WM/WM_ResizeWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Screen2Win.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SendMessageNoPara.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SendToParent.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetAnchor.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetCallback.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetCapture.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetCaptureMove.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetCreateFlags.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetDesktopColor.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetFocus.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetFocusOnNextChild.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetFocusOnPrevChild.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetId.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetScrollState.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetScrollbar.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetSize.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetTrans.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetTransState.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetUserClipRect.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetXSize.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetYSize.c create mode 100644 User/system/lib/lcd/gui/WM/WM_SetpfPollPID.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Show.c create mode 100644 User/system/lib/lcd/gui/WM/WM_StayOnTop.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Timer.c create mode 100644 User/system/lib/lcd/gui/WM/WM_TimerExternal.c create mode 100644 User/system/lib/lcd/gui/WM/WM_UserData.c create mode 100644 User/system/lib/lcd/gui/WM/WM_Validate.c create mode 100644 User/system/lib/lcd/gui/WM/WM_ValidateWindow.c create mode 100644 User/system/lib/lcd/gui/WM/WM__ForEachDesc.c create mode 100644 User/system/lib/lcd/gui/WM/WM__GetFirstSibling.c create mode 100644 User/system/lib/lcd/gui/WM/WM__GetFocussedChild.c create mode 100644 User/system/lib/lcd/gui/WM/WM__GetLastSibling.c create mode 100644 User/system/lib/lcd/gui/WM/WM__GetOrg_AA.c create mode 100644 User/system/lib/lcd/gui/WM/WM__GetPrevSibling.c create mode 100644 User/system/lib/lcd/gui/WM/WM__IsAncestor.c create mode 100644 User/system/lib/lcd/gui/WM/WM__IsChild.c create mode 100644 User/system/lib/lcd/gui/WM/WM__IsEnabled.c create mode 100644 User/system/lib/lcd/gui/WM/WM__NotifyVisChanged.c create mode 100644 User/system/lib/lcd/gui/WM/WM__Screen2Client.c create mode 100644 User/system/lib/lcd/gui/WM/WM__SendMessage.c create mode 100644 User/system/lib/lcd/gui/WM/WM__SendMessageIfEnabled.c create mode 100644 User/system/lib/lcd/gui/WM/WM__SendMessageNoPara.c create mode 100644 User/system/lib/lcd/gui/WM/WM__UpdateChildPositions.c create mode 100644 User/system/lib/lcd/gui/WM/vssver.scc create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON.h create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_BMP.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_Bitmap.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_Get.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_IsPressed.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_SelfDraw.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_SetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON_StreamedBitmap.c create mode 100644 User/system/lib/lcd/gui/Widget/BUTTON__SetBitmapObj.c create mode 100644 User/system/lib/lcd/gui/Widget/CCGUIWidget.bat create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX.h create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_GetState.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_Image.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_IsChecked.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetDefaultImage.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetImage.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetNumStates.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetSpacing.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetState.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetText.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/DIALOG.c create mode 100644 User/system/lib/lcd/gui/Widget/DIALOG.h create mode 100644 User/system/lib/lcd/gui/Widget/DIALOG_Intern.h create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN.h create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_DeleteItem.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_InsertString.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_ItemSpacing.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_SetAutoScroll.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextHeight.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT.h create mode 100644 User/system/lib/lcd/gui/Widget/EDITBin.c create mode 100644 User/system/lib/lcd/gui/Widget/EDITDec.c create mode 100644 User/system/lib/lcd/gui/Widget/EDITFloat.c create mode 100644 User/system/lib/lcd/gui/Widget/EDITHex.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_GetNumChars.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_SetCursorAtChar.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_SetInsertMode.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_SetSel.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_SetpfAddKeyEx.c create mode 100644 User/system/lib/lcd/gui/Widget/EDIT_SetpfUpdateBuffer.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN.h create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_AddMenu.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_Button.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonClose.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMax.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMin.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_Get.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_IsMinMax.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_MinMaxRest.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_SetBorderSize.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_SetColors.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_SetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_SetResizeable.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleHeight.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleVis.c create mode 100644 User/system/lib/lcd/gui/Widget/FRAMEWIN__UpdateButtons.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_ARRAY.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_ARRAY.h create mode 100644 User/system/lib/lcd/gui/Widget/GUI_ARRAY_DeleteItem.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_ARRAY_InsertItem.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_ARRAY_ResizeItem.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_DRAW.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_DRAW_BITMAP.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_DRAW_BMP.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_DRAW_STREAMED.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_DRAW_Self.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_EditBin.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_EditDec.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_EditFloat.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_EditHex.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_EditString.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_HOOK.c create mode 100644 User/system/lib/lcd/gui/Widget/GUI_HOOK.h create mode 100644 User/system/lib/lcd/gui/Widget/HEADER.c create mode 100644 User/system/lib/lcd/gui/Widget/HEADER.h create mode 100644 User/system/lib/lcd/gui/Widget/HEADER_BMP.c create mode 100644 User/system/lib/lcd/gui/Widget/HEADER_Bitmap.c create mode 100644 User/system/lib/lcd/gui/Widget/HEADER_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/HEADER_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/HEADER_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/HEADER_StreamedBitmap.c create mode 100644 User/system/lib/lcd/gui/Widget/HEADER__SetDrawObj.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX.h create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_DeleteItem.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_Font.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_GetItemText.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_GetNumItems.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_InsertString.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_ItemDisabled.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_ItemSpacing.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_MultiSel.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_ScrollStep.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetAutoScroll.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetOwner.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetOwnerDraw.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetScrollbarWidth.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetString.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTBOX_SetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW.h create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteColumn.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteRow.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetHeader.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumColumns.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumRows.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetSel.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_GetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetColumnWidth.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetGridVis.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemColor.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemText.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetLBorder.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetRBorder.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetRowHeight.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetSel.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU.h create mode 100644 User/system/lib/lcd/gui/Widget/MENU_Attach.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_DeleteItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_DisableItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_EnableItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_GetItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_GetItemText.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_GetNumItems.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_InsertItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_Popup.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/MENU_SetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_SetBorderSize.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_SetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_SetItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU_SetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/MENU__FindItem.c create mode 100644 User/system/lib/lcd/gui/Widget/MESSAGEBOX.c create mode 100644 User/system/lib/lcd/gui/Widget/MESSAGEBOX.h create mode 100644 User/system/lib/lcd/gui/Widget/MULTIEDIT.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIEDIT.h create mode 100644 User/system/lib/lcd/gui/Widget/MULTIEDIT_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIEDIT_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIPAGE.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIPAGE.h create mode 100644 User/system/lib/lcd/gui/Widget/MULTIPAGE_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIPAGE_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIPAGE_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/MULTIPAGE_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/PROGBAR.c create mode 100644 User/system/lib/lcd/gui/Widget/PROGBAR.h create mode 100644 User/system/lib/lcd/gui/Widget/PROGBAR_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/PROGBAR_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO.h create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_Image.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetDefaultImage.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetGroupId.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetImage.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetText.c create mode 100644 User/system/lib/lcd/gui/Widget/RADIO_SetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR.c create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR.h create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR_Defaults.c create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR_GetValue.c create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/SCROLLBAR_SetWidth.c create mode 100644 User/system/lib/lcd/gui/Widget/SLIDER.c create mode 100644 User/system/lib/lcd/gui/Widget/SLIDER.h create mode 100644 User/system/lib/lcd/gui/Widget/SLIDER_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/SLIDER_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT.h create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_Create.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_CreateIndirect.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_SetBkColor.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_SetFont.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_SetText.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_SetTextAlign.c create mode 100644 User/system/lib/lcd/gui/Widget/TEXT_SetTextColor.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET.h create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D1L.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D2L.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_Effect_None.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_Effect_Simple.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_FillStringInRect.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_SetEffect.c create mode 100644 User/system/lib/lcd/gui/Widget/WIDGET_SetWidth.c create mode 100644 User/system/lib/lcd/gui/Widget/WINDOW.c create mode 100644 User/system/lib/lcd/gui/Widget/WINDOW_Default.c create mode 100644 User/system/lib/lcd/gui/Widget/WINDOW_Private.h create mode 100644 User/system/lib/lcd/gui/Widget/vssver.scc create mode 100644 User/system/lib/lcd/image/readme/1719196693709.png create mode 100644 User/system/lib/lcd/image/readme/1719196745232.png create mode 100644 User/system/lib/lcd/lcd_sharp.c create mode 100644 User/system/lib/lcd/lcd_sharp.h create mode 100644 User/system/lib/lcd/lcd_st7525.c create mode 100644 User/system/lib/lcd/lcd_st7525.h create mode 100644 User/system/lib/lcd/lcds.c create mode 100644 User/system/lib/lcd/lcds.h create mode 100644 User/system/lib/lcd/readme.md create mode 100644 User/system/lib/menu/menu.c create mode 100644 User/system/lib/menu/menu.h create mode 100644 User/system/lib/readme.md create mode 100644 User/system/lib/src/aes.c create mode 100644 User/system/lib/src/clist.c create mode 100644 User/system/lib/src/cmac.c create mode 100644 User/system/lib/src/cmd.c create mode 100644 User/system/lib/src/data_analysis.c create mode 100644 User/system/lib/src/debug.c create mode 100644 User/system/lib/src/filter.c create mode 100644 User/system/lib/src/lib.c create mode 100644 User/system/lib/src/malloc.c create mode 100644 User/system/lib/src/mlist.c create mode 100644 User/system/lib/src/pbuf.c create mode 100644 User/system/lib/src/sqqueue.c create mode 100644 User/system/lib/src/storage.c create mode 100644 User/system/lib/src/wl_flash.c create mode 100644 User/system/lib/unity/unity.c create mode 100644 User/system/lib/unity/unity.h create mode 100644 User/system/lib/unity/unity_config.h create mode 100644 User/system/lib/unity/unity_internals.h create mode 100644 User/system/os.h create mode 100644 User/system/readme.txt create mode 100644 User/system/sys.c create mode 100644 User/system/sys.h diff --git a/User/system/bsp/adcs.c b/User/system/bsp/adcs.c new file mode 100644 index 0000000..2243bc7 --- /dev/null +++ b/User/system/bsp/adcs.c @@ -0,0 +1,416 @@ +/** + * @file adcs.c + * @author xxx + * @date 2023-09-04 15:59:16 + * @brief LL库ADC驱动 STM32F407 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "adcs.h" +#include "dmas.h" +adcs_t adcs[ADCS_MAX]; + +static uint8_t adc_get_channels_count(uint32_t channnels); // 通过用户配置的通道号获取通道数量 + +/** + * @brief ADC初始化 + * @param {adcs_e} num ADC编号 + * @param {ADC_TypeDef} *adc ADC外设 + * @param {DMA_TypeDef} *dma DMA外设 + * @param {uint32_t} dma_channel DMA通道 + * @param {uint8_t} adc_cct ADC采样次数 + * @param {uint32_t} channels 存储数据所在的序列号 + * @return {*} + * @note TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数) + */ +void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_stream, uint32_t dma_channel, uint16_t adc_cct, uint32_t channels) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + DBG_ASSERT(adc != NULL __DBG_LINE); + DBG_ASSERT(dma != NULL __DBG_LINE); + DBG_ASSERT(adc_cct > 0 __DBG_LINE); + + adcs_t *p = &adcs[num]; + osel_memset((uint8_t *)p, 0, sizeof(adcs_t)); + p->adc = adc; + p->dma = dma; + p->dma_stream = dma_stream; + p->dma_channel = dma_channel; + p->channels.data = channels; + p->adc_cct = adc_cct; + p->adc_chans_count = adc_get_channels_count(channels); + p->adc_sum = adc_cct * p->adc_chans_count; + +#if defined(SRAM2_BASE) // SRAM2速度更快 + p->adc_value = (uint16_t *)osel_mem_alloc2(sizeof(uint16_t) * p->adc_sum); +#else + p->adc_value = (uint16_t *)osel_mem_alloc(sizeof(uint16_t) * p->adc_sum); +#endif + + DBG_ASSERT(p->adc_value != NULL __DBG_LINE); + osel_memset((uint8_t *)p->adc_value, 0, sizeof(uint16_t) * p->adc_sum); + + LL_DMA_SetChannelSelection(p->dma, p->dma_stream, p->dma_channel); + LL_DMA_ConfigTransfer(p->dma, p->dma_stream, + LL_DMA_DIRECTION_PERIPH_TO_MEMORY | + LL_DMA_MODE_CIRCULAR | + LL_DMA_PERIPH_NOINCREMENT | + LL_DMA_MEMORY_INCREMENT | + LL_DMA_PDATAALIGN_HALFWORD | + LL_DMA_MDATAALIGN_HALFWORD | + LL_DMA_PRIORITY_HIGH); + LL_DMA_ConfigAddresses(p->dma, p->dma_stream, + LL_ADC_DMA_GetRegAddr(p->adc, LL_ADC_DMA_REG_REGULAR_DATA), + (uint32_t)p->adc_value, + LL_DMA_GetDataTransferDirection(p->dma, p->dma_stream)); + + LL_DMA_SetDataLength(p->dma, p->dma_stream, p->adc_sum); + LL_DMA_EnableStream(p->dma, p->dma_stream); + + LL_ADC_REG_SetContinuousMode(p->adc, LL_ADC_REG_CONV_CONTINUOUS); + LL_ADC_REG_SetDMATransfer(p->adc, LL_ADC_REG_DMA_TRANSFER_UNLIMITED); + + if (BIT_IS_SET(channels, INVREF)) + { + // 使能VREFINT + LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(p->adc), LL_ADC_PATH_INTERNAL_VREFINT); + } + if (BIT_IS_SET(channels, INTEMP)) + { + LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(p->adc), LL_ADC_PATH_INTERNAL_TEMPSENSOR); + } + + LL_mDelay(10); + // 启动 ADC 转换 + LL_ADC_Enable(p->adc); + LL_ADC_REG_StartConversionSWStart(p->adc); +} + +/** + * @brief 启动样本 + * + * 根据给定的 ADCS 枚举值启动 ADC 样本校准。 + * + * @param num ADCS 枚举值 + */ +void start_sample(adcs_e num) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + // adcs_t *p = &adcs[num]; +} + +/** + * @brief 停止样本采集 + * + * 根据给定的 ADCS 枚举值,停止相应的 ADCS 样本采集。 + * + * @param num ADCS 枚举值 + */ +void stop_sample(adcs_e num) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + // adcs_t *p = &adcs[num]; +} + +/** + * @brief ADC重新开始转换 + * @param {adcs_e} num ADC编号 + * @return {*} + * @note + */ +void adc_restart(adcs_e num) +{ + stop_sample(num); + start_sample(num); +} + +/** + * @brief ADC反初始化 + * @param {adcs_e} num ADC编号 + * @return {*} + * @note + */ +void adc_dinit(adcs_e num) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + adcs_t *p = &adcs[num]; + LL_ADC_Disable(p->adc); + if (p->adc_value != NULL) + { +#if defined(SRAM2_BASE) + osel_mem_free2((uint16_t *)p->adc_value); +#else + osel_mem_free((uint16_t *)p->adc_value); +#endif + } +} +/** + * @brief 获取ADC转换结果,只需要第一个值 + * @param {adcs_e} num + * @param {uint8_t} chan + * @return {*} + * @note + */ +uint16_t adc_result_only_one(adcs_e num, uint8_t chan) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + adcs_t *p = &adcs[num]; + DBG_ASSERT(p != NULL __DBG_LINE); + uint16_t(*gram)[p->adc_chans_count] = (uint16_t(*)[p->adc_chans_count])p->adc_value; + return gram[0][chan]; +} + +/** + * @brief 中位值平均滤波,获取ADC转换结果 + * @param {adcs_e} num ADC编号 + * @param {uint8_t} chan 存储数据所在的序列号 + * @return {*} + * @note 不适合在中断中使用,因为排序算法时间复杂度为O(n^2) + */ +uint16_t adc_result_median_average(adcs_e num, uint8_t chan) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + adcs_t *p = &adcs[num]; + DBG_ASSERT(p != NULL __DBG_LINE); + + if (p->adc_cct <= 2) + return 0; // 如果adc_cct小于等于2,直接返回0 + + uint16_t adc_temp[p->adc_cct]; + uint32_t adc_sum = 0; + uint16_t count = p->adc_cct >> 2; // 使用位移操作计算n的值 + + // 减少重复计算,计算基础偏移量 + uint16_t *adc_values = (uint16_t *)p->adc_value + chan; + for (uint16_t i = 0; i < p->adc_cct; ++i, adc_values += p->adc_chans_count) + { + adc_temp[i] = *adc_values; + } + + insertion_sort(adc_temp, p->adc_cct); + + // 计算中间部分的和 + for (uint16_t i = count; i < p->adc_cct - count; ++i) + { + adc_sum += adc_temp[i]; + } + + // 计算平均值,确保不会除以0 + uint16_t res = adc_sum / (p->adc_cct - (count << 1)); + return res; +} + +/** + * @brief 中位值滤波,获取ADC转换结果 + * @param {adcs_e} num ADC编号 + * @param {uint8_t} chan 存储数据所在的序列号 + * @return {*} + * @note 不适合在中断中使用,因为排序算法时间复杂度为O(n^2) + */ +uint16_t adc_result_median(adcs_e num, uint8_t chan) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + uint16_t res = 0; + adcs_t *p = &adcs[num]; + DBG_ASSERT(p != NULL __DBG_LINE); + + uint16_t adc_temp[p->adc_cct]; + // 减少重复计算,计算基础偏移量 + uint16_t *adc_values = (uint16_t *)p->adc_value + chan; + for (uint16_t i = 0; i < p->adc_cct; ++i, adc_values += p->adc_chans_count) + { + adc_temp[i] = *adc_values; + } + insertion_sort(adc_temp, p->adc_cct); + res = adc_temp[p->adc_cct >> 1]; + return res; +} + +/** + * @brief 平均值,获取ADC转换结果 + * @param {adcs_e} num ADC编号 + * @param {uint8_t} chan 存储数据所在的序列号 + * @return {*} + * @note + */ +uint16_t adc_result_average(adcs_e num, uint8_t chan) +{ + DBG_ASSERT(num < ADCS_MAX __DBG_LINE); + uint16_t res = 0; + uint32_t adc_sum = 0; + adcs_t *p = &adcs[num]; + DBG_ASSERT(p != NULL __DBG_LINE); + + // 减少重复计算,计算基础偏移量 + uint16_t *adc_values = (uint16_t *)p->adc_value + chan; + for (uint16_t i = 0; i < p->adc_cct; ++i, adc_values += p->adc_chans_count) + { + adc_sum += *adc_values; + } + res = adc_sum / p->adc_cct; + + return res; +} + +/** + * @brief 计算内部温度 + * @param {uint16_t} adc_value ADC转换结果 + * @return {*} + * @note 计算公式为:(measure * VDD_APPLI / VDD_CALIB) - (int32_t)*TEMP30_CAL_ADDR) * (int32_t)(130 - 30) / (int32_t)(*TEMP130_CAL_ADDR - *TEMP30_CAL_ADDR)) + 30 + * adc_value 是从ADC读取的温度传感器数据。 + TS_CAL1 是在30°C时校准的温度传感器数据,地址为TEMPSENSOR_CAL1_ADDR。 + TS_CAL2 是在110°C时校准的温度传感器数据,地址为TEMPSENSOR_CAL2_ADDR。 + TEMPSENSOR_CAL1_TEMP 是30°C。 + TEMPSENSOR_CAL2_TEMP 是110°C。 + */ +float32 adc_result_temperature(uint16_t adc_value) +{ + uint16_t ts_cal1 = *TEMPSENSOR_CAL1_ADDR; + uint16_t ts_cal2 = *TEMPSENSOR_CAL2_ADDR; + + float32 temperature = ((float32)(adc_value - ts_cal1) / (ts_cal2 - ts_cal1)) * (TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP) + TEMPSENSOR_CAL1_TEMP; + return temperature; +} + +/** + * @brief 计算内部电压 + * @param {uint16_t} adc_value ADC转换结果 + * @return {*} 电压值V + * @note + */ +float32 adc_result_value_local(uint16_t adc_value) +{ + float32 vdd = (VREFINT_CAL_VREF * (*VREFINT_CAL_ADDR)) / 4095; + return ((vdd / adc_value) * 4095) / 1000; +} + +/** + * @brief ADC DMA转换回调函数 +{ + * @param {adcs_e} num ADC编号 + * @return {*} + * @note + */ +void adc_dma_callback(adcs_e num) +{ + adcs_t *p = &adcs[num]; + DBG_ASSERT(p != NULL __DBG_LINE); + if (LL_DMA_IsActiveFlag_TC1(p->dma) != 0) + { + LL_DMA_ClearFlag_TC1(p->dma); + } + // 检查DMA1的传输错误标志是否为1,如果是,则清除该标志 + if (LL_DMA_IsActiveFlag_TE1(p->dma) != 0) + { + LL_DMA_ClearFlag_TE1(p->dma); + } +} + +/** + * @brief ADC回调函数 + * @param {adcs_e} num ADC编号 + * @return {*} + * @note + */ +void adc_env_callback(adcs_e num) +{ + adcs_t *p = &adcs[num]; + DBG_ASSERT(p != NULL __DBG_LINE); + if (LL_ADC_IsActiveFlag_OVR(p->adc) != 0) + { + p->ovr_count++; + LL_ADC_ClearFlag_OVR(p->adc); + } +} + +/** + * @brief 通过用户配置的通道号获取通道数量 + * @param {uint32_t} channnels 存储数据所在的序列号 + * @return {*} + * @note + */ +static uint8_t adc_get_channels_count(uint32_t channnels) +{ + uint8_t ch_num = 0; + if (BIT_IS_SET(channnels, IN0)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN1)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN2)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN3)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN4)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN5)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN6)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN7)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN8)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN9)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN10)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN11)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN12)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN13)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN14)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN15)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, IN16)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, INVREF)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, INVBAT)) + { + ch_num++; + } + if (BIT_IS_SET(channnels, INTEMP)) + { + ch_num++; + } + return ch_num; +} diff --git a/User/system/bsp/adcs.h b/User/system/bsp/adcs.h new file mode 100644 index 0000000..ede7800 --- /dev/null +++ b/User/system/bsp/adcs.h @@ -0,0 +1,228 @@ +/** + * @file adcs.h + * @brief Header file for ADC driver using LL library. + * + * This file contains the declarations and documentation for the ADC driver + * using the LL (Low-Level) library. + * + * @date 2023-09-04 15:59:16 + * @author xxx + * @version 1.0 + * + * @note This code is proprietary and confidential. + * Unauthorized copying of this file, via any medium is strictly prohibited. + * + * @note All rights reserved by xxx. + */ + +#ifndef __ADCS_H__ +#define __ADCS_H__ +#include "sys.h" + +#define ADC_CHANNEL_MAX 18 ///< Maximum number of ADC channels +typedef enum +{ + IN0 = BIT0, + IN1 = BIT1, + IN2 = BIT2, + IN3 = BIT3, + IN4 = BIT4, + IN5 = BIT5, + IN6 = BIT6, + IN7 = BIT7, + IN8 = BIT8, + IN9 = BIT9, + IN10 = BIT10, + IN11 = BIT11, + IN12 = BIT12, + IN13 = BIT13, + IN14 = BIT14, + IN15 = BIT15, + IN16 = BIT16, + INTEMP = BIT17, + INVBAT = BIT18, + INVREF = BIT19, +} adc_num_e; ///< ADC channel number + +typedef enum +{ + ADCS_1, + ADCS_2, + ADCS_3, + ADCS_MAX, +} adcs_e; ///< ADC number + +typedef union +{ + uint32_t data; + struct + { + uint32_t in0 : 1; + uint32_t in1 : 1; + uint32_t in2 : 1; + uint32_t in3 : 1; + uint32_t in4 : 1; + uint32_t in5 : 1; + uint32_t in6 : 1; + uint32_t in7 : 1; + uint32_t in8 : 1; + uint32_t in9 : 1; + uint32_t in10 : 1; + uint32_t in11 : 1; + uint32_t in12 : 1; + uint32_t in13 : 1; + uint32_t in14 : 1; + uint32_t in15 : 1; + uint32_t invref : 1; + uint32_t intemp : 1; + }; +} adcs_channels_u; ///< ADC channels + +typedef struct +{ + ADC_TypeDef *adc; ///< ADC peripheral + DMA_TypeDef *dma; ///< DMA peripheral + uint32_t dma_stream; ///< DMA stream + uint32_t dma_channel; ///< DMA channel + adcs_channels_u channels; ///< ADC channels + uint32_t ovr_count; ///< ADC overflow count + + uint16_t adc_cct; ///< Channel single acquisition count + uint8_t adc_chans_count; ///< Number of channels + uint16_t adc_sum; ///< Channel acquisition count + __IO uint16_t *adc_value; ///< Address to store ADC conversion results + +} adcs_t; + +/** + * @brief Initializes the ADC module. + * + * This function initializes the ADC module with the specified parameters. + * + * @param num The ADC number. + * @param adc Pointer to the ADC peripheral. + * @param dma Pointer to the DMA peripheral. + * @param dma_channel The DMA channel number. + * @param adc_cct The ADC continuous conversion mode. + * @param channels The number of ADC channels to be converted. + */ +extern void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_stream, uint32_t dma_channel, uint16_t adc_cct, uint32_t channels); + +/** + * @brief Starts the ADC conversion. + * + * This function starts the ADC conversion for the specified ADC number. + * + * @param num The ADC number. + */ +extern void adc_restart(adcs_e num); + +/** + * @brief Deinitializes the ADC module. + * + * This function deinitializes the ADC module. + * + * @param num The ADC number. + */ +extern void adc_dinit(adcs_e num); + +/** + * @brief Gets the ADC conversion result for a single channel. + * + * This function gets the ADC conversion result for a single channel. + * It returns only the first converted value. + * + * @param num The ADC number. + * @param chan The ADC channel number. + * @return The ADC conversion result. + */ +extern uint16_t adc_result_only_one(adcs_e num, uint8_t chan); + +/** + * @brief Gets the ADC conversion result using median average filtering. + * + * This function gets the ADC conversion result for a single channel. + * It applies median average filtering to the converted values. + * + * @param num The ADC number. + * @param chan The ADC channel number. + * @return The ADC conversion result. + */ +extern uint16_t adc_result_median_average(adcs_e num, uint8_t chan); + +/** + * @brief Gets the ADC conversion result using median filtering. + * + * This function gets the ADC conversion result for a single channel. + * It applies median filtering to the converted values. + * + * @param num The ADC number. + * @param chan The ADC channel number. + * @return The ADC conversion result. + */ +extern uint16_t adc_result_median(adcs_e num, uint8_t chan); + +/** + * @brief Gets the ADC conversion result using average filtering. + * + * This function gets the ADC conversion result for a single channel. + * It applies average filtering to the converted values. + * + * @param num The ADC number. + * @param chan The ADC channel number. + * @return The ADC conversion result. + */ +extern uint16_t adc_result_average(adcs_e num, uint8_t chan); + +/** + * @brief Gets the ADC conversion result using N-times average filtering. + * + * This function gets the ADC conversion result for a single channel. + * It applies N-times average filtering to the converted values. + * + * @param num The ADC number. + * @param chan The ADC channel number. + * @return The ADC conversion result. + */ +extern uint16_t adc_result_n_average(adcs_e num, uint8_t chan); + +/** + * @brief Calculates the temperature from the ADC conversion result. + * + * This function calculates the temperature in degrees Celsius + * from the ADC conversion result of the internal temperature sensor. + * + * @param adc_value The ADC conversion result. + * @return The temperature in degrees Celsius. + */ +extern float32 adc_result_temperature(uint16_t adc_value); + +/** + * @brief Calculates the voltage from the ADC conversion result. + * + * This function calculates the voltage in millivolts + * from the ADC conversion result of the internal voltage reference. + * + * @param adc_value The ADC conversion result. + * @return The voltage in millivolts. + */ +extern float32 adc_result_value_local(uint16_t adc_value); + +/** + * @brief ADC environment callback function. + * + * This function is called when an ADC conversion is completed. + * + * @param num The ADC number. + */ +extern void adc_env_callback(adcs_e num); + +/** + * @brief DMA callback function for ADC. + * + * This function is called when a DMA transfer for ADC is completed. + * + * @param num The ADC number. + */ +extern void adc_dma_callback(adcs_e num); +#endif ///< __ADCS_H__ diff --git a/User/system/bsp/bsp.c b/User/system/bsp/bsp.c new file mode 100644 index 0000000..ab47573 --- /dev/null +++ b/User/system/bsp/bsp.c @@ -0,0 +1,90 @@ + +#include "bsp.h" + +#define EXIT_LINE LL_EXTI_LINE_16 + +pvd_irq_handle_cb pvd_irq_handle_cb_func = NULL; +/** + * @brief 配置PVD(电源电压检测) + * + * 根据给定的电源电压等级配置PVD(电源电压检测)。 + * + * @param pwr_level 电源电压等级 + * @param call PVD中断处理回调函数 + */ +void pvd_configuration(uint32_t pwr_level, pvd_irq_handle_cb call) +{ +// pvd_irq_handle_cb_func = call; +// // 启用电源时钟 +// LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); + +// // 设置PVD电平阈值,例如设置为2.4V LL_PWR_PVDLEVEL_2 +// LL_PWR_SetPVDLevel(pwr_level); + +// // 启用PVD +// LL_PWR_EnablePVD(); + +// // 配置PVD中断 +// LL_EXTI_EnableIT_0_31(EXIT_LINE); // PVD连接到EXTI Line +// LL_EXTI_EnableRisingTrig_0_31(EXIT_LINE); +// LL_EXTI_EnableFallingTrig_0_31(EXIT_LINE); + +// // 启用PVD中断向量 +// NVIC_EnableIRQ(PVD_PVM_IRQn); +// NVIC_SetPriority(PVD_PVM_IRQn, 0); +} + +/** + * @brief 处理PVD中断 + * + * 当PVD中断触发时,该函数将被调用以处理中断事件。 + * + * @note 无返回值 + */ +void pvd_irq_handle(void) +{ +// if (LL_EXTI_IsActiveFlag_0_31(EXIT_LINE)) +// { +// LL_EXTI_ClearFlag_0_31(EXIT_LINE); +// if (pvd_irq_handle_cb_func != NULL) +// { +// pvd_irq_handle_cb_func(); +// } +// } +} + +/** + * @brief 禁用调试接口 + * + * 禁用设备的调试接口,包括关闭调试停止模式、调试待机模式和调试睡眠模式。 + * 同时将 SWD 和 JTAG 接口的引脚配置为普通 GPIO。 + * + * @note disable_debug_interface调用后 SWD 接口会被关闭,ST-LINK 等调试工具无法通过 SWD 连接 MCU,也无法使用 STM32 ST-LINK Utility 软件 通过 ST-LINK 连接MCU解除读保护 + * 解除读保护流程:Read Out Protection : 改为 Level 0 ,调整为 Level 0 后 Flash 中的程序会被自动擦除。注意:千万不要改为 Level 2 ,改成Level 2 后 MCU 将会被彻底锁死,相当于熔断保护,无法通过软件再恢复。 + */ +void disable_debug_interface(void) +{ +// // 使能 SYSCFG 时钟 +// LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); + +// // 关闭调试接口 +// LL_DBGMCU_DisableDBGStopMode(); +// LL_DBGMCU_DisableDBGStandbyMode(); +// LL_DBGMCU_DisableDBGSleepMode(); + +// // 关闭 SWD 和 JTAG 接口 +// LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + +// // 配置 SWDIO (PA13) 和 SWCLK (PA14) 引脚为普通 GPIO +// GPIO_InitStruct.Pin = LL_GPIO_PIN_13 | LL_GPIO_PIN_14; +// GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; +// GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; +// LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + +// // 如果使用的是 JTAG 接口,还需要配置 JTDI (PA15), JTDO (PB3), 和 NJTRST (PB4) 引脚 +// GPIO_InitStruct.Pin = LL_GPIO_PIN_15; +// LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + +// GPIO_InitStruct.Pin = LL_GPIO_PIN_3 | LL_GPIO_PIN_4; +// LL_GPIO_Init(GPIOB, &GPIO_InitStruct); +} diff --git a/User/system/bsp/bsp.h b/User/system/bsp/bsp.h new file mode 100644 index 0000000..f37170a --- /dev/null +++ b/User/system/bsp/bsp.h @@ -0,0 +1,33 @@ +/** + * @file bsp.h + * @brief This file contains the declarations and definitions for the BSP (Board Support Package) module. + * + * The BSP module provides functions and configurations specific to the hardware platform, such as initializing + * peripherals, configuring GPIO pins, and managing interrupts. + * + * @author xxx + * @date 2023-12-27 14:44:03 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __BSP_H__ +#define __BSP_H__ + +#include "gpios.h" +// #include "dmas.h" +// #include "adcs.h" +// #include "dacs.h" +// #include "tims.h" +// #include "pwms.h" +// #include "uarts.h" +// #include "eeprom.h" +// #include "spis.h" +// #include "i2cs.h" + +///< 定义回调函数类型 +typedef void (*pvd_irq_handle_cb)(void); + +extern void pvd_configuration(uint32_t pwr_level, pvd_irq_handle_cb call); ///< Configures the Programmable Voltage Detector (PVD) module +extern void pvd_irq_handle(void); ///< Handles the PVD interrupt +extern void disable_debug_interface(void); ///< Disables the debug interface + +#endif ///< __BSP_H__ diff --git a/User/system/bsp/dacs.c b/User/system/bsp/dacs.c new file mode 100644 index 0000000..2485e65 --- /dev/null +++ b/User/system/bsp/dacs.c @@ -0,0 +1,52 @@ +/** + * @file dacs.c + * @brief This file contains the implementation of the DAC module. + * It provides functions to initialize and de-initialize a DAC instance, + * as well as write a 16-bit value to the specified DAC channel. + * @author xxx + * @date 2023-12-27 14:44:03 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#include "dacs.h" + +/** + * @brief Writes a 16-bit value to the specified DAC channel + * + * @param dac pointer to the DAC instance + * @param value 16-bit value to write to the DAC + */ +static void _out(dac_t *dac, uint16_t value) +{ + DBG_ASSERT(dac != NULL __DBG_LINE); + DAC_OUT(dac->dac, dac->dac_channel, value); +} + +/** + * @brief Initializes a DAC instance + * + * @param dac pointer to the DAC instance + * @param dac_channel DAC channel to use + * @return pointer to the initialized DAC instance + */ +dac_t *dac_create(DAC_TypeDef *dac, uint16_t dac_channel) +{ + DBG_ASSERT(dac != NULL __DBG_LINE); + dac_t *handle = (dac_t *)osel_mem_alloc(sizeof(dac_t)); + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->dac = dac; + handle->dac_channel = dac_channel; + + handle->out = _out; + return handle; +} + +/** + * @brief De-initializes a DAC instance + * + * @param dac pointer to the DAC instance + */ +void dac_free(dac_t *dac) +{ + DBG_ASSERT(dac != NULL __DBG_LINE); + osel_mem_free(dac); +} diff --git a/User/system/bsp/dacs.h b/User/system/bsp/dacs.h new file mode 100644 index 0000000..56e68a7 --- /dev/null +++ b/User/system/bsp/dacs.h @@ -0,0 +1,55 @@ +/** + * @file dacs.h + * @brief Header file for DACs module. + * + * This file contains the declarations and definitions for the DACs module. + * DACs (Digital-to-Analog Converters) are used to convert digital signals into analog voltages. + * + * @author xxx + * @date 2023-12-27 14:44:03 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __DACS_H__ +#define __DACS_H__ +#include "dac.h" +#include "lib.h" +#include "main.h" + +/** + * @brief Set the output value for a specific DAC channel. + * @param dac: pointer to the @ref dac_t structure that contains the configuration information for the specified DAC. + * @param value: the output value to be set. + * @retval None + */ +#define DAC_OUT(DACx, DAC_Channel, Data) \ + do \ + { \ + LL_DAC_ConvertData12RightAligned(DACx, DAC_Channel, Data); \ + LL_DAC_TrigSWConversion(DACx, DAC_Channel); \ + } while (__LINE__ == -1) + +/** + * @brief Enable the specified DAC channel. + * @param dac: pointer to the @ref dac_t structure that contains the configuration information for the specified DAC. + * @retval None + */ +#define DAC_START(DACx, DAC_Channel) LL_DAC_Enable(DACx, DAC_Channel) + +/** + * @brief Disable the specified DAC channel. + * @param dac: pointer to the @ref dac_t structure that contains the configuration information for the specified DAC. + * @retval None + */ +#define DAC_STOP(DACx, DAC_Channel) LL_DAC_Disable(DACx, DAC_Channel) + +/** + * @brief Structure definition for the DAC driver. + */ +typedef struct DACS +{ + DAC_TypeDef *dac; + uint16_t dac_channel; + + void (*out)(struct DACS *dac, uint16_t value); +} dac_t; +#endif diff --git a/User/system/bsp/dmas.h b/User/system/bsp/dmas.h new file mode 100644 index 0000000..6ef1a61 --- /dev/null +++ b/User/system/bsp/dmas.h @@ -0,0 +1,135 @@ +#ifndef __DMAS_H__ +#define __DMAS_H__ + +/** + * @brief 清除DMA传输完成标志 + * @param {DMA_HandleTypeDef} *DMAX DMA总线句柄 + * @param {uint32_t} CHx DMA通道号 + * @return {*} 操作结果 + * @note: 该宏用于清除DMA总线的传输完成标志。它首先检查DMA总线的传输完成标志是否已置位,如果已置位,则清除该标志。 + */ +#define DMA_ClEAR_FLAG_TC(DMAX, CHx) \ + do \ + { \ + if (LL_DMA_IsActiveFlag_TC##CHx(DMAX)) \ + { \ + LL_DMA_ClearFlag_TC##CHx(DMAX); \ + } \ + } while (__LINE__ == -1) + +/** + * @brief 清除DMA传输错误标志 + * @param {DMA_HandleTypeDef} *DMAX DMA总线句柄 + * @param {uint32_t} CHx DMA通道号 + * @return {*} 操作结果 + * @note: 该宏用于清除DMA总线的传输错误标志。它首先检查DMA总线的传输错误标志是否已置位,如果已置位,则清除该标志。 + */ +#define DMA_ClEAR_FLAG_TE(DMAX, CHx) \ + do \ + { \ + if (LL_DMA_IsActiveFlag_TE##CHx(DMAX)) \ + { \ + LL_DMA_ClearFlag_TE##CHx(DMAX); \ + } \ + } while (__LINE__ == -1) + +/** + * @file uarts.c + * @brief This file contains the implementation of DMA_CLEAR_FLAG_TC_CHANNEL macro. + */ + +/** + * @brief Clear the Transfer Complete (TC) flag of a specific DMA channel. + * + * @param dma The DMA peripheral. + * @param channel The DMA channel number. + */ +#define DMA_CLEAR_FLAG_TC_CHANNEL(dma, channel) \ + switch (channel) \ + { \ + case LL_DMA_CHANNEL_1: \ + DMA_ClEAR_FLAG_TC(dma, 1); \ + break; \ + case LL_DMA_CHANNEL_2: \ + DMA_ClEAR_FLAG_TC(dma, 2); \ + break; \ + case LL_DMA_CHANNEL_3: \ + DMA_ClEAR_FLAG_TC(dma, 3); \ + break; \ + case LL_DMA_CHANNEL_4: \ + DMA_ClEAR_FLAG_TC(dma, 4); \ + break; \ + case LL_DMA_CHANNEL_5: \ + DMA_ClEAR_FLAG_TC(dma, 5); \ + break; \ + case LL_DMA_CHANNEL_6: \ + DMA_ClEAR_FLAG_TC(dma, 6); \ + break; \ + case LL_DMA_CHANNEL_7: \ + DMA_ClEAR_FLAG_TC(dma, 7); \ + break; \ + default: \ + break; \ + } + +/** + * @brief Clear the Transfer Error (TE) flag for the specified DMA channel. + * + * @param dma The DMA peripheral. + * @param channel The DMA channel number. + */ +#define DMA_CLEAR_FLAG_TE_CHANNEL(dma, channel) \ + switch (channel) \ + { \ + case 1: \ + DMA_ClEAR_FLAG_TE(dma, 1); \ + break; \ + case 2: \ + DMA_ClEAR_FLAG_TE(dma, 2); \ + break; \ + case 3: \ + DMA_ClEAR_FLAG_TE(dma, 3); \ + break; \ + case 4: \ + DMA_ClEAR_FLAG_TE(dma, 4); \ + break; \ + case 5: \ + DMA_ClEAR_FLAG_TE(dma, 5); \ + break; \ + case 6: \ + DMA_ClEAR_FLAG_TE(dma, 6); \ + break; \ + case 7: \ + DMA_ClEAR_FLAG_TE(dma, 7); \ + break; \ + default: \ + break; \ + } + +/** + * @brief Clears the flags of a DMA channel + * @param DMAX DMAx register base + * @param CHx DMA channel number + * @param Flag a boolean variable that indicates if the transfer is complete + * @note This function should be called within the interrupt service routine of the DMA channel + */ +#define DMA_ClEAR_FLAG(DMAX, CHx, Flag) \ + do \ + { \ + if (LL_DMA_IsActiveFlag_TC##CHx(DMAX)) \ + { \ + LL_DMA_ClearFlag_TC##CHx(DMAX); \ + LL_DMA_ClearFlag_GI##CHx(DMAX); \ + Flag = TRUE; \ + } \ + if (LL_DMA_IsActiveFlag_TE##CHx(DMAX)) \ + { \ + LL_DMA_ClearFlag_TE##CHx(DMAX); \ + } \ + if (LL_DMA_IsActiveFlag_GI##CHx(DMAX)) \ + { \ + LL_DMA_ClearFlag_GI##CHx(DMAX); \ + } \ + } while (__LINE__ == -1) + +#endif // __DMAS_H__ diff --git a/User/system/bsp/eeprom.c b/User/system/bsp/eeprom.c new file mode 100644 index 0000000..6be9a42 --- /dev/null +++ b/User/system/bsp/eeprom.c @@ -0,0 +1,91 @@ +/** + * @file eeprom.c + * @author xxx + * @date 2023-11-16 10:28:47 + * @brief STM32L072xx EEPROM 驱动 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ +#include "eeprom.h" +#include "main.h" + +#ifdef STM32L072xx +#define PEKEY1 0x89ABCDEF // FLASH_PEKEYR +#define PEKEY2 0x02030405 // FLASH_PEKEYR + +#define LOCK __enable_irq(); // 系统开全局中断 +#define UNLOCK __disable_irq(); // 系统关全局中断 + +/** + * @brief 用于配置读取和写入EEPROM的函数 + * @param {uint32_t} read_addr - 读取地址 + * @param {uint8_t} *data - 存储数据的指针 + * @param {uint16_t} length - 读取或写入的数据长度 + * @return {*} + * @note: 这些函数用于在特定的地址读取或写入数据到EEPROM中。地址和数据以字节为单位,长度以字节为单位。 + */ +void chip_eeprom_config_read(uint32_t read_addr, uint8_t *data, uint16_t length) +{ + uint8_t *wAddr; + wAddr = (uint8_t *)(read_addr); + while (length--) + { + *data++ = *wAddr++; + } +} + +/** + * @brief 用于配置写入EEPROM的函数 + * @param {uint32_t} write_addr - 写入地址 + * @param {uint8_t} *data - 存储数据的指针 + * @param {uint16_t} length - 写入的数据长度 + * @return {*} + * @note: 这些函数用于在特定的地址写入数据到EEPROM中。地址和数据以字节为单位,长度以字节为单位。在写入数据之前,需要先解锁EEPROM,写入数据,然后锁定EEPROM。 + */ +void chip_eeprom_config_write(uint32_t write_addr, uint8_t *data, uint16_t length) +{ + uint8_t *addr; + addr = (uint8_t *)(write_addr); + UNLOCK + FLASH->PDKEYR = PEKEY1; + FLASH->PDKEYR = PEKEY2; + while (FLASH->PECR & FLASH_PECR_PELOCK) + ; + + while (length--) + { + *addr++ = *data++; + while (FLASH->SR & FLASH_SR_BSY) + ; + } + FLASH->PECR |= FLASH_PECR_PELOCK; + LOCK +} + +#endif // STM32L072xx + +#ifdef STM32L476xx + +/** + * @brief 用于配置读取和写入SRAM2的函数 + * @param {uint32_t} read_addr - 读取地址 + * @param {uint8_t} *data - 存储数据的指针 + * @param {uint16_t} length - 读取或写入的数据长度 + * @return {*} + * @note: 这些函数用于在特定的地址读取或写入数据到SRAM2中。地址和数据以字节为单位,长度以字节为单位。 + */ +void chip_eeprom_config_read(uint32_t read_addr, uint8_t *data, uint16_t length) +{ +} + +/** + * @brief 用于配置写入SRAM2的函数 + * @param {uint32_t} write_addr - 写入地址 从0开始 + * @param {uint8_t} *data - 存储数据的指针 + * @param {uint16_t} length - 写入的数据长度 + * @return {*} + * @note: 这些函数用于在特定的地址写入数据到SRAM2中。地址和数据以字节为单位,长度以字节为单位。 + */ +void chip_eeprom_config_write(uint32_t write_addr, uint8_t *data, uint16_t length) +{ +} +#endif // STM32L476xx diff --git a/User/system/bsp/eeprom.h b/User/system/bsp/eeprom.h new file mode 100644 index 0000000..42ea792 --- /dev/null +++ b/User/system/bsp/eeprom.h @@ -0,0 +1,7 @@ +#ifndef __EEPROM_H__ +#define __EEPROM_H__ +#include "lib.h" + +extern void chip_eeprom_config_read(uint32_t read_addr, uint8_t *data, uint16_t length); ///< 读取数据 +extern void chip_eeprom_config_write(uint32_t write_addr, uint8_t *data, uint16_t length); ///< 写入数据 +#endif ///< __EEPROM_H__ diff --git a/User/system/bsp/flash.c b/User/system/bsp/flash.c new file mode 100644 index 0000000..c1be5e1 --- /dev/null +++ b/User/system/bsp/flash.c @@ -0,0 +1,550 @@ +/** + * @file flash.c + * @author xxx + * @date 2024-02-07 11:49:34 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + * @attention + * + * ST 的官方驱动 LL 库并没有 flash 驱动。这里自己实现。 + * + * 1. 由于在 stm32l4xx_ll_system.h 中存在部分 FLASH 操作函数(ACR寄存器的处理)且不全面 + * 因此这里需要额外处理(重命名) + * + * 2. Main memory + * (1) FLASH_ACR 完成 + * (2) FLASH_PDKEYR 完成 + * (3) FLASH_KEYR 完成 + * (4) FLASH_OPTKEYR 完成 + * (5) FLASH_SR 完成 + * (6) FLASH_CR 完成 + * (7) FLASH_ECCR 完成 + * (8) FLASH_OPTR 未完成 + * (9) FLASH_PCROP1SR 未完成 + * 后续寄存器 均未完成 + * 3. Information block + * - System memory + * - OTP area + * - Option bytes + * 4. 根据 HAL 库的实现,相比于与手册的推荐流程,擦写的执行序列还有其他操作。 + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "flash.h" +#include "stm32l4xx_ll_rcc.h" +#include "stm32l4xx_ll_system.h" +#include "stm32l4xx_ll_pwr.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#define WHILE_MAX 30000U +/** @addtogroup STM32L4xx_LL_Driver + * @{ + */ + +/** @addtogroup FLASH_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup FLASH_LL_Private_Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup FLASH_LL_Private_Macros + * @{ + */ + +#define IS_LL_FLASH_WRITE_ADDR(__ADDR__) ((__ADDR__) % LL_FLASH_ALIGNMENT_MIN_SIZE == 0) + +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup FLASH_LL_Private_Functions FLASH Private functions + * @{ + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_LL_Exported_Functions + * @{ + */ +/** + * @brief Clear All Error in SR + * @param FLASHx FLASH Instance + * @retval None + */ +void LL_FLASH_ClearAllErrorFlag(void) +{ + LL_FLASH_ClearFlag_OPTVERR(FLASH); + LL_FLASH_ClearFlag_RDERR(FLASH); + LL_FLASH_ClearFlag_FASTERR(FLASH); + LL_FLASH_ClearFlag_MISERR(FLASH); + LL_FLASH_ClearFlag_PGSERR(FLASH); + LL_FLASH_ClearFlag_SIZERR(FLASH); + LL_FLASH_ClearFlag_PGAERR(FLASH); + LL_FLASH_ClearFlag_WRPERR(FLASH); + LL_FLASH_ClearFlag_PROGERR(FLASH); + LL_FLASH_ClearFlag_OPERR(FLASH); +} + +/** + * @brief Flush the instruction and data caches. + * @retval None + */ +void LL_FLASH_FlushCaches(void) +{ + /* Flush instruction cache */ + if (LL_FLASH_IsEnabledInstructionCache(FLASH)) + { + LL_FLASH_DisableInstructionCache(FLASH); + /* Reset instruction cache */ + LL_FLASH_InstructionCacheReset(FLASH); + /* Enable instruction cache */ + LL_FLASH_EnableInstructionCache(FLASH); + } + + /* Flush data cache */ + if (LL_FLASH_IsEnabledDataCache(FLASH)) + { + LL_FLASH_ZCS_DisableDataCache(FLASH); + /* Reset data cache */ + LL_FLASH_DataCacheReset(FLASH); + /* Enable data cache */ + LL_FLASH_ZCS_EnableDataCache(FLASH); + } +} + +/** + * @brief Erase Page + * @param pageno Page number + * @retval None + */ +ErrorStatus LL_FLASH_ErasePage(uint32_t pageno) +{ + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the PER bit and select the page you wish to erase (PNB) with the associated bank (BKER) in the Flash control register (FLASH_CR). */ + LL_FLASH_EnablePageErase(FLASH); + + if (pageno >= LL_FLASH_BANK1_PAGE_NUM) + { + pageno -= LL_FLASH_BANK1_PAGE_NUM; + LL_FLASH_SetErasePageBank(FLASH, LL_FLASH_BANK2); + } + else + { + LL_FLASH_SetErasePageBank(FLASH, LL_FLASH_BANK1); + } + + LL_FLASH_SetErasePageNo(FLASH, pageno); + + /* Set the STRT bit in the FLASH_CR register. */ + LL_FLASH_EraseStart(FLASH); + + /* Wait for the BSY bit to be cleared in the FLASH_SR register. */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* 完成只有需要清除擦除标志. */ + LL_FLASH_DisablePageErase(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + + return SUCCESS; +} + +/** + * @brief Erase bank + * @param bank This parameter can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + * @retval None + */ +ErrorStatus LL_FLASH_EraseBank(uint32_t bank) +{ + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the MER1 bit or/and MER2 (depending on the bank) in the Flash control register (FLASH_CR). + Both banks can be selected in the same operation. */ + if (bank == LL_FLASH_BANK1) + { + LL_FLASH_EnableBank1Erase(FLASH); + } + else + { + LL_FLASH_EnableBank2Erase(FLASH); + } + + /* Set the STRT bit in the FLASH_CR register. */ + LL_FLASH_EraseStart(FLASH); + + /* Wait for the BSY bit to be cleared in the FLASH_SR register. */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* 完成只有需要清除擦除标志. */ + LL_FLASH_DisableBank1Erase(FLASH); + LL_FLASH_DisableBank2Erase(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + return SUCCESS; +} + +/** + * @brief Erase Chip + * @param None + * @retval None + */ +ErrorStatus LL_FLASH_EraseChip(void) +{ + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the MER1 bit or/and MER2 (depending on the bank) in the Flash control register (FLASH_CR). + Both banks can be selected in the same operation. */ + LL_FLASH_EnableBank1Erase(FLASH); + LL_FLASH_EnableBank2Erase(FLASH); + + /* Set the STRT bit in the FLASH_CR register. */ + LL_FLASH_EraseStart(FLASH); + + /* Wait for the BSY bit to be cleared in the FLASH_SR register. */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* 完成只有需要清除擦除标志. */ + LL_FLASH_DisableBank1Erase(FLASH); + LL_FLASH_DisableBank2Erase(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + return SUCCESS; +} + +/** + * @brief Program Double Word + * @param address specifies the address to be programmed. + * @param data specifies the data to be programmed. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Write successfully + * - ERROR: error + */ +ErrorStatus LL_FLASH_ProgramDoubleWord(uint32_t address, uint64_t data) +{ + assert_param(!IS_LL_FLASH_WRITE_ADDR(address)); + uint16_t count = 0; + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the PG bit in the Flash control register (FLASH_CR). */ + LL_FLASH_EnableProgram(FLASH); + + /* Perform the data write operation at the desired memory address, inside main memory + block or OTP area. Only double word can be programmed. */ + /* Program the double word */ + *(__IO uint32_t *)address = (uint32_t)data; + *(__IO uint32_t *)(address + 4U) = (uint32_t)(data >> 32); + + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + /* Check that EOP flag is set in the FLASH_SR register (meaning that the programming + operation has succeed), and clear it by software. */ + if (LL_FLASH_IsActiveFlag_EOP(FLASH)) + { + LL_FLASH_ClearFlag_EOP(FLASH); + } + + /* Clear the PG bit in the FLASH_CR register if there no more programming request anymore. */ + LL_FLASH_DisableProgram(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + + return SUCCESS; +} + +/** + * @brief Program + * @param address specifies the address to be programmed. + * @param data specifies the data to be programmed. + * @param num specifies the data number + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Write successfully + * - ERROR: error + */ +ErrorStatus LL_FLASH_Program(uint32_t address, uint8_t data[], uint32_t num) +{ + static uint64_t DataT = 0; + uint32_t T = 0, S = 0; + uint16_t count = 0; + assert_param(!IS_LL_FLASH_WRITE_ADDR(address)); + + if (num == 0) + { + return SUCCESS; + } + + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + /* Check and clear all error programming flags due to a previous programming. If not, PGSERR is set. */ + LL_FLASH_ClearAllErrorFlag(); + + /* Set the PG bit in the Flash control register (FLASH_CR). */ + LL_FLASH_EnableProgram(FLASH); + + /* Perform the data write operation at the desired memory address, inside main memory + block or OTP area. Only double word can be programmed. */ + T = num; + while (num > 0) + { + DataT = 0; + if (num >= 8) + { + for (int i = 0; i < LL_FLASH_ALIGNMENT_MIN_SIZE; i++) + { + DataT = DataT << 8; + DataT |= data[S + 7 - i]; + } + S += LL_FLASH_ALIGNMENT_MIN_SIZE; + num -= LL_FLASH_ALIGNMENT_MIN_SIZE; + } + else + { + for (int i = 0; i < num; i++) + { + DataT = DataT << 8; + DataT |= data[T - 1 - i]; + } + num = 0; + } + + /* Program the double word */ + *(__IO uint32_t *)address = (uint32_t)DataT; + *(__IO uint32_t *)(address + 4U) = (uint32_t)(DataT >> 32); + + /* Check that no Flash memory operation is ongoing by checking the BSY bit */ + while (LL_FLASH_IsActiveFlag_BSY(FLASH)) + { + if (count++ > WHILE_MAX) + { + return ERROR; + } + } + count = 0; + + /* Check that EOP flag is set in the FLASH_SR register (meaning that the programming + operation has succeed), and clear it by software. */ + if (LL_FLASH_IsActiveFlag_EOP(FLASH)) + { + LL_FLASH_ClearFlag_EOP(FLASH); + } + + address += LL_FLASH_ALIGNMENT_MIN_SIZE; + } + + /* Clear the PG bit in the FLASH_CR register if there no more programming request anymore. */ + LL_FLASH_DisableProgram(FLASH); + + /* Flush the caches to be sure of the data consistency */ + LL_FLASH_FlushCaches(); + + return SUCCESS; +} + +/** + * @} + */ + +/** @addtogroup FLASH_LL_Private_Functions + * @{ + */ +/** + * @brief Fast program a row double-word (64-bit) at a specified address. + * @param address: specifies the address to be programmed. + * @param DataAddress: specifies the address where the data are stored. + * @retval None + */ +void LL_FLASH_ProgramFast(uint32_t address, uint32_t DataAddress) +{ + uint8_t row_index = (2 * LL_FLASH_ROW_SIZE); + __IO uint32_t *dest_addr = (__IO uint32_t *)address; + __IO uint32_t *src_addr = (__IO uint32_t *)DataAddress; + + /* Check the parameters */ + assert_param(IS_FLASH_MAIN_MEM_ADDRESS(address)); + + /* Set FSTPG bit */ + LL_FLASH_EnableFastProgram(FLASH); + + /* Disable interrupts to avoid any interruption during the loop */ + __disable_irq(); + + /* Program the double word of the row */ + do + { + *dest_addr = *src_addr; + dest_addr++; + src_addr++; + row_index--; + } while (row_index != 0U); + + /* Re-enable the interrupts */ + __enable_irq(); + + LL_FLASH_DisableFastProgram(FLASH); +} + +/** + * @brief Fast program a row double-word (64-bit) at a specified address. + * @param address: specifies the address to be programmed. + * @param data: specifies the data to be programmed. + * @retval None + */ +ErrorStatus LL_FLASH_Read(uint32_t address, uint8_t data[], uint32_t num) +{ + if (num == 0) + { + return SUCCESS; + } + for (uint32_t i = 0; i < num; i++) + { + data[i] = *(__IO uint8_t *)(address + i); + } + + return SUCCESS; +} + +/** + * @brief 擦除指定地址的 FLASH + * + * 根据给定的地址和大小,擦除 FLASH 中指定范围的页面。 + * + * @param address FLASH 中的起始地址 + * @param size 需要擦除的大小(以字节为单位) + */ +void LL_FLASH_EraseAddress(uint32_t address, uint16_t size) +{ + uint16_t start_page = 0, end_page = 0; + start_page = address / LL_FLASH_PAGE_SIZE; + end_page = (address + size) / LL_FLASH_PAGE_SIZE; + // 擦除页 + for (uint16_t i = start_page; i < end_page; i++) + { + LL_FLASH_ErasePage(i); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/User/system/bsp/flash.h b/User/system/bsp/flash.h new file mode 100644 index 0000000..b4b693a --- /dev/null +++ b/User/system/bsp/flash.h @@ -0,0 +1,1725 @@ +/** + * @file flash.h + * @author xxx + * @date 2024-02-07 11:49:34 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + * @attention + * + * ST 的官方驱动 LL 库并没有 flash 驱动。这里自己实现。 + * + * 1. 由于在 stm32l4xx_ll_system.h 中存在部分 FLASH 操作函数(ACR寄存器的处理)且不全面 + * 因此这里需要额外处理(重命名) + * + * 2. Main memory + * (1) FLASH_ACR 完成 + * (2) FLASH_PDKEYR 完成 + * (3) FLASH_KEYR 完成 + * (4) FLASH_OPTKEYR 完成 + * (5) FLASH_SR 完成 + * (6) FLASH_CR 完成 + * (7) FLASH_ECCR 完成 + * (8) FLASH_OPTR 未完成 + * (9) FLASH_PCROP1SR 未完成 + * 后续寄存器 均未完成 + * 3. Information block + * - System memory + * - OTP area + * - Option bytes + * 4. 根据 HAL 库的实现,相比于与手册的推荐流程,擦写的执行序列还有其他操作。 + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_LL_FLASH_H +#define __STM32L4xx_LL_FLASH_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "osel_arch.h" + +/** @addtogroup STM32L4xx_LL_Driver + * @{ + */ + +/** @defgroup FLASH_LL FLASH + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup FLASH_LL_Private_Constants FLASH Private Constants + * @{ + */ + +/* The following values must be written consecutively to unlock the FLASH_OPTR +register allowing option byte programming/erasing operations */ +#define LL_FLASH_OPT_KEY1 ((uint32_t)0x08192A3B) +#define LL_FLASH_OPT_KEY2 ((uint32_t)0x4C5D6E7F) + +/* The following values must be written consecutively to unlock the FLASH_CR +register allowing flash programming/erasing operations */ +#define LL_FLASH_KEY1 ((uint32_t)0x45670123) +#define LL_FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* The following values must be written consecutively to unlock the RUN_PD bit in +FLASH_ACR */ +#define LL_FLASH_PDKEY1 ((uint32_t)0x04152637) +#define LL_FLASH_PDKEY2 ((uint32_t)0xFAFBFCFD) + +/* Page size */ +#define LL_FLASH_PAGE_SIZE (2 * 1024) + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup FLASH_LL_Private_Macros FLASH Private Macros + * @{ + */ +/** + * @} + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASH_LL_ES_INIT FLASH Exported structures + * @{ + */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASH_LL_Exported_Constants FLASH Exported Constants + * @{ + */ + +/** @defgroup FLASH_LL_EC_BANK bank + * @{ + */ +#define LL_FLASH_BANK1 0 /*!< bank 1 */ +#define LL_FLASH_BANK2 1 /*!< bank 2 */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_ALIGNMENT alignment + * @{ + */ +#define LL_FLASH_ALIGNMENT_MIN_SIZE 8 /*!< the min alignment size */ +#define LL_FLASH_ROW_SIZE 32 /* row (32 double word) */ +#define LL_FLASH_BANK1_PAGE_NUM 256 /* */ +#define LL_FLASH_BANK2_PAGE_NUM 256 /* */ + +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_FLASH_ReadReg function. + * @{ + */ +#define LL_FLASH_SR_BSY FLASH_SR_BSY /*!< Busy flag */ +#define LL_FLASH_SR_OPTVERR FLASH_SR_OPTVERR /*!< Option validity error flag */ +#define LL_FLASH_SR_RDERR FLASH_SR_RDERR /*!< PCROP read error flag */ +#define LL_FLASH_SR_FASTERR FLASH_SR_FASTERR /*!< Fast programming error flag */ +#define LL_FLASH_SR_MISERR FLASH_SR_MISERR /*!< Fast programming data miss error flag */ +#define LL_FLASH_SR_PGSERR FLASH_SR_PGSERR /*!< Programming sequence error flag */ +#define LL_FLASH_SR_SIZERR FLASH_SR_SIZERR /*!< Size error flag */ +#define LL_FLASH_SR_PGAERR FLASH_SR_PGAERR /*!< Programming alignment error flag */ +#define LL_FLASH_SR_WRPERR FLASH_SR_WRPERR /*!< Write protection error flag */ +#define LL_FLASH_SR_PROGERR FLASH_SR_PROGERR /*!< Programming error flag */ +#define LL_FLASH_SR_OPERR FLASH_SR_OPERR /*!< Operation error flag */ +#define LL_FLASH_SR_EOP FLASH_SR_EOP /*!< End of operation flag */ +/* */ +#define LL_FLASH_ECCR_DETECTION FLASH_ECCR_ECCD /*!< ECC detection */ +#define LL_FLASH_ECCR_CORRECTION FLASH_ECCR_ECCC /*!< ECC correction */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_FLASH_ReadReg and LL_FLASH_WriteReg functions + * @{ + */ +#define LL_FLASH_CR_RDERRIE FLASH_CR_RDERRIE /*!< PCROP read error interrupt enable */ +#define LL_FLASH_CR_ERRIE FLASH_CR_ERRIE /*!< Error interrupt enable */ +#define LL_FLASH_CR_EOPIE FLASH_CR_EOPIE /*!< End of operation interrupt enable */ +#define LL_FLASH_CR_ECCIE FLASH_ECCR_ECCIE /*!< ECC correction interrupt enable */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_Latency Flash Latency + * @{ + */ +#define LL_FLASH_LATENCY_0WS FLASH_ACR_LATENCY_0WS /*!< FLASH Zero Latency cycle */ +#define LL_FLASH_LATENCY_1WS FLASH_ACR_LATENCY_1WS /*!< FLASH One Latency cycle */ +#define LL_FLASH_LATENCY_2WS FLASH_ACR_LATENCY_2WS /*!< FLASH Two Latency cycles */ +#define LL_FLASH_LATENCY_3WS FLASH_ACR_LATENCY_3WS /*!< FLASH Three Latency cycles */ +#define LL_FLASH_LATENCY_4WS FLASH_ACR_LATENCY_4WS /*!< FLASH Four Latency cycles */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_PREFETCH Prefetch + * @{ + */ +#define LL_FLASH_PREFETCH_DISABLE 0x00000000U /*!< Prefetch disabled */ +#define LL_FLASH_PREFETCH_ENABLE FLASH_ACR_PRFTEN /*!< Prefetch enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_INSTRUCTION_CACHE Instruction cache + * @{ + */ +#define LL_FLASH_INSTRUCTION_CACHE_DISABLE 0x00000000U /*!< Instruction cache disabled */ +#define LL_FLASH_INSTRUCTION_CACHE_ENABLE FLASH_ACR_ICEN /*!< Instruction cache enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_DATA_CACHE data cache + * @{ + */ +#define LL_FLASH_DATA_CACHE_DISABLE 0x00000000U /*!< data cache disabled */ +#define LL_FLASH_DATA_CACHE_ENABLE FLASH_ACR_DCEN /*!< data cache enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_RUN_PD_MODE Flash Power-down mode during Run or Low-power run mode + * @{ + */ +#define LL_FLASH_RUN_PD_MODE_IDLE 0x00000000U /*!< Flash in Idle mode */ +#define LL_FLASH_RUN_PD_MODE_PD FLASH_ACR_RUN_PD /*!< Flash in Power-down mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_SLEEP_PD_MODE Flash Power-down mode during Sleep or Low-power sleep mode + * @{ + */ +#define LL_FLASH_SLEEP_PD_MODE_IDLE 0x00000000U /*!< Flash in Idle mode during Sleep and Low-power sleep modes */ +#define LL_FLASH_SLEEP_PD_MODE_PD FLASH_ACR_SLEEP_PD /*!< Flash in Power-down mode during Sleep and Low-power sleep modes */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_PG Programming + * @{ + */ +#define LL_FLASH_PROGRAMMING_DISABLE 0x00000000U /*!< Flash programming disabled */ +#define LL_FLASH_PROGRAMMING_ENABLE FLASH_CR_PG /*!< Flash programming enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_PER Programming + * @{ + */ +#define LL_FLASH_PAGE_ERASE_DISABLE 0x00000000U /*!< page erase disabled */ +#define LL_FLASH_PAGE_ERASE_ENABLE FLASH_CR_PER /*!< page erase enabled */ +/** + * @} + */ + +/** @defgroup FLASH_LL_EC_OBL_LAUNCH Force the option byte loading + * @{ + */ +#define LL_FLASH_OB_LAUNCH_COMPLETE 0x00000000U /*!< Option byte loading complete */ +#define LL_FLASH_OB_LAUNCH_REQUESTED FLASH_CR_OBL_LAUNCH /*!< Option byte loading requested */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_Read_Protection FLASH Option Bytes Read Protection + * @{ + */ +#define LL_FLASH_OB_RDP_LEVEL_0 ((uint32_t)0xAA) +#define LL_FLASH_OB_RDP_LEVEL_1 ((uint32_t)0xBB) +#define LL_FLASH_OB_RDP_LEVEL_2 ((uint32_t)0xCC) /*!< Warning: When enabling read protection level 2 it's no more possible to go back to level 1 or 0 */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_BOR_LEVEL FLASH Option Bytes BOR Level + * @{ + */ +#define LL_FLASH_OB_BOR_LEVEL_0 ((uint32_t)FLASH_OPTR_BOR_LEV_0) /*!< Reset level threshold is around 1.7V */ +#define LL_FLASH_OB_BOR_LEVEL_1 ((uint32_t)FLASH_OPTR_BOR_LEV_1) /*!< Reset level threshold is around 2.0V */ +#define LL_FLASH_OB_BOR_LEVEL_2 ((uint32_t)FLASH_OPTR_BOR_LEV_2) /*!< Reset level threshold is around 2.2V */ +#define LL_FLASH_OB_BOR_LEVEL_3 ((uint32_t)FLASH_OPTR_BOR_LEV_3) /*!< Reset level threshold is around 2.5V */ +#define LL_FLASH_OB_BOR_LEVEL_4 ((uint32_t)FLASH_OPTR_BOR_LEV_4) /*!< Reset level threshold is around 2.8V */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nRST_STOP FLASH Option Bytes Reset On Stop + * @{ + */ +#define LL_FLASH_OB_STOP_RST ((uint32_t)0x0000) /*!< Reset generated when entering the stop mode */ +#define LL_FLASH_OB_STOP_NORST ((uint32_t)FLASH_OPTR_nRST_STOP) /*!< No reset generated when entering the stop mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nRST_STANDBY FLASH Option Bytes Reset On Standby + * @{ + */ +#define LL_FLASH_OB_STANDBY_RST ((uint32_t)0x0000) /*!< Reset generated when entering the standby mode */ +#define LL_FLASH_OB_STANDBY_NORST ((uint32_t)FLASH_OPTR_nRST_STDBY) /*!< No reset generated when entering the standby mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nRST_SHUTDOWN FLASH Option Bytes Reset On Shutdown + * @{ + */ +#define LL_FLASH_OB_SHUTDOWN_RST ((uint32_t)0x0000) /*!< Reset generated when entering the shutdown mode */ +#define LL_FLASH_OB_SHUTDOWN_NORST ((uint32_t)FLASH_OPTR_nRST_SHDW) /*!< No reset generated when entering the shutdown mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_IWDG_SW FLASH Option Bytes IWDG Type + * @{ + */ +#define LL_FLASH_OB_IWDG_HW ((uint32_t)0x00000) /*!< Hardware independent watchdog */ +#define LL_FLASH_OB_IWDG_SW ((uint32_t)FLASH_OPTR_IWDG_SW) /*!< Software independent watchdog */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_IWDG_STOP FLASH Option Bytes IWDG Mode On Stop + * @{ + */ +#define LL_FLASH_OB_IWDG_STOP_FREEZE ((uint32_t)0x00000) /*!< Independent watchdog counter is frozen in Stop mode */ +#define LL_FLASH_OB_IWDG_STOP_RUN ((uint32_t)FLASH_OPTR_IWDG_STOP) /*!< Independent watchdog counter is running in Stop mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_IWDG_STANDBY FLASH Option Bytes IWDG Mode On Standby + * @{ + */ +#define LL_FLASH_OB_IWDG_STDBY_FREEZE ((uint32_t)0x00000) /*!< Independent watchdog counter is frozen in Standby mode */ +#define LL_FLASH_OB_IWDG_STDBY_RUN ((uint32_t)FLASH_OPTR_IWDG_STDBY) /*!< Independent watchdog counter is running in Standby mode */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_WWDG_SW FLASH Option Bytes WWDG Type + * @{ + */ +#define LL_FLASH_OB_WWDG_HW ((uint32_t)0x00000) /*!< Hardware window watchdog */ +#define LL_FLASH_OB_WWDG_SW ((uint32_t)FLASH_OPTR_WWDG_SW) /*!< Software window watchdog */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_BFB2 FLASH Option Bytes BFB2 Mode + * @{ + */ +#define LL_FLASH_OB_BFB2_DISABLE ((uint32_t)0x000000) /*!< Dual-bank boot disable */ +#define LL_FLASH_OB_BFB2_ENABLE ((uint32_t)FLASH_OPTR_BFB2) /*!< Dual-bank boot enable */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_DUALBANK FLASH Option Bytes Dual-bank Type + * @{ + */ +#define LL_FLASH_OB_DUALBANK_SINGLE ((uint32_t)0x000000) /*!< 256 KB/512 KB Single-bank Flash */ +#define LL_FLASH_OB_DUALBANK_DUAL ((uint32_t)FLASH_OPTR_DUALBANK) /*!< 256 KB/512 KB Dual-bank Flash */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nBOOT1 FLASH Option Bytes User BOOT1 Type + * @{ + */ +#define LL_FLASH_OB_BOOT1_SRAM ((uint32_t)0x000000) /*!< Embedded SRAM1 is selected as boot space (if BOOT0=1) */ +#define LL_FLASH_OB_BOOT1_SYSTEM ((uint32_t)FLASH_OPTR_nBOOT1) /*!< System memory is selected as boot space (if BOOT0=1) */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_SRAM2_PE FLASH Option Bytes User SRAM2 Parity Check Type + * @{ + */ +#define LL_FLASH_OB_SRAM2_PARITY_ENABLE ((uint32_t)0x0000000) /*!< SRAM2 parity check enable */ +#define LL_FLASH_OB_SRAM2_PARITY_DISABLE ((uint32_t)FLASH_OPTR_SRAM2_PE) /*!< SRAM2 parity check disable */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_SRAM2_RST FLASH Option Bytes User SRAM2 Erase On Reset Type + * @{ + */ +#define LL_FLASH_OB_SRAM2_RST_ERASE ((uint32_t)0x0000000) /*!< SRAM2 erased when a system reset occurs */ +#define LL_FLASH_OB_SRAM2_RST_NOT_ERASE ((uint32_t)FLASH_OPTR_SRAM2_RST) /*!< SRAM2 is not erased when a system reset occurs */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nSWBOOT0 FLASH Option Bytes User Software BOOT0 + * @{ + */ +#define LL_FLASH_OB_BOOT0_FROM_OB ((uint32_t)0x0000000) /*!< BOOT0 taken from the option bit nBOOT0 */ +#define LL_FLASH_OB_BOOT0_FROM_PIN ((uint32_t)FLASH_OPTR_nSWBOOT0) /*!< BOOT0 taken from PH3/BOOT0 pin */ +/** + * @} + */ + +/** @defgroup FLASH_LL_OB_nBOOT0 FLASH Option Bytes User nBOOT0 option bit + * @{ + */ +#define LL_FLASH_OB_BOOT0_RESET ((uint32_t)0x0000000) /*!< nBOOT0 = 0 */ +#define LL_FLASH_OB_BOOT0_SET ((uint32_t)FLASH_OPTR_nBOOT0) /*!< nBOOT0 = 1 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup CRS_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in FLASH register + * @param __INSTANCE__ FLASH Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_FLASH_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in FLASH register + * @param __INSTANCE__ FLASH Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_FLASH_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) + /** + * @} + */ + + /* Exported functions --------------------------------------------------------*/ + /** @defgroup FLASH_LL_Exported_Functions FLASH Exported Functions + * @{ + */ + + /** @defgroup FLASH_LL_EF_Configuration Configuration + * @{ + */ + /** + * @brief Sets the code latency value + * @note When changing the CPU frequency, the following software sequences must be applied in + * order to tune the number of wait states needed to access the Flash memory + * @rmtoll ACR LATENCY LL_FLASH_SetLatency + * @param FLASHx Flash instance + * @param FLASH_Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0WS + * @arg @ref LL_FLASH_LATENCY_1WS + * @arg @ref LL_FLASH_LATENCY_2WS + * @arg @ref LL_FLASH_LATENCY_3WS + * @arg @ref LL_FLASH_LATENCY_4WS + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_SetLatency(FLASH_TypeDef *FLASHx, uint32_t FLASH_Latency) + { + MODIFY_REG(FLASHx->ACR, FLASH_ACR_LATENCY, FLASH_Latency); + } + + /** + * @brief Sets the code latency value + * @rmtoll ACR LATENCY LL_FLASH_GetLatency + * @param FLASHx Flash instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0WS + * @arg @ref LL_FLASH_LATENCY_1WS + * @arg @ref LL_FLASH_LATENCY_2WS + * @arg @ref LL_FLASH_LATENCY_3WS + * @arg @ref LL_FLASH_LATENCY_4WS + */ + __STATIC_INLINE uint32_t LL_FLASH_ZCS_GetLatency(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->ACR, FLASH_ACR_LATENCY)); + } + + /** + * @brief Enable FLASH Prefetch + * @rmtoll ACR PRFTEN LL_FLASH_EnablePrefetch + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_EnablePrefetch(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_PRFTEN); + } + + /** + * @brief Disable FLASH Prefetch + * @rmtoll ACR PRFTEN LL_FLASH_DisablePrefetch + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_DisablePrefetch(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_PRFTEN); + } + + /** + * @brief Indicates whether the FLASH Prefetch is enabled. + * @rmtoll ACR PRFTEN LL_FLASH_IsEnabledPrefetch + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledPrefetch(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)) ? 1UL : 0UL); + } + + /** + * @brief Enable FLASH Instruction cache + * @rmtoll ACR ICEN LL_FLASH_EnableInstructionCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableInstructionCache(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_ICEN); + } + + /** + * @brief Disable FLASH Instruction cache + * @rmtoll ACR ICEN LL_FLASH_DisableInstructionCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableInstructionCache(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_ICEN); + } + + /** + * @brief Indicates whether the FLASH Instruction cache is enabled. + * @rmtoll ACR ICEN LL_FLASH_IsEnabledInstructionCache + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledInstructionCache(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ACR, FLASH_ACR_ICEN) == (FLASH_ACR_ICEN)) ? 1UL : 0UL); + } + + /** + * @brief Enable FLASH data cache + * @rmtoll ACR DCEN LL_FLASH_EnableDataCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_EnableDataCache(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_DCEN); + } + + /** + * @brief Disable FLASH data cache + * @rmtoll ACR DCEN LL_FLASH_DisableDataCache + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ZCS_DisableDataCache(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_DCEN); + } + + /** + * @brief Indicates whether the FLASH data cache is enabled. + * @rmtoll ACR DCEN LL_FLASH_IsEnabledDataCache + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledDataCache(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ACR, FLASH_ACR_DCEN) == (FLASH_ACR_DCEN)) ? 1UL : 0UL); + } + + /** + * @brief Reset FLASH Instruction cache + * @note This bit can be written only when the instruction cache is disabled. + * @rmtoll ACR ICRST LL_FLASH_InstructionCacheReset + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_InstructionCacheReset(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_ICRST); + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_ICRST); + } + + /** + * @brief Reset FLASH data cache + * @note This bit can be written only when the data cache is disabled. + * @rmtoll ACR DCRST LL_FLASH_DataCacheReset + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DataCacheReset(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ACR, FLASH_ACR_DCRST); + CLEAR_BIT(FLASHx->ACR, FLASH_ACR_DCRST); + } + + /** + * @brief Set Flash Power-down mode during Run or Low-power run mode + * @note This bit is write-protected with FLASH_PDKEYR. Call LL_FLASH_UnlockRunPowerDownMode before using this api + * @note The flash memory can be put in power-down mode only when the code is executed from RAM. + * @note The Flash must not be accessed when RUN_PD is set. + * @note he flash must not be put in power-down while a program or an erase operation is on-going. + * @rmtoll ACR RUN_PD LL_FLASH_SetRunPowerDownMode + * @param FLASHx FLASH Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_FLASH_RUN_PD_MODE_IDLE + * @arg @ref LL_FLASH_RUN_PD_MODE_PD + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetRunPowerDownMode(FLASH_TypeDef *FLASHx, uint32_t Mode) + { + MODIFY_REG(FLASHx->ACR, FLASH_ACR_RUN_PD, Mode); + } + + /** + * @brief Get Flash Power-down mode during Run or Low-power run mode + * @note This bit is write-protected with FLASH_PDKEYR. Call LL_FLASH_UnlockRunPowerDownMode before using this api + * @note The flash memory can be put in power-down mode only when the code is executed from RAM. + * @note The Flash must not be accessed when RUN_PD is set. + * @note he flash must not be put in power-down while a program or an erase operation is on-going. + * @rmtoll ACR RUN_PD LL_FLASH_GetRunPowerDownMode + * @param FLASHx FLASH Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_RUN_PD_MODE_IDLE + * @arg @ref LL_FLASH_RUN_PD_MODE_PD + */ + __STATIC_INLINE uint32_t LL_FLASH_GetRunPowerDownMode(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->ACR, FLASH_ACR_RUN_PD)); + } + + /** + * @brief Set Flash Power-down mode during Sleep or Low-power sleep mode + * @note The flash must not be put in power-down while a program or an erase operation is on-going. + * @rmtoll ACR SLEEP_PD LL_FLASH_SetSleepPowerDownMode + * @param FLASHx FLASH Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_FLASH_SLEEP_PD_MODE_IDLE + * @arg @ref LL_FLASH_SLEEP_PD_MODE_PD + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetSleepPowerDownMode(FLASH_TypeDef *FLASHx, uint32_t Mode) + { + MODIFY_REG(FLASHx->ACR, FLASH_ACR_SLEEP_PD, Mode); + } + + /** + * @brief Get Flash Power-down mode during Sleep or Low-power sleep mode + * @rmtoll ACR SLEEP_PD LL_FLASH_SetSleepPowerDownMode + * @param FLASHx FLASH Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_SLEEP_PD_MODE_IDLE + * @arg @ref LL_FLASH_SLEEP_PD_MODE_PD + */ + __STATIC_INLINE uint32_t LL_FLASH_GetSleepPowerDownMode(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->ACR, FLASH_ACR_SLEEP_PD)); + } + + /** + * @brief Unlock Power-down in Run mode + * @rmtoll PDKEYR LL_FLASH_SetSleepPowerDownMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_UnlockRunPowerDownMode(FLASH_TypeDef *FLASHx) + { + WRITE_REG(FLASHx->PDKEYR, LL_FLASH_PDKEY1); + WRITE_REG(FLASHx->PDKEYR, LL_FLASH_PDKEY2); + } + + /** + * @brief Sets Read protection level + * @rmtoll OPTR RDP LL_FLASH_SetReaProtectionLevel + * @param FLASHx Flash instance + * @param FLASH_Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_OB_RDP_LEVEL_0 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_1 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_2 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetReaProtectionLevel(FLASH_TypeDef *FLASHx, uint32_t Level) + { + MODIFY_REG(FLASHx->ACR, FLASH_OPTR_RDP, Level); + } + + /** + * @brief Sets Read protection level + * @rmtoll OPTR RDP LL_FLASH_GetReaProtectionLevel + * @param FLASHx Flash instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_OB_RDP_LEVEL_0 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_1 + * @arg @ref LL_FLASH_OB_RDP_LEVEL_2 + */ + __STATIC_INLINE uint32_t LL_FLASH_GetReaProtectionLevel(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->OPTR, FLASH_OPTR_RDP) >> FLASH_OPTR_RDP_Pos); + } + + /** + * @brief Sets BOR level + * @rmtoll OPTR BOR_LEV LL_FLASH_SetBORLevel + * @param FLASHx Flash instance + * @param FLASH_Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_OB_BOR_LEVEL_0 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_1 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_2 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_3 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_4 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetBORLevel(FLASH_TypeDef *FLASHx, uint32_t Level) + { + MODIFY_REG(FLASHx->OPTR, FLASH_OPTR_BOR_LEV, Level); + } + + /** + * @brief Sets BOR level + * @rmtoll OPTR BOR_LEV LL_FLASH_GetBORLevel + * @param FLASHx Flash instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_OB_BOR_LEVEL_0 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_1 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_2 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_3 + * @arg @ref LL_FLASH_OB_BOR_LEVEL_4 + */ + __STATIC_INLINE uint32_t LL_FLASH_GetBORLevel(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->OPTR, FLASH_OPTR_BOR_LEV) >> FLASH_OPTR_BOR_LEV_Pos); + } + + /** + * @brief Enable Reset generated when entering the Stop mode + * @rmtoll OPTR nRST_STOP LL_FLASH_EnableResetStopMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableResetStopMode(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STOP); + } + + /** + * @brief Disable Reset generated when entering the Stop mode + * @rmtoll OPTR nRST_STOP LL_FLASH_DisableResetStopMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableResetStopMode(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STOP); + } + + /** + * @brief Indicates whether Reset generated when entering the Stop mode is enabled. + * @rmtoll OPTR nRST_STOP LL_FLASH_IsEnabledResetStopMode + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledResetStopMode(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STOP) == (FLASH_OPTR_nRST_STOP)) ? 1UL : 0UL); + } + + /** + * @brief Enable Reset generated when entering the Standby mode + * @rmtoll OPTR nRST_STOP LL_FLASH_EnableResetStandbyMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableResetStandbyMode(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STDBY); + } + + /** + * @brief Disable Reset generated when entering the Standby mode + * @rmtoll OPTR nRST_STOP LL_FLASH_DisableResetStandbyMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableResetStandbyMode(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STDBY); + } + + /** + * @brief Indicates whether Reset generated when entering the Standby mode is enabled. + * @rmtoll OPTR nRST_STOP LL_FLASH_IsEnabledResetStandbyMode + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledResetStandbyMode(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_STDBY) == (FLASH_OPTR_nRST_STDBY)) ? 1UL : 0UL); + } + + /** + * @brief Enable Reset generated when entering the Shutdown mode + * @rmtoll OPTR nRST_STOP LL_FLASH_EnableResetShutdownMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableResetShutdownMode(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_SHDW); + } + + /** + * @brief Disable Reset generated when entering the Shutdown mode + * @rmtoll OPTR nRST_STOP LL_FLASH_DisableResetShutdownMode + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableResetShutdownMode(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_SHDW); + } + + /** + * @brief Indicates whether Reset generated when entering the Shutdown mode is enabled. + * @rmtoll OPTR nRST_STOP LL_FLASH_IsEnabledResetShutdownMode + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledResetShutdownMode(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->OPTR, FLASH_OPTR_nRST_SHDW) == (FLASH_OPTR_nRST_SHDW)) ? 1UL : 0UL); + } + + /** + * @} + */ + + /** @defgroup FLASH_LL_EF_Programming Programming + * @{ + */ + /** + * @brief Unlocks the FLASH control register access + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_Unlock(FLASH_TypeDef *FLASHx) + { + WRITE_REG(FLASHx->KEYR, LL_FLASH_KEY1); + WRITE_REG(FLASHx->KEYR, LL_FLASH_KEY2); + } + + /** + * @brief Locks the FLASH control register access + * @rmtoll CR LOCK LL_FLASH_Lock + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_LOCK); + } + + /** + * @brief Unlocks the FLASH Option control register access + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_OB_Unlock(FLASH_TypeDef *FLASHx) + { + WRITE_REG(FLASHx->OPTKEYR, LL_FLASH_OPT_KEY1); + WRITE_REG(FLASHx->OPTKEYR, LL_FLASH_OPT_KEY2); + } + + /** + * @brief Locks the FLASH Option control register access + * @rmtoll CR OPTLOCK LL_FLASH_OB_Lock + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_OB_Lock(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_OPTLOCK); + } + + /** + * @brief Getthe option byte loading + * @rmtoll CR OBL_LAUNCH LL_FLASH_OB_GetLaunch + * @param FLASHx FLASH Instance + * @retval This parameter can be one of the following values: + * @arg @ref LL_FLASH_OB_LAUNCH_COMPLETE + * @arg @ref LL_FLASH_OB_LAUNCH_REQUESTED + */ + __STATIC_INLINE uint32_t LL_FLASH_OB_GetLaunch(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH) >> FLASH_CR_OBL_LAUNCH_Pos); + } + + /** + * @brief Force the option byte loading + * @note When set to 1, this bit forces the option byte reloading. + * This bit is cleared only when the option byte loading is complete. + * @note It cannot be written if OPTLOCK is set. + * @rmtoll CR OBL_LAUNCH FLASH_OB_Launch + * @param FLASHx Flash instance + * @retval None + */ + __STATIC_INLINE void FLASH_OB_Launch(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH); + } + + /** + * @brief Enable FLASH Fast programming + * @rmtoll CR FSTPG LL_FLASH_EnableFastProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableFastProgram(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_FSTPG); + } + + /** + * @brief Disable FLASH Fast programming + * @rmtoll CR FSTPG LL_FLASH_DisableFastProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableFastProgram(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_FSTPG); + } + + /** + * @brief Indicates whether the FLASH Fast programming is enabled. + * @rmtoll CR FSTPG LL_FLASH_IsEnabledFastProgram + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledFastProgram(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_FSTPG) == (FLASH_CR_FSTPG)) ? 1UL : 0UL); + } + + /** + * @brief Enable FLASH Program + * @rmtoll CR PG LL_FLASH_EnableProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_PG); + } + + /** + * @brief Disable FLASH Program + * @rmtoll CR PG LL_FLASH_DisableProgram + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableProgram(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_PG); + } + + /** + * @brief Indicates whether the FLASH Program is enabled. + * @rmtoll CR PRFTEN LL_FLASH_IsEnabledProgram + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledProgram(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_PG) == (FLASH_CR_PG)) ? 1UL : 0UL); + } + + /** + * @brief Set Page number MSB (bank selection) + * @rmtoll CR BKER LL_FLASH_SetErasePageBank + * @param FLASHx FLASH Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetErasePageBank(FLASH_TypeDef *FLASHx, uint32_t bank) + { + MODIFY_REG(FLASHx->CR, FLASH_CR_BKER, (bank << FLASH_CR_BKER_Pos)); + } + + /** + * @brief Get Page number MSB (bank selection) + * @rmtoll CR BKER LL_FLASH_GetErasePageBank + * @param FLASHx FLASH Instance + * @retval This parameter can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + */ + __STATIC_INLINE uint32_t LL_FLASH_GetErasePageBank(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->CR, FLASH_CR_BKER) >> FLASH_CR_BKER_Pos); + } + + /** + * @brief Set Page number selection + * @rmtoll CR PNB LL_FLASH_SetErasePageNo + * @param FLASHx FLASH Instance + * @param No This parameter can be one of the following values: + * @arg @ref 0 ~ 255 + * @retval None + */ + __STATIC_INLINE void LL_FLASH_SetErasePageNo(FLASH_TypeDef *FLASHx, uint32_t No) + { + MODIFY_REG(FLASHx->CR, FLASH_CR_PNB, ((No & 0xFFU) << FLASH_CR_PNB_Pos)); + } + + /** + * @brief Get Page number selection + * @rmtoll CR PNB LL_FLASH_SetErasePageNo + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE uint32_t LL_FLASH_GetErasePageNo(FLASH_TypeDef *FLASHx) + { + return (uint32_t)(READ_BIT(FLASHx->CR, FLASH_CR_PNB) >> FLASH_CR_PNB_Pos); + } + + /** + * @brief Clear Page number selection + * @rmtoll CR PNB LL_FLASH_ClearErasePageNo + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearErasePageNo(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_PNB); + } + + /** + * @brief Enable Page Erase + * @rmtoll CR PER LL_FLASH_EnablePageErase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnablePageErase(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_PER); + } + + /** + * @brief Disable Page Erase + * @rmtoll CR PER LL_FLASH_DisablePageErase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisablePageErase(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_PER); + } + + /** + * @brief Indicates whether the Page Erase is enabled. + * @rmtoll CR PER LL_FLASH_IsEnabledPageErase + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledPageErase(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_PER) == (FLASH_CR_PER)) ? 1UL : 0UL); + } + + /** + * @brief Enable Bank1 Erase + * @rmtoll CR MER1 LL_FLASH_EnableBank1Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableBank1Erase(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_MER1); + } + + /** + * @brief Disable FLASH Bank1Erase + * @rmtoll CR MER1 LL_FLASH_DisableBank1Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableBank1Erase(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_MER1); + } + + /** + * @brief Indicates whether the Bank1 Erase is enabled. + * @rmtoll CR MER1 LL_FLASH_IsEnabledBank1Erase + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledBank1Erase(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_MER1) == (FLASH_CR_MER1)) ? 1UL : 0UL); + } + + /** + * @brief Enable Bank2 Erase + * @rmtoll CR MER2 LL_FLASH_EnableBank2Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableBank2Erase(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_MER2); + } + + /** + * @brief Disable Bank2 Erase + * @rmtoll CR MER2 LL_FLASH_DisableBank2Erase + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableBank2Erase(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_MER2); + } + + /** + * @brief Indicates whether the Bank2 Erase is enabled. + * @rmtoll CR MER2 LL_FLASH_IsEnabledBank2Erase + * @param FLASHx Flash instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledBank2Erase(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_MER2) == (FLASH_CR_MER2)) ? 1UL : 0UL); + } + + /** + * @brief Start an erase operation + * @note If MER1, MER2 and PER bits are reset and the STRT bit is set, + * an unpredictable behavior may occur without generating any error flag. + * This condition should be forbidden. + * @note This bit is set only by software, and is cleared when the BSY bit is cleared in FLASH_SR. + * @rmtoll CR STRT LL_FLASH_EraseStart + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EraseStart(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_STRT); + } + + /** + * @brief Start an options operation + * @note This bit is set only by software, and is cleared when the BSY bit is cleared in FLASH_SR. + * @rmtoll CR STRT LL_FLASH_OprationStart + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_OB_OprationStart(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_OPTSTRT); + } + + /** + * @brief Get ECC fail bank + * @note When ECCC or ECCD is set, ADDR_ECC and BK_ECC are not updated if a new ECC error + * occurs. FLASH_ECCR is updated only when ECC flags are cleared. + * @rmtoll ECCR BK_ECC LL_FLASH_ECC_GetFailBank + * @param FLASHx FLASH Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_BANK1 + * @arg @ref LL_FLASH_BANK2 + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_GetFailBank(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_BK_ECC) == (FLASH_ECCR_BK_ECC)) ? LL_FLASH_BANK2 : LL_FLASH_BANK1); + } + + /** + * @brief Get ECC fail addr + * @note When ECCC or ECCD is set, ADDR_ECC and BK_ECC are not updated if a new ECC error + * occurs. FLASH_ECCR is updated only when ECC flags are cleared. + * @rmtoll ECCR ADDR_ECC LL_FLASH_ECC_GetFailAddr + * @param FLASHx FLASH Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x7FFFF + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_GetFailAddr(FLASH_TypeDef *FLASHx) + { + return (uint32_t)((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ADDR_ECC) == (FLASH_ECCR_ADDR_ECC)) >> FLASH_ECCR_ADDR_ECC_Pos); + } + + /** + * @} + */ + + /** @defgroup FLASH_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + /** + * @brief Get Busy flag + * @note This is set on the beginning of a Flash operation + * and reset when the operation finishes or when an error occurs. + * @rmtoll FLASH_SR BSY LL_FLASH_IsActiveFlag_BSY + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY)) ? 1UL : 0UL); + } + + /** + * @brief Get Option validity error flag + * @note Set by hardware when the options read may not be the one configured by the user. + If option haven’t been properly loaded, OPTVERR is set again after each system reset. + * @rmtoll FLASH_SR OPTVERR LL_FLASH_IsActiveFlag_OPTVERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_OPTVERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_OPTVERR) == (FLASH_SR_OPTVERR)) ? 1UL : 0UL); + } + + /** + * @brief Get PCROP read error flag + * @note Set by hardware when an address to be read through the D-bus belongs to a + read protected area of the flash (PCROP protection). + @note An interrupt is generated if RDERRIE is set in FLASH_CR. + * @rmtoll FLASH_SR RDERR LL_FLASH_IsActiveFlag_RDERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_RDERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_RDERR) == (FLASH_SR_RDERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Fast programming error flag + * @note Set by hardware when a fast programming sequence (activated by FSTPG) is interrupted + * due to an error (alignment, size, write protection or data miss). + * @note The corresponding status bit (PGAERR, SIZERR, WRPERR or MISSERR) is set at the same time. + * @rmtoll FLASH_SR FASTERR LL_FLASH_IsActiveFlag_FASTERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_FASTERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_FASTERR) == (FLASH_SR_FASTERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Fast programming data miss error flag + * @note In Fast programming mode, 32 double words must be sent to flash successively, + and the new data must be sent to the flash logic control before the current data is fully programmed. + @note MISSERR is set by hardware when the new data is not present in time. + * @rmtoll FLASH_SR MISERR LL_FLASH_IsActiveFlag_MISERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_MISERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_MISERR) == (FLASH_SR_MISERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Programming sequence error flag + * @note Set by hardware when a write access to the Flash memory is performed by the code + * while PG or FSTPG have not been set previously. + * @note Set also by hardware when PROGERR, SIZERR, PGAERR, MISSERR or FASTERR is set + * due to a previous programming error. + * @rmtoll FLASH_SR PGSERR LL_FLASH_IsActiveFlag_PGSERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_PGSERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_PGSERR) == (FLASH_SR_PGSERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Size error flag + * @note Set by hardware when the size of the access is a byte or half-word + * during a program or a fast program sequence. + * @note Only double word programming is allowed (consequently: word access). + * @rmtoll FLASH_SR SIZERR LL_FLASH_IsActiveFlag_SIZERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_SIZERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_SIZERR) == (FLASH_SR_SIZERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Programming alignment error flag + * @note Set by hardware when the data to program cannot be contained + * in the same 64-bit Flash memory row in case of standard programming, + * or if there is a change of page during fast programming. + * @rmtoll FLASH_SR PGAERR LL_FLASH_IsActiveFlag_PGAERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_PGAERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_PGAERR) == (FLASH_SR_PGAERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Write protection error flag + * @note Set by hardware when an address to be erased/programmed + * belongs to a write-protected part (by WRP, PCROP or RDP level 1) of the Flash memory. + * @rmtoll FLASH_SR WRPERR LL_FLASH_IsActiveFlag_WRPERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_WRPERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_WRPERR) == (FLASH_SR_WRPERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Programming error flag + * @note Set by hardware when a double-word address to be programmed contains a value + * different from '0xFFFF FFFF' before programming, except if the data to write is '0x0000 0000'. + * @rmtoll FLASH_SR PROGERR LL_FLASH_IsActiveFlag_PROGERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_PROGERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_PROGERR) == (FLASH_SR_PROGERR)) ? 1UL : 0UL); + } + + /** + * @brief Get Operation error flag + * @note Set by hardware when a Flash memory operation (program / erase) completes unsuccessfully. + * @note This bit is set only if error interrupts are enabled (ERRIE = 1). + * @rmtoll FLASH_SR OPERR LL_FLASH_IsActiveFlag_OPERR + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_OPERR(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_OPERR) == (FLASH_SR_OPERR)) ? 1UL : 0UL); + } + + /** + * @brief Get End of operation flag + * @note Set by hardware when one or more Flash memory operation (programming / erase) has been completed successfully. + * @note This bit is set only if the end of operation interrupts are enabled (EOPIE = 1). + * @rmtoll FLASH_SR EOP LL_FLASH_IsActiveFlag_EOP + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP)) ? 1UL : 0UL); + } + + /** + * @brief Clear Internal OPTVERR flag + * @rmtoll ISR IOPTVERR LL_FLASH_ClearFlag_OPTVERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_OPTVERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_OPTVERR); + } + + /** + * @brief Clear Internal RDERR flag + * @rmtoll ISR IRDERR LL_FLASH_ClearFlag_RDERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_RDERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_RDERR); + } + + /** + * @brief Clear Internal FASTERR flag + * @rmtoll ISR IFASTERR LL_FLASH_ClearFlag_FASTERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_FASTERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_FASTERR); + } + + /** + * @brief Clear Internal MISERR flag + * @rmtoll ISR IMISERR LL_FLASH_ClearFlag_MISERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_MISERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_MISERR); + } + + /** + * @brief Clear Internal PGSERR flag + * @rmtoll ISR IPGSERR LL_FLASH_ClearFlag_PGSERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_PGSERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_PGSERR); + } + + /** + * @brief Clear Internal SIZERR flag + * @rmtoll ISR ISIZERR LL_FLASH_ClearFlag_SIZERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_SIZERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_SIZERR); + } + + /** + * @brief Clear Internal PGAERR flag + * @rmtoll ISR IPGAERR LL_FLASH_ClearFlag_PGAERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_PGAERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_PGAERR); + } + + /** + * @brief Clear Internal WRPERR flag + * @rmtoll ISR IWRPERR LL_FLASH_ClearFlag_WRPERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_WRPERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_WRPERR); + } + + /** + * @brief Clear Internal PROGERR flag + * @rmtoll ISR IPROGERR LL_FLASH_ClearFlag_PROGERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_PROGERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_PROGERR); + } + + /** + * @brief Clear Internal OPERR flag + * @rmtoll ISR IOPERR LL_FLASH_ClearFlag_OPERR + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_OPERR(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_OPERR); + } + + /** + * @brief Clear Internal EOP flag + * @rmtoll ISR IEOP LL_FLASH_ClearFlag_EOP + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->SR, FLASH_SR_EOP); + } + + /** + * @brief Get Internal ECC ECCD flag + * @note Set by hardware when two ECC errors have been detected. When this bit is set, a NMI is generated + * @rmtoll ECCR ECCD LL_FLASH_ECC_IsActiveFlag_ECCD + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsActiveFlag_ECCD(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ECCD) == (FLASH_ECCR_ECCD)) ? 1UL : 0UL); + } + + /** + * @brief Get Internal ECC ECCC flag + * @note Set by hardware when one ECC error has been detected and corrected. + * An interrupt is generated if ECCIE is set. + * @rmtoll ECCR ECCC LL_FLASH_ECC_IsActiveFlag_ECCC + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsActiveFlag_ECCC(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ECCC) == (FLASH_ECCR_ECCC)) ? 1UL : 0UL); + } + + /** + * @brief Clear Internal ECCD flag + * @rmtoll ECCR ECCD LL_FLASH_ECC_ClearFlag_ECCD + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_ClearFlag_ECCD(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ECCR, FLASH_ECCR_ECCD); + } + + /** + * @brief Clear Internal ECCC flag + * @rmtoll ECCR ECCC LL_FLASH_ECC_ClearFlag_ECCC + * @param FLASHx FLASH Instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_ClearFlag_ECCC(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ECCR, FLASH_ECCR_ECCC); + } + + /** + * @brief Get Internal System Flash ECC fail flag + * @note This bit indicates that the ECC error correction or double ECC error detection + * is located in the System Flash. + * @rmtoll ECCR SYSF_ECC LL_FLASH_ECC_IsActiveFlag_SYSF_ECC + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsActiveFlag_SYSF_ECC(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_SYSF_ECC) == (FLASH_ECCR_SYSF_ECC)) ? 1UL : 0UL); + } + + /** + * @} + */ + + /** @defgroup FLASH_LL_EF_IT_Management IT-Management + * @{ + */ + /** + * @brief Enable PCROP read error interrupt (RDERRIE). + * @rmtoll CR RDERRIE LL_FLASH_EnableIT_RDERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableIT_RDERRIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_RDERRIE); + } + + /** + * @brief Disable PCROP read error interrupt (RDERRIE). + * @rmtoll CR RDERRIE LL_FLASH_DisableIT_RDERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableIT_RDERRIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_RDERRIE); + } + + /** + * @brief Enable Error interrupt (ERRIE). + * @rmtoll CR ERRIE LL_FLASH_EnableIT_ERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableIT_ERRIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_ERRIE); + } + + /** + * @brief Disable Error interrupt (ERRIE). + * @rmtoll CR ERRIE LL_FLASH_DisableIT_ERRIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableIT_ERRIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_ERRIE); + } + + /** + * @brief Enable End of operation interrupt (EOPIE). + * @rmtoll CR EOPIE LL_FLASH_EnableIT_EOPIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_EnableIT_EOPIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->CR, FLASH_CR_EOPIE); + } + + /** + * @brief Disable End of operation interrupt (EOPIE). + * @rmtoll CR EOPIE LL_FLASH_DisableIT_EOPIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_DisableIT_EOPIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->CR, FLASH_CR_EOPIE); + } + + /** + * @brief Indicates whether the PCROP read error interrupt (RDERRIE) is enabled. + * @rmtoll CR2 RDERRIE LL_FLASH_IsEnabledIT_RDERRIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledIT_RDERRIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_RDERRIE) == (FLASH_CR_RDERRIE)) ? 1UL : 0UL); + } + + /** + * @brief Indicates whether the Error interrupt (ERRIE) is enabled. + * @rmtoll CR2 ERRIE LL_FLASH_IsEnabledIT_ERRIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledIT_ERRIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_ERRIE) == (FLASH_CR_ERRIE)) ? 1UL : 0UL); + } + + /** + * @brief Indicates whether the End of operation interrupt (EOPIE) is enabled. + * @rmtoll CR2 EOPIE LL_FLASH_IsEnabledIT_EOPIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_IsEnabledIT_EOPIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->CR, FLASH_CR_EOPIE) == (FLASH_CR_EOPIE)) ? 1UL : 0UL); + } + + /** + * @brief Enable ECC correction interrupt (ECCIE). + * @rmtoll ECCR ECCIE LL_FLASH_ECC_EnableIT_ECCIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_EnableIT_ECCIE(FLASH_TypeDef *FLASHx) + { + SET_BIT(FLASHx->ECCR, FLASH_ECCR_ECCIE); + } + + /** + * @brief Disable ECC correction interrupt (ECCIE). + * @rmtoll ECCR ECCIE LL_FLASH_ECC_DisableIT_ECCIE + * @param FLASHx FLASH instance + * @retval None + */ + __STATIC_INLINE void LL_FLASH_ECC_DisableIT_ECCIE(FLASH_TypeDef *FLASHx) + { + CLEAR_BIT(FLASHx->ECCR, FLASH_ECCR_ECCIE); + } + + /** + * @brief Indicates whether the ECC correction interrupt (ECCIE) is enabled. + * @rmtoll ECCR RDERRIE LL_FLASH_ECC_IsEnabledIT_ECCIE + * @param FLASHx FLASH Instance + * @retval State of bit (1 or 0). + */ + __STATIC_INLINE uint32_t LL_FLASH_ECC_IsEnabledIT_ECCIE(FLASH_TypeDef *FLASHx) + { + return ((READ_BIT(FLASHx->ECCR, FLASH_ECCR_ECCIE) == (FLASH_ECCR_ECCIE)) ? 1UL : 0UL); + } + + /** + * @} + */ + + /** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + void LL_FLASH_ClearAllErrorFlag(void); + void LL_FLASH_FlushCaches(void); + ErrorStatus LL_FLASH_ErasePage(uint32_t pageno); + ErrorStatus LL_FLASH_EraseBank(uint32_t bank); + ErrorStatus LL_FLASH_EraseChip(void); + ErrorStatus LL_FLASH_ProgramDoubleWord(uint32_t address, uint64_t data); + ErrorStatus LL_FLASH_Program(uint32_t address, uint8_t data[], uint32_t num); + ErrorStatus LL_FLASH_Read(uint32_t address, uint8_t data[], uint32_t num); + void LL_FLASH_ProgramFast(uint32_t address, uint32_t DataAddress); + void LL_FLASH_EraseAddress(uint32_t address, uint16_t size); + /** + * @} + */ + + /** + * @} + */ + + /** + * @} + */ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_LL_FLASH_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/User/system/bsp/gpios.c b/User/system/bsp/gpios.c new file mode 100644 index 0000000..cb59b80 --- /dev/null +++ b/User/system/bsp/gpios.c @@ -0,0 +1,76 @@ +#include "gpios.h" +#include "gpio.h" +/** + * @brief 设置GPIO引脚为高电平 + * @param {gpio_t} gpio - GPIO对象 + * @note: 用于设置指定GPIO引脚为高电平。 + */ +static void _set(gpio_t gpio) +{ + GPIO_SET(gpio.port, gpio.pin); +} + +/** + * @brief 设置GPIO引脚为低电平 + * @param {gpio_t} gpio - GPIO对象 + * @note: 用于设置指定GPIO引脚为低电平。 + */ +static void _reset(gpio_t gpio) +{ + GPIO_RESET(gpio.port, gpio.pin); +} + +/** + * @brief 切换GPIO引脚状态 + * @param {gpio_t} gpio - GPIO对象 + * @note: 用于切换指定GPIO引脚的状态,即高电平变为低电平,低电平变为高电平。 + */ +static void _toggle(gpio_t gpio) +{ + GPIO_TOGGLE(gpio.port, gpio.pin); +} + +/** + * @brief 读取GPIO引脚状态 + * @param {gpio_t} gpio - GPIO对象 + * @return {*} - GPIO引脚当前状态,即0表示低电平,1表示高电平 + * @note: 用于读取指定GPIO引脚的状态,即返回0或1。 + */ +static uint8_t _read(gpio_t gpio) +{ + return (uint8_t)GPIO_READ(gpio.port, gpio.pin); +} + +/** + * @brief 创建GPIO对象 + * @param {GPIO_TypeDef} *port - GPIO寄存器指针 + * @param {uint16_t} pin - 引脚号 + * @return {gpio_t *} - 创建的GPIO对象指针 + * @note: 用于创建一个GPIO对象,用于操作特定端口和引脚的GPIO功能。 + */ +gpio_t *gpio_create(GPIO_TypeDef *port, uint16_t pin) +{ + gpio_t *gpio = (gpio_t *)osel_mem_alloc(sizeof(gpio_t)); + DBG_ASSERT(gpio != NULL __DBG_LINE); + gpio->port = port; + gpio->pin = pin; + gpio->set = _set; + gpio->reset = _reset; + gpio->toggle = _toggle; + gpio->read = _read; + return gpio; +} + +/** + * @brief 释放GPIO对象 + * @param {gpio_t} *gpio - GPIO对象指针 + * @return {*} + * @note: 用于释放一个GPIO对象,释放后不能再使用该对象。 + */ +void gpio_free(gpio_t *gpio) +{ + if (gpio != NULL) + { + osel_mem_free(gpio); + } +} diff --git a/User/system/bsp/gpios.h b/User/system/bsp/gpios.h new file mode 100644 index 0000000..36594e7 --- /dev/null +++ b/User/system/bsp/gpios.h @@ -0,0 +1,170 @@ +/** + * @file gpios.h + * @brief Header file for GPIO configuration and control. + * + * This file contains the declarations and definitions for GPIO configuration and control functions. + * + * @author xxx + * @date 2023-12-27 14:44:03 + * @version 1.0 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ + +#ifndef __GPIOS_H__ +#define __GPIOS_H__ +#include "lib.h" +#include "main.h" +/** + * @brief Set the GPIO pin to high. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_SET(port, pin) (HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET)) + +/** + * @brief Set the GPIO pin to low. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_RESET(port, pin) (HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET)) + +/** + * @brief Toggle the state of the GPIO pin. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_TOGGLE(port, pin) (HAL_GPIO_TogglePin(port, pin)) + +/** + * @brief Read the state of the GPIO pin. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + * @return The state of the GPIO pin (1 if high, 0 if low). + */ +#define GPIO_READ(port, pin) (HAL_GPIO_ReadPin(port, pin) == GPIO_PIN_SET) + +/** + * @brief Set the GPIO pin as input. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_SET_INPUT(port, pin) \ + do \ + { \ + GPIO_InitTypeDef GPIO_InitStruct = {0}; \ + GPIO_InitStruct.Pin = pin; \ + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \ + GPIO_InitStruct.Pull = GPIO_NOPULL; \ + HAL_GPIO_Init(port, &GPIO_InitStruct); \ + } while (0) + +/** + * @brief Set the GPIO pin as output. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_SET_OUTPUT(port, pin) \ + do \ + { \ + GPIO_InitTypeDef GPIO_InitStruct = {0}; \ + GPIO_InitStruct.Pin = pin; \ + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \ + GPIO_InitStruct.Pull = GPIO_NOPULL; \ + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; \ + HAL_GPIO_Init(port, &GPIO_InitStruct); \ + } while (0) + +/** + * @brief Set the GPIO pin as alternate function. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_SET_ALTERNATE(port, pin, af) \ + do \ + { \ + GPIO_InitTypeDef GPIO_InitStruct = {0}; \ + GPIO_InitStruct.Pin = pin; \ + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; \ + GPIO_InitStruct.Pull = GPIO_NOPULL; \ + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; \ + GPIO_InitStruct.Alternate = af; \ + HAL_GPIO_Init(port, &GPIO_InitStruct); \ + } while (0) + +/** + * @brief Set the GPIO pin as analog. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + */ +#define GPIO_SET_ANALOG(port, pin) \ + do \ + { \ + GPIO_InitTypeDef GPIO_InitStruct = {0}; \ + GPIO_InitStruct.Pin = pin; \ + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; \ + GPIO_InitStruct.Pull = GPIO_NOPULL; \ + HAL_GPIO_Init(port, &GPIO_InitStruct); \ + } while (0) +/** + * @brief Structure representing a GPIO pin. + */ +typedef struct GPIO +{ + GPIO_TypeDef *port; ///< The GPIO port. + uint16_t pin; ///< The GPIO pin. + + /** + * @brief Set the GPIO pin to high. + * + * @param gpio The GPIO pin. + */ + void (*set)(struct GPIO gpio); + + /** + * @brief Set the GPIO pin to low. + * + * @param gpio The GPIO pin. + */ + void (*reset)(struct GPIO gpio); + + /** + * @brief Toggle the state of the GPIO pin. + * + * @param gpio The GPIO pin. + */ + void (*toggle)(struct GPIO gpio); + + /** + * @brief Read the state of the GPIO pin. + * + * @param gpio The GPIO pin. + * @return The state of the GPIO pin (1 if high, 0 if low). + */ + uint8_t (*read)(struct GPIO gpio); +} gpio_t; + +/** + * @brief Create a GPIO pin. + * + * @param port The GPIO port. + * @param pin The GPIO pin. + * @return The created GPIO pin. + */ +extern gpio_t *gpio_create(GPIO_TypeDef *port, uint16_t pin); + +/** + * @brief Free the memory allocated for a GPIO pin. + * + * @param gpio The GPIO pin to free. + */ +extern void gpio_free(gpio_t *gpio); + +#endif ///< __GPIOS_H__ diff --git a/User/system/bsp/i2cs.c b/User/system/bsp/i2cs.c new file mode 100644 index 0000000..c6f53ba --- /dev/null +++ b/User/system/bsp/i2cs.c @@ -0,0 +1,669 @@ +#include "i2cs.h" +#include "main.h" + +static inline void delay(i2c_t *handle); // 延时函数 +static inline void _ack(i2c_t *handle); // 应答 +static inline void _nack(i2c_t *handle); // 非应答 + +/** + * @brief 启动I2C总线 + * @param {i2c_t} *handle - I2C总线句柄 + * @note: 用于启动I2C总线的操作。在发送或接收数据之前,需要先启动总线。 + */ +static void _start(i2c_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + // 获取gpios指针 + i2c_gpio_group_t *gpios = &handle->gpios; + // 获取scl指针 + gpio_t *scl = gpios->scl; + // 获取sda指针 + gpio_t *sda = gpios->sda; + // 设置sda + gpios->sda->set(*sda); + // 设置scl + gpios->scl->set(*scl); + // 延时 + delay(handle); + // 重置sda + gpios->sda->reset(*sda); + // 延时 + delay(handle); + // 重置scl + gpios->scl->reset(*scl); + // 延时 + delay(handle); +} + +/** + * @brief 停止I2C总线 + * @param {i2c_t} *handle - I2C总线句柄 + * @note: 用于停止I2C总线的操作。在发送或接收数据之后,需要先停止总线。 + */ +static void _stop(i2c_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + i2c_gpio_group_t *gpios = &handle->gpios; + gpio_t *scl = gpios->scl; + gpio_t *sda = gpios->sda; + gpios->scl->reset(*scl); + gpios->sda->reset(*sda); + delay(handle); + gpios->scl->set(*scl); + gpios->sda->set(*sda); + delay(handle); +} +/** + * @brief 等待应答信号 + * @param {i2c_t} *handle - I2C总线句柄 + * @return {BOOL} - 等待成功返回TRUE,否则返回FALSE + * @note: 用于等待I2C总线上发送的应答信号。 + */ +static BOOL _wait_ack(i2c_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + uint8_t count = 0; + i2c_gpio_group_t *gpios = &handle->gpios; + gpio_t *scl = gpios->scl; + gpio_t *sda = gpios->sda; + gpios->sda->set(*sda); + gpios->scl->set(*scl); + delay(handle); + while (gpios->sda->read(*sda)) + { + count++; + if (count > 250) + { + _stop(handle); + return FALSE; + } + } + gpios->scl->reset(*scl); + delay(handle); + return TRUE; +} + +/** + * @brief 读取一个字节 + * @param {i2c_t} *handle - I2C总线句柄 + * @param {BOOL} ack - 应答信号标志 + * @return {uint8_t} - 读取到的字节 + * @note: 用于从I2C总线上读取一个字节。在读取一个字节后,需要发送应答信号。 + */ +static uint8_t _read_byte(i2c_t *handle, BOOL ack) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + uint8_t i = 0, receive = 0; + i2c_gpio_group_t *gpios = &handle->gpios; + gpio_t *scl = gpios->scl; + gpio_t *sda = gpios->sda; + for (i = 0; i < 8; i++) + { + gpios->sda->set(*sda); + gpios->scl->set(*scl); + receive <<= 1; + delay(handle); + + if (gpios->sda->read(*sda)) + receive++; + + gpios->scl->reset(*scl); + delay(handle); + } + + if (TRUE == ack) + { + _ack(handle); + } + else + { + _nack(handle); + } + return receive; +} +/** + * @brief 发送一个字节的数据到I2C总线上 + * @param {i2c_t} *handle I2C总线的句柄 + * @param {uint8_t} data 要发送的字节数据 + * @return {*} 无 + * @note: 该函数用于在I2C总线上发送一个字节的数据。它首先定义了一个循环,用于遍历要发送的字节中的每一位。在循环中,首先检查当前位是否为1,如果是,则设置SDA为1,否则设置SDA为0。然后设置SCL为1,延时1ms。接着将数据右移一位,然后设置SCL为0,延时1ms。当位遍历完后,最后设置SDA为1,以确保正确的结束传输。 + */ +static void _write_byte(i2c_t *handle, uint8_t data) +{ + // 定义变量i + uint8_t i = 0; + // 断言参数handle不为空 + DBG_ASSERT(handle != NULL __DBG_LINE); + // 定义变量gpios + i2c_gpio_group_t *gpios = &handle->gpios; + // 定义变量scl + gpio_t *scl = gpios->scl; + // 定义变量sda + gpio_t *sda = gpios->sda; + // 遍历每一位 + for (i = 0; i < 8; i++) + { + // 如果data的最低位为1 + if (data & 0x80) + { + // 设置sda的状态为1 + gpios->sda->set(*sda); + } + // 否则,设置sda的状态为0 + else + { + // 设置sda的状态为0 + gpios->sda->reset(*sda); + } + + // 设置scl的状态为1 + gpios->scl->set(*scl); + // 延时1ms + delay(handle); + // 将data右移1位 + data <<= 1; + // 设置scl的状态为0 + gpios->scl->reset(*scl); + // 延时1ms + delay(handle); + + // 如果i等于7 + if (i == 7) + { + // 设置sda的状态为1 + gpios->sda->set(*sda); + } + } +} + +/** + * @brief 发送一个字节的数据到I2C总线上 + * @param {i2c_t} *handle I2C总线的句柄 + * @param {uint16_t} data 要发送的字节数据 + * @return {*} 无 + * @note: 该函数用于在I2C总线上发送一个字节的数据。它首先定义了一个循环,用于遍历要发送的字节中的每一位。在循环中,首先检查当前位是否为1,如果是,则设置SDA为1,否则设置SDA为0。然后设置SCL为1,延时1ms。接着将数据右移一位,然后设置SCL为0,延时1ms。当位遍历完后,最后设置SDA为1,以确保正确的结束传输。 + */ +static void _write_word(i2c_t *handle, uint16_t data) +{ + // 循环写入2个字节 + for (uint8_t i = 0; i < 2; i++) + { + // 将data的第i个字节写入i2c接口 + _write_byte(handle, (uint8_t)(data >> (8 * i))); + // 等待ACK + _wait_ack(handle); + } +} + +/** + * @brief 创建一个I2C总线设备 + * @param {i2c_gpio_group_t} gpios I2C总线的GPIO配置 + * @param {uint16_t} delay_ticks I2C总线的延时参数 + * @return {i2c_t *} 创建的I2C总线设备句柄 + * @note: 该函数用于创建一个I2C总线设备。它首先创建一个i2c_t结构体,并将gpios和delay_ticks的内存地址复制到handle结构体中。然后,它为handle结构体定义了start、stop、wait_ack、read_byte、write_byte和write_word函数。最后,它返回handle结构体。 + */ +i2c_t *i2c_create(i2c_gpio_group_t gpios, uint16_t delay_ticks) +{ + // 创建一个i2c_t结构体 + i2c_t *handle = (i2c_t *)osel_mem_alloc(sizeof(i2c_t)); + // 将gpios的内存地址复制到handle结构体中 + osel_memcpy((uint8_t *)&handle->gpios, (uint8_t *)&gpios, sizeof(i2c_gpio_group_t)); + // 将delay_ticks的内存地址复制到handle结构体中 + handle->delay_ticks = delay_ticks; + + // 创建一个start函数 + handle->interface.start = _start; + // 创建一个stop函数 + handle->interface.stop = _stop; + // 创建一个wait_ack函数 + handle->interface.wait_ack = _wait_ack; + // 创建一个read_byte函数 + handle->interface.read_byte = _read_byte; + // 创建一个write_byte函数 + handle->interface.write_byte = _write_byte; + // 创建一个write_word函数 + handle->interface.write_word = _write_word; + + handle->dead_count = 0; + // 返回handle结构体 + return handle; +} + +/** + * @brief 设置I2C器件地址 + * @param {i2c_t} *handle + * @param {uint8_t} w_address 写地址 + * @param {uint8_t} r_address 读地址 + * @return {*} + * @note + */ +void i2c_dma_set_address(i2c_t *handle, uint8_t w_address, uint8_t r_address) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->w_address = w_address; + handle->r_address = r_address; +} + +/** + * @brief 释放I2C总线设备 + * @param {i2c_t} *handle 需要释放的I2C总线设备句柄 + * @return {*} 无 + * @note: 该函数用于释放一个I2C总线设备。它首先检查handle是否为空,如果不为空,则释放所有的GPIO。最后,释放handle的内存。 + */ +void i2c_free(i2c_t *handle) +{ + // 如果handle不为空,则释放所有的gpio + if (NULL != handle) + { + gpio_free(handle->gpios.scl); + gpio_free(handle->gpios.sda); + osel_mem_free(handle); + } +} + +/** + * @brief I2C DMA TX回调函数 + * @param {i2c_t} handle + * @return {*} + * @note + */ +void i2c_dma_callback(i2c_t *handle) +{ + // 检查输入参数是否为空 + DBG_ASSERT(handle != NULL __DBG_LINE); + // 清除传输完成标志位 + if (handle->dma_tx_cb != NULL) + { + handle->dma_tx_cb(handle); + } + if (handle->dma_rx_cb != NULL) + { + handle->dma_rx_cb(handle); + } +} + +#if defined(STM32L4xx_LL_I2C_H) +static void i2c_reset(i2c_t *handle); +static BOOL _read_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_addsize, uint8_t *data, uint16_t size); +static BOOL _write_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_addsize, uint8_t *data, uint16_t size); +/** + * @brief 创建一个I2C总线设备 DMA + * @param {I2C_TypeDef} *i2c + * @param {DMA_TypeDef} *dma + * @param {uint16_t} rxsize + * @param {uint32_t} dma_rx_channel + * @param {uint16_t} txsize + * @param {uint32_t} dma_tx_channel + * @return {*} + * @note + */ +i2c_t *i2c_create_dma(I2C_TypeDef *i2c, DMA_TypeDef *dma, uint16_t rxsize, uint32_t dma_rx_channel, + i2cs_dma_callback *dma_rx_cb, uint16_t txsize, uint32_t dma_tx_channel, i2cs_dma_callback *dma_tx_cb) +{ + i2c_t *handle = (i2c_t *)osel_mem_alloc(sizeof(i2c_t)); + handle->i2c = i2c; + handle->dma = dma; + handle->dma_rx_channel = dma_rx_channel; + handle->dma_tx_channel = dma_tx_channel; + handle->rxbuf = (uint8_t *)osel_mem_alloc(rxsize); + handle->txbuf = (uint8_t *)osel_mem_alloc(txsize); + handle->rxsize = rxsize; + handle->txsize = txsize; + handle->tx_dma_ok = TRUE; + handle->interface.write_mem_dma = _write_mem_dma; + handle->interface.read_mem_dma = _read_mem_dma; + if (dma_rx_cb != NULL) + { + handle->dma_rx_cb = dma_rx_cb; + } + + if (dma_tx_cb != NULL) + { + handle->dma_tx_cb = dma_tx_cb; + } + + LL_DMA_DisableChannel(dma, dma_tx_channel); + LL_DMA_DisableChannel(dma, dma_rx_channel); + + // TX + uint8_t *pTransmitBuffer = handle->txbuf; + LL_DMA_ConfigTransfer(dma, dma_tx_channel, LL_DMA_DIRECTION_MEMORY_TO_PERIPH | LL_DMA_PRIORITY_HIGH | LL_DMA_MODE_NORMAL | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_BYTE | LL_DMA_MDATAALIGN_BYTE); + LL_DMA_ConfigAddresses(dma, dma_tx_channel, (uint32_t)pTransmitBuffer, (uint32_t)LL_I2C_DMA_GetRegAddr(i2c, LL_I2C_DMA_REG_DATA_TRANSMIT), LL_DMA_GetDataTransferDirection(dma, dma_tx_channel)); + LL_DMA_SetPeriphRequest(dma, dma_tx_channel, LL_DMA_REQUEST_3); + + // RX + uint8_t *pReceiveBuffer = handle->rxbuf; + LL_DMA_ConfigTransfer(dma, dma_rx_channel, LL_DMA_DIRECTION_PERIPH_TO_MEMORY | LL_DMA_PRIORITY_HIGH | LL_DMA_MODE_NORMAL | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_BYTE | LL_DMA_MDATAALIGN_BYTE); + LL_DMA_ConfigAddresses(dma, dma_rx_channel, (uint32_t)LL_I2C_DMA_GetRegAddr(i2c, LL_I2C_DMA_REG_DATA_RECEIVE), (uint32_t)pReceiveBuffer, LL_DMA_GetDataTransferDirection(dma, dma_rx_channel)); + LL_DMA_SetPeriphRequest(dma, dma_rx_channel, LL_DMA_REQUEST_3); + + LL_DMA_EnableIT_TC(dma, dma_tx_channel); + LL_DMA_EnableIT_TE(dma, dma_tx_channel); + LL_DMA_EnableIT_TC(dma, dma_rx_channel); + LL_DMA_EnableIT_TE(dma, dma_rx_channel); + + LL_I2C_EnableDMAReq_TX(i2c); + LL_I2C_EnableDMAReq_RX(i2c); + LL_I2C_Enable(i2c); + + return handle; +} + +/** + * @brief 非阻塞模式下使用DMA从特定内存地址读取数据 + * @param {i2c_t} *handle 指向一个i2c_t结构体,其中包含指定I2C的配置信息 + * @param {uint16_t} dev_address 目标设备地址:在数据手册中,设备7位地址值需要向左移动以调用接口 + * @param {uint16_t} mem_address 内部内存地址 + * @param {uint16_t} mem_addsize 内部内存地址大小 + * @param {uint8_t} *data 数据缓冲区的指针 + * @param {uint16_t} size 要发送的数据量 + * @return {*} + * @note + */ +static BOOL _read_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_addsize, uint8_t *data, uint16_t size) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + if (LL_I2C_IsActiveFlag_BUSY(handle->i2c) == 1) + { + i2c_reset(handle); // xsh:重置I2C,修复一段时间后无法读写的问题 + return FALSE; + } + uint16_t count = 2000; + handle->txsize = 0; + handle->tx_dma_ok = FALSE; + handle->rx_dma_ok = FALSE; + + for (uint8_t i = mem_addsize; i > 0; i--) + { + handle->txbuf[handle->txsize++] = (uint8_t)(mem_address >> (8 * (i - 1))); + } + + LL_DMA_SetDataLength(handle->dma, handle->dma_tx_channel, handle->txsize); + LL_DMA_EnableChannel(handle->dma, handle->dma_tx_channel); + + LL_I2C_HandleTransfer(handle->i2c, handle->w_address, LL_I2C_ADDRSLAVE_7BIT, handle->txsize, LL_I2C_MODE_SOFTEND, LL_I2C_GENERATE_START_WRITE); + count = 2000; + while (!handle->tx_dma_ok) + { + if (count-- == 0) + { + handle->tx_dma_ok = TRUE; + return FALSE; + } + } + + count = 2000; + while (LL_I2C_IsActiveFlag_TC(handle->i2c) != 1) + { + if (count-- == 0) + { + handle->tx_dma_ok = TRUE; + return FALSE; + } + } + + handle->tx_dma_ok = FALSE; + handle->rx_dma_ok = FALSE; + handle->rxsize = size; + osel_memset(handle->rxbuf, 0, handle->rxsize); + LL_DMA_DisableChannel(handle->dma, handle->dma_tx_channel); + LL_DMA_SetDataLength(handle->dma, handle->dma_rx_channel, handle->rxsize); + LL_DMA_EnableChannel(handle->dma, handle->dma_rx_channel); + LL_I2C_HandleTransfer(handle->i2c, handle->r_address, LL_I2C_ADDRSLAVE_7BIT, handle->rxsize, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_RESTART_7BIT_READ); + + count = 2000; + while (!LL_I2C_IsActiveFlag_STOP(handle->i2c)) + { + if (count-- == 0) + { + handle->tx_dma_ok = TRUE; + return FALSE; + } + } + + LL_DMA_DisableChannel(handle->dma, handle->dma_rx_channel); + LL_I2C_ClearFlag_STOP(handle->i2c); + osel_memcpy(data, handle->rxbuf, handle->rxsize); + return TRUE; +} + +/** + * @brief 非阻塞模式下使用DMA将数据写入特定内存地址 + * @param {i2c_t} *handle 指向一个i2c_t结构体,其中包含指定I2C的配置信息 + * @param {uint16_t} dev_address 目标设备地址:在数据手册中,设备7位地址值需要向左移动以调用接口 + * @param {uint16_t} mem_address 内部内存地址 + * @param {uint16_t} mem_addsize 内部内存地址大小 + * @param {uint8_t} *data 数据缓冲区的指针 + * @param {uint16_t} size 要发送的数据量 + * @return {*} + * @note + */ +static BOOL _write_mem_dma(i2c_t *handle, uint16_t mem_address, uint16_t mem_addsize, uint8_t *data, uint16_t size) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + uint16_t count = 2000; + if (LL_I2C_IsActiveFlag_BUSY(handle->i2c) == 1) + { + i2c_reset(handle); // xsh:重置I2C,修复一段时间后无法读写的问题 + return FALSE; + } + + handle->txsize = 0; + handle->tx_dma_ok = FALSE; + for (uint8_t i = mem_addsize; i > 0; i--) + { + handle->txbuf[handle->txsize++] = (uint8_t)(mem_address >> (8 * (i - 1))); + } + osel_memcpy(&handle->txbuf[handle->txsize], data, size); + handle->txsize += size; + LL_DMA_SetDataLength(handle->dma, handle->dma_tx_channel, handle->txsize); + LL_DMA_EnableChannel(handle->dma, handle->dma_tx_channel); + + LL_I2C_HandleTransfer(handle->i2c, handle->w_address, LL_I2C_ADDRSLAVE_7BIT, handle->txsize, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_WRITE); + + count = 2000; + while (!handle->tx_dma_ok) + { + if (count-- == 0) + { + handle->tx_dma_ok = TRUE; + return FALSE; + } + } + count = 2000; + while (!LL_I2C_IsActiveFlag_STOP(handle->i2c)) + { + if (count-- == 0) + { + handle->tx_dma_ok = TRUE; + return FALSE; + } + } + + LL_DMA_DisableChannel(handle->dma, handle->dma_tx_channel); + LL_I2C_ClearFlag_STOP(handle->i2c); + + return TRUE; +} + +/** + * @brief I2C重置 + * @param {I2C_TypeDef} *I2Cx + * @return {*} + * @note 解决I2C总线死锁问题 + */ +static void i2c_reset(i2c_t *handle) +{ + LL_I2C_Disable(handle->i2c); + LL_I2C_Enable(handle->i2c); + handle->dead_count++; +} + +/** + * @brief I2C 中断回调函数 + * @param {i2c_t} *handle + * @return {*} + * @note + */ +void i2c_ev_callback(i2c_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + if (LL_I2C_IsActiveFlag_ADDR(handle->i2c)) + { + /* Verify the Address Match with the OWN Slave address */ + if (LL_I2C_GetAddressMatchCode(handle->i2c) == handle->w_address || LL_I2C_GetAddressMatchCode(handle->i2c) == handle->r_address) + { + /* Verify the transfer direction, a write direction, Slave enters receiver mode */ + if (LL_I2C_GetTransferDirection(handle->i2c) == LL_I2C_DIRECTION_WRITE) + { + /* Clear ADDR flag value in ISR register */ + LL_I2C_ClearFlag_ADDR(handle->i2c); + + /* Enable Receive Interrupt */ + LL_I2C_EnableIT_RX(handle->i2c); + } + else if (LL_I2C_GetTransferDirection(handle->i2c) == LL_I2C_DIRECTION_READ) + { + /* Clear ADDR flag value in ISR register */ + LL_I2C_ClearFlag_ADDR(handle->i2c); + + /* Enable Transmit Interrupt */ + LL_I2C_EnableIT_TX(handle->i2c); + } + } + else + { + /* Clear ADDR flag value in ISR register */ + LL_I2C_ClearFlag_ADDR(handle->i2c); + + /* Call Error function */ + DBG_ASSERT(FALSE __DBG_LINE); + } + } + /* Check NACK flag value in ISR register */ + else if (LL_I2C_IsActiveFlag_NACK(handle->i2c)) + { + /* End of Transfer */ + LL_I2C_ClearFlag_NACK(handle->i2c); + } + /* Check RXNE flag value in ISR register */ + else if (LL_I2C_IsActiveFlag_RXNE(handle->i2c)) + { + /* Call function Slave Reception Callback */ + } + /* Check TXIS flag value in ISR register */ + else if (LL_I2C_IsActiveFlag_TXIS(handle->i2c)) + { + /* Call function Slave Ready to Transmit Callback */ + } + /* Check STOP flag value in ISR register */ + else if (LL_I2C_IsActiveFlag_STOP(handle->i2c)) + { + /* End of Transfer */ + LL_I2C_ClearFlag_STOP(handle->i2c); + + /* Check TXE flag value in ISR register */ + if (!LL_I2C_IsActiveFlag_TXE(handle->i2c)) + { + /* Flush TX buffer */ + LL_I2C_ClearFlag_TXE(handle->i2c); + } + + /* Call function Slave Complete Callback */ + } + /* Check TXE flag value in ISR register */ + else if (!LL_I2C_IsActiveFlag_TXE(handle->i2c)) + { + /* Do nothing */ + /* This Flag will be set by hardware when the TXDR register is empty */ + /* If needed, use LL_I2C_ClearFlag_TXE() interface to flush the TXDR register */ + } + else + { + /* Call Error function */ + DBG_ASSERT(FALSE __DBG_LINE); + } +} +#endif + +/*下面是内部实现方法*/ + +/** + * @brief 此方法是一个简单的延迟函数,它使用循环来执行指定数量的NOP(无操作)指令。这个延迟函数的目的是在程序的执行中引入延迟,这在需要精确定时的某些应用中很有用。延迟时间由输入参数“count”的值决定,该参数指定要执行的NOP指令的数量。延迟时间通常以微秒或毫秒为单位测量,具体取决于使用延迟的环境。 + * @param {uint16_t} count NOP指令的数量 + * @return {*} + */ +static inline void delay(i2c_t *handle) +{ + // 断言参数handle不为空 + DBG_ASSERT(handle != NULL __DBG_LINE); + // 定义循环计数变量count + uint16_t count = 0; + // 设置循环计数变量count的值为handle->delay_ticks + count = handle->delay_ticks; + // 循环计数变量count的值,直到count的值为0 + while (count--) + { + // 每次循环调用__NOP()函数 + __NOP(); + } +} + +/** + * @brief 发送ACK信号 + * @param {i2c_t} *handle I2C总线的句柄 + * @return {*} 无 + * @note: 该函数用于在I2C总线上发送ACK信号。它首先断言handle不为空,然后获取gpios和scl、sda的指针。接着重置sda,延时1ms,设置scl为1,延时1ms,重置scl,确保正确的结束传输。 + */ +static inline void _ack(i2c_t *handle) +{ + // 断言handle不为空 + DBG_ASSERT(handle != NULL __DBG_LINE); + // 获取gpios指针 + i2c_gpio_group_t *gpios = &handle->gpios; + // 获取scl指针 + gpio_t *scl = gpios->scl; + // 获取sda指针 + gpio_t *sda = gpios->sda; + + // 重置sda + gpios->sda->reset(*sda); + // 延时 + delay(handle); + // 设置scl + gpios->scl->set(*scl); + // 延时 + delay(handle); + // 重置scl + gpios->scl->reset(*scl); +} + +/** + * @brief 发送NACK信号 + * @param {i2c_t} *handle I2C总线的句柄 + * @return {*} 无 + * @note: 该函数用于在I2C总线上发送NACK信号。它首先断言handle不为空,然后获取gpios和scl、sda的指针。接着设置sda为1,延时1ms,设置scl为1,延时1ms,重置scl,确保正确的结束传输。 + */ +static inline void _nack(i2c_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + // 获取gpios指针 + i2c_gpio_group_t *gpios = &handle->gpios; + // 获取scl指针 + gpio_t *scl = gpios->scl; + // 获取sda指针 + gpio_t *sda = gpios->sda; + + // 设置sda引脚 + gpios->sda->set(*sda); + // 等待延时 + delay(handle); + // 设置scl引脚 + gpios->scl->set(*scl); + // 等待延时 + delay(handle); + // 重置scl引脚 + gpios->scl->reset(*scl); +} diff --git a/User/system/bsp/i2cs.h b/User/system/bsp/i2cs.h new file mode 100644 index 0000000..bf83806 --- /dev/null +++ b/User/system/bsp/i2cs.h @@ -0,0 +1,127 @@ +/** + * @file i2cs.h + * @brief Header file for I2C Slave module. + * + * This file contains the declarations and definitions for the I2C Slave module. + * It provides functions to initialize and configure the I2C peripheral as a slave, + * as well as functions to send and receive data over the I2C bus. + * + * @author xxx + * @date 2023-12-27 14:44:03 + * @version 1.0 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ + +#ifndef __I2CS_H__ +#define __I2CS_H__ +#include "lib.h" +#include "gpios.h" +/** + * @file i2cs.h + * @brief Header file containing the definition of the I2C slave (I2CS) structure and related functions. + */ + +typedef struct I2CS i2c_t; +typedef void i2cs_dma_callback(i2c_t *handle); + +typedef struct +{ + void (*start)(i2c_t *handle); ///< Function pointer to start the I2C communication. + void (*stop)(i2c_t *handle); ///< Function pointer to stop the I2C communication. + BOOL(*wait_ack) + (i2c_t *handle); ///< Function pointer to wait for the acknowledgment from the I2C bus. + + void (*write_byte)(i2c_t *handle, uint8_t data); ///< Function pointer to write a byte of data to the I2C bus. + uint8_t (*read_byte)(i2c_t *handle, BOOL ack); ///< Function pointer to read a byte of data from the I2C bus. + + void (*write_word)(i2c_t *handle, uint16_t data); ///< Function pointer to write two bytes of data to the I2C bus. + + BOOL(*write_mem_dma) + (i2c_t *handle, uint16_t mem_address, uint16_t mem_addsize, uint8_t *data, uint16_t size); ///< Function pointer to write multiple bytes of data to a memory address using DMA. + BOOL(*read_mem_dma) + (i2c_t *handle, uint16_t mem_address, uint16_t mem_addsize, uint8_t *data, uint16_t size); ///< Function pointer to read multiple bytes of data from a memory address using DMA. +} i2c_interface_t; + +typedef struct +{ + struct GPIO *scl; ///< Pointer to the GPIO pin used for the I2C clock (SCL). + struct GPIO *sda; ///< Pointer to the GPIO pin used for the I2C data (SDA). +} i2c_gpio_group_t; + +struct I2CS +{ + ///< Analog part definition + i2c_gpio_group_t gpios; ///< Structure containing the GPIO pins used for the I2C communication. + uint16_t delay_ticks; ///< Number of NOP instructions to delay the I2C communication. + + ///< Hardware part definition + I2C_TypeDef *i2c; ///< Pointer to the I2C peripheral. + DMA_TypeDef *dma; ///< Pointer to the DMA peripheral. + uint32_t dma_rx_channel; ///< DMA channel used for receiving data. + uint32_t dma_tx_channel; ///< DMA channel used for transmitting data. + uint8_t *rxbuf; ///< Pointer to the receive buffer. + uint16_t rxsize; ///< Size of the receive buffer. + uint8_t *txbuf; ///< Pointer to the transmit buffer. + uint16_t txsize; ///< Size of the transmit buffer. + uint8_t w_address; ///< 7-bit write address. + uint8_t r_address; ///< 7-bit read address. + __IO BOOL rx_dma_ok; ///< Flag indicating the completion of receive DMA. + __IO BOOL tx_dma_ok; ///< Flag indicating the completion of transmit DMA. + + i2cs_dma_callback *dma_rx_cb; ///< Callback function called when receive DMA is completed. + i2cs_dma_callback *dma_tx_cb; ///< Callback function called when transmit DMA is completed. + + i2c_interface_t interface; ///< Structure containing the function pointers for the I2C interface. + uint16_t dead_count; ///< Counter for the number of deadlocks. +}; + +/** + * @brief Creates an I2C slave instance with GPIO pins for clock and data. + * @param gpios The GPIO pins used for the I2C communication. + * @param delay_ticks The number of NOP instructions to delay the I2C communication. + * @return A pointer to the created I2C slave instance. + */ +extern i2c_t *i2c_create(i2c_gpio_group_t gpios, uint16_t delay_ticks); + +/** + * @brief Creates an I2C slave instance with DMA support. + * @param i2c Pointer to the I2C peripheral. + * @param dma Pointer to the DMA peripheral. + * @param rxsize Size of the receive buffer. + * @param dma_rx_channel DMA channel used for receiving data. + * @param dma_rx_cb Callback function called when receive DMA is completed. + * @param txsize Size of the transmit buffer. + * @param dma_tx_channel DMA channel used for transmitting data. + * @param dma_tx_cb Callback function called when transmit DMA is completed. + * @return A pointer to the created I2C slave instance. + */ +extern i2c_t *i2c_create_dma(I2C_TypeDef *i2c, DMA_TypeDef *dma, uint16_t rxsize, uint32_t dma_rx_channel, + i2cs_dma_callback *dma_rx_cb, uint16_t txsize, uint32_t dma_tx_channel, i2cs_dma_callback *dma_tx_cb); + +/** + * @brief Sets the write and read addresses for the I2C slave instance with DMA support. + * @param handle Pointer to the I2C slave instance. + * @param w_address 7-bit write address. + * @param r_address 7-bit read address. + */ +extern void i2c_dma_set_address(i2c_t *handle, uint8_t w_address, uint8_t r_address); + +/** + * @brief Frees the resources used by the I2C slave instance. + * @param handle Pointer to the I2C slave instance. + */ +extern void i2c_free(i2c_t *handle); + +/** + * @brief Callback function called when an I2C event occurs. + * @param handle Pointer to the I2C slave instance. + */ +extern void i2c_ev_callback(i2c_t *handle); + +/** + * @brief Callback function called when an I2C DMA event occurs. + * @param handle Pointer to the I2C slave instance. + */ +extern void i2c_dma_callback(i2c_t *handle); + +#endif ///< __I2CS_H__ diff --git a/User/system/bsp/iwdgs.c b/User/system/bsp/iwdgs.c new file mode 100644 index 0000000..8b4228b --- /dev/null +++ b/User/system/bsp/iwdgs.c @@ -0,0 +1,39 @@ +#include "iwdgs.h" + +/** + * @brief 检查判断CPU复位是否是看门狗复位 + * @return {BOOL} + * @note + */ +BOOL check_watchdog_reset(void) +{ + if (LL_RCC_IsActiveFlag_IWDGRST() == SET) // cpu is reset due to iwdg + { + LL_RCC_ClearResetFlags(); // clear flag + return TRUE; + } + else + { + return FALSE; + } +} + +/** + * @brief 调试模式冻结看门狗 + * @return {*} + * @note + */ +void debug_freeze_watchdog(void) +{ + LL_DBGMCU_APB1_GRP1_FreezePeriph(LL_DBGMCU_APB1_GRP1_IWDG_STOP); +} + +/** + * @brief 调试模式恢复看门狗 + * @return {*} + * @note + */ +void debug_unfreeze_watchdog(void) +{ + LL_DBGMCU_APB1_GRP1_UnFreezePeriph(LL_DBGMCU_APB1_GRP1_IWDG_STOP); +} diff --git a/User/system/bsp/iwdgs.h b/User/system/bsp/iwdgs.h new file mode 100644 index 0000000..9c91099 --- /dev/null +++ b/User/system/bsp/iwdgs.h @@ -0,0 +1,45 @@ +/** + * @file iwdgs.h + * @brief This file contains the declaration of the Independent Watchdog (IWDG) module. + * + * The Independent Watchdog (IWDG) is a hardware module in STM32 microcontrollers that provides a mechanism for system reset in case of software failures or malfunctions. This file declares the functions and constants related to the IWDG module. + * + * @author xxx + * @date 2023-12-27 14:44:03 + * @version 1.0 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __IWDGS_H__ +#define __IWDGS_H__ + +#include "main.h" +#include "lib.h" +/** + * @brief Reloads the watchdog counter. + * + * This macro is used to reload the watchdog counter, preventing the system from resetting. + */ +#define WATCHDOG_RESET() LL_IWDG_ReloadCounter(IWDG) + +/** + * @brief Checks if the system has been reset by the watchdog. + * + * @return BOOL Returns TRUE if the system has been reset by the watchdog, FALSE otherwise. + */ +extern BOOL check_watchdog_reset(void); + +/** + * @brief Freezes the watchdog timer for debugging purposes. + * + * This function freezes the watchdog timer, allowing for debugging without triggering a watchdog reset. + */ +extern void debug_freeze_watchdog(void); + +/** + * @brief Unfreezes the watchdog timer after debugging. + * + * This function unfreezes the watchdog timer, allowing it to resume normal operation after debugging. + */ +extern void debug_unfreeze_watchdog(void); + +#endif diff --git a/User/system/bsp/pwms.h b/User/system/bsp/pwms.h new file mode 100644 index 0000000..5946032 --- /dev/null +++ b/User/system/bsp/pwms.h @@ -0,0 +1,90 @@ +/** + * @file pwms.h + * @brief Header file for PWMs module. + * + * This file contains the declarations and documentation for the PWMs module. + * + * @author xxx + * @date 2023-12-27 14:44:03 + * @version 1.0 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __PWMS_H__ +#define __PWMS_H__ +#include "lib.h" + +/** + * @brief Starts the PWM for a specific channel + * @param TIMx: TIM instance + * @param CHx: Channel to be started + * @retval None + */ +#define PWM_START(TIMx, CHx) \ + do \ + { \ + LL_TIM_EnableCounter(TIMx); \ + LL_TIM_CC_EnableChannel(TIMx, CHx); \ + } while (__LINE__ == -1) + +/** + * @brief Stops the PWM for a specific channel + * @param TIMx: TIM instance + * @param CHx: Channel to be stopped + * @retval None + */ +#define PWM_STOP(TIMx, CHx) \ + do \ + { \ + LL_TIM_DisableCounter(TIMx); \ + LL_TIM_CC_DisableChannel(TIMx, CHx); \ + } while (__LINE__ == -1) + +/** + * @brief Sets the PWM frequency + * @param TIMx: TIM instance + * @param CHx: Channel to be set + * @param COMPARE: Compare value + * @retval None + */ +static inline void PWM_SET_COMPARE(TIM_TypeDef *TIMx, uint32_t CHx, uint16_t COMPARE) +{ + switch (CHx) + { + case LL_TIM_CHANNEL_CH1: + LL_TIM_OC_SetCompareCH1(TIMx, COMPARE); + break; + case LL_TIM_CHANNEL_CH2: + LL_TIM_OC_SetCompareCH2(TIMx, COMPARE); + break; + case LL_TIM_CHANNEL_CH3: + LL_TIM_OC_SetCompareCH3(TIMx, COMPARE); + break; + case LL_TIM_CHANNEL_CH4: + LL_TIM_OC_SetCompareCH4(TIMx, COMPARE); + break; + default: + break; + } +} + +/** + * @brief 设置PWM占空比 + * + * 设置指定定时器TIMx的指定通道CHx的PWM占空比。 + * + * @param TIMx 定时器类型,例如TIM1、TIM2等 + * @param CHx 通道号,例如TIM_CHANNEL_1、TIM_CHANNEL_2等 + * @param DUTY 占空比,范围在0到100之间 + */ +static inline void PWM_SET_DUTY(TIM_TypeDef *TIMx, uint32_t CHx, uint16_t DUTY) +{ + PWM_SET_COMPARE(TIMx, CHx, DUTY * LL_TIM_GetAutoReload(TIMx) / 100); +} + +// 获取当前频率 +static inline uint32_t PWM_GET_FREQ(TIM_TypeDef *TIMx) +{ + return SystemCoreClock / (LL_TIM_GetPrescaler(TIMx) + 1) / (LL_TIM_GetAutoReload(TIMx) + 1); +} + +#endif ///< __PWMS_H__ diff --git a/User/system/bsp/readme.md b/User/system/bsp/readme.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/User/system/bsp/readme.md @@ -0,0 +1 @@ + diff --git a/User/system/bsp/spis.c b/User/system/bsp/spis.c new file mode 100644 index 0000000..15bf791 --- /dev/null +++ b/User/system/bsp/spis.c @@ -0,0 +1,811 @@ +#include "spis.h" +#include "delay.h" + +#define SPI_TIMEOUT 2000 + +#define CMD_RDSR 0x05 /*!< Read Status Register instruction */ +#define CMD_WRSR 0x01 /*!< Write Status Register instruction */ +#define CMD_WREN 0x06 /*!< Write enable instruction */ +#define CMD_WRDI 0x04 /*!< Write disable instruction */ +#define CMD_READ 0x03 /*!< Read from Memory instruction */ +#define CMD_WRITE 0x02 /*!< Write to Memory instruction */ +#define DUMMY_BYTE 0xA5 ///< 虚拟字节 + +static inline void spi_delay(spi_t *handle); // 延时函数 + +static inline void spi_rdy_high(spi_t *handle); // RDY高电平 +static inline void spi_rdy_low(spi_t *handle); // RDY低电平 +static inline void spi_cs_high(spi_t *handle); // CS高电平 +static inline void spi_cs_low(spi_t *handle); // CS低电平 +static inline void spi_mosi_high(spi_t *handle); // MOSI高电平 +static inline void spi_mosi_low(spi_t *handle); // MOSI低电平 +static inline void spi_sck_high(spi_t *handle); // SCK高电平 +static inline void spi_sck_low(spi_t *handle); // SCK低电平 +static inline uint8_t spi_miso_read(spi_t *handle); // 读取MISO电平 + +static uint8_t spi_read_write_byte(spi_t *handle, uint8_t tx_data); // 读写一个字节 +static void spi_reset(spi_t *handle); // 复位 +static BOOL spi_write(spi_t *handle, uint32_t write_addr, uint8_t *data, uint16_t length); // 写数据 +static BOOL spi_read(spi_t *handle, uint32_t write_addr, uint8_t *data, uint16_t length); // 读数据 +static void spi_write_reg(spi_t *handle, uint8_t reg, uint8_t data); // 写寄存器 +static uint8_t spi_read_reg(spi_t *handle, uint8_t reg); // 读寄存器 + +static void _hardware_enable(spi_t *handle, SPI_TypeDef *spi); // 硬件SPI +static void _dma_enable(spi_t *handle, DMA_TypeDef *dma, uint32_t dma_rx_channel, spis_dma_callback *dma_rx_cb, + uint32_t dma_tx_channel, spis_dma_callback *dma_tx_cb); // DMA SPI +static void _spi_dma_callback(spi_t *handle); // DMA发送完成回调 +static BOOL _spi_dma_send(spi_t *handle, uint8_t *data, uint16_t length); // DMA发送数据 +static uint8_t _read_drdy(spi_t *handle); // 读取DRDY电平 +static uint8_t _write_regs(spi_t *handle, uint8_t reg, uint8_t *data, uint8_t len); // 写多个寄存器 +static uint8_t _read_regs(spi_t *handle, uint8_t reg, uint8_t *data, uint8_t len); // 读多个寄存器 +static uint8_t _spi_write_reg(spi_t *handle, uint8_t reg, uint8_t data); // 写单个寄存器 +static uint8_t _spi_read_reg(spi_t *handle, uint8_t reg); // 读单个寄存器 +static uint8_t _spi_write_cmd(spi_t *handle, uint8_t cmd); // 写命令 +static uint8_t _spi_write_data(spi_t *handle, uint8_t *data, uint16_t len); // 写数据 + +/** + * @brief 创建一个SPI总线设备 + * @param {spi_type_e} spi_type SPI总线的类型 + * @param {spi_gpio_group_t} gpios SPI总线的GPIO配置 + * @param {uint16_t} delay_ticks SPI总线的延时参数 + * @return {*} 创建的SPI总线设备句柄 + * @note: 该函数用于创建一个SPI总线设备。它首先断言spi_type在有效的范围内,然后创建一个spi_t结构体,并将gpios和delay_ticks的内存地址复制到handle结构体中。接着,根据spi_type的值,设置不同的接口函数。最后,返回handle结构体。 + */ +spi_t *spi_create(spi_type_e spi_type, spi_gpio_group_t gpios, uint16_t delay_ticks) +{ + DBG_ASSERT(spi_type < SPI_TYPE_MAX __DBG_LINE); + spi_t *handle = (spi_t *)osel_mem_alloc(sizeof(spi_t)); + osel_memcpy((uint8_t *)&handle->gpios, (uint8_t *)&gpios, sizeof(spi_gpio_group_t)); + handle->delay_ticks = delay_ticks; + handle->spi_type = spi_type; + handle->simualte_gpio = TRUE; + handle->interface.hardware_enable = _hardware_enable; + handle->interface.dma_enable = _dma_enable; + handle->interface.spi_dma_send = _spi_dma_send; + handle->interface.spi_dma_callback = _spi_dma_callback; + if (spi_type == SPI_TYPE_NORMAL) + { + handle->interface.u.normal.write_reg = _spi_write_reg; + handle->interface.u.normal.read_reg = _spi_read_reg; + handle->interface.u.normal.write_regs = _write_regs; + handle->interface.u.normal.read_regs = _read_regs; + handle->interface.u.normal.read_drdy = _read_drdy; + + handle->interface.u.normal.spi_send = spi_read_write_byte; + handle->interface.u.normal.spi_reset = spi_reset; + handle->interface.u.normal.spi_read = spi_read; + handle->interface.u.normal.spi_write = spi_write; + handle->interface.u.normal.spi_write_reg = spi_write_reg; + handle->interface.u.normal.spi_read_reg = spi_read_reg; + + handle->cfg.cmd_rdsr = CMD_RDSR; + handle->cfg.cmd_wrsr = CMD_WRSR; + handle->cfg.cmd_wren = CMD_WREN; + handle->cfg.cmd_wrdi = CMD_WRDI; + handle->cfg.cmd_read = CMD_READ; + handle->cfg.cmd_write = CMD_WRITE; + handle->cfg.dummy_byte = DUMMY_BYTE; + handle->cfg.continuous_write = FALSE; + } + else if (spi_type == SPI_TYPE_LCD) + { + handle->interface.u.lcd.write_cmd = _spi_write_cmd; + handle->interface.u.lcd.write_data = _spi_write_data; + } + else + { + DBG_ASSERT(FALSE __DBG_LINE); + } + return handle; +} + +void spi_free(spi_t *handle) +{ + if (handle != NULL) + { + gpio_free(handle->gpios.cs); + gpio_free(handle->gpios.rdy); + gpio_free(handle->gpios.rst); + gpio_free(handle->gpios.mosi); + gpio_free(handle->gpios.miso); + gpio_free(handle->gpios.sck); + + osel_mem_free(handle); + } +} + +/** + * @brief 硬件SPI模式 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {SPI_TypeDef} *spi SPI总线的寄存器结构体指针 + * @return {*} 无 + * @note: 该函数用于设置SPI总线的硬件模式。它首先断言handle不为空,然后断言spix不为空。接着,将handle的simulate_gpio设置为FALSE,并将spix的地址赋值给handle->spix。最后,调用SPI_ENABLE函数启用SPI总线。 + */ +static void _hardware_enable(spi_t *handle, SPI_TypeDef *spi) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(spi != NULL __DBG_LINE); + handle->simualte_gpio = FALSE; + handle->spi = spi; + SPI_ENABLE(spi); +} + +static void _dma_enable(spi_t *handle, DMA_TypeDef *dma, uint32_t dma_rx_channel, spis_dma_callback *dma_rx_cb, + uint32_t dma_tx_channel, spis_dma_callback *dma_tx_cb) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(dma != NULL __DBG_LINE); + DBG_ASSERT(handle->spi != NULL __DBG_LINE); + handle->dma = dma; + handle->dma_rx_channel = dma_rx_channel; + handle->dma_tx_channel = dma_tx_channel; + handle->rx_dma_ok = TRUE; + handle->tx_dma_ok = TRUE; + if (dma_rx_cb != NULL) + { + handle->dma_rx_cb = dma_rx_cb; + } + if (dma_tx_cb != NULL) + { + handle->dma_tx_cb = dma_tx_cb; + } + + LL_DMA_SetPeriphAddress(dma, dma_tx_channel, LL_SPI_DMA_GetRegAddr(handle->spi)); + LL_DMA_ClearFlag_GI1(dma); + LL_DMA_ClearFlag_TC1(dma); + LL_DMA_EnableIT_TC(dma, dma_tx_channel); + LL_SPI_EnableDMAReq_TX(handle->spi); + LL_SPI_Enable(handle->spi); +} + +static void _spi_dma_callback(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + if (handle->dma_tx_cb != NULL) + { + handle->dma_tx_cb(handle); + } + + if (handle->dma_rx_cb != NULL) + { + handle->dma_rx_cb(handle); + } +} + +static BOOL _spi_dma_send(spi_t *handle, uint8_t *data, uint16_t length) +{ + handle->tx_dma_ok = FALSE; + LL_DMA_DisableChannel(handle->dma, handle->dma_tx_channel); + + LL_DMA_SetMemoryAddress(handle->dma, handle->dma_tx_channel, (uint32_t)data); + LL_DMA_SetDataLength(handle->dma, handle->dma_tx_channel, length); + + LL_DMA_EnableChannel(handle->dma, handle->dma_tx_channel); + + uint16_t i = 0; + while (handle->tx_dma_ok == FALSE) + { + i++; + if (i > 50000) + { + __NOP(); + break; + } + } + + return handle->tx_dma_ok == TRUE ? TRUE : FALSE; +} + +/** + * @brief 读取数据准备好信号 + * @param {spi_t} *handle SPI总线设备句柄 + * @return {uint8_t} 数据准备好信号的值 + * @note: 该函数用于读取SPI总线的数据准备好信号。它首先断言handle不为空,然后返回handle的gpios.rdy的读取结果。 + */ +static uint8_t _read_drdy(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + return handle->gpios.rdy->read(*handle->gpios.rdy); +} + +/** + * @brief 写入单个寄存器 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} reg 寄存器号 + * @param {uint8_t} data 寄存器值 + * @return {*} 操作结果 + * @note: 该函数用于写入SPI总线的单个寄存器。它首先断言handle不为空,然后断言data不为空。接着,将SPI总线的CS引脚设置为低电平,发送寄存器号和寄存器值,最后将SPI总线的CS引脚设置为高电平,返回操作结果。 + */ +static uint8_t _write_regs(spi_t *handle, uint8_t reg, uint8_t *data, uint8_t len) +{ + uint8_t status = 0; + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + DBG_ASSERT(len != 0 __DBG_LINE); + spi_cs_low(handle); + status = spi_read_write_byte(handle, reg); // 发送寄存器号 + while (len--) + { + spi_read_write_byte(handle, *data); // 写入寄存器的值 + data++; + } + spi_cs_high(handle); + + return status; +} + +/** + * @brief 读取多个寄存器 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} reg 寄存器号 + * @param {uint8_t} *data 寄存器值的指针 + * @param {uint8_t} len 寄存器值的个数 + * @return {uint8_t} 操作结果 + * @note: 该函数用于读取SPI总线的多个寄存器。它首先断言handle不为空,然后断言data不为空,接着断言len大于0。接着,将SPI总线的CS引脚设置为低电平,发送寄存器号,然后循环读取多个寄存器的值,最后将SPI总线的CS引脚设置为高电平,返回操作结果。 + */ +static uint8_t _read_regs(spi_t *handle, uint8_t reg, uint8_t *data, uint8_t len) +{ + uint8_t status = 0; + + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + DBG_ASSERT(len != 0 __DBG_LINE); + + spi_cs_low(handle); + status = spi_read_write_byte(handle, reg); + for (uint8_t i = 0; i < len; i++) + { + data[i] = spi_read_write_byte(handle, 0xff); // 读出数据 + } + spi_cs_high(handle); + + return status; +} + +/** + * @brief 写入单个寄存器 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} reg 寄存器号 + * @param {uint8_t} data 寄存器值 + * @return {*} 操作结果 + * @note: 该函数用于写入SPI总线的单个寄存器。它首先断言handle不为空,然后将SPI总线的CS引脚设置为低电平,发送寄存器号和寄存器值,最后将SPI总线的CS引脚设置为高电平,返回操作结果。 + */ +static uint8_t _spi_write_reg(spi_t *handle, uint8_t reg, uint8_t data) +{ + uint8_t status = 0; + DBG_ASSERT(handle != NULL __DBG_LINE); + + spi_cs_low(handle); + status = spi_read_write_byte(handle, reg); // 发送寄存器号 + spi_read_write_byte(handle, data); // 写入寄存器的值 + + spi_cs_high(handle); + + return status; +} + +/** + * @brief 读取单个寄存器 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} reg 寄存器号 + * @return {*} 寄存器值 + * @note: 该函数用于读取SPI总线的单个寄存器。它首先断言handle不为空,然后将SPI总线的CS引脚设置为低电平,发送寄存器号,接着读取寄存器的值,最后将SPI总线的CS引脚设置为高电平,返回寄存器值。 + */ +static uint8_t _spi_read_reg(spi_t *handle, uint8_t reg) +{ + uint8_t reg_val = 0; + DBG_ASSERT(handle != NULL __DBG_LINE); + + spi_cs_low(handle); + spi_read_write_byte(handle, reg); // 发送寄存器号 + reg_val = spi_read_write_byte(handle, 0); + spi_cs_high(handle); + return reg_val; +} + +/** + * @brief 写入命令 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} cmd 命令 + * @return {*} 操作结果 + * @note: 该函数用于写入SPI总线的命令。它首先断言handle不为空,然后将SPI总线的RDY引脚设置为低电平,发送命令,最后将SPI总线的CS引脚设置为高电平,返回操作结果。 + */ +static uint8_t _spi_write_cmd(spi_t *handle, uint8_t cmd) +{ + uint8_t status = 0; + + DBG_ASSERT(handle != NULL __DBG_LINE); + spi_rdy_low(handle); + spi_cs_low(handle); + status = spi_read_write_byte(handle, cmd); // 发送命令 + spi_cs_high(handle); + return status; +} + +/** + * @brief 写入数据 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} *data 要写入的数据的指针 + * @param {uint16_t} len 要写入的数据的长度 + * @return {*} 操作结果 + * @note: 该函数用于写入SPI总线的数据。它首先断言handle不为空,然后将SPI总线的RDY引脚设置为高电平,发送数据,最后将SPI总线的CS引脚设置为高电平,返回操作结果。 + */ +static uint8_t _spi_write_data(spi_t *handle, uint8_t *data, uint16_t len) +{ + uint8_t status = 0; + DBG_ASSERT(handle != NULL __DBG_LINE); + spi_rdy_high(handle); + spi_cs_low(handle); + for (uint16_t i = 0; i < len; i++) + { + status = spi_read_write_byte(handle, *data); + data++; + } + spi_cs_high(handle); + return status; +} + +/** + * @brief SPI延时函数 + * @param {spi_t} *handle SPI总线设备句柄 + * @return {*} 无 + * @note: 该函数用于SPI总线的延时。它首先断言handle不为空,然后根据handle的delay_ticks的值,循环执行NOP指令。 + */ +static inline void spi_delay(spi_t *handle) +{ + uint16_t count = 0; + DBG_ASSERT(handle != NULL __DBG_LINE); + count = handle->delay_ticks; + if (count > 0) + { + while (count--) + { + __NOP(); + } + } +} + +static BOOL spi_wait_flag(spi_t *handle, uint32_t flag, uint32_t timeout) +{ + uint32_t i = 0; + DBG_ASSERT(handle != NULL __DBG_LINE); + if (flag == LL_SPI_SR_TXE) + { + while (LL_SPI_IsActiveFlag_TXE(handle->spi) == 0) + { + if (i++ > timeout) + { + return FALSE; // 超时 + } + else + { + __NOP(); + } + } + } + else if (flag == LL_SPI_SR_RXNE) + { + while (LL_SPI_IsActiveFlag_RXNE(handle->spi) == 0) + { + if (i++ > timeout) + { + return FALSE; // 超时 + } + else + { + __NOP(); + } + } + } + else if (flag == LL_SPI_SR_BSY) + { + while (LL_SPI_IsActiveFlag_BSY(handle->spi) == 0) + { + if (i++ > timeout) + { + return FALSE; // 超时 + } + else + { + __NOP(); + } + } + } + else + { + DBG_ASSERT(FALSE __DBG_LINE); + } + + return TRUE; // 成功 +} + +/** + * @brief 读写一个字节 + * @param {spi_t} *handle SPI总线设备句柄 + * @param {uint8_t} tx_data 要写入的数据 + * @return {*} 读取到的数据 + * @note: 该函数用于SPI总线的读写一个字节。它首先断言handle不为空,然后根据handle的simulate_gpio的值,选择模拟SPI或硬件SPI。最后,返回读取到的数据。 + */ +static uint8_t spi_read_write_byte(spi_t *handle, uint8_t tx_data) +{ + uint8_t bit_ctr; + uint8_t rdata = 0xff; + DBG_ASSERT(handle != NULL __DBG_LINE); + if (handle->simualte_gpio == TRUE) + { + // 模拟SPI + for (bit_ctr = 0; bit_ctr < 8; bit_ctr++) + { + spi_sck_low(handle); + spi_delay(handle); + + if (tx_data & 0x80) + spi_mosi_high(handle); + else + spi_mosi_low(handle); + + spi_delay(handle); + spi_sck_high(handle); + spi_delay(handle); + tx_data = (tx_data << 1); + rdata = rdata << 1; + + if (NULL != handle->gpios.miso->port) + { + if (spi_miso_read(handle) == 1) + rdata += 0x01; + } + } + return (rdata); + } + else + { + LL_SPI_TransmitData8(handle->spi, tx_data); + + if (spi_wait_flag(handle, LL_SPI_SR_RXNE, SPI_TIMEOUT) == FALSE) + { + return 0xff; + } + rdata = LL_SPI_ReceiveData8(handle->spi); + return rdata; + } +} + +static void _write_enable(spi_t *handle) +{ + handle->gpios.cs->reset(*handle->gpios.cs); + handle->interface.u.normal.spi_send(handle, handle->cfg.cmd_wren); + handle->gpios.cs->set(*handle->gpios.cs); +} + +static void _write_disable(spi_t *handle) +{ + handle->gpios.cs->reset(*handle->gpios.cs); + handle->interface.u.normal.spi_send(handle, handle->cfg.cmd_wrdi); + handle->gpios.cs->set(*handle->gpios.cs); +} + +static uint8_t _read_status(spi_t *handle) +{ + uint8_t data; + handle->gpios.cs->reset(*handle->gpios.cs); + handle->interface.u.normal.spi_send(handle, handle->cfg.cmd_rdsr); + data = handle->interface.u.normal.spi_send(handle, handle->cfg.dummy_byte); + handle->gpios.cs->set(*handle->gpios.cs); + return data; +} + +static void _ready(spi_t *handle) +{ + uint16_t count = 0; + while (_read_status(handle) & 0x01) + { + if (count++ > 20000) + { + break; + } + else + { + __NOP(); + } + } +} + +static BOOL spi_write(spi_t *handle, uint32_t write_addr, uint8_t *data, uint16_t length) +{ + BOOL ret = TRUE; + uint8_t cnt = 0; // 返回值检查 + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + DBG_ASSERT(length > 0 __DBG_LINE); + DBG_ASSERT(handle->cfg.page_size > 0 __DBG_LINE); + uint32_t page_size = handle->cfg.page_size; + _write_enable(handle); // 写入使能命令 + handle->gpios.cs->reset(*handle->gpios.cs); // 设置CS引脚为低电平,准备开始SPI通信 + + cnt = handle->interface.u.normal.spi_send(handle, handle->cfg.cmd_write); // 发送写入命令 + if (cnt == 0) + { + return FALSE; + } + + if (handle->cfg.address_bytes == 2) + { + cnt = handle->interface.u.normal.spi_send(handle, write_addr >> 8); // 发送高位地址 + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, write_addr); // 发送低位地址 + if (cnt == 0) + { + return FALSE; + } + } + else + { + cnt = handle->interface.u.normal.spi_send(handle, write_addr >> 16); + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, write_addr >> 8); + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, write_addr); + if (cnt == 0) + { + return FALSE; + } + } + + while (length--) + { + cnt = handle->interface.u.normal.spi_send(handle, *data); // 发送一个字节数据 + if (cnt == 0) + { + return FALSE; + } + data++; + if (handle->cfg.continuous_write == FALSE) + { + write_addr++; + if (((write_addr % page_size) == 0) && (length > 0)) + { + // 一页写完 + handle->gpios.cs->set(*handle->gpios.cs); // 设置CS引脚为高电平,完成SPI通信 + _ready(handle); + + _write_enable(handle); // 写入使能命令 + handle->gpios.cs->reset(*handle->gpios.cs); // 设置CS引脚为低电平,准备开始SPI通信 + + cnt = handle->interface.u.normal.spi_send(handle, handle->cfg.cmd_write); // 发送写入命令 + if (cnt == 0) + { + return FALSE; + } + if (handle->cfg.address_bytes == 2) + { + cnt = handle->interface.u.normal.spi_send(handle, write_addr >> 8); // 发送高位地址 + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, write_addr); // 发送低位地址 + if (cnt == 0) + { + return FALSE; + } + } + else + { + cnt = handle->interface.u.normal.spi_send(handle, write_addr >> 16); + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, write_addr >> 8); + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, write_addr); + if (cnt == 0) + { + return FALSE; + } + } + } + } + } + handle->gpios.cs->set(*handle->gpios.cs); // 设置CS引脚为高电平,完成SPI通信 + + _ready(handle); + _write_disable(handle); + return ret; +} + +static void spi_write_reg(spi_t *handle, uint8_t reg, uint8_t value) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + _write_enable(handle); // 写入使能命令 + handle->interface.u.normal.write_reg(handle, reg, value); + _ready(handle); + _write_disable(handle); // 写入禁止命令 +} + +static uint8_t spi_read_reg(spi_t *handle, uint8_t reg) +{ + uint8_t data; + handle->gpios.cs->reset(*handle->gpios.cs); + handle->interface.u.normal.spi_send(handle, reg); + data = handle->interface.u.normal.spi_send(handle, handle->cfg.dummy_byte); + handle->gpios.cs->set(*handle->gpios.cs); + return data; +} + +static BOOL spi_read(spi_t *handle, uint32_t read_addr, uint8_t *data, uint16_t length) +{ + BOOL ret = TRUE; + uint8_t cnt = 0; // 返回值检查 + DBG_ASSERT(handle != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + DBG_ASSERT(length > 0 __DBG_LINE); + handle->gpios.cs->reset(*handle->gpios.cs); // 设置CS引脚为低电平,准备开始SPI通信 + + cnt = handle->interface.u.normal.spi_send(handle, handle->cfg.cmd_read); // 发送读取命令 + if (cnt == 0) + { + return FALSE; + } + if (handle->cfg.address_bytes == 2) + { + cnt = handle->interface.u.normal.spi_send(handle, read_addr >> 8); // 发送高位地址 + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, read_addr); // 发送低位地址 + if (cnt == 0) + { + return FALSE; + } + } + else + { + cnt = handle->interface.u.normal.spi_send(handle, read_addr >> 16); + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, read_addr >> 8); + if (cnt == 0) + { + return FALSE; + } + cnt = handle->interface.u.normal.spi_send(handle, read_addr); + if (cnt == 0) + { + return FALSE; + } + } + for (uint16_t i = 0; i < length; i++) // 循环读取数据 + { + data[i] = handle->interface.u.normal.spi_send(handle, handle->cfg.dummy_byte); // 发送空字节,读取实际数据 + } + handle->gpios.cs->set(*handle->gpios.cs); // 设置CS引脚为高电平,完成SPI通信 + + return ret; +} + +static void spi_reset(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.cs->reset(*handle->gpios.cs); + delay_tick(10); + handle->gpios.cs->set(*handle->gpios.cs); + delay_tick(10); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的复位(RST)引脚设置为高 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_rdy_high(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.rdy->set(*handle->gpios.rdy); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的复位(RST)引脚设置为低 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_rdy_low(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.rdy->reset(*handle->gpios.rdy); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的芯片选择(CS)引脚设置为高 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_cs_high(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.cs->set(*handle->gpios.cs); + spi_delay(handle); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的芯片选择(CS)引脚设置为低 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_cs_low(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.cs->reset(*handle->gpios.cs); + spi_delay(handle); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的时钟(SCK)引脚设置为高 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_mosi_high(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.mosi->set(*handle->gpios.mosi); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的输出(MOSI)引脚设置为低 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_mosi_low(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.mosi->reset(*handle->gpios.mosi); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的时钟(SCK)引脚设置为高 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_sck_high(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.sck->set(*handle->gpios.sck); +} + +/** + * @brief 用于将SPI(串行外围接口)设备的时钟(SCK)引脚设置为低 + * @param {spi_id_e} id + * @return {*} + */ +static inline void spi_sck_low(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + handle->gpios.sck->reset(*handle->gpios.sck); +} + +/** + * @brief 用于读取SPI(串行外围接口)设备的输入(MISO)引脚的电平 + * @param {spi_id_e} id + * @return {*} + */ +static inline uint8_t spi_miso_read(spi_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + return handle->gpios.miso->read(*handle->gpios.miso); +} diff --git a/User/system/bsp/spis.h b/User/system/bsp/spis.h new file mode 100644 index 0000000..ac2d77e --- /dev/null +++ b/User/system/bsp/spis.h @@ -0,0 +1,165 @@ +/** + * @file spis.h + * @brief SPI驱动, 用于SPI设备的读写操作 + * + * This file contains the SPI driver used for reading and writing operations on SPI devices. + * + * @date 2023-08-01 + * @version 1.0 + * + * @note This file is part of the STM32 controller-v2 project. + * + */ + +#ifndef __SPIS_H__ +#define __SPIS_H__ + +#include "lib.h" +#include "gpios.h" + +#define SPI_ENABLE(SPIX) LL_SPI_Enable(SPIX) + +typedef struct SPIS spi_t; +typedef void spis_dma_callback(spi_t *handle); + +/** + * @brief SPI type enumeration + */ +typedef enum +{ + SPI_TYPE_NORMAL = 0, ///< SPI1:NORMAL + SPI_TYPE_LCD, ///< SPI2:LCD + SPI_TYPE_MAX, +} spi_type_e; + +/** + * @brief SPI GPIO group structure + */ +typedef struct +{ + gpio_t *mosi; ///< MOSI + gpio_t *miso; ///< MISO + gpio_t *sck; ///< SCK + gpio_t *cs; ///< CS + gpio_t *rst; ///< RST + gpio_t *rdy; ///< DRDY +} spi_gpio_group_t; + +/** + * @brief SPI normal interface structure + */ +typedef struct +{ + uint8_t (*write_reg)(spi_t *handle, uint8_t reg, uint8_t data); ///< Write a single register via SPI + uint8_t (*read_reg)(spi_t *handle, uint8_t reg); ///< Read the value of a single register via SPI + uint8_t (*read_drdy)(spi_t *handle); ///< Get the value of the SPI DRDY pin + uint8_t (*write_regs)(spi_t *handle, uint8_t reg, uint8_t *data, uint8_t len); ///< Write multiple registers via SPI + uint8_t (*read_regs)(spi_t *handle, uint8_t reg, uint8_t *data, uint8_t len); ///< Read multiple registers via SPI + uint8_t (*spi_send)(spi_t *handle, uint8_t data); ///< Send data via SPI + void (*spi_reset)(spi_t *handle); ///< Reset SPI + + BOOL(*spi_write) + (spi_t *handle, uint32_t write_addr, uint8_t *data, uint16_t length); ///< Write data via SPI + + BOOL(*spi_read) + (spi_t *handle, uint32_t read_addr, uint8_t *data, uint16_t length); ///< Read data via SPI + + void (*spi_write_reg)(spi_t *handle, uint8_t reg, uint8_t data); ///< Write a single register via SPI + uint8_t (*spi_read_reg)(spi_t *handle, uint8_t reg); ///< Read a single register via SPI +} spi_normal_interface_t; + +/** + * @brief SPI LCD interface structure + */ +typedef struct +{ + uint8_t (*write_cmd)(spi_t *handle, uint8_t cmd); ///< Write a command via SPI + uint8_t (*write_data)(spi_t *handle, uint8_t *data, uint16_t len); ///< Write data via SPI +} spi_lcd_interface_t; + +/** + * @brief SPI interface structure + */ +typedef struct +{ + union + { + spi_normal_interface_t normal; + spi_lcd_interface_t lcd; + } u; + void (*hardware_enable)(spi_t *handle, SPI_TypeDef *spi); ///< Enable hardware SPI + void (*dma_enable)(spi_t *handle, DMA_TypeDef *dma, uint32_t dma_rx_channel, spis_dma_callback *dma_rx_cb, + uint32_t dma_tx_channel, spis_dma_callback *dma_tx_cb); ///< Enable DMA SPI + void (*spi_dma_callback)(spi_t *spi); ///< DMA send completion callback + BOOL(*spi_dma_send) + (spi_t *handle, uint8_t *data, uint16_t length); ///< DMA send +} spi_interface_t; + +/** + * @brief SPI structure + */ +typedef struct SPIS spi_t; + +/** + * @brief SPI DMA callback function + */ +typedef void spis_dma_callback(spi_t *handle); + +typedef struct +{ + // CMD + uint8_t cmd_rdsr; ///< Read Status Register instruction + uint8_t cmd_wrsr; ///< Write Status Register instruction + uint8_t cmd_wren; ///< Write enable instruction + uint8_t cmd_wrdi; ///< Write disable instruction + uint8_t cmd_read; ///< Read from Memory instruction + uint8_t cmd_write; ///< Write to Memory instruction + + uint8_t dummy_byte; ///< Dummy byte + + uint8_t address_bytes; + uint32_t page_size; + uint32_t total_size; + uint8_t ticks; ///< Delay in NOP ticks + BOOL continuous_write; ///< Continuous write +} spi_normal_config_t; + +struct SPIS +{ + spi_type_e spi_type; ///< SPI type + uint16_t delay_ticks; ///< Delay in NOP ticks + spi_gpio_group_t gpios; ///< SPI GPIOs + spi_interface_t interface; ///< SPI interface + SPI_TypeDef *spi; ///< SPI peripheral + BOOL simualte_gpio; ///< Simulate GPIO + spi_normal_config_t cfg; ///< Normal SPI configuration + ///< DMA + DMA_TypeDef *dma; ///< External setting + uint32_t dma_rx_channel; ///< External setting + uint32_t dma_tx_channel; ///< External setting + __IO BOOL rx_dma_ok; + __IO BOOL tx_dma_ok; + spis_dma_callback *dma_rx_cb; ///< DMA receive callback function + spis_dma_callback *dma_tx_cb; ///< DMA send callback function + + void *params; ///< 扩展参数 +}; + +/** + * @brief Create a new SPI instance + * + * @param spi_type The type of SPI + * @param gpios The SPI GPIO group + * @param delay_ticks The delay in NOP ticks + * @return spi_t* The created SPI instance + */ +extern spi_t *spi_create(spi_type_e spi_type, spi_gpio_group_t gpios, uint16_t delay_ticks); + +/** + * @brief Free the SPI instance + * + * @param spi The SPI instance to free + */ +extern void spi_free(spi_t *spi); + +#endif ///< __SPIS_H__ diff --git a/User/system/bsp/tims.c b/User/system/bsp/tims.c new file mode 100644 index 0000000..03d544d --- /dev/null +++ b/User/system/bsp/tims.c @@ -0,0 +1 @@ +#include "tims.h" diff --git a/User/system/bsp/tims.h b/User/system/bsp/tims.h new file mode 100644 index 0000000..3dcfb32 --- /dev/null +++ b/User/system/bsp/tims.h @@ -0,0 +1,128 @@ +/** + * @file tims.h + * @brief Header file for TIMS module. + * + * This file contains the declarations and definitions for the TIMS module. + * TIMS stands for Timer System and provides functionality related to timers. + * + * @author xxx + * @date 2024-01-16 22:23:43 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __TIMS_H__ +#define __TIMS_H__ +#include "lib.h" +/** +Timer overflow time calculation formula +Tout = ((ARR + 1)*(PSC + 1)) / Tclk +Given Tclk as 84MHz, we need Tout to be 200ms or 200000us. Let's assume PSC is 839, substituting it into the formula gives ARR = 19999. +With these calculated values, both ARR and PSC are within the range of 0 to 65535, so we can use this parameter set. + */ + +#define ENABLE_TIM_COUNT(TIMx) \ + do \ + { \ + LL_TIM_EnableCounter(TIMx); \ + } while (__LINE__ == -1); + +#define RESET_TIM_COUNT(TIMx) \ + do \ + { \ + LL_TIM_DisableCounter(TIMx); \ + LL_TIM_SetCounter(TIMx, 0); \ + LL_TIM_EnableCounter(TIMx); \ + } while (__LINE__ == -1); +/** + * @brief Enables the specified TIMx. + * @param TIMx TIM instance. + */ +#define ENABLE_TIM(TIMx) \ + do \ + { \ + LL_TIM_EnableCounter(TIMx); \ + LL_TIM_EnableIT_UPDATE(TIMx); \ + } while (__LINE__ == -1); + +/** + * @brief Checks if the specified TIMx is enabled. + * @param TIMx TIM instance. + * @retval The new state of TIMx (1 or 0). + */ +#define IS_ENABLE_TIM(TIMx) LL_TIM_IsEnabledIT_UPDATE(TIMx) + +/** + * @brief Disables the specified TIMx. + * @param TIMx TIM instance. + */ +#define DISABLE_TIM(TIMx) \ + do \ + { \ + LL_TIM_DisableCounter(TIMx); \ + LL_TIM_DisableIT_UPDATE(TIMx); \ + } while (__LINE__ == -1); + +#define ENABLE_TIM_ARR_RELOAD(TIMx) LL_TIM_EnableARRPreload(TIMx) +#define DISABLE_TIM_ARR_RELOAD(TIMx) LL_TIM_DisableARRPreload(TIMx) + +/** + * @brief Checks if the specified TIMx interrupt flag is set. + * @param TIMx TIM instance. + * @retval The new state of the specified TIMx interrupt flag (1 or 0). + */ +#define IS_TIM_IT_FLAG(TIMx) (LL_TIM_IsActiveFlag_UPDATE(TIMx) == 1) + +/** + * @brief TIM interrupt handler. + * @param TIMx TIM instance. + */ +#define TIM_IRQ_HANDLER(TIMx) \ + do \ + { \ + if (LL_TIM_IsActiveFlag_CC1(TIMx) == SET) \ + { \ + if (LL_TIM_IsEnabledIT_CC1(TIMx) == SET) \ + { \ + LL_TIM_ClearFlag_CC1(TIMx); \ + } \ + } \ + if (LL_TIM_IsActiveFlag_CC2(TIMx) == SET) \ + { \ + if (LL_TIM_IsEnabledIT_CC2(TIMx) == SET) \ + { \ + LL_TIM_ClearFlag_CC2(TIMx); \ + } \ + } \ + if (LL_TIM_IsActiveFlag_CC3(TIMx) == SET) \ + { \ + if (LL_TIM_IsEnabledIT_CC3(TIMx) == SET) \ + { \ + LL_TIM_ClearFlag_CC3(TIMx); \ + } \ + } \ + if (LL_TIM_IsActiveFlag_CC4(TIMx) == SET) \ + { \ + if (LL_TIM_IsEnabledIT_CC4(TIMx) == SET) \ + { \ + LL_TIM_ClearFlag_CC4(TIMx); \ + } \ + } \ + if (LL_TIM_IsActiveFlag_UPDATE(TIMx) == SET) \ + { \ + if (LL_TIM_IsEnabledIT_UPDATE(TIMx) == SET) \ + { \ + LL_TIM_ClearFlag_UPDATE(TIMx); \ + } \ + } \ + } while (__LINE__ == -1) + +/** + * @brief 获取定时器周期时间(单位:毫秒) + * + * 获取指定定时器TIMx的周期时间,以秒为单位。 + * + * @param TIMx 定时器指针,指向需要查询的定时器 + * + * @return 返回定时器周期时间(单位:毫秒) + */ +#define TIM_CYCLE(TIMx) ((LL_TIM_GetAutoReload(TIMx) + 1) * 0.1) +#endif ///< __TIMS_H__ diff --git a/User/system/bsp/uarts.c b/User/system/bsp/uarts.c new file mode 100644 index 0000000..7868a74 --- /dev/null +++ b/User/system/bsp/uarts.c @@ -0,0 +1,486 @@ +/* + * @Author: + * @Date: 2023-07-31 11:47:35 + * @LastEditors: xxx + * @LastEditTime: 2023-08-25 15:30:33 + * @Description: LL库的串口驱动 + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ +#include "uarts.h" +#include "dma.h" + +// 清理接收中断错误标志 +static void uart_clear_error(uart_t *uart) +{ + if (uart == NULL) + { + return; + } + uart->rx_error_count = 0; + if (uart->rx_err_en == TRUE && uart->rx_error != NULL) + { + osel_memset((uint8_t *)uart->rx_error, 0, sizeof(uarts_interupt_error_t) * uart->rxsize); + } +} +/** + * @brief 创建一个UART设备 + * @param {USART_TypeDef} *huart USART总线设备句柄 + * @param {BOOL} rx_dma_en 接收DMA使能标志 + * @param {uint16_t} rxsize 接收缓冲区大小 + * @param {rx_interrupt_cb_t} rx_cb 接收中断回调函数 + * @param {BOOL} tx_dma_en 发送DMA使能标志 + * @param {uint16_t} txsize 发送缓冲区大小 + * @param {tx_complete_cb_t} tx_complete_cb 发送完成回调函数 + * @return {*} 创建的UART设备指针 + * @note: 该函数用于创建一个UART设备。它首先断言huart不为空,然后分配内存用于接收缓冲区和发送缓冲区,并设置相关标志。最后,返回创建的UART设备指针。 + */ +uart_t *uart_create(USART_TypeDef *huart, BOOL rx_dma_en, uint16_t rxsize, rx_interupt_cb_t rx_cb, + BOOL tx_dma_en, uint16_t txsize, tx_complete_cb_t tx_complete_cb) +{ + DBG_ASSERT(huart != NULL __DBG_LINE); + // 分配内存 + uart_t *uart = (uart_t *)osel_mem_alloc(sizeof(uart_t)); + DBG_ASSERT(uart != NULL __DBG_LINE); + + uart->rx_interupt_timeout = TRUE; // 接收超时标志 + uart->rx_interupt_cnt = 0; // 接收中断计数 + + // 设置接收回调函数 + uart->rx_interupt_cb = rx_cb; + // 设置接收数据大小 + uart->rxsize = rxsize; + + // 设置发送完成回调函数 + uart->tx_complete_cb = tx_complete_cb; + // 设置发送数据大小 + uart->txsize = txsize; + // 如果接收大小大于0,则分配内存 + if (rxsize > 0) + { + uart->rxbuf = (uint8_t *)osel_mem_alloc(rxsize); + DBG_ASSERT(uart->rxbuf != NULL __DBG_LINE); + } + + // 如果发送大小大于0,则分配内存 + if (txsize > 0) + { + uart->txbuf = (uint8_t *)osel_mem_alloc(txsize); + DBG_ASSERT(uart->txbuf != NULL __DBG_LINE); + } + // 设置接收DMA禁用 + uart->rx_dma_en = rx_dma_en; + // 设置发送DMA禁用 + uart->tx_dma_en = tx_dma_en; + + // 设置huart + uart->huart = huart; + + // 返回uart + return uart; +} + +/** + * @brief 使能UART接收 + * @param {uart_t} *uart UART设备句柄 + * @param {BOOL} rx_err_en 接收错误使能标志,只能用于串口中断模式下使用 + * @return {*} 操作结果 + * @note: 该函数用于使能UART设备的接收功能。它首先检查UART设备的接收DMA使能标志,然后禁用接收中断,配置RX DMA并启用RX DMA通道。最后,检查UART设备的发送DMA使能标志,配置TX DMA并启用TX DMA通道。 + */ +void uart_recv_en(uart_t *uart, BOOL rx_err_en) +{ + if (FALSE == uart->rx_dma_en) + { + uart->rx_err_en = rx_err_en; + LL_USART_EnableIT_RXNE(uart->huart); // 使用接收中断处理 + } + else + { + uart->rx_err_en = FALSE; + LL_USART_ClearFlag_IDLE(uart->huart); + + // 配置RX DMA + LL_DMA_DisableChannel(uart->dma, uart->dma_tx_channel); + LL_DMA_DisableChannel(uart->dma, uart->dma_rx_channel); + + // 配置RX DMA + LL_DMA_SetPeriphAddress(uart->dma, uart->dma_rx_channel, LL_USART_DMA_GetRegAddr(uart->huart)); + LL_DMA_SetMemoryAddress(uart->dma, uart->dma_rx_channel, (uint32_t)uart->rxbuf); + LL_DMA_SetDataLength(uart->dma, uart->dma_rx_channel, uart->rxsize); + LL_DMA_EnableIT_TC(uart->dma, uart->dma_rx_channel); + LL_DMA_EnableChannel(uart->dma, uart->dma_rx_channel); + LL_USART_EnableDMAReq_RX(uart->huart); + LL_USART_EnableIT_IDLE(uart->huart); + + // 配置TX DMA + LL_DMA_SetPeriphAddress(uart->dma, uart->dma_tx_channel, LL_USART_DMA_GetRegAddr(uart->huart)); + // 配置内存地址 + LL_DMA_SetMemoryAddress(uart->dma, uart->dma_tx_channel, (uint32_t)uart->txbuf); + LL_DMA_EnableIT_TC(uart->dma, uart->dma_tx_channel); + LL_USART_EnableDMAReq_TX(uart->huart); + + uart->tx_dma_ok = TRUE; + } + + if (uart->rx_err_en == TRUE) + { + if (uart->rx_error == NULL) + { + uart->rx_error = (uarts_interupt_error_t *)osel_mem_alloc(sizeof(uarts_interupt_error_t) * uart->rxsize); + DBG_ASSERT(uart->rx_error != NULL __DBG_LINE); + } + + LL_USART_EnableIT_PE(uart->huart); // 使能奇偶校验错误中断 + // 使能帧错误中断 + // 使能帧错误中断 + // 使能溢出错误中断 + // LL_USART_EnableIT_ERROR 可以使能上面3个中断 + /** + * When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_ISR register). + */ + LL_USART_EnableIT_ERROR(uart->huart); + } +} + +/** + * @brief 释放UART设备资源 + * @param {uart_t} *uart UART设备句柄 + * @return {*} 操作结果 + * @note: 该函数用于释放UART设备的接收缓冲区、发送缓冲区和UART设备本身。 + */ +void uart_free(uart_t *uart) +{ + if (uart != NULL) + { + if (uart->rxbuf != NULL) + { + osel_mem_free(uart->rxbuf); + } + if (uart->rx_error != NULL) + { + osel_mem_free(uart->rx_error); + } + if (uart->txbuf != NULL) + { + osel_mem_free(uart->txbuf); + } + osel_mem_free(uart); + } +} + +/** + * @brief 设置波特率 + * @param {uart_t} *uart + * @param {uint32_t} baudrate 波特率 + * @return {*} + * @note 可以在超频后串口数据重新通讯 + */ +void uart_set_baudrate(USART_TypeDef *uart, uint32_t baudrate) +{ + LL_USART_SetBaudRate(uart, SystemCoreClock, LL_USART_OVERSAMPLING_16); +} + +/** + * @brief 发送数据 + * @param {uart_t} *uart UART设备句柄 + * @param {uint8_t} *data 要发送的数据 + * @param {uint16_t} len 要发送的数据长度 + * @return {*} 操作结果 + * @note: 该函数用于发送数据。首先检查UART设备的发送DMA使能标志,然后禁用发送中断,配置TX DMA并启用TX DMA通道。最后,发送数据直到发送缓冲区满或发送中断发生。 + */ +void uart_send_data(uart_t *uart, uint8_t *data, uint16_t len) +{ + DBG_ASSERT(uart != NULL __DBG_LINE); + DBG_ASSERT(data != NULL __DBG_LINE); + DBG_ASSERT(len > 0 __DBG_LINE); + uint16_t count = 0; + if (TRUE == uart->tx_dma_en) + { + uart->tx_dma_ok = FALSE; + osel_memcpy(uart->txbuf, data, len); // 拷贝数据到发送缓冲区 + LL_DMA_DisableChannel(uart->dma, uart->dma_tx_channel); + // 配置 DMA 源地址 + LL_DMA_SetMemoryAddress(uart->dma, uart->dma_tx_channel, (uint32_t)uart->txbuf); + // 配置数据长度 + LL_DMA_SetDataLength(uart->dma, uart->dma_tx_channel, len); + // 使能DMA STREAM 也就是发送数据 + LL_DMA_EnableChannel(uart->dma, uart->dma_tx_channel); + // 等待DMA发送完成 + while (uart->tx_dma_ok == FALSE) + { + if (count++ >= 2000) + { + return; + } + } + } + else + { + count = 0; + for (uint16_t i = 0; i < len; i++) + { + count = 0; + LL_USART_TransmitData8(uart->huart, data[i]); + while (!LL_USART_IsActiveFlag_TXE(uart->huart)) + { + if (count++ >= 0xFE) + { + count = 0; + continue; + } + } + } + while (!LL_USART_IsActiveFlag_TC(uart->huart)) + { + if (count++ >= 0xFE) + { + count = 0; + continue; + } + } + if (uart->tx_complete_cb != NULL) + { + uart->tx_complete_cb(); + } + LL_USART_ClearFlag_TC(uart->huart); + } +} + +/** + * @brief UART接收超时定时器 + * + * 当UART接收超时定时器触发时,调用此函数处理UART接收超时事件。 + * + * @param uart UART对象指针 + */ +void uart_rx_timeout_timer(uart_t *uart) +{ + // DBG_ASSERT(uart != NULL __DBG_LINE); + if (uart == NULL) + { + return; + } + if (uart->rx_dma_en == FALSE && uart->rx_interupt_timeout == FALSE) // 中断方式 + { + if (uart->rx_interupt_cnt++ == RX_TIMEOUT_MSEC) + { + uart->rx_interupt_timeout = TRUE; + if (uart->rx_interupt_cb != NULL && uart->rx_index > 0) + { + uart->rx_interupt_cb(uart->uart_index, uart->rxbuf, uart->rx_index); + } + uart_data_storage_reset(uart); + } + } +} + +/** + * @brief UART接收完成回调函数 + * + * 当UART接收完成时调用此函数。 + * + * @param uart UART设备指针 + */ +void uart_rx_cd_callback(uart_t *uart) +{ + if (uart == NULL) + { + return; + } + if (uart->rx_cd_en == FALSE) + { + return; + } + if (uart->rx_dma_en == FALSE) // 中断方式 + { + if (uart->rx_interupt_cb != NULL && uart->rx_index > 0) + { + uart->rx_interupt_cb(uart->uart_index, uart->rxbuf, uart->rx_index); + } + uart_data_storage_reset(uart); + } +} + +/** + * @brief 获取UART通信错误计数 + * + * 获取UART设备的接收错误计数。 + * + * @param uart UART设备指针 + * + * @return uint16_t 返回接收错误计数,如果uart为NULL,则返回0 + */ +uint16_t uart_get_error_count(uart_t *uart) +{ + if (uart == NULL) + { + return 0; + } + return uart->rx_error_count; +} + +/** + * @brief 获取UART通信中的错误信息 + * + * 从UART设备中获取接收错误信息和错误计数。 + * + * @param uart UART设备指针 + * @param count 用于存储错误计数的指针 + * + * @return 如果存在错误,则返回错误类型指针;否则返回NULL + */ +uarts_interupt_error_t *uart_get_error(uart_t *uart) +{ + if (uart == NULL) + { + return NULL; + } + if (uart->rx_error_count > 0) + { + + return uart->rx_error; + } + else + { + return NULL; + } +} + +/** + * @brief 重置UART数据存储 + * + * 将UART接收到的数据缓冲区重置,并清除错误状态。 + * + * @param uart UART结构体指针 + */ +void uart_data_storage_reset(uart_t *uart) +{ + if (uart == NULL) + { + return; + } + + uart->rx_index = 0; + uart_clear_error(uart); +} + +/** + * @brief 接收中断回调函数 + * @param {uart_t} *uart UART设备句柄 + * @return {*} 操作结果 + * @note: 该函数用于处理接收中断。首先检查接收DMA使能标志,然后禁用接收中断,配置RX DMA并启用RX DMA通道。当接收到数据时,将数据复制到接收缓冲区,并调用接收中断回调函数。当接收缓冲区满时,关闭RX DMA通道并重置接收索引。 + */ +void uart_reception_callback(uart_t *uart) +{ + // DBG_ASSERT(uart != NULL __DBG_LINE); + if (uart == NULL) + { + return; + } + if (LL_USART_IsEnabledIT_RXNE(uart->huart) && LL_USART_IsActiveFlag_RXNE(uart->huart)) + { + if (uart->rx_index >= uart->rxsize) + { + uart_data_storage_reset(uart); + } + + uart->rxbuf[uart->rx_index++] = LL_USART_ReceiveData8(uart->huart); + uart->rx_interupt_cnt = 0; + uart->rx_interupt_timeout = FALSE; + // 数据交给超时中断处理 :uart_rx_timeout_timer + } + else if (LL_USART_IsEnabledIT_IDLE(uart->huart) && LL_USART_IsActiveFlag_IDLE(uart->huart)) + { + if (uart->rx_dma_en == TRUE) + { + uart->rx_index = uart->rxsize - LL_DMA_GetDataLength(uart->dma, uart->dma_rx_channel); + if (uart->rx_cd_en == FALSE) + { + LL_DMA_DisableChannel(uart->dma, uart->dma_rx_channel); + if (uart->rx_interupt_cb != NULL && (uart->rx_index > 0 && uart->rx_index <= uart->rxsize)) + { + uart->rx_interupt_cb(uart->uart_index, uart->rxbuf, uart->rx_index); + osel_memset(uart->rxbuf, 0, uart->rxsize); + } + + LL_DMA_SetDataLength(uart->dma, uart->dma_rx_channel, uart->rxsize); // 这个不能少 先关闭DMA才能重新设置长度 + LL_DMA_EnableChannel(uart->dma, uart->dma_rx_channel); + } + } + + uart->rx_index = 0; + LL_USART_ClearFlag_IDLE(uart->huart); + } + + if (LL_USART_IsEnabledIT_TC(uart->huart) && LL_USART_IsActiveFlag_TC(uart->huart)) + { + if (uart->tx_complete_cb != NULL) + { + uart->tx_complete_cb(); + } + LL_USART_ClearFlag_TC(uart->huart); + } + + if (uart->rx_err_en == TRUE) + { + uarts_interupt_error_e err = UART_NO_ERROR; + if (LL_USART_IsEnabledIT_PE(uart->huart) && LL_USART_IsActiveFlag_PE(uart->huart)) + { + err = UART_PARITY_ERROR; + LL_USART_ClearFlag_PE(uart->huart); // 清除奇偶校验错误标志 + } + + if (LL_USART_IsActiveFlag_FE(uart->huart) && LL_USART_IsActiveFlag_FE(uart->huart)) + { + err = UART_FRAME_ERROR; + LL_USART_ClearFlag_FE(uart->huart); // 清除帧错误标志 + } + + if (LL_USART_IsActiveFlag_NE(uart->huart) && LL_USART_IsActiveFlag_NE(uart->huart)) + { + // err = UART_NOISE_ERROR; + LL_USART_ClearFlag_NE(uart->huart); // 清除噪声错误标志 + } + + if (LL_USART_IsActiveFlag_ORE(uart->huart) && LL_USART_IsActiveFlag_ORE(uart->huart)) + { + err = UART_OVERRUN_ERROR; + LL_USART_ClearFlag_ORE(uart->huart); // 清除溢出错误标志 + } + + if (err != UART_NO_ERROR && uart->rx_error != NULL) + { + uint16_t index = uart->rx_index - 1; + uart->rx_error[uart->rx_error_count].index = index; + uart->rx_error[uart->rx_error_count].err = err; + uart->rx_error_count++; + } + } +} + +/** + * @brief 用于处理串口DMA接收中断的回调函数 + * @param {uart_t} *uart - 串口对象 + * @return {*} 无 + * @note: + */ +void uart_dma_reception_callback(uart_t *uart) +{ + // 检查输入参数是否为空 + DBG_ASSERT(uart != NULL __DBG_LINE); + + uart->tx_dma_ok = TRUE; + + // 禁用串口DMA的发送通道 + LL_DMA_DisableChannel(uart->dma, uart->dma_tx_channel); + + // 清除发送中断标志位 + DMA_CLEAR_FLAG_TC_CHANNEL(uart->dma, uart->dma_tx_channel); + + // 使能发送中断,用于关闭发送使能引脚 + LL_USART_EnableIT_TC(uart->huart); // 使能发送中断,用于关闭发送使能引脚 + + // 清除传输错误标志 + DMA_CLEAR_FLAG_TE_CHANNEL(uart->dma, uart->dma_tx_channel); +} diff --git a/User/system/bsp/uarts.h b/User/system/bsp/uarts.h new file mode 100644 index 0000000..fb17c39 --- /dev/null +++ b/User/system/bsp/uarts.h @@ -0,0 +1,218 @@ +/** + * @file uarts.h + * @brief Header file for UARTs module. + * + * This file contains the definitions and function prototypes for UARTs module. + * The UARTs module provides functions for creating and managing UART instances, + * enabling reception, sending data, and handling interrupts. + */ + +#ifndef __UARTS_H__ +#define __UARTS_H__ + +#include "lib.h" +#include "main.h" +// 串口中断用于接收超时的参数 +#define RX_TIMEOUT_TICK (1U) /* 10ms的tick */ +#define RX_TIMEOUT_MSEC (20U / RX_TIMEOUT_TICK) /* 20毫秒需要的tick,可以根据需求添加其他时间更短的宏 */ + +/** + * @brief Enumeration for UART status. + */ +typedef enum +{ + UART_OK = 0x00u, /**< The action was successful. */ + UART_ERROR = 0xFFu /**< Generic error. */ +} uart_status_e; + +typedef enum +{ + // 无错误 + UART_NO_ERROR = BIT0, + // 奇偶校验错误中断 + UART_PARITY_ERROR = BIT1, + // 帧错误中断 + UART_FRAME_ERROR = BIT2, + // 噪声错误中断 + UART_NOISE_ERROR = BIT3, + // 溢出错误中断 + UART_OVERRUN_ERROR = BIT4, +} uarts_interupt_error_e; ///< UART中断错误枚举 + +typedef struct +{ + uarts_interupt_error_e err; ///< 错误标志 + uint16_t index; ///< 接收到的第几个字节 +} uarts_interupt_error_t; + +/** + * @brief Callback function type for UART receive interrupt. + * + * This function type is used to define the callback function for UART receive interrupt. + * The callback function is called when data is received on the UART. + * + * @param uart_index The index of the UART. + * @param uart_error The error code. + * @param data The received data. + * @param len The length of the received data. + */ +typedef void (*rx_interupt_cb_t)(uint8_t uart_index, uint8_t *data, uint16_t len); + +/** + * @brief Callback function type for UART transmit complete. + * + * This function type is used to define the callback function for UART transmit complete. + * The callback function is called when the UART transmission is complete. + */ +typedef void (*tx_complete_cb_t)(void); + +/** + * @brief Structure representing a UART instance. + */ +typedef struct +{ + uint8_t uart_index; /**< The index of the UART. */ + USART_TypeDef *huart; /**< The UART peripheral. */ + DMA_TypeDef *dma; /**< The DMA peripheral. */ + uint32_t dma_rx_channel; /**< The DMA receive channel. */ + uint32_t dma_tx_channel; /**< The DMA transmit channel. */ + + //*******************RX*************************/ + BOOL rx_cd_en; /**< Flag indicating if carrier detect is enabled. */ + BOOL rx_dma_en; /**< Flag indicating if DMA reception is enabled. */ + BOOL rx_err_en; /**< Flag indicating if error interrupt is enabled. */ + __IO BOOL rx_interupt_timeout; /**< Flag indicating if receive interrupt timeout. */ + __IO uint8_t rx_interupt_cnt; /**< The receive interrupt count. */ + uint8_t *rxbuf; /**< The receive buffer. */ + uint16_t rxsize; /**< The size of the receive buffer. */ + uarts_interupt_error_t *rx_error; /**< The receive error. */ + uint16_t rx_error_count; /**< The receive error count. */ + __IO uint16_t rx_index; /**< The receive data index. */ + + //*******************TX*************************/ + + BOOL tx_dma_en; /**< Flag indicating if DMA transmission is enabled. */ + uint8_t *txbuf; /**< The transmit buffer. */ + uint16_t txsize; /**< The size of the transmit buffer. */ + uint16_t tx_index; /**< The transmit data index. */ + __IO BOOL tx_dma_ok; /**< Flag indicating if DMA transmission is complete. */ + + rx_interupt_cb_t rx_interupt_cb; /**< The receive interrupt callback function. */ + tx_complete_cb_t tx_complete_cb; /**< The transmit complete callback function. */ +} uart_t; + +/** + * @brief Creates a UART instance. + * + * This function creates a UART instance with the specified parameters. + * + * @param huart The UART peripheral. + * @param rx_dma_en Flag indicating if DMA reception is enabled. + * @param rxsize The size of the receive buffer. + * @param rx_cb The receive interrupt callback function. + * @param tx_dma_en Flag indicating if DMA transmission is enabled. + * @param txsize The size of the transmit buffer. + * @param tx_complete_cb The transmit complete callback function. + * @return The created UART instance. + */ +extern uart_t *uart_create(USART_TypeDef *huart, BOOL rx_dma_en, uint16_t rxsize, rx_interupt_cb_t rx_cb, + BOOL tx_dma_en, uint16_t txsize, tx_complete_cb_t tx_complete_cb); + +/** + * @brief Frees the resources of a UART instance. + * + * This function frees the resources allocated for a UART instance. + * + * @param uart The UART instance to free. + */ +extern void uart_free(uart_t *uart); + +/** + * @brief Initializes a UART instance. + * + * This function initializes the specified UART instance with the specified parameters. + * + * @param uart The UART instance. + * @param baudrate The baudrate. + */ +extern void uart_set_baudrate(USART_TypeDef *uart, uint32_t baudrate); + +/** + * @brief Enables UART reception. + * + * This function enables reception on the specified UART instance. + * + * @param uart The UART instance. + */ +extern void uart_recv_en(uart_t *uart, BOOL rx_err_en); + +/** + * @brief Sends data over UART. + * + * This function sends the specified data over the specified UART instance. + * + * @param uart The UART instance. + * @param data The data to send. + * @param len The length of the data. + */ +extern void uart_send_data(uart_t *uart, uint8_t *data, uint16_t len); + +/** + * @brief UART receive carrier detect callback. + * + * This function is the callback for UART receive carrier detect. + * + * @param uart The UART instance. + */ +extern void uart_rx_cd_callback(uart_t *uart); + +/** + * @brief UART receive timeout timer. + * + * This function is the timer callback for UART receive timeout. + * + * @param uart The UART instance. + */ +extern void uart_rx_timeout_timer(uart_t *uart); +/** + * @brief UART receive interrupt callback. + * + * This function is the interrupt callback for UART receive interrupt. + * + * @param uart The UART instance. + */ +extern void uart_reception_callback(uart_t *uart); + +/** + * @brief Get the UART error count. + * + * This function returns the number of errors that have occurred on the specified UART instance. + * + * @param uart The UART instance. + * @return The number of errors. + */ +extern uint16_t uart_get_error_count(uart_t *uart); + +/** + * @brief Get UART interrupt error. + * + * This function gets the UART interrupt error. + * + * @param uart The UART instance. + * @param count The error count. + * @return The error. + */ +extern uarts_interupt_error_t *uart_get_error(uart_t *uart); + +extern void uart_data_storage_reset(uart_t *uart); + +/** + * @brief DMA receive interrupt callback. + * + * This function is the interrupt callback for DMA receive interrupt. + * + * @param uart The UART instance. + */ +extern void uart_dma_reception_callback(uart_t *uart); + +#endif ///< __UARTS_H__ diff --git a/User/system/btn.c b/User/system/btn.c new file mode 100644 index 0000000..454845f --- /dev/null +++ b/User/system/btn.c @@ -0,0 +1,248 @@ +/* + * @Author: + * @Date: 2023-07-04 08:25:56 + * @LastEditors: xxx + * @LastEditTime: 2023-08-25 11:13:52 + * @Description:一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰 + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "btn.h" + +#define EVENT_CB(ev) \ + if (handle->cb[ev]) \ + handle->cb[ev]((Button *)handle) + +// button handle list head. +static struct Button *head_handle = NULL; + +/** + * @brief 初始化按钮结构体句柄。 + * @param handle: 按钮句柄结构体。 + * @param pin_level: 读取按钮连接的HAL GPIOLevel。 + * @param active_level: 按下按钮的GPIOLevel。 + * @param button_id: 按钮ID。 + * @retval 无 + */ +void button_init(struct Button *handle, uint8_t (*pin_level)(uint8_t), active_level_e active_level, uint8_t button_id, uint8_t button_id_reverse) +{ +#ifdef STM32 + osel_memset((uint8_t *)handle, 0, sizeof(struct Button)); +#else + memset(handle, 0, sizeof(struct Button)); +#endif + + handle->event = (uint8_t)NONE_PRESS; + handle->hal_button_Level = pin_level; + handle->button_level = handle->hal_button_Level(button_id); + handle->active_level = (uint8_t)active_level; + handle->button_id = button_id; + handle->button_id_reverse = button_id_reverse; +} + +/** + * @brief 为按钮添加事件回调函数。 + * @param handle: 按钮句柄结构体。 + * @param event: 触发事件类型。 + * @param cb: 回调函数。 + * @retval 无 + */ +void button_attach(struct Button *handle, PressEvent event, BtnCallback cb) +{ + handle->cb[event] = cb; +} + +/** + * @brief 查询按钮发生的事件。 + * @param handle: 按钮句柄结构体。 + * @retval 按钮事件。 + */ +PressEvent get_button_event(struct Button *handle) +{ + return (PressEvent)(handle->event); +} + +/** + * @brief 按钮驱动核心函数,驱动状态机。 + * @param handle: 按钮句柄结构体。 + * @retval 无 + */ +void button_handler(struct Button *handle) +{ + uint8_t read_gpio_level = handle->hal_button_Level(handle->button_id); + + // ticks counter working.. + if ((handle->state) > 0) + handle->ticks++; + + /*------------button debounce handle---------------*/ + if (read_gpio_level != handle->button_level) + { // not equal to prev one + // continue read 3 times same new level change + if (++(handle->debounce_cnt) >= DEBOUNCE_TICKS) + { + handle->button_level = read_gpio_level; + handle->debounce_cnt = 0; + } + } + else + { // leved not change ,counter reset. + handle->debounce_cnt = 0; + } + + /*-----------------State machine-------------------*/ + switch (handle->state) + { + case 0: + if (handle->button_level == handle->active_level) + { // start press down + handle->event = (uint8_t)PRESS_DOWN; + EVENT_CB(PRESS_DOWN); + handle->ticks = 0; + handle->repeat = 1; + handle->state = 1; + } + else + { + handle->event = (uint8_t)NONE_PRESS; + } + break; + + case 1: + if (handle->button_level != handle->active_level) + { // released press up + handle->event = (uint8_t)PRESS_UP; + EVENT_CB(PRESS_UP); + handle->ticks = 0; + handle->state = 2; + } + else if (handle->ticks > LONG_TICKS) + { + handle->event = (uint8_t)LONG_PRESS_START; + EVENT_CB(LONG_PRESS_START); + handle->state = 5; + } + break; + + case 2: + if (handle->button_level == handle->active_level) + { // press down again + handle->event = (uint8_t)PRESS_DOWN; + EVENT_CB(PRESS_DOWN); + handle->repeat++; + EVENT_CB(PRESS_REPEAT); // repeat hit + handle->ticks = 0; + handle->state = 3; + } + else if (handle->ticks > SHORT_TICKS) + { // released timeout + if (handle->repeat == 1) + { + handle->event = (uint8_t)SINGLE_CLICK; + EVENT_CB(SINGLE_CLICK); + } + else if (handle->repeat == 2) + { + handle->event = (uint8_t)DOUBLE_CLICK; + EVENT_CB(DOUBLE_CLICK); // repeat hit + } + handle->state = 0; + } + break; + + case 3: + if (handle->button_level != handle->active_level) + { // released press up + handle->event = (uint8_t)PRESS_UP; + EVENT_CB(PRESS_UP); + if (handle->ticks < SHORT_TICKS) + { + handle->ticks = 0; + handle->state = 2; // repeat press + } + else + { + handle->state = 0; + } + } + else if (handle->ticks > SHORT_TICKS) + { // long press up + handle->state = 0; + } + break; + + case 5: + if (handle->button_level == handle->active_level) + { + // continue hold trigger + handle->event = (uint8_t)LONG_PRESS_HOLD; + EVENT_CB(LONG_PRESS_HOLD); + } + else + { // releasd + handle->event = (uint8_t)PRESS_UP; + EVENT_CB(PRESS_UP); + handle->state = 0; // reset + } + break; + default: + handle->state = 0; // reset + break; + } +} + +/** + * @brief 启动按钮工作,将句柄添加到工作队列中。 + * @param handle: 目标句柄结构体。 + * @retval 0: 成功。-1: 已存在。 + */ +int button_start(struct Button *handle) +{ + struct Button *target = head_handle; + while (target) + { + if (target == handle) + return -1; // already exist. + target = target->next; + } + handle->next = head_handle; + head_handle = handle; + return 0; +} + +/** + * @brief 停止按钮工作,从工作队列中移除句柄。 + * @param handle: 目标句柄结构体。 + * @retval None + */ +void button_stop(struct Button *handle) +{ + struct Button **curr; + for (curr = &head_handle; *curr;) + { + struct Button *entry = *curr; + if (entry == handle) + { + *curr = entry->next; + // free(entry); + return; + } + else + curr = &entry->next; + } +} + +/** + * @brief 后台计时,定时器重复调用间隔为5ms。 + * @param None. + * @retval None + */ +void button_ticks() +{ + struct Button *target; + for (target = head_handle; target; target = target->next) + { + button_handler(target); + } +} diff --git a/User/system/btn.h b/User/system/btn.h new file mode 100644 index 0000000..c78b8bb --- /dev/null +++ b/User/system/btn.h @@ -0,0 +1,164 @@ +/*** + * @Author: + * @Date: 2023-07-04 08:26:12 + * @LastEditors: xxx + * @LastEditTime: 2023-08-09 22:49:14 + * @Description: btn是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式 + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +/** +使用方法: +1.先申请一个按键结构 + +struct Button button1; +2.初始化按键对象,绑定按键的GPIO电平读取接口read_button_pin() ,后一个参数设置有效触发电平 + +button_init(&button1, read_button_pin, 0, 0); +3.注册按键事件 + +button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler); +button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler); +... +4.启动按键 + +button_start(&button1); +5.设置一个5ms间隔的定时器循环调用后台处理函数 + +while(1) { + ... + if(timer_ticks == 5) { + timer_ticks = 0; + + button_ticks(); + } +} +*/ +#ifndef _BTN_H_ +#define _BTN_H_ + +#ifdef STM32 +#include "lib.h" +#else +#include "stdint.h" +#include "string.h" +#endif + +// 根据您的需求修改常量。 +#define TICKS_INTERVAL 10 // 按钮扫描间隔,单位ms +#define DEBOUNCE_TICKS 20 / TICKS_INTERVAL // 按键去抖动时间,单位ms +#define SHORT_TICKS (100 / TICKS_INTERVAL) // 短按时间阈值,单位ms +#define LONG_TICKS (500 / TICKS_INTERVAL) // 长按时间阈值,单位ms + +typedef void (*BtnCallback)(void *); + +typedef enum +{ + ACTIVE_LEVEL_LOW = 0, // 低电平有效 + ACTIVE_LEVEL_HIGH, // 高电平有效 +} active_level_e; + +/*** + * @brief + 事件 说明 + PRESS_DOWN 按键按下,每次按下都触发 + PRESS_UP 按键弹起,每次松开都触发 + PRESS_REPEAT 重复按下触发,变量repeat计数连击次数 + SINGLE_CLICK 单击按键事件 + DOUBLE_CLICK 双击按键事件 + LONG_PRESS_START 达到长按时间阈值时触发一次 + LONG_PRESS_HOLD 长按期间一直触发 + */ +typedef enum +{ + PRESS_DOWN = 0, // 按下 + PRESS_UP, // 弹起 + PRESS_REPEAT, // 重复按下 + SINGLE_CLICK, // 单击 + DOUBLE_CLICK, // 双击 + LONG_PRESS_START, // 长按开始 + LONG_PRESS_HOLD, // 长按保持 + number_of_event, // 事件数量 + NONE_PRESS // 无按键 +} PressEvent; + +/*** + * @brief 按钮设备结构体 + */ +typedef struct Button +{ + uint16_t ticks; // 计时器 + uint8_t repeat : 4; // 重复计数 + uint8_t event : 4; // 事件类型 + uint8_t state : 3; // 状态 + uint8_t debounce_cnt : 3; // 去抖计数 + uint8_t active_level : 1; // 激活电平 + uint8_t button_level : 1; // 按钮电平 + uint8_t button_id; // 按钮ID + uint8_t button_id_reverse; // 按钮ID反转 + uint8_t (*hal_button_Level)(uint8_t button_id_); // 获取按钮引脚电平函数 + BtnCallback cb[number_of_event]; // 回调函数数组 + struct Button *next; // 下一个按钮句柄 +} Button; + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief 初始化按钮设备 + * @param handle: 按钮句柄结构体 + * @param pin_level: 获取按钮引脚电平函数 + * @param active_level: 按钮激活电平 + * @param button_id: 按钮ID + * @retval 0: 成功 + * @retval -1: 失败 + */ + void button_init(struct Button *handle, uint8_t (*pin_level)(uint8_t), active_level_e active_level, uint8_t button_id, uint8_t button_id_reverse); + + /** + * @brief 附加按钮事件处理函数 + * @param handle: 按钮句柄结构体 + * @param event: 按钮事件 + * @param cb: 回调函数 + * @retval 0: 成功 + * @retval -1: 失败 + */ + void button_attach(struct Button *handle, PressEvent event, BtnCallback cb); + + /** + * @brief 获取按钮事件 + * @param handle: 按钮句柄结构体 + * @retval 按钮事件 + */ + PressEvent get_button_event(struct Button *handle); + + /** + * @brief 启动按钮工作 + * @param handle: 按钮句柄结构体 + * @retval 0: 成功 + * @retval -1: 已存在 + */ + int button_start(struct Button *handle); + + /** + * @brief 停止按钮工作 + * @param handle: 按钮句柄结构体 + * @retval None + */ + void button_stop(struct Button *handle); + + /** + * @brief 后台计时,定时器重复调用间隔为5ms + * @param None + * @retval None + */ + void button_ticks(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/User/system/delay.c b/User/system/delay.c new file mode 100644 index 0000000..3801499 --- /dev/null +++ b/User/system/delay.c @@ -0,0 +1,188 @@ +/* + * @Author: + * @Date: 2023-04-11 18:31:07 + * @LastEditors: xxx + * @LastEditTime: 2023-08-25 11:27:12 + * @Description: + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "delay.h" + +#if USE_OS == 1 +#include "os.h" +// 确保包含了 vPortSetupTimerInterrupt 函数的声明 +extern void vPortSetupTimerInterrupt(void); +#endif + +// static uint16_t g_fac_ms = 0; // ms延时倍乘数,在os下,代表每个节拍的ms数 +static uint32_t g_fac_us = 0; /* us延时倍乘数 */ + +/** + * @brief 初始化延迟函数 + * @param sysclk: 系统时钟频率, 即CPU频率(rcc_c_ck) + * @retval 无 + */ +void delay_init(uint16_t sysclk) +{ +#if SYS_SUPPORT_OS /* 如果需要支持OS */ + uint32_t reload; +#endif + g_fac_us = sysclk; /* 不论是否使用OS,g_fac_us都需要使用 */ + // Remove the redundant assignment statement +#if SYS_SUPPORT_OS /* 如果需要支持OS. */ + reload = sysclk; /* 每秒钟的计数次数 单位为M */ + reload *= 1000000 / configTICK_RATE_HZ; /* 根据delay_ostickspersec设定溢出时间,reload为24位 + * 寄存器,最大值:16777216,在168M下,约合0.099s左右 + */ + g_fac_ms = 1000 / configTICK_RATE_HZ; // 代表OS可以延时的最少单位 + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; /* 开启SYSTICK中断 */ + SysTick->LOAD = reload; /* 每1/delay_ostickspersec秒中断一次 */ + SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* 开启SYSTICK */ +#endif +} + +#if USE_OS == 1 +void delay_us(uint32_t nus) +{ + uint32_t ticks; + uint32_t told, tnow, reload, tcnt = 0; + + if ((0x0001 & (SysTick->CTRL)) == 0) + { + // 定时器未工作,初始化定时器 + vPortSetupTimerInterrupt(); + } + + reload = SysTick->LOAD; // 获取重装载寄存器值 + ticks = nus * g_fac_us; // 计算延时所需的SysTick计数 + + vTaskSuspendAll(); // 阻止OS调度,防止打断us延时 + told = SysTick->VAL; // 获取当前数值寄存器值(开始时数值) + + while (1) + { + tnow = SysTick->VAL; // 获取当前数值寄存器值 + if (tnow != told) + { // 当前值不等于开始值说明已在计数 + if (tnow < told) + { + tcnt += told - tnow; // 计数值 = 开始值 - 当前值 + } + else + { + tcnt += reload - tnow + told; // 计数值 = 重装载值 - 当前值 + 开始值 + } + told = tnow; // 更新开始值 + if (tcnt >= ticks) + { + break; // 时间超过/等于要延迟的时间,则退出 + } + } + } + + xTaskResumeAll(); // 恢复OS调度 +} + +#else +/** + * @brief 延时nus + * @param nus: 要延时的us数. + * @note 注意: nus的值,不要大于34952us(最大值即2^24 / g_fac_us @g_fac_us = 168) + * @retval 无 + */ +void delay_us(uint32_t nus) +{ + uint32_t ticks; + uint32_t told, tnow, tcnt = 0; + uint32_t reload = SysTick->LOAD; /* LOAD的值 */ + ticks = nus * g_fac_us; /* 需要的节拍数 */ + told = SysTick->VAL; /* 刚进入时的计数器值 */ + while (1) + { + tnow = SysTick->VAL; + if (tnow != told) + { + if (tnow < told) + { + tcnt += told - tnow; /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */ + } + else + { + tcnt += reload - tnow + told; + } + told = tnow; + if (tcnt >= ticks) + { + // __NOP(); + break; /* 时间超过/等于要延迟的时间,则退出 */ + } + } + } +} +#endif + +/** + * @brief 对指定的硬件定时器进行微秒级延时 + * + * 使用指定的硬件定时器进行延时操作,延时时间为微秒级。 + * + * @param timer_us 指向硬件定时器的指针 + * @param us 需要延时的微秒数 + */ +void delay_hardware_us(TIM_TypeDef *timer_us, uint32_t us) +{ +} + +/** + * @brief 延迟指定微秒数的硬件延迟函数 + * + * 使用指定的定时器实现微秒级的硬件延迟。 + * + * @param timer_us 指向定时器的指针,用于实现延迟功能 + * @param us 需要延迟的微秒数 + */ +void delay_hardware_ms(TIM_TypeDef *timer_us, uint32_t ms) +{ + while (ms--) + { + delay_hardware_us(timer_us, 1000); // 每毫秒延时1000微秒 + } +} + +/** + * @brief 延时nms + * @param nms: 要延时的ms数 (0< nms <= 65535) + * @retval 无 + */ +void delay_ms(uint16_t nms) +{ + uint32_t repeat = nms / 30; /* 这里用30,是考虑到可能有超频应用 */ + uint32_t remain = nms % 30; + + while (repeat) + { + delay_us(30 * 1000); /* 利用delay_us 实现 1000ms 延时 */ + repeat--; + } + + if (remain) + { + delay_us(remain * 1000); /* 利用delay_us, 把尾数延时(remain ms)给做了 */ + } +} + +/** + * @brief 延时函数,用于模拟硬件延时。 + * @param {uint32_t} ticks + * @return {*} + * @note: 请注意,这个函数仅用于模拟硬件延时,实际应用中可能需要使用其他延时函数,如HAL_Delay或rt_delay。 + */ +void delay_tick(uint32_t ticks) +{ + while (ticks--) + { + __NOP(); + } +} diff --git a/User/system/delay.h b/User/system/delay.h new file mode 100644 index 0000000..299241f --- /dev/null +++ b/User/system/delay.h @@ -0,0 +1,26 @@ +/*** + * @Author: + * @Date: 2023-04-11 18:31:07 + * @LastEditors: xxx + * @LastEditTime: 2023-04-11 18:31:20 + * @Description: + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __DELAY_H +#define __DELAY_H + +#include "sys.h" +#include "tims.h" + +#define USE_OS 0 + +void delay_init(uint16_t sysclk); /* 初始化延迟函数 */ +void delay_ms(uint16_t nms); /* 延时nms */ +void delay_us(uint32_t nus); /* 延时nus */ +void delay_hardware_us(TIM_TypeDef *timer_us, uint32_t us); /* 硬件延时us */ +void delay_hardware_ms(TIM_TypeDef *timer_us, uint32_t ms); /* 硬件延时ms */ +void delay_tick(uint32_t ticks); /* 延时ticks */ + +#endif diff --git a/User/system/driver/dac161p997.c b/User/system/driver/dac161p997.c new file mode 100644 index 0000000..e7e8e79 --- /dev/null +++ b/User/system/driver/dac161p997.c @@ -0,0 +1,154 @@ +#include "dac161p997.h" +#include "delay.h" +static dac161p997_t _handle; + +static void _delay_us(uint32_t us) +{ + delay_hardware_us(_handle.timer_us, us); +} + +static void dac161p997_output_0() +{ + _handle.io->set(*_handle.io); + _delay_us(DUTY_CYCLE_25); + _handle.io->reset(*_handle.io); + _delay_us(DUTY_CYCLE_75); +} + +static void dac161p997_output_1() +{ + _handle.io->set(*_handle.io); + _delay_us(DUTY_CYCLE_75); + _handle.io->reset(*_handle.io); + _delay_us(DUTY_CYCLE_25); +} + +static void dac161p997_output_d() +{ + _handle.io->set(*_handle.io); + _delay_us(DUTY_CYCLE_50); + _handle.io->reset(*_handle.io); + _delay_us(DUTY_CYCLE_50); +} + +/** + * @brief 输出DAC161符号 + * + * 根据传入的符号类型,调用相应的DAC161输出函数。 + * + * @param sym 符号类型,可以是ZERO_SYM、ONE_SYM或其他值。 + */ +static void dac161p997_output_symbol(uint8_t sym) +{ + switch (sym) + { + case ZERO_SYM: + dac161p997_output_0(); + break; + case ONE_SYM: + dac161p997_output_1(); + break; + default: + dac161p997_output_d(); + break; + } +} + +/** + * @brief 向DAC161写入寄存器 + * + * 向DAC161写入一个16位的数据,并附加一个8位的标签。 + * 芯片会回复一个应答信号,此处忽略应答信号。可以通过设置寄存器关闭应答信号。 + * @param data 要写入的数据,16位。 + * @param tag 附加的标签,8位。tag = 0时,写DAC寄存器;tag = 1时,写配置寄存器。 + */ +void dac161p997_swif_write_reg(uint16_t data, uint8_t tag) +{ + uint8_t plow, phigh; + uint16_t i, tmp; + + /* compute parity low */ + tmp = data & 0x00ff; // get least significant byte + for (plow = 0; tmp != 0; tmp >>= 1) + { + if (tmp & 0x1) // test if lsb is 1 + plow++; // count number of bits equal to 1 + } + + if (plow & 0x1) // check if number of 1s is odd + plow = 0; // set even parity + else + plow = 1; // else set odd parity + + /* compute parity high */ + tmp = (data & 0xff00) >> 8; // get most significant byte + for (phigh = 0; tmp != 0; tmp >>= 1) + { + if (tmp & 0x1) // test if lsb is 1 + phigh++; // count number of bits equal to 1 + } + + if (phigh & 0x1) // check if number of 1s is odd + phigh = 0; // set even parity + else + phigh = 1; // set odd parity + + phigh = phigh ^ tag; // parity high is for high slice = tag + 1 byte + + dac161p997_output_symbol(IDLE_SYM); // Frame start: send an idle symbol first + dac161p997_output_symbol(tag); + + tmp = data; + for (i = 0; i < 16; i++) // send 16 data bits msb to lsb + { + if (tmp & 0x8000) + { + dac161p997_output_symbol(ONE_SYM); // send 1 + } + else + { + dac161p997_output_symbol(ZERO_SYM); // send 0 + } + + tmp = tmp << 1; // move next data bit to msb + } + + dac161p997_output_symbol(phigh); // send parity high bit + dac161p997_output_symbol(plow); // send parity low bit + + dac161p997_output_symbol(IDLE_SYM); // send idle +} + +/** + * @brief 设置DAC161输出电流 + * + * 通过向DAC161写入指定的电流值来设置其输出电流,输出电流持续时间100ms。 + * + * @param current 要设置的电流值 + */ +void dac161p997_output_current(float32 current) +{ + uint16_t adc = (uint16_t)(current * DAC161P997_CURRENT_SLOPE); + dac161p997_swif_write_reg(adc, DACCODE_WRITE); +} + +/** + * @brief 初始化DAC161设备 + * + * 此函数用于初始化DAC161设备,进行必要的配置,以便设备正常工作。 + * 写寄存器之前要先解锁,具体配置寄存器根据需要配置的寄存器而定 + * 具体步骤包括: + * 1. 解锁DAC161的配置寄存器 + * 2. 配置DAC161的错误下限寄存器 + * 3. 锁定DAC161的配置寄存器 + */ +void dac161p997_init(TIM_TypeDef *timer_us) +{ + DBG_ASSERT(timer_us != NULL __DBG_LINE); + _handle.timer_us = timer_us; + ENABLE_TIM_COUNT(_handle.timer_us); + _handle.io = gpio_create(DAC161P997_IO_PORT, DAC161P997_IO_PIN); + dac161p997_swif_write_reg(DAC161P997_LCK_REG + DAC161P997_LCK_REG_UNLOCK, CONFIG_WRITE); + dac161p997_swif_write_reg(DAC161P997_CONFIG2_REG, CONFIG_WRITE); + dac161p997_swif_write_reg(DAC161P997_LCK_REG + DAC161P997_LCK_REG_LOCK, CONFIG_WRITE); +} diff --git a/User/system/driver/dac161p997.h b/User/system/driver/dac161p997.h new file mode 100644 index 0000000..9c480c7 --- /dev/null +++ b/User/system/driver/dac161p997.h @@ -0,0 +1,83 @@ +#ifndef __DAC161P997_H__ +#define __DAC161P997_H__ +#include "main.h" +#include "gpios.h" + +#define DAC161P997_IO_PORT (DAC161P997_GPIO_Port) +#define DAC161P997_IO_PIN (DAC161P997_Pin) + +#define DAC161P997_CURRENT_SLOPE 2730.625f // adc = (current / 24) * 0xffff + +// Symbol Periods +#define DUTY_CYCLE_100 (1000U) // (CPU_CLK / BAUD_RATE) +#define DUTY_CYCLE_75 (DUTY_CYCLE_100 * 0.75f) +#define DUTY_CYCLE_50 (DUTY_CYCLE_100 * 0.50f) +#define DUTY_CYCLE_25 (DUTY_CYCLE_100 * 0.25f) + +/************************************************************ + * TI DAC161P997 REGISTER SET ADDRESSES + ************************************************************/ +#define DAC161P997_LCK_REG (0x0000) +#define DAC161P997_CONFIG1_REG (0x0100) +#define DAC161P997_CONFIG2_REG (0x0200) +#define DAC161P997_CONFIG3_REG (0x0300) +#define DAC161P997_ERR_LOW_REG (0x0400) +#define DAC161P997_ERR_HIGH_REG (0x0500) + +// TI DAC161P997 Register Bits +#define DAC161P997_LCK_REG_LOCK (0x00AA) // any value other than 0x95 +#define DAC161P997_LCK_REG_UNLOCK (0x0095) +#define DAC161P997_CONFIG1_REG_RST (0x0001) +#define DAC161P997_CONFIG1_REG_NOP (0 * 0x08u) +#define DAC161P997_CONFIG1_REG_SET_ERR (1 * 0x08u) +#define DAC161P997_CONFIG1_REG_CLEAR_ERR (2 * 0x08u) +#define DAC161P997_CONFIG1_REG_NOP3 (3 * 0x08u) +#define DAC161P997_CONFIG2_REG_LOOP (0x0001) +#define DAC161P997_CONFIG2_REG_CHANNEL (0x0002) +#define DAC161P997_CONFIG2_REG_PARITY (0x0004) +#define DAC161P997_CONFIG2_REG_FRAME (0x0008) +#define DAC161P997_CONFIG2_REG_ACK_EN (0x0010) +#define DAC161P997_CONFIG3_REG_RX_ERR_CNT_16 (0x000F) +#define DAC161P997_CONFIG3_REG_RX_ERR_CNT_8 (0x0007) +#define DAC161P997_CONFIG3_REG_RX_ERR_CNT_1 (0x0000) + +// Tags +#define DACCODE_WRITE (0x00) +#define CONFIG_WRITE (0x01) + +// Valid Symbols +#define ZERO_SYM (0x00) +#define ONE_SYM (0x01) +#define IDLE_SYM (0x02) +#define STATIC_LOW_SYM (0x03) + +// DAC Codes for different currents +#define DACCODE_0mA (0x0000) +#define DACCODE_4mA (0x2AAA) +#define DACCODE_8mA (0x5555) +#define DACCODE_12mA (0x7FFF) +#define DACCODE_16mA (0xAAAA) +#define DACCODE_20mA (0xD555) +#define DACCODE_24mA (0xFFFF) + +typedef enum +{ + DAC161P997_IDLE_SYM, + +} dac161p997_e; +typedef struct +{ + TIM_TypeDef *timer_us; + gpio_t *io; + uint8_t count; +} dac161p997_t; + +void dac161p997_output_0(void); +void dac161p997_output_1(void); +void dac161p997_output_d(void); +void dac161p997_output_symbol(uint8_t sym); +void dac161p997_swif_write_reg(uint16_t data, uint8_t tag); + +extern void dac161p997_output_current(float32 current); +extern void dac161p997_init(TIM_TypeDef *timer_us); +#endif diff --git a/User/system/driver/eeprom_fm24.c b/User/system/driver/eeprom_fm24.c new file mode 100644 index 0000000..2fd37e9 --- /dev/null +++ b/User/system/driver/eeprom_fm24.c @@ -0,0 +1,219 @@ +/** + * @file eeprom_fm24.c + * @author xxx + * @date 2023-08-29 07:58:27 + * @brief 用于实现FM24 EEPROM相关的读写操作 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ +#include "entity.h" +#include "board.h" +#include "eeprom_fm24.h" +#include "delay.h" + +#define FM24_SPI SPI1 + +#define EEPROM_FM24_CS_PORT EE3_CS_GPIO_Port +#define EEPROM_FM24_CS_PIN EE3_CS_Pin +#define EEPROM_FM24_MOSI_PORT SPI_MOSI_GPIO_Port +#define EEPROM_FM24_MOSI_PIN SPI_MOSI_Pin +#define EEPROM_FM24_MISO_PORT SPI_MISO_GPIO_Port +#define EEPROM_FM24_MISO_PIN SPI_MISO_Pin +#define EEPROM_FM24_SCK_PORT SPI_CLK_GPIO_Port +#define EEPROM_FM24_SCK_PIN SPI_CLK_Pin + +static fm24_t _eeprom_fm24; + +void eeprom_fm24_init(void) +{ + spi_gpio_group_t gpios; + spi_normal_config_t cfg; + osel_memset((uint8_t *)&cfg, 0, sizeof(spi_normal_config_t)); + // 创建CS引脚 + gpios.cs = gpio_create(EEPROM_FM24_CS_PORT, EEPROM_FM24_CS_PIN); + gpios.mosi = gpio_create(EEPROM_FM24_MOSI_PORT, EEPROM_FM24_MOSI_PIN); + gpios.sck = gpio_create(EEPROM_FM24_SCK_PORT, EEPROM_FM24_SCK_PIN); + gpios.miso = gpio_create(EEPROM_FM24_MISO_PORT, EEPROM_FM24_MISO_PIN); + gpios.rst = gpio_create(NULL, 0); + gpios.rdy = gpio_create(NULL, 0); + + // 创建SPI对象 + eeprom_fm24_get()->spi = spi_create(SPI_TYPE_NORMAL, gpios, 0); + DBG_ASSERT(eeprom_fm24_get() != NULL __DBG_LINE); + cfg.cmd_rdsr = FM24_CMD_RDSR; + cfg.cmd_wrsr = FM24_CMD_WRSR; + cfg.cmd_wren = FM24_CMD_WREN; + cfg.cmd_wrdi = FM24_CMD_WRDI; + cfg.cmd_write = FM24_CMD_WRITE; + cfg.cmd_read = FM24_CMD_READ; + cfg.dummy_byte = FM24_DUMMY_BYTE; + cfg.address_bytes = 2; + cfg.page_size = FM24_PAGE_SIZE; + cfg.total_size = FM24_SIZE; + cfg.continuous_write = FALSE; + osel_memcpy((uint8_t *)&eeprom_fm24_get()->spi->cfg, (uint8_t *)&cfg, sizeof(spi_normal_config_t)); + // 使能SPI + eeprom_fm24_get()->spi->interface.hardware_enable(eeprom_fm24_get()->spi, FM24_SPI); + // 这里需要复位下SPI,否则读出的数据不对 + eeprom_fm24_get()->spi->interface.u.normal.spi_reset(eeprom_fm24_get()->spi); + + eeprom_fm24_write_protection_close(); + // eeprom_fm24_test(); +} + +fm24_t *eeprom_fm24_get(void) +{ + return &_eeprom_fm24; +} + +void eeprom_fm24_dinit(void) +{ + LL_SPI_Disable(FM24_SPI); + GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.mosi->port, eeprom_fm24_get()->spi->gpios.mosi->pin); + GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.miso->port, eeprom_fm24_get()->spi->gpios.miso->pin); + GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.sck->port, eeprom_fm24_get()->spi->gpios.sck->pin); + GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.cs->port, eeprom_fm24_get()->spi->gpios.cs->pin); +} + +void eeprom_fm24_enable(void) +{ + uint16_t count = 100; + LL_SPI_Enable(FM24_SPI); + // 判断SPI是否使能成功 + while (LL_SPI_IsEnabled(FM24_SPI) != 1) + { + if (count-- == 0) + { + return; + } + else + { + __NOP(); + } + } +} + +void eeprom_fm24_disable(void) +{ + uint16_t count = 100; + LL_SPI_Disable(FM24_SPI); + // 判断SPI是否关闭成功 + while (LL_SPI_IsEnabled(FM24_SPI) != 0) + { + if (count-- == 0) + { + return; + } + else + { + __NOP(); + } + } +} + +/** + * @brief 关闭EEPROM FM24的写保护 + * + * 此函数用于关闭EEPROM FM24的写保护功能,允许对其进行写操作。 + * + * 调用此函数前,应确保EEPROM FM24的SPI接口已正确初始化。 + */ +void eeprom_fm24_write_protection_close(void) +{ + DBG_ASSERT(eeprom_fm24_get()->spi != NULL __DBG_LINE); + eeprom_fm24_enable(); + eeprom_fm24_get()->spi->interface.u.normal.spi_write_reg(eeprom_fm24_get()->spi, eeprom_fm24_get()->spi->cfg.cmd_wrsr, 0); + eeprom_fm24_disable(); +} + +/** + * @brief 获取EEPROM FM24的写保护状态 + * + * 获取EEPROM FM24的写保护状态。 + * + * @return BOOL 返回TRUE表示没有写保护,返回FALSE表示有写保护 + */ +BOOL eeprom_fm24_write_protection_state(void) +{ + DBG_ASSERT(eeprom_fm24_get()->spi != NULL __DBG_LINE); + eeprom_fm24_enable(); + eeprom_fm24_get()->write_protection.data = eeprom_fm24_get()->spi->interface.u.normal.spi_read_reg(eeprom_fm24_get()->spi, eeprom_fm24_get()->spi->cfg.cmd_rdsr); + eeprom_fm24_disable(); + + if (eeprom_fm24_get()->write_protection.bits.bp0 == 1 || + eeprom_fm24_get()->write_protection.bits.bp1 == 1 || + eeprom_fm24_get()->write_protection.bits.wpen == 1) + { + return FALSE; + } + else + { + return TRUE; + } +} + +BOOL eeprom_fm24_write(uint32_t write_addr, uint8_t *data, uint16_t length) +{ + BOOL ret = FALSE; + if (length == 0) + { + return ret; + } + // 开启和关闭SPI对读写实时性有影响 + eeprom_fm24_enable(); + ret = eeprom_fm24_get()->spi->interface.u.normal.spi_write(eeprom_fm24_get()->spi, write_addr, data, length); + eeprom_fm24_disable(); + return ret; +} + +BOOL eeprom_fm24_read(uint32_t read_addr, uint8_t *data, uint16_t length) +{ + BOOL ret = FALSE; + if (length == 0) + { + return ret; + } + // 开启和关闭SPI对读写实时性有影响 + eeprom_fm24_enable(); + ret = eeprom_fm24_get()->spi->interface.u.normal.spi_read(eeprom_fm24_get()->spi, read_addr, data, length); + eeprom_fm24_disable(); + return ret; +} + +BOOL eeprom_fm24_test(void) +{ + const uint8_t buf_size = 5; + uint16_t test_address = FM24_TEST_PAGE * FM24_PAGE_SIZE; + uint8_t buf[buf_size]; + uint8_t rbuf[buf_size]; + osel_memset(buf, 0, buf_size); + osel_memset(rbuf, 0, buf_size); + buf[0] = 0xD5; + buf[1] = 0xC8; + buf[2] = 0x00; + buf[3] = 0x01; + buf[4] = 0x02; + buf[buf_size - 1] = 0xfe; + eeprom_fm24_write(test_address, buf, buf_size); + __NOP(); + eeprom_fm24_read(test_address, rbuf, buf_size); + if (osel_memcmp(buf, rbuf, buf_size) == 0) + { + return TRUE; + } + else + { + return FALSE; + } +} + +/** + * @brief 获取FM24 EEPROM的状态 + * + * 获取FM24 EEPROM的当前状态。该函数始终返回TRUE,表示EEPROM正常工作。 + * + * @return BOOL 始终返回TRUE + */ +BOOL eeprom_fm24_status_get(void) +{ + return TRUE; +} diff --git a/User/system/driver/eeprom_fm24.h b/User/system/driver/eeprom_fm24.h new file mode 100644 index 0000000..dd7f702 --- /dev/null +++ b/User/system/driver/eeprom_fm24.h @@ -0,0 +1,158 @@ +/** + * @file eeprom_fm24.h + * @author xxx + * @date 2023-08-30 14:05:55 + * @brief FM24系列EEPROM驱动 https://zhuanlan.zhihu.com/p/598934638 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __EEPROM_FM24_H__ +#define __EEPROM_FM24_H__ +#include "main.h" +#include "spis.h" +// High-endurance 100 trillion (1014) read/writes + +//========在此设定芯片地址============= + +#define W_ADD_COM 0xa0 // 写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0 + +#define R_ADD_COM 0xa1 // 读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1 + +//=======在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512 + +//=======在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512 + +#define e2prom 256 // + +#if e2prom == 1 +#define FM24_PAGE_SIZE 16 +#define FM24_SIZE (128 * 8) +#elif e2prom == 2 +#define FM24_PAGE_SIZE 16 +#define FM24_SIZE (256 * 8) +#elif e2prom == 4 +#define FM24_PAGE_SIZE 32 +#define FM24_SIZE (512 * 8) +#elif e2prom == 8 +#define FM24_PAGE_SIZE 64 +#define FM24_SIZE (1024 * 8) +#elif e2prom == 16 +#define FM24_PAGE_SIZE 128 +#define FM24_SIZE (2048 * 8) +#elif e2prom == 32 +#define FM24_PAGE_SIZE 128 +#define FM24_SIZE (4096 * 8) +#elif e2prom == 64 +#define FM24_PAGE_SIZE 256 +#define FM24_SIZE (8192 * 8) +#elif e2prom == 128 +#define FM24_PAGE_SIZE 256 +#define FM24_SIZE (16384) +#elif e2prom == 256 +#define FM24_PAGE_SIZE 256 +#define FM24_SIZE (32768) // 32K 128页 +#elif e2prom == 512 +#define FM24_PAGE_SIZE 512 +#define FM24_SIZE (65536) +#endif + +#define FM24_CMD_RDSR 0x05 /*!< Read Status Register instruction */ +#define FM24_CMD_WRSR 0x01 /*!< Write Status Register instruction */ + +#define FM24_CMD_WREN 0x06 /*!< Write enable instruction */ +#define FM24_CMD_WRDI 0x04 /*!< Write disable instruction */ + +#define FM24_CMD_READ 0x03 /*!< Read from Memory instruction */ +#define FM24_CMD_WRITE 0x02 /*!< Write to Memory instruction */ + +#define FM24_DUMMY_BYTE 0x00 ///< 无用数据 + +#define FM24_TEST_PAGE 0 ///< 测试页地址 + +typedef union +{ + uint8_t data; + struct + { + uint8_t reserve1 : 1; + uint8_t wel : 1; ///< Write enable latch + uint8_t bp0 : 1; ///< Block protect 0 + uint8_t bp1 : 1; ///< Block protect 1 + uint8_t reserve2 : 3; + uint8_t wpen : 1; ///< Write protect enable + } bits; +} fm24_write_protection_u; + +typedef struct +{ + fm24_write_protection_u write_protection; + spi_t *spi; +} fm24_t; + +/** + * @brief Initializes the FM24 EEPROM module. + */ +extern void eeprom_fm24_init(void); + +/** + * @brief Deinitializes the FM24 EEPROM module. + */ +extern void eeprom_fm24_dinit(void); + +/** + * @brief Gets the fm24_t handle of the FM24 EEPROM module. + * @return The fm24_t handle of the FM24 EEPROM module. + */ +extern fm24_t *eeprom_fm24_get(void); + +/** + * @brief Enables the FM24 EEPROM module. + */ +extern void eeprom_fm24_enable(void); + +/** + * @brief Disables the FM24 EEPROM module. + */ +extern void eeprom_fm24_disable(void); + +/** + * @brief Reads data from the FM24 EEPROM module. + * @param read_addr The starting address to read from. + * @param data Pointer to the buffer to store the read data. + * @param length The number of bytes to read. + * @return TRUE if the read operation is successful, FALSE otherwise. + */ +extern BOOL eeprom_fm24_read(uint32_t read_addr, uint8_t *data, uint16_t length); + +/** + * @brief Writes data to the FM24 EEPROM module. + * @param write_addr The starting address to write to. + * @param data Pointer to the data to be written. + * @param length The number of bytes to write. + * @return TRUE if the write operation is successful, FALSE otherwise. + */ +extern BOOL eeprom_fm24_write(uint32_t write_addr, uint8_t *data, uint16_t length); + +/** + * @brief Closes the write protection of the FM24 EEPROM module. + */ +extern void eeprom_fm24_write_protection_close(void); + +/** + * @brief Gets the write protection state of the FM24 EEPROM module. + * @return TRUE if the FM24 EEPROM module is not write-protected, FALSE otherwise. + */ +extern BOOL eeprom_fm24_write_protection_state(void); + +/** + * @brief Performs a test on the FM24 EEPROM module. + */ +extern BOOL eeprom_fm24_test(void); + +/** + * @brief Gets the status of the FM24 EEPROM module. + * @return TRUE if the FM24 EEPROM module is ready, FALSE otherwise. + */ +extern BOOL eeprom_fm24_status_get(void); + +#endif // __EEPROM_FM24_H__ diff --git a/User/system/driver/eeprom_lc02b.c b/User/system/driver/eeprom_lc02b.c new file mode 100644 index 0000000..de090e6 --- /dev/null +++ b/User/system/driver/eeprom_lc02b.c @@ -0,0 +1,171 @@ +#include "eeprom_lc02b.h" +#include "delay.h" + +#define W_ADD_COM 0xa8 // 写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0 +#define R_ADD_COM 0xa9 // 读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1 +#define PAGE_SIZE 8U +#define SIZE 256U + +#define EEPROM_LC02B_SDA_PORT I2C1_SDA_GPIO_Port +#define EEPROM_LC02B_SDA_PIN I2C1_SDA_Pin +#define EEPROM_LC02B_SCL_PORT I2C1_SCL_GPIO_Port +#define EEPROM_LC02B_SCL_PIN I2C1_SCL_Pin + +static i2c_t *_eeprom_24lc028bt_i2c; +static TIM_TypeDef *_timer_us; + +static void _delay_us(uint32_t us) +{ + if (_timer_us != NULL) + { + delay_hardware_us(_timer_us, us); + } + else + { + delay_us(us); + } +} + +void eeprom_lc02b_test(void) +{ +#define TEST_SIZE 15 + uint16_t test_address = SIZE - TEST_SIZE; + uint8_t buf[TEST_SIZE]; + for (uint8_t i = 0; i < TEST_SIZE; i++) + { + buf[i] = i + 1; + } + + eeprom_lc02b_write(test_address, buf, TEST_SIZE); + _delay_us(10000); + osel_memset(buf, 0, ARRAY_LEN(buf)); + eeprom_lc02b_read(test_address, buf, TEST_SIZE); + + __NOP(); +} + +/** + * @brief 获取EEPROM LC02B的状态 + * + * 此函数用于获取EEPROM LC02B的当前状态。 + * + * @return 如果EEPROM LC02B处于正常状态,则返回TRUE;否则返回FALSE。 + * 注意:在本实现中,总是返回TRUE,因为这是一个简单的示例函数。 + */ +BOOL eeprom_lc02b_status_get(void) +{ + return TRUE; +} + +/** + * @brief EEPROM LC02B初始化 + * @return {*} + * @note + */ +void eeprom_lc02b_init(TIM_TypeDef *timer_us) +{ + if (timer_us != NULL) + { + _timer_us = timer_us; + ENABLE_TIM_COUNT(_timer_us); + } + + i2c_gpio_group_t gpios; + gpios.scl = gpio_create(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN); + gpios.sda = gpio_create(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN); + + _eeprom_24lc028bt_i2c = i2c_create(gpios, 10); + // eeprom_lc02b_test(); +} + +/** + * @brief EEPROM LC02B反初始化 + * @return {*} + * @note + */ +void eeprom_lc02b_dinit(void) +{ + GPIO_SET_ANALOG(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN); + GPIO_SET_ANALOG(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN); +} +/** + * @brief 写入数据 + * @param {uint32_t} write_addr + * @param {uint8_t} *data + * @param {uint16_t} length + * @return {*} + * @note + */ +void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length) +{ + // 发送开始信号 + _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c); + // 发送写入地址命令 + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, W_ADD_COM); + // 等待写入地址命令响应 + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + // 发送要写入的地址 + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, (uint8_t)write_addr); + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + + // 循环写入数据 + + for (uint16_t i = 0; i < length; i++) + { + // 写入一个字节数据 + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, *data++); + // 等待响应 + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + write_addr++; + if (write_addr % PAGE_SIZE == 0) + { + _eeprom_24lc028bt_i2c->interface.stop(_eeprom_24lc028bt_i2c); + _delay_us(10000); // 延时10ms,等待写入完成 + _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c); + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, W_ADD_COM); + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, (uint8_t)write_addr); + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + } + } + // 写入完成,停止I2C总线 + _eeprom_24lc028bt_i2c->interface.stop(_eeprom_24lc028bt_i2c); +} + +/** + * @brief 读取数据 + * @param {uint32_t} read_addr + * @param {uint8_t} *data + * @param {uint16_t} length + * @return {*} + * @note + */ +void eeprom_lc02b_read(uint32_t read_addr, uint8_t *data, uint16_t length) +{ + // 发送开始信号 + _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c); + // 发送写入地址命令 + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, W_ADD_COM); + // 等待写入地址命令响应 + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + + // 发送要读取的地址 + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, (uint8_t)read_addr); + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + + // 发送开始信号 + _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c); + // 发送读取地址命令 + _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, R_ADD_COM); + // 等待读取地址命令响应 + _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c); + // 循环读取数据 + for (uint16_t i = 0; i < length - 1; i++) + { + // 读取一个字节数据 + *data++ = _eeprom_24lc028bt_i2c->interface.read_byte(_eeprom_24lc028bt_i2c, TRUE); + } + *data++ = _eeprom_24lc028bt_i2c->interface.read_byte(_eeprom_24lc028bt_i2c, FALSE); + // 停止I2C总线 + _eeprom_24lc028bt_i2c->interface.stop(_eeprom_24lc028bt_i2c); +} diff --git a/User/system/driver/eeprom_lc02b.h b/User/system/driver/eeprom_lc02b.h new file mode 100644 index 0000000..d1dc2a5 --- /dev/null +++ b/User/system/driver/eeprom_lc02b.h @@ -0,0 +1,56 @@ +/** + * @file eeprom_lc02b.h + * @author xxx + * @date 2023-12-27 14:44:02 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __EEPROM_LC02B_H +#define __EEPROM_LC02B_H +#include "main.h" +#include "entity.h" + +#define PRRESSURE_CALIBRATION_ADDRESS 0x00 ///< 压力校准地址 + +/** + * @brief Initializes the LC02B EEPROM module. + */ +void eeprom_lc02b_init(TIM_TypeDef *timer_us); + +/** + * @brief Deinitializes the LC02B EEPROM module. + */ +void eeprom_lc02b_dinit(void); + +/** + * @brief Writes data to the LC02B EEPROM module. + * + * @param write_addr The starting address to write the data. + * @param data The pointer to the data to be written. + * @param length The length of the data to be written. + */ +void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length); + +/** + * @brief Reads data from the LC02B EEPROM module. + * + * @param read_addr The starting address to read the data. + * @param data The pointer to store the read data. + * @param length The length of the data to be read. + */ +void eeprom_lc02b_read(uint32_t read_addr, uint8_t *data, uint16_t length); + +/** + * @brief Performs a test on the LC02B EEPROM module. + */ +void eeprom_lc02b_test(void); + +/** + * @brief Gets the LC02B EEPROM status. + * + * This function is used to get the current status of the LC02B EEPROM. + * + * @return TRUE if the LC02B EEPROM is in normal status, FALSE otherwise. + */ +BOOL eeprom_lc02b_status_get(void); +#endif ///< !__EEPROM_LC02B_H diff --git a/User/system/driver/eeprom_m95.c b/User/system/driver/eeprom_m95.c new file mode 100644 index 0000000..7b134b6 --- /dev/null +++ b/User/system/driver/eeprom_m95.c @@ -0,0 +1,331 @@ +/** + * @file eeprom_m95.c + * @author xxx + * @date 2023-08-30 08:58:43 + * @brief 用于实现M95 EEPROM相关的读写操作 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "eeprom_m95.h" +#include "spis.h" +#include "delay.h" +#include "entity.h" +#include "board.h" +#include "diagnosis.h" +#include "storage.h" + +#define M95_SPI SPI1 + +#define EEPROM_M95_1_CS_PORT EE1_CS_GPIO_Port +#define EEPROM_M95_1_CS_PIN EE1_CS_Pin +#define EEPROM_M95_2_CS_PORT EE2_CS_GPIO_Port +#define EEPROM_M95_2_CS_PIN EE2_CS_Pin + +// 下面宏定义为2个EEPROM_M95的引脚定义 +#define EEPROM_M95_MOSI_PORT SPI_MOSI_GPIO_Port +#define EEPROM_M95_MOSI_PIN SPI_MOSI_Pin +#define EEPROM_M95_MISO_PORT SPI_MISO_GPIO_Port +#define EEPROM_M95_MISO_PIN SPI_MISO_Pin +#define EEPROM_M95_SCK_PORT SPI_CLK_GPIO_Port +#define EEPROM_M95_SCK_PIN SPI_CLK_Pin + +m95_number_t eeprom_m95s[M95_MAX]; + +/** + * @brief 初始化EEPROM_M95eeprom_m95s + * @param {m95_number_e} num + * @return {*} + * @note 初始化函数对板卡上不同的芯片定义了块大小 + */ +void eeprom_m95_init(m95_number_e num) +{ + DBG_ASSERT(num < M95_MAX __DBG_LINE); + spi_gpio_group_t gpios; + spi_t *eeprom_m95_spi; + spi_normal_config_t cfg; + osel_memset((uint8_t *)&cfg, 0, sizeof(spi_normal_config_t)); + cfg.cmd_rdsr = M95_CMD_RDSR; + cfg.cmd_wrsr = M95_CMD_WRSR; + cfg.cmd_wren = M95_CMD_WREN; + cfg.cmd_wrdi = M95_CMD_WRDI; + cfg.cmd_write = M95_CMD_WRITE; + cfg.cmd_read = M95_CMD_READ; + cfg.dummy_byte = M95_DUMMY_BYTE; + cfg.continuous_write = FALSE; + // 128 byte + if (num == M95_1) + { + // 创建CS引脚 + gpios.cs = gpio_create(EEPROM_M95_1_CS_PORT, EEPROM_M95_1_CS_PIN); + + cfg.address_bytes = 3; + cfg.page_size = M95_PAGE_SIZE_256; + cfg.total_size = _M95M02_; + } + // 256 byte + else if (num == M95_2) + { + // 创建CS引脚 + gpios.cs = gpio_create(EEPROM_M95_2_CS_PORT, EEPROM_M95_2_CS_PIN); + + cfg.address_bytes = 3; + cfg.page_size = M95_PAGE_SIZE_256; + cfg.total_size = _M95M02_; + } + else + { + DBG_ASSERT(FALSE __DBG_LINE); + } + + gpios.mosi = gpio_create(EEPROM_M95_MOSI_PORT, EEPROM_M95_MOSI_PIN); + gpios.sck = gpio_create(EEPROM_M95_SCK_PORT, EEPROM_M95_SCK_PIN); + gpios.miso = gpio_create(EEPROM_M95_MISO_PORT, EEPROM_M95_MISO_PIN); + gpios.rst = gpio_create(NULL, 0); + gpios.rdy = gpio_create(NULL, 0); + + // 创建SPI对象 + eeprom_m95_spi = spi_create(SPI_TYPE_NORMAL, gpios, 10); + DBG_ASSERT(eeprom_m95_spi != NULL __DBG_LINE); + osel_memcpy((uint8_t *)&eeprom_m95_spi->cfg, (uint8_t *)&cfg, sizeof(spi_normal_config_t)); + // 使能SPI + eeprom_m95_spi->interface.hardware_enable(eeprom_m95_spi, M95_SPI); + eeprom_m95s[num].num = num; + eeprom_m95s[num].spi = eeprom_m95_spi; + // 这里需要设置,否则读出的数据不对 + eeprom_m95_spi->interface.u.normal.spi_reset(eeprom_m95_spi); + eeprom_m95_write_protection_close(num); // 关闭写保护 + + // eeprom_m95_test(num); +} + +/** + * @brief 反初始化EEPROM_M95 + * @param {m95_number_e} num + * @return {*} + * @note + */ +void eeprom_m95_dinit(m95_number_e num) +{ + LL_SPI_Disable(M95_SPI); + GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.mosi->port, eeprom_m95s[num].spi->gpios.mosi->pin); + GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.miso->port, eeprom_m95s[num].spi->gpios.miso->pin); + GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.sck->port, eeprom_m95s[num].spi->gpios.sck->pin); + GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.cs->port, eeprom_m95s[num].spi->gpios.cs->pin); +} + +/** + * @brief M95 EEPROM使能 + * @return {*} + * @note + */ +void eeprom_m95_enable(void) +{ + uint16_t count = 100; + LL_SPI_Enable(M95_SPI); + // 判断SPI是否使能成功 + while (LL_SPI_IsEnabled(M95_SPI) != 1) + { + if (count-- == 0) + { + return; + } + else + { + __NOP(); + } + } +} + +/** + * @brief M95 EEPROM失能 + * @return {*} + * @note + */ +void eeprom_m95_disable(void) +{ + uint16_t count = 100; + LL_SPI_Disable(M95_SPI); + // 判断SPI是否关闭成功 + while (LL_SPI_IsEnabled(M95_SPI) != 0) + { + if (count-- == 0) + { + return; + } + else + { + __NOP(); + } + } +} + +/** + * @brief 关闭EEPROM M95写保护 + * + * 关闭指定M95 EEPROM的写保护功能。 + * + * @param num 指定M95 EEPROM的编号 + */ +void eeprom_m95_write_protection_close(m95_number_e num) +{ + spi_t *handle = eeprom_m95s[num].spi; + DBG_ASSERT(handle != NULL __DBG_LINE); + eeprom_m95_enable(); + handle->interface.u.normal.spi_write_reg(handle, handle->cfg.cmd_wrsr, 0); + eeprom_m95_disable(); +} + +/** + * @brief 获取M95 EEPROM写保护状态(软件) + * + * 根据传入的M95编号获取其写保护状态。 + * + * @param num M95编号 + * @return 如果M95 EEPROM处于写保护状态,则返回FALSE;否则返回TRUE。 + */ +BOOL eeprom_m95_write_protection_state(m95_number_e num) +{ + spi_t *handle = eeprom_m95s[num].spi; + DBG_ASSERT(handle != NULL __DBG_LINE); + eeprom_m95_enable(); + eeprom_m95s[num].write_protection.data = handle->interface.u.normal.spi_read_reg(handle, handle->cfg.cmd_rdsr); + eeprom_m95_disable(); + + if (eeprom_m95s[num].write_protection.bits.bp0 == 1 || + eeprom_m95s[num].write_protection.bits.bp1 == 1 || + eeprom_m95s[num].write_protection.bits.srwd == 1) + { + return FALSE; + } + else + { + return TRUE; + } +} + +/** + * @brief 读取M95 EEPROM内存数据 + * @param num EEPROM模块编号(0或1) + * @param read_addr 要读取的地址 + * @param data 存储读取数据的缓冲区 + * @param length 要读取的数据长度 + * @return {*} + */ +BOOL eeprom_m95_read(m95_number_e num, uint32_t read_addr, uint8_t *data, uint16_t length) +{ + BOOL ret = FALSE; + if (length == 0) + { + return ret; + } + + spi_t *eeprom_m95_spi = eeprom_m95s[num].spi; // 获取EEPROM模块的SPI配置 + DBG_ASSERT(eeprom_m95_spi != NULL __DBG_LINE); + // 开启和关闭SPI对读写实时性有影响 + eeprom_m95_enable(); + ret = eeprom_m95_spi->interface.u.normal.spi_read(eeprom_m95_spi, read_addr, data, length); + eeprom_m95_disable(); + return ret; +} + +/** + * @brief 向M95 EEPROM内存写入数据 + * @param num EEPROM模块编号(0或1) + * @param write_addr 要写入的地址 + * @param data 包含要写入数据的缓冲区 + * @param length 要写入的数据长度 + * @return {*} + */ +BOOL eeprom_m95_write(m95_number_e num, uint32_t write_addr, uint8_t *data, uint16_t length) +{ + BOOL ret = FALSE; + if (length == 0) + { + return ret; + } + spi_t *eeprom_m95_spi = eeprom_m95s[num].spi; + DBG_ASSERT(eeprom_m95_spi != NULL __DBG_LINE); + // 开启和关闭SPI对读写实时性有影响 + eeprom_m95_enable(); + ret = eeprom_m95_spi->interface.u.normal.spi_write(eeprom_m95_spi, write_addr, data, length); + eeprom_m95_disable(); + return ret; +} + +BOOL eeprom_m95_1_read(uint32_t addr, uint8_t *buf, uint16_t size) +{ + return eeprom_m95_read(M95_1, addr, buf, size); +} + +BOOL eeprom_m95_1_write(uint32_t addr, uint8_t *buf, uint16_t size) +{ + return eeprom_m95_write(M95_1, addr, (uint8_t *)buf, size); +} + +BOOL eeprom_m95_2_read(uint32_t addr, uint8_t *buf, uint16_t size) +{ + return eeprom_m95_read(M95_2, addr, buf, size); +} + +BOOL eeprom_m95_2_write(uint32_t addr, uint8_t *buf, uint16_t size) +{ + return eeprom_m95_write(M95_2, addr, (uint8_t *)buf, size); +} +/** + * @brief 用于M95 EEPROM测试 + * @param {m95_number_e} num + * @return {*} + * @note + */ +BOOL eeprom_m95_test(m95_number_e num) +{ + const uint8_t buf_size = 5; + storage_t *st = storage_init(M95_TEST_PAGE * M95_PAGE_SIZE_256, M95_PAGE_SIZE_256); + DBG_ASSERT(st != NULL __DBG_LINE); + + if (num == M95_1) + { + st->ops.read = eeprom_m95_1_read; + st->ops.write = eeprom_m95_1_write; + } + else + { + st->ops.read = eeprom_m95_2_read; + st->ops.write = eeprom_m95_2_write; + } + uint8_t buf[buf_size]; + uint8_t rbuf[buf_size]; + storage_add_node(st, 0, buf_size); + osel_memset(buf, 0, buf_size); + buf[0] = 0xD5; + buf[1] = 0xC8; + buf[2] = num; + buf[3] = 0xaa; + buf[4] = 0xbb; + storage_write(st, 0, buf); + __NOP(); + storage_read(st, 0, rbuf); + storage_destroy(st); + if (osel_memcmp(buf, rbuf, buf_size) == 0) + { + return TRUE; + } + else + { + return FALSE; + } +} + +/** + * @brief 获取EEPROM M95状态 + * + * 获取EEPROM M95设备的工作状态。 + * + * @param num EEPROM M95设备编号 + * + * @return 如果EEPROM M95设备正常工作,返回TRUE;否则返回FALSE + */ +BOOL eeprom_m95_status_get(m95_number_e num) +{ + return TRUE; +} diff --git a/User/system/driver/eeprom_m95.h b/User/system/driver/eeprom_m95.h new file mode 100644 index 0000000..6b06947 --- /dev/null +++ b/User/system/driver/eeprom_m95.h @@ -0,0 +1,166 @@ +/** + * @file eeprom_m95.h + * @author xxx + * @date 2023-08-30 14:05:55 + * @brief 头文件 eeprom_m95.h + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __EEPROM_M95_H +#define __EEPROM_M95_H +#include "main.h" +#include "spis.h" + +#define _M95010_ 128 +#define _M95020_ 256 +#define _M95040_ 512 + +#define _M95080_ 1024 +#define _M95160_ 2048 +#define _M95320_ 4096 +#define _M95640_ 8192 + +#define _M95128_ 16384 +#define _M95256_ 32768 + +#define _M95512_ 65536 ///< 65K +#define _M95M02_ 262144 ///< 256K + +#define _M95_SIZE _M95512_ + +#define M95_CMD_RDSR 0x05 /*!< Read Status Register instruction */ +#define M95_CMD_WRSR 0x01 /*!< Write Status Register instruction */ + +#define M95_CMD_WREN 0x06 /*!< Write enable instruction */ +#define M95_CMD_WRDI 0x04 /*!< Write disable instruction */ + +#define M95_CMD_READ 0x03 /*!< Read from Memory instruction */ +#define M95_CMD_WRITE 0x02 /*!< Write to Memory instruction */ + +///< Instruction available only for the M95_2-D device. +#define M95_CMD_RDID 0x83 /*!< Read identification page*/ +#define M95_CMD_WRID 0x82 /*!< Write identification page*/ +#define M95_CMD_RDLS 0x83 /*!< Reads the Identification page lock status*/ +#define M95_CMD_LID 0x82 /*!< Locks the Identification page in read-only mode*/ + +#define M95_DUMMY_BYTE 0xA5 ///< 虚拟字节 + +#define M95_TEST_PAGE 0 ///< 测试页地址 + +///< 定义存储器大小(Bytes) +typedef enum +{ + M95_PAGE_SIZE_16 = 16, ///< _M95010_ 、_M95020_ 、_M95040_ + M95_PAGE_SIZE_32 = 32, ///< _M95080_ 、_M95160_、_M95320_、_M95640_ + M95_PAGE_SIZE_64 = 64, ///< _M95128_、_M95256_ + M95_PAGE_SIZE_128 = 128, ///< _M95512_ + M95_PAGE_SIZE_256 = 256, ///< _M95M02_ +} m95_page_size_e; + +typedef enum +{ + M95_1, + M95_2, + M95_MAX, +} m95_number_e; ///< 板卡上2块m95芯片定义 + +typedef union +{ + uint8_t data; + struct + { + uint8_t wip : 1; ///< Write in progress + uint8_t wel : 1; ///< Write enable latch + uint8_t bp0 : 1; ///< Block protect 0 + uint8_t bp1 : 1; ///< Block protect 1 + uint8_t reserve : 3; + uint8_t srwd : 1; ///< Status register write protect + } bits; +} m95_write_protection_u; + +typedef struct +{ + m95_number_e num; + m95_write_protection_u write_protection; + spi_t *spi; +} m95_number_t; + +extern m95_number_t eeprom_m95s[M95_MAX]; ///< m95芯片数组 + +/** + * @brief Initializes the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + */ +extern void eeprom_m95_init(m95_number_e num); + +/** + * @brief Deinitializes the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + */ +extern void eeprom_m95_dinit(m95_number_e num); + +/** + * @brief Enables the M95 EEPROM module. + */ +extern void eeprom_m95_enable(void); + +/** + * @brief Disables the M95 EEPROM module. + */ +extern void eeprom_m95_disable(void); + +/** + * @brief Closes the write protection of the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + */ +extern void eeprom_m95_write_protection_close(m95_number_e num); + +/** + * @brief write protection state of the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + */ +extern BOOL eeprom_m95_write_protection_state(m95_number_e num); + +/** + * @brief Reads data from the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + * @param read_addr The address to read from. + * @param data The buffer to store the read data. + * @param length The number of bytes to read. + */ +extern BOOL eeprom_m95_read(m95_number_e num, uint32_t read_addr, uint8_t *data, uint16_t length); + +/** + * @brief Writes data to the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + * @param write_addr The address to write to. + * @param data The data to write. + * @param length The number of bytes to write. + */ +extern BOOL eeprom_m95_write(m95_number_e num, uint32_t write_addr, uint8_t *data, uint16_t length); + +/** + * @brief Performs a test on the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + */ +extern BOOL eeprom_m95_test(m95_number_e num); + +/** + * @brief Gets the status of the M95 EEPROM module. + * + * @param num The M95 EEPROM number. + */ +extern BOOL eeprom_m95_status_get(m95_number_e num); + +extern BOOL eeprom_m95_1_read(uint32_t addr, uint8_t *buf, uint16_t size); +extern BOOL eeprom_m95_1_write(uint32_t addr, uint8_t *buf, uint16_t size); +extern BOOL eeprom_m95_2_read(uint32_t addr, uint8_t *buf, uint16_t size); +extern BOOL eeprom_m95_2_write(uint32_t addr, uint8_t *buf, uint16_t size); +#endif ///< __EEPROM_M95_H diff --git a/User/system/driver/ntc_3950.c b/User/system/driver/ntc_3950.c new file mode 100644 index 0000000..161d6e0 --- /dev/null +++ b/User/system/driver/ntc_3950.c @@ -0,0 +1,107 @@ +/** + * @file ntc_3950.c + * @author xxx + * @date 2023-08-30 08:58:43 + * @brief 用于实现NTC的应用功能 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "ntc_3950.h" +#define CPU_VREF 2.5 +#define NTC_VREF 2.5 +#define TABLE_SIZE 185 +#define NTC_SERIES_RESISTOR 200000 ///< 200K +#define BASE_TEMP -55 + +const uint32_t _table[TABLE_SIZE] = { + 8989000, 8242680, 7592960, 7021380, 6513750, // -55,-54,-53,-52,-51 + 6059060, 5648680, 5275800, 4935020, 4621990, 4333220, 4065840, 3817520, 3586310, 3370600, // -50,-49,-48,-47,-46,-45,-44,-43,-42,-41 + 3169000, 2980330, 2803600, 2637910, 2482470, 2336580, 2199620, 2071020, 1950230, 1836790, // -40,-39,-38,-37,-36,-35,-34,-33,-32,-31 + 1730230, 1630150, 1536140, 1447840, 1364900, 1287000, 1213820, 1145090, 1080530, 1019890, // -30,-29,-28,-27,-26,-25,-24,-23,-22,-21 + 962912, 909379, 859074, 811797, 767359, 725581, 686296, 649348, 614590, 581883, // -20,-19,-18,-17,-16,-15,-14,-13,-12,-11 + 551100, 522117, 494824, 469113, 444886, 422050, 400518, 380209, 361048, 342963, // -10,-9,-8,-7,-6,-5,-4,-3,-2,-1 + 326560, 309764, 294529, 280131, 266520, 253647, 241470, 229946, 219036, 208706, // 0,1, 2, 3,4,5,6,7,8,9 + 198920, 189647, 180857, 172523, 164618, 157118, 150000, 143243, 136827, 130731, // 10,11 ,12, 13,14,15,16,17,18,19 + 124940, 119435, 114202, 109225, 104491, 100000, 95699, 91617, 87731, 84028, // 20,21, 22, 23,24,25,26,27,28,29 + 80501, 77140, 73936, 70881, 67968, 65188, 62537, 60006, 57590, 55283, // 30,31, 32, 33,34,35,36,37,38,39 + 53080, 50976, 48965, 47044, 45207, 43451, 41771, 40165, 38628, 37157, // 40,41, 42, 43,34,35,36,37,38,39 + 35750, 34402, 33112, 31876, 30692, 29558, 28471, 27429, 26430, 25472, // 50,51, 52, 53,54,55,56,57,58,59 + 24554, 23672, 22827, 22016, 21237, 20489, 19771, 19082, 18420, 17784, // 60,61, 62, 63,64,65,66,67,68,69 + 17172, 16585, 16020, 15477, 14955, 14453, 13970, 13505, 13058, 12628, // 70,71, 72, 73,74,75,76,77,78,79 + 12213, 11815, 11431, 11061, 10705, 10362, 10031, 9712, 9405, 9110, // 80,81, 82, 83,84,85,86,87,88,89 + 8824, 8549, 8284, 8028, 7782, 7544, 7314, 7093, 6879, 6673, // 90,91, 92, 93,94,95,96,97,98,99 + 6474, 6281, 6096, 5916, 5743, 5576, 5415, 5259, 5108, 4963, // 101,102, 103,104,105,106,107,108,109 + 4822, 4687, 4555, 4428, 4306, 4187, 4073, 3962, 3855, 3751, // 111,112, 113,114,115,116,117,118,119 + 3651, 3555, 3461, 3371, 3283, 3199, 3100, 3099, 2899, 2799, // 121,122, 123,124,125,126,127,128,129 +}; + +/** + * @brief 温度查表 + * @param {uint32_t} *list + * @param {uint32_t} rt + * @return {*} + * @note + */ +static uint8_t ntc_lookup(const uint32_t *list, uint32_t rt) +{ + uint8_t middle = 0; + uint8_t indexL = 0; + uint8_t indexR = TABLE_SIZE - 1; + if (rt >= *(list + 0)) + return 0; + if (rt <= *(list + TABLE_SIZE - 1)) + return TABLE_SIZE - 1; + + while ((indexR - indexL) > 1) + { + middle = (indexL + indexR) >> 1; + if (rt == *(list + middle)) + return middle; + else if (rt > *(list + middle)) + indexR = middle; + else if (rt < *(list + middle)) + indexL = middle; + } + return indexL; +} + +/** + * @brief 获取温度值,单位为0.1摄氏度 + * @param {uint16_t} adc采集值 + * @return {float32_u} 温度值 + * @note + */ +float32_u ntc_get_temp(uint16_t adc) +{ + + uint8_t index = 0; + int16_t data = 0; + int16_t t = 0; + int16_t result = 0; + uint32_t rt = 0; + const int16_t base = BASE_TEMP * 10; + float32_u res; + res.f = BASE_TEMP; + + /** + * ad = (4095*rt)/(rt+10000) + * + * rt = (ad*NTC_SERIES_RESISTOR*CPU_VREF)/(NTC_VREF*4095-CPU_VREF*ad) + */ + rt = (adc * NTC_SERIES_RESISTOR * CPU_VREF) / (NTC_VREF * 4095 - CPU_VREF * adc); + index = ntc_lookup(_table, rt); + if (rt >= _table[0]) + return res; + if (rt <= *(_table + TABLE_SIZE - 1)) + { + result = (TABLE_SIZE - 1) * 10 + base; + } + else + { + data = _table[index] - _table[index + 1]; + t = 10 * (_table[index] - rt) / data; + result = base + index * 10 + t; + } + res.f = result / 10.0; + return res; +} diff --git a/User/system/driver/ntc_3950.h b/User/system/driver/ntc_3950.h new file mode 100644 index 0000000..a5e19f9 --- /dev/null +++ b/User/system/driver/ntc_3950.h @@ -0,0 +1,15 @@ +/** + * @file ntc_3950.h + * @author xxx + * @date 2023-08-30 14:05:55 + * @brief 头文件 ntc_3950.h + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __NTC_B3950_H__ +#define __NTC_B3950_H__ +#include "main.h" + +extern float32_u ntc_get_temp(uint16_t adc); ///< 获取温度值 + +#endif ///< __NTC_B3950_H__ diff --git a/User/system/driver/rtc_rx8010.c b/User/system/driver/rtc_rx8010.c new file mode 100644 index 0000000..ec34508 --- /dev/null +++ b/User/system/driver/rtc_rx8010.c @@ -0,0 +1,560 @@ +/** + * @file rtc_rx8010.c + * @author xxx + * @date 2023-08-30 08:58:43 + * @brief 用于实现RTC芯片RX8010的应用功能 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "rtc_rx8010.h" +#include "i2cs.h" +#include "delay.h" + +#define RTC_RX8010_SDA_PORT RTC_SDA_GPIO_Port +#define RTC_RX8010_SDA_PIN RTC_SDA_Pin +#define RTC_RX8010_SCL_PORT RTC_SCL_GPIO_Port +#define RTC_RX8010_SCL_PIN RTC_SCL_Pin + +static i2c_t *rtc; +static TIM_TypeDef *_timer_us; + +static void _delay_us(uint32_t us) +{ + if (_timer_us != NULL) + { + delay_hardware_us(_timer_us, us); + } + else + { + delay_us(us); + } +} + +/* sec, min, hour, week, day, month, year */ +// static uint8_t calendar[7] = {0, 0, 0, 1, 29, 2, 98}; + +/** + * @brief 从RTC芯片的指定地址读取一个字节数据 + * @param {uint8_t} *read_buf + * @param {uint8_t} addr + * @return {*} + */ +static BOOL rtc_read_byte(uint8_t *read_buf, uint8_t addr) +{ + uint8_t *p = read_buf; + + /* 发送起始信号 */ + rtc->interface.start(rtc); + + /* 发送从机地址 + 读写方向 */ + rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 此处是写方向,因为要发送读地址 */ + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 发送读地址 */ + rtc->interface.write_byte(rtc, addr); + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 重新发送起始信号。前面的代码的目的向RTC传送地址,下面开始读取数据 */ + rtc->interface.start(rtc); + + /* 发送从机地址 + 读写方向 */ + rtc->interface.write_byte(rtc, RTC_RD_ADDR); /* 此处是读方向,因为要开始读数据了 */ + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + /* 读取数据 */ + *p = rtc->interface.read_byte(rtc, FALSE); /* 读1个字节 */ + + /* 命令执行成功,发送I2C总线停止信号 */ + rtc->interface.stop(rtc); + return TRUE; +} + +/** + * @brief 从RTC芯片的指定地址读取若干数据 + * @param {uint8_t} *read_buf + * @param {uint8_t} addr + * @param {int} size + * @return {*} + */ +static BOOL rtc_read_bytes(uint8_t *read_buf, uint8_t addr, int size) +{ + int i = 0; + + /* 发送起始信号 */ + rtc->interface.start(rtc); + + /* 发送从机地址 + 读写方向 */ + rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 此处是写方向,因为要发送读地址 */ + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 发送读地址 */ + rtc->interface.write_byte(rtc, addr); + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 重新发送起始信号。前面的代码的目的向RTC传送地址,下面开始读取数据 */ + rtc->interface.start(rtc); + + /* 发送从机地址 + 读写方向 */ + rtc->interface.write_byte(rtc, RTC_RD_ADDR); /* 此处是读方向,因为要开始读数据了 */ + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 循环读取数据,RTC芯片地址自动自增 */ + for (i = 0; i < size; i++) + { + /* 每读完1个字节后,需要发送Ack, 最后一个字节需要发Nack */ + if (i != (size - 1)) + { + read_buf[i] = rtc->interface.read_byte(rtc, TRUE); /* 读1个字节 */ + } + else + { + read_buf[i] = rtc->interface.read_byte(rtc, FALSE); /* 读1个字节 */ + } + } + + /* 命令执行成功,发送I2C总线停止信号 */ + rtc->interface.stop(rtc); + return TRUE; +} + +/** + * @brief 向RTC芯片的指定地址写入一个数据 + * @param {uint8_t} data + * @param {uint8_t} addr + * @return {*} + * @note + */ +static BOOL rtc_write_byte(uint8_t data, uint8_t addr) +{ + int retry = 0; + + /* 尝试与RTC芯片建立I2C通讯 */ + for (retry = 0; retry < 100; retry++) + { + rtc->interface.start(rtc); /* 发送起始信号 */ + rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 发送从机地址 + 读写方向 */ + if (rtc->interface.wait_ack(rtc) == TRUE) + { + break; + } + } + if (retry == 100) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 发送起始写地址 */ + rtc->interface.write_byte(rtc, addr); + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 写入数据 */ + rtc->interface.write_byte(rtc, data); + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 命令执行成功,发送I2C总线停止信号 */ + rtc->interface.stop(rtc); + return TRUE; +} + +/** + * @brief 向RTC芯片的指定地址写入若干数据 + * @param {uint8_t} *write_buf + * @param {uint8_t} addr + * @param {int} size + * @return {*} + * @note + */ +static BOOL rtc_write_bytes(uint8_t *write_buf, uint8_t addr, int size) +{ + int i = 0; + int retry = 0; + + for (i = 0; i < size; i++) + { + if (i == 0) + { + /* 尝试与RTC芯片建立I2C通讯 */ + for (retry = 0; retry < 100; retry++) + { + rtc->interface.start(rtc); /* 发送起始信号 */ + rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 发送从机地址 + 读写方向 */ + if (rtc->interface.wait_ack(rtc) == TRUE) + { + break; + } + } + if (retry == 100) + { + rtc->interface.stop(rtc); + return FALSE; + } + + /* 发送起始写地址 */ + rtc->interface.write_byte(rtc, addr); + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + } + + /* 循环写入数据,RTC芯片地址自动自增 */ + rtc->interface.write_byte(rtc, write_buf[i]); + if (rtc->interface.wait_ack(rtc) != TRUE) + { + rtc->interface.stop(rtc); + return FALSE; + } + } + + /* 命令执行成功,发送I2C总线停止信号 */ + rtc->interface.stop(rtc); + return TRUE; +} + +/** + * @brief 假读RTC芯片,任意读地址,不判断RTC响应 + * @return {*} + * @note + */ +static void rtc_dummy_read(void) +{ + rtc->interface.start(rtc); + rtc->interface.write_byte(rtc, RTC_WR_ADDR); + rtc->interface.write_byte(rtc, 0x20); + + rtc->interface.start(rtc); + rtc->interface.write_byte(rtc, RTC_RD_ADDR); + rtc->interface.read_byte(rtc, FALSE); + + rtc->interface.stop(rtc); +} + +/** + * @brief 用于检查VLF,寄存器地址:0x1e bit[1] + * @return {uint8_t} 0 = VLF位为0,1 = VLF位为1 + * @note + */ +static uint8_t rtc_check_vlf(void) +{ + uint8_t flag_register = 1; + uint8_t vlf = 0; + + rtc_read_byte(&flag_register, RTC_FLAG_ADDR); + + vlf = (flag_register & 0x02); + if (vlf == 0) + { + return 0; + } + else + { + return 1; + } +} + +/** + * @brief 等待VLF位清除,寄存器地址:0x1e bit[1] + * @return {uint8_t} 0 = 清零成功,1 = 清零失败,2 = 无需清零 + */ +static uint8_t rtc_wait_vlf_clear(void) +{ + uint8_t ret = 1; + uint8_t i = 0; + uint8_t vlf; + + for (i = 0; i < 10; i++) + { + vlf = rtc_check_vlf(); + + if (vlf == 0) + { + ret = ((i > 0) ? 0 : 2); + return ret; + } + + /* 清除VLF */ + rtc_write_byte(0, RTC_FLAG_ADDR); + } + + return ret; +} + +/** + * @brief 复位 + * @return {BOOL} FALSE = 复位成功,TRUE = 复位失败 + */ +static BOOL rtc_soft_reset(void) +{ + BOOL ret = FALSE; + + ret = rtc_write_byte(0x00, 0x1f); + ret = rtc_write_byte(0x80, 0x1f); + ret = rtc_write_byte(0xd3, 0x60); + ret = rtc_write_byte(0x03, 0x66); + ret = rtc_write_byte(0x02, 0x6b); + ret = rtc_write_byte(0x01, 0x6b); + + if (ret == 0) + { + _delay_us(2000); + } + + return ret; +} + +/** + * @brief 时钟寄存器初始化函数 + * @return {BOOL} TRUE = 初始化成功,FALSE = 初始化失败 + */ +static BOOL rtc_clock_reginit(void) +{ + BOOL ret = FALSE; + + /* set reserve register */ + ret = rtc_write_byte(RTC_REG17_DATA, RTC_REG17_ADDR); + ret = rtc_write_byte(RTC_REG30_DATA, RTC_REG30_ADDR); + ret = rtc_write_byte(RTC_REG31_DATA, RTC_REG31_ADDR); + ret = rtc_write_byte(RTC_IRQ_DATA, RTC_IRQ_ADDR); + /* write 0x04 to reg_0x1d */ + ret = rtc_write_byte(0x04, 0x1d); + /* write 0x00 to reg_0x1e */ + ret = rtc_write_byte(0x00, 0x1e); + /* stop clock */ + ret = rtc_write_byte(0x40, RTC_CONTROL_ADDR); + /* set the present time */ + // ret = rtc_write_bytes(calendar, RTC_CLOCK_ADDR, sizeof(calendar)); + /* start clock */ + ret = rtc_write_byte(0x00, RTC_CONTROL_ADDR); + + return ret; +} + +/** + * @brief RTC芯片初始化 + * @return {BOOL} TRUE = 成功,FALSE = 失败 + * @note + */ +BOOL rtc_init(TIM_TypeDef *timer_us) +{ + if (timer_us != NULL) + { + _timer_us = timer_us; + ENABLE_TIM_COUNT(_timer_us); + } + + i2c_gpio_group_t gpios; + int ret = 1; + gpios.scl = gpio_create(RTC_RX8010_SCL_PORT, RTC_RX8010_SCL_PIN); + gpios.sda = gpio_create(RTC_RX8010_SDA_PORT, RTC_RX8010_SDA_PIN); + + rtc = i2c_create(gpios, 10); + + rtc_dummy_read(); + /* wait for VLF bit clear */ + ret = rtc_wait_vlf_clear(); + if (ret == 0) + { + /* software reset */ + ret = rtc_soft_reset(); + if (ret == FALSE) + { + return FALSE; + } + } + else if (ret == 1) + { + return FALSE; + } + + /* register initialize */ + + return rtc_clock_reginit(); +} + +/** + * @brief RTC芯片反初始化 + * @return {*} + * @note + */ +BOOL rtc_dinit(void) +{ + GPIO_SET_ANALOG(RTC_RX8010_SCL_PORT, RTC_RX8010_SCL_PIN); + GPIO_SET_ANALOG(RTC_RX8010_SDA_PORT, RTC_RX8010_SDA_PIN); + return TRUE; +} + +/** + * @brief 从RTC芯片读取时间 + * @param {uint8_t} *read_buf - 接收缓存指针,用于接收读取到的数据 + * @return {BOOL} TRUE = 成功,FALSE = 失败 + * @note + */ +BOOL rtc_get_clock_time(uint8_t *read_buf) +{ + return rtc_read_bytes(read_buf, RTC_CLOCK_ADDR, 7); +} + +/** + * @brief 向RTC芯片写入时间 + * @param {rtc_date} *data - 发送缓存指针,用于存储要发送的数据 + * @return {BOOL} TRUE = 成功,FALSE = 失败 + * @note + */ +BOOL rtc_set_clock_time(rtc_date *data) +{ + BOOL ret = FALSE; + uint8_t tmp[7]; + tmp[0] = data->second; + tmp[1] = data->minute; + tmp[2] = data->hour; + tmp[3] = data->weekday; + tmp[4] = data->day; + tmp[5] = data->month; + tmp[6] = data->year; + + tmp[3] = (rtc_week_e)tmp[3]; // 改成星期几 + + /* stop clock */ + ret = rtc_write_byte(0x40, RTC_CONTROL_ADDR); + /* set the present time */ + ret = rtc_write_bytes(tmp, RTC_CLOCK_ADDR, sizeof(tmp)); + /* start clock */ + ret = rtc_write_byte(0x00, RTC_CONTROL_ADDR); + + return ret; +} + +/** + * 获取实时时钟(RTC)的时间戳 + * + * 该函数从RTC设备中获取当前的日期和时间,并将其转换为自1970年1月1日以来的秒数(时间戳)。 + * 如果无法从RTC设备中获取时间,则返回0。 + * + * @return 返回从1970年1月1日以来的秒数(时间戳),如果无法获取时间则返回0。 + */ +uint32_t rtc_timestamp(void) +{ + BOOL ret = FALSE; + uint8_t tmp[7]; + rtc_date_t date; + rtc_time_t time; + ret = rtc_get_clock_time(tmp); + if (ret == FALSE) + { + return 0; + } + date.year = hex_format_dec(tmp[6]); + date.month = hex_format_dec(tmp[5]); + date.day = hex_format_dec(tmp[4]); + time.hour = hex_format_dec(tmp[2]); + time.minute = hex_format_dec(tmp[1]); + time.second = hex_format_dec(tmp[0]); + return time2stamp(&date, &time); +} + +/** + * @brief 将星期转为星期码 + * @param {uint8_t} *weekday 星期几 + * @return {*} + * @note + */ +void rtc_weekday_convert(uint8_t *weekday) +{ + switch (*weekday) + { + case 1: + *weekday = MON; + break; + case 2: + *weekday = TUE; + break; + case 3: + *weekday = WED; + break; + case 4: + *weekday = THUR; + break; + case 5: + *weekday = FRI; + break; + case 6: + *weekday = SAT; + break; + case 7: + *weekday = SUN; + break; + default: + *weekday = 0; + break; + } +} + +/** + * @brief 将星期码转为星期 + * @param {uint8_t} *weekday 星期码 + * @return {*} + * @note + */ +void rtc_weekday_rconvert(uint8_t *weekday) +{ + switch (*weekday) + { + case MON: + *weekday = 1; + break; + case TUE: + *weekday = 2; + break; + case WED: + *weekday = 3; + break; + case THUR: + *weekday = 4; + break; + case FRI: + *weekday = 5; + break; + case SAT: + *weekday = 6; + break; + case SUN: + *weekday = 7; + break; + default: + *weekday = 0; + break; + } +} diff --git a/User/system/driver/rtc_rx8010.h b/User/system/driver/rtc_rx8010.h new file mode 100644 index 0000000..7a54745 --- /dev/null +++ b/User/system/driver/rtc_rx8010.h @@ -0,0 +1,99 @@ +/** + * @file rtc_rx8010.h + * @author xxx + * @date 2023-08-30 14:05:55 + * @brief 头文件 rtc_rx8010.h + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __RTC_RX8010_H__ +#define __RTC_RX8010_H__ +#include "main.h" + +#define RTC_DEVICE_ADDR 0x32 + +#define RTC_WR_ADDR ((RTC_DEVICE_ADDR << 1) | 0) +#define RTC_RD_ADDR ((RTC_DEVICE_ADDR << 1) | 1) + +#define RTC_FLAG_ADDR 0x1e +#define RTC_CLOCK_ADDR 0x10 +#define RTC_CONTROL_ADDR 0x1f + +#define RTC_REG17_ADDR 0x17 +#define RTC_REG17_DATA 0xd8 + +#define RTC_REG30_ADDR 0x30 +#define RTC_REG30_DATA 0x00 + +#define RTC_REG31_ADDR 0x31 +#define RTC_REG31_DATA 0x08 + +#define RTC_IRQ_ADDR 0x32 +#define RTC_IRQ_DATA 0x00 + +typedef enum +{ + SUN = BIT0, + MON = BIT1, + TUE = BIT2, + WED = BIT3, + THUR = BIT4, + FRI = BIT5, + SAT = BIT6 +} rtc_week_e; ///< 星期码 + +typedef struct +{ + uint8_t year; ///< 7 bit - 1 63 + uint8_t month; ///< 4 bit + uint8_t day; ///< 5 bit + uint8_t weekday; ///< rtc_week_e + uint8_t hour; ///< 5 bit + uint8_t minute; ///< 6 bit + uint8_t second; ///< 6 bit +} rtc_date; + +/** + * @brief Initializes the RTC module. + * @return TRUE if the initialization is successful, FALSE otherwise. + */ +extern BOOL rtc_init(TIM_TypeDef *timer_us); + +/** + * @brief Deinitializes the RTC module. + * @return TRUE if the deinitialization is successful, FALSE otherwise. + */ +extern BOOL rtc_dinit(void); + +/** + * @brief Retrieves the current clock time from the RTC module. + * @param read_buf Pointer to the buffer to store the clock time. + * @return TRUE if the clock time is successfully retrieved, FALSE otherwise. + */ +extern BOOL rtc_get_clock_time(uint8_t *read_buf); + +/** + * @brief Sets the clock time in the RTC module. + * @param data Pointer to the RTC date structure containing the new clock time. + * @return TRUE if the clock time is successfully set, FALSE otherwise. + */ +extern BOOL rtc_set_clock_time(rtc_date *data); + +/** + * @brief Retrieves the current alarm time from the RTC module. + * @param read_buf Pointer to the buffer to store the alarm time. + * @return TRUE if the alarm time is successfully retrieved, FALSE otherwise. + */ +extern uint32_t rtc_timestamp(void); +/** + * @brief Converts the weekday value to a human-readable format. + * @param weekday Pointer to the weekday value to be converted. + */ +extern void rtc_weekday_convert(uint8_t *weekday); + +/** + * @brief Converts the weekday value from a human-readable format to the RTC format. + * @param weekday Pointer to the weekday value to be converted. + */ +extern void rtc_weekday_rconvert(uint8_t *weekday); +#endif ///< !__RTC_RX8010_H__ diff --git a/User/system/driver/sht40.c b/User/system/driver/sht40.c new file mode 100644 index 0000000..6235ef8 --- /dev/null +++ b/User/system/driver/sht40.c @@ -0,0 +1,181 @@ +#include "sht40.h" +#include "i2cs.h" +#include "delay.h" +#define SHT40_SDA_PORT I2C1_SDA_GPIO_Port +#define SHT40_SDA_PIN I2C1_SDA_Pin +#define SHT40_SCL_PORT I2C1_SCL_GPIO_Port +#define SHT40_SCL_PIN I2C1_SCL_Pin + +#define SHT40_I2C_ADDRESS 0x44 +#define SHT40_MEASURE_CMD 0xFD // 2*8-bit T-data:8-bit CRC:2*8-bit RH-data: 8-bit CRC + +static i2c_t *_sht40_i2c; +static TIM_TypeDef *_timer_us; +static uint8_t crc8(uint8_t *data, uint8_t len); + +static void _delay_us(uint32_t us) +{ + if (_timer_us != NULL) + { + delay_hardware_us(_timer_us, us); + } + else + { + delay_us(us); + } +} + +void sht40_test(void) +{ + float32 temperature = 0; + float32 humidity = 0; + sht40_read(&temperature, &humidity); + + __NOP(); +} +/** + * @brief 初始化 SHT40 传感器 + * + * 该函数用于初始化 SHT40 传感器,包括创建 I2C 通讯所需的 GPIO 引脚和 I2C 通讯对象。 + * + * 初始化完成后,sht40_i2c 变量将用于后续的 SHT40 传感器通信。 + */ +void sht40_init(TIM_TypeDef *timer_us) +{ + DBG_ASSERT(timer_us != NULL __DBG_LINE); + if (timer_us != NULL) + { + _timer_us = timer_us; + ENABLE_TIM_COUNT(_timer_us); + } + + i2c_gpio_group_t gpios; + gpios.scl = gpio_create(SHT40_SCL_PORT, SHT40_SCL_PIN); + gpios.sda = gpio_create(SHT40_SDA_PORT, SHT40_SDA_PIN); + + _sht40_i2c = i2c_create(gpios, 10); + DBG_ASSERT(_sht40_i2c != NULL __DBG_LINE); + + // sht40_test(); // 测试 SHT40 +} + +/** + * @brief 初始化 SHT40 传感器 + * + * 此函数用于初始化 SHT40 温湿度传感器,以便进行后续的温度和湿度测量。 + * + * 注意:该函数没有返回值,也不接受任何参数。 + */ +void sht40_dinit(void) +{ + GPIO_SET_ANALOG(SHT40_SDA_PORT, SHT40_SDA_PIN); + GPIO_SET_ANALOG(SHT40_SCL_PORT, SHT40_SCL_PIN); +} + +/** + * @brief 读取温湿度传感器数据 + * + * 从温湿度传感器读取温度和湿度数据,并将读取到的数据存储在传入的浮点数指针指向的位置。 + * + * @param temperature 用于存储读取到的温度值的浮点数指针 + * @param humidity 用于存储读取到的湿度值的浮点数指针 + */ +BOOL sht40_read(float32 *temperature, float32 *humidity) +{ + uint8_t data[6]; + + osel_memset(data, 0, ARRAY_LEN(data)); + // 发送开始信号 + _sht40_i2c->interface.start(_sht40_i2c); + // 发送写入地址命令 + _sht40_i2c->interface.write_byte(_sht40_i2c, SHT40_I2C_ADDRESS << 1); + // 等待写入地址命令响应 + if (_sht40_i2c->interface.wait_ack(_sht40_i2c) == FALSE) + { + return FALSE; + } + // 发送测量命令 + _sht40_i2c->interface.write_byte(_sht40_i2c, SHT40_MEASURE_CMD); + // 等待测量命令响应 + if (_sht40_i2c->interface.wait_ack(_sht40_i2c) == FALSE) + { + return FALSE; + } + // 停止I2C总线 + _sht40_i2c->interface.stop(_sht40_i2c); + + _delay_us(10000); // 根据 SHT40 数据手册,等待至少 10ms + + // 发送开始信号 + _sht40_i2c->interface.start(_sht40_i2c); + // 发送写入地址命令 + _sht40_i2c->interface.write_byte(_sht40_i2c, (SHT40_I2C_ADDRESS << 1) | 1); + // 等待写入地址命令响应 + if (_sht40_i2c->interface.wait_ack(_sht40_i2c) == FALSE) + { + return FALSE; + } + + for (uint8_t i = 0; i < ARRAY_LEN(data); i++) + { + if (i == 5) + { + data[i] = _sht40_i2c->interface.read_byte(_sht40_i2c, FALSE); + } + else + { + data[i] = _sht40_i2c->interface.read_byte(_sht40_i2c, TRUE); + } + } + + // 停止I2C总线 + _sht40_i2c->interface.stop(_sht40_i2c); + + *temperature = 0; + *humidity = 0; + if (crc8(&data[0], 2) != data[2] || crc8(&data[3], 2) != data[5]) + { + return FALSE; + } + else + { + *temperature = (float32)((uint16_t)data[0] << 8 | data[1]) * 175 / 65535 - 45; + *humidity = (float32)((uint16_t)data[3] << 8 | data[4]) * 125 / 65535 - 6; + if (*humidity > 100) + { + *humidity = 100; + } + if (*humidity < 0) + { + *humidity = 0; + } + + return TRUE; + } +} + +/** + * @brief crc8校验函数,多项式为 x^8 + x^5 + x^4 + 1 + * @param data 要校验的数据 + * @param len 要校验的数据的字节数 + * @retval 校验结果 + * @note 该校验适合SHT3温湿度传感器的数据校验 + */ +static uint8_t crc8(uint8_t *data, uint8_t len) +{ + const uint8_t polynomial = 0x31; + uint8_t crc = 0xFF; + int i, j; + + for (i = 0; i < len; ++i) + { + crc ^= *data++; + + for (j = 0; j < 8; ++j) + { + crc = (crc & 0x80) ? (crc << 1) ^ polynomial : (crc << 1); + } + } + + return crc; +} diff --git a/User/system/driver/sht40.h b/User/system/driver/sht40.h new file mode 100644 index 0000000..c06341c --- /dev/null +++ b/User/system/driver/sht40.h @@ -0,0 +1,9 @@ +#ifndef __SHT40_H +#define __SHT40_H +#include "main.h" + +void sht40_init(TIM_TypeDef *timer_us); ///< 初始化 SHT40 传感器 +void sht40_dinit(void); ///< 反初始化 SHT40 传感器 +BOOL sht40_read(float32 *temperature, float32 *humidity); ///< 读取温湿度传感器数据 + +#endif ///< !__SHT40_H diff --git a/User/system/driver/ssd1306_oled.c b/User/system/driver/ssd1306_oled.c new file mode 100644 index 0000000..a232cae --- /dev/null +++ b/User/system/driver/ssd1306_oled.c @@ -0,0 +1,1011 @@ +/** + * @file ssd1306_oled.c + * @author xushenghao + * @brief 0.96 SSD1306 OLED display driver + * @version 0.1 + * @note PB13-SCK PB12-SDA + */ +#include "ssd1306_oled.h" +#include "string.h" + +/************************************6*8的点阵************************************/ +const uint8_t F6x8[][6] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp + 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // ! + 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // " + 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // # + 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $ + 0x00, 0x62, 0x64, 0x08, 0x13, 0x23, // % + 0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // & + 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // ' + 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // ( + 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // ) + 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // * + 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // + + 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // , + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // - + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // . + 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // / + 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 + 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 1 + 0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 2 + 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 3 + 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 4 + 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 5 + 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 + 0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 7 + 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 8 + 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 9 + 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // : + 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ; + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // < + 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // = + 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // > + 0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ? + 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @ + 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A + 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B + 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C + 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D + 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E + 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F + 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G + 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H + 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I + 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J + 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K + 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L + 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M + 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N + 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O + 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P + 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q + 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R + 0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S + 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T + 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U + 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V + 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W + 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X + 0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y + 0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z + 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [ + 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55 + 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ] + 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^ + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _ + 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // ' + 0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // a + 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, // b + 0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // c + 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // d + 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // e + 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // f + 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g + 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // h + 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // i + 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // j + 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k + 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // l + 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // m + 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // n + 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // o + 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // p + 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // q + 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // r + 0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // s + 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // t + 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // u + 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // v + 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // w + 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // x + 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y + 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // z + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // horiz lines +}; +/****************************************8*16的点阵************************************/ +const uint8_t F8X16[] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0 + 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00, //! 1 + 0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //" 2 + 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00, // # 3 + 0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00, //$ 4 + 0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00, //% 5 + 0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10, //& 6 + 0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //' 7 + 0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, //( 8 + 0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, //) 9 + 0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, //* 10 + 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, //+ 11 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, //, 12 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //- 13 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //. 14 + 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, /// 15 + 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, // 0 16 + 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // 1 17 + 0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, // 2 18 + 0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // 3 19 + 0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, // 4 20 + 0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, // 5 21 + 0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // 6 22 + 0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, // 7 23 + 0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, // 8 24 + 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, // 9 25 + 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, //: 26 + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, //; 27 + 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, //< 28 + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, //= 29 + 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, //> 30 + 0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, //? 31 + 0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, //@ 32 + 0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, // A 33 + 0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // B 34 + 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, // C 35 + 0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // D 36 + 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, // E 37 + 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, // F 38 + 0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, // G 39 + 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, // H 40 + 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // I 41 + 0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, // J 42 + 0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, // K 43 + 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, // L 44 + 0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, // M 45 + 0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, // N 46 + 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // O 47 + 0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, // P 48 + 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, // Q 49 + 0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, // R 50 + 0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, // S 51 + 0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // T 52 + 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // U 53 + 0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, // V 54 + 0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, // W 55 + 0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, // X 56 + 0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // Y 57 + 0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, // Z 58 + 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, //[ 59 + 0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, //\ 60 + 0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, //] 61 + 0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //^ 62 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //_ 63 + 0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //` 64 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, // a 65 + 0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // b 66 + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, // c 67 + 0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, // d 68 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, // e 69 + 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // f 70 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, // g 71 + 0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // h 72 + 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // i 73 + 0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, // j 74 + 0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, // k 75 + 0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // l 76 + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, // m 77 + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // n 78 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // o 79 + 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, // p 80 + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, // q 81 + 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, // r 82 + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, // s 83 + 0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, // t 84 + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, // u 85 + 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, // v 86 + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, // w 87 + 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, // x 88 + 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, // y 89 + 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, // z 90 + 0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, //{ 91 + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //| 92 + 0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, //} 93 + 0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94 +}; + +const uint8_t LOGO[] = { + 0x00, 0x03, 0x05, 0x09, 0x11, 0xFF, 0x11, 0x89, 0x05, 0xC3, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x28, 0xFF, 0x11, 0xAA, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x38, 0x44, 0x82, 0x92, + 0x92, 0x74, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0xC7, 0x01, 0x7D, + 0x7D, 0x7D, 0x7D, 0x01, 0x7D, 0x7D, 0x7D, 0x7D, 0x01, 0x7D, 0x7D, 0x7D, 0x7D, 0x01, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, + 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDB, 0xDB, + 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0x00, 0x00, 0xD8, 0xD8, 0xD8, 0xD8, + 0xD8, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0xE6, 0x66, 0x20, 0x00, 0x06, 0x06, 0x86, 0x06, + 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x86, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x00, 0x86, 0x86, 0x86, 0x86, 0x86, 0x80, 0x80, 0x86, 0x86, 0x06, 0x86, 0x86, 0xC0, 0xC0, 0x86, + 0x86, 0x86, 0x06, 0x06, 0xD0, 0x30, 0x76, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1C, 0x00, 0xFE, 0x00, 0x01, + 0x02, 0x00, 0xC4, 0x18, 0x20, 0x02, 0x9E, 0x63, 0xB2, 0x0E, 0x00, 0xFF, 0x81, 0x81, 0xFF, 0x00, + 0x00, 0x80, 0x40, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x23, 0xEA, 0xAA, 0xBF, 0xAA, + 0xEA, 0x03, 0x3F, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0C, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, 0x80, 0x80, 0x81, 0x80, + 0x81, 0x80, 0x80, 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x09, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x00, 0x1E, 0x21, 0x40, 0x40, 0x50, 0x21, 0x5E, 0x00, 0x1E, 0x21, 0x40, 0x40, 0x50, 0x21, 0x5E, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC1, 0xC1, 0xFF, + 0xFF, 0xC1, 0xC1, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0xFC, 0xF3, 0xEF, 0xF3, 0xFC, + 0x80, 0xFF, 0x80, 0xEE, 0xEE, 0xEE, 0xF5, 0xFB, 0xFF, 0x9C, 0xBE, 0xB6, 0xB6, 0x88, 0xFF, 0x00, + // end +}; + +static uint8_t _buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区 +static uint8_t _buffer_copy[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 屏幕缓冲区副本 + +static void i2c_start(void) +{ + SDA_OUT(); + GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(4); + GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + delay_us(4); + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); +} + +static void i2c_stop(void) +{ + SDA_OUT(); + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + delay_us(4); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + delay_us(4); +} + +static BOOL i2c_wait_ack(void) +{ + uint8_t count = 0; + SDA_IN(); + GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + delay_us(4); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(4); + while (GPIO_READ(SSD1306_SDA_PORT, SSD1306_SDA_PIN)) + { + count++; + if (count > 250) + { + i2c_stop(); + return FALSE; + } + } + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + return TRUE; +} + +static void i2c_ack(void) +{ + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + SDA_OUT(); + GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + delay_us(2); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(2); + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); +} + +static void i2c_nack(void) +{ + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + SDA_OUT(); + GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + delay_us(2); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(2); + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); +} + +uint8_t i2c_read_byte(BOOL ack) +{ + uint8_t i = 0, receive = 0; + SDA_IN(); + for (i = 0; i < 8; i++) + { + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(2); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + receive <<= 1; + if (GPIO_READ(SSD1306_SDA_PORT, SSD1306_SDA_PIN)) + { + receive++; + } + delay_us(1); + } + + if (!ack) + { + i2c_nack(); + } + else + { + i2c_ack(); + } + + return receive; +} + +void i2c_write_byte(uint8_t data) +{ + uint8_t i = 0; + SDA_OUT(); + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + for (i = 0; i < 8; i++) + { + // IIC_SDA=(txd&0x80)>>7; + if ((data & 0x80) >> 7) + GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + else + GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN); + + data <<= 1; + delay_us(2); + GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(2); + GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN); + delay_us(2); + } +} + +static void i2c_write_command(uint8_t command) +{ + uint8_t dd[2]; + dd[0] = SSD1306_CMD_SET_LOW_COLUMN; // Co = 0, D/C# = 0 + dd[1] = command; + i2c_start(); + i2c_write_byte(SSD1306_I2C_ADDRESS); + i2c_wait_ack(); + + i2c_write_byte(dd[0]); + i2c_wait_ack(); + + i2c_write_byte(dd[1]); + i2c_wait_ack(); + i2c_stop(); +} + +static void i2c_write_data(uint8_t data) +{ + uint8_t dd[2]; + dd[0] = SSD1306_CMD_SET_START_LINE; // Co = 0, D/C# = 1 + dd[1] = data; + i2c_start(); + i2c_write_byte(SSD1306_I2C_ADDRESS); + i2c_wait_ack(); + + i2c_write_byte(dd[0]); + i2c_wait_ack(); + + i2c_write_byte(dd[1]); + i2c_wait_ack(); +} + +/** + * @brief 设置SSD1306 OLED显示屏上的显示位置 + * + * 该函数用于设置SSD1306 OLED显示屏上的显示位置,通过x和y坐标确定显示位置。 + * + * @param x 要设置的横坐标(0-127) + * @param y 要设置的纵坐标(0-7,对应SSD1306 OLED的8个页面) + */ +void set_position(uint8_t x, uint8_t y) +{ + i2c_write_command(0xb0 + y); + i2c_write_command(((x & 0xf0) >> 4) | 0x10); + i2c_write_command((x & 0x0f) | 0x01); +} + +void ssd1306_test(void) +{ + ssd1306_f8x16_string(0, 0, " TEST"); + ssd1306_f8x16_number(40, 0, -15.26, 2); + ssd1306_f6x8_string_number(0, 3, " @ADC1:", 'V', 24); + ssd1306_update_screen(); +} + +void ssd1306_init(void) +{ + i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // display off + i2c_write_command(SSD1306_CMD_MEMORY_MODE); // Set Memory Addressing Mode + i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid + i2c_write_command(SSD1306_CMD_COM_SCAN_DEC); // Set COM Output Scan Direction + i2c_write_command(SSD1306_CMD_SET_LOW_COLUMN); //---set low column address + i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); //---set high column address + i2c_write_command(SSD1306_CMD_SET_START_LINE); //--set start line address + i2c_write_command(SSD1306_CMD_SET_CONTRAST); //--set contrast control register + i2c_write_command(0xff); // 亮度调节 0x00~0xff + i2c_write_command(0xa1); //--set segment re-map 0 to 127 + i2c_write_command(SSD1306_CMD_NORMAL_DISPLAY); //--set normal display + i2c_write_command(SSD1306_CMD_SET_MULTIPLEX); //--set multiplex ratio(1 to 64) + i2c_write_command(0x3f); // + i2c_write_command(SSD1306_CMD_DISPLAY_ALL_ON_RESUME); // 0xa4,Output follows RAM content;0xa5,Output ignores RAM content + i2c_write_command(SSD1306_CMD_SET_DISPLAY_OFFSET); //-set display offset + i2c_write_command(SSD1306_CMD_SET_LOW_COLUMN); //-not offset + i2c_write_command(SSD1306_CMD_SET_DISPLAY_CLOCK_DIV); //--set display clock divide ratio/oscillator frequency + i2c_write_command(0xf0); //--set divide ratio + i2c_write_command(SSD1306_CMD_SET_PRECHARGE); //--set pre-charge period + i2c_write_command(SSD1306_CMD_PAGE_ADDR); // + i2c_write_command(SSD1306_CMD_SET_COM_PINS); //--set com pins hardware configuration + i2c_write_command(0x12); + i2c_write_command(SSD1306_CMD_SET_VCOM_DETECT); //--set vcomh + i2c_write_command(SSD1306_CMD_MEMORY_MODE); // 0x20,0.77xVcc + i2c_write_command(SSD1306_CMD_CHARGE_PUMP); //--set DC-DC enable + i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); // + i2c_write_command(SSD1306_CMD_DISPLAY_ON); //--turn on oled panel + ssd1306_clear(); + + // ssd1306_test(); +} + +void ssd1306_logo(void) +{ + ssd1306_draw_bmp(0, 0, SSD1306_WIDTH, 2, LOGO); +} + +void ssd1306_display_on(void) +{ + i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵 + i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); // 开启电荷泵 + i2c_write_command(SSD1306_CMD_DISPLAY_ON); // OLED唤醒 +} + +void ssd1306_display_off(void) +{ + i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵 + i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 关闭电荷泵 + i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // OLED休眠 +} + +/** + * @brief 更新SSD1306 OLED显示屏的内容 + * + * 此函数将缓冲区中的数据写入SSD1306 OLED显示屏,从而更新显示内容。 + * + * 首先,通过发送命令设置列地址和页地址,然后将缓冲区中的数据逐行写入显示屏。 + * + * @note 在调用此函数之前,需要将需要显示的数据写入缓冲区。 + */ +void ssd1306_update_screen(void) +{ + for (uint8_t i = 0; i < SSD1306_HEIGHT / 8; i++) + { + uint8_t update_needed = 0; + for (uint8_t j = 0; j < SSD1306_WIDTH; j++) + { + if (_buffer[j + i * SSD1306_WIDTH] != _buffer_copy[j + i * SSD1306_WIDTH]) + { + update_needed = 1; + break; + } + } + if (update_needed) + { + i2c_write_command(0xb0 + i); + i2c_write_command(0x01); + i2c_write_command(0x10); + for (uint8_t j = 0; j < SSD1306_WIDTH; j++) + { + i2c_write_data(_buffer[j + i * SSD1306_WIDTH]); + } + } + } + + osel_memcpy(_buffer_copy, _buffer, ARRAY_LEN(_buffer)); +} + +/** + * @brief 填充整个屏幕为指定颜色 + * + * 该函数将 SSD1306 OLED 显示屏的每一个像素点都设置为指定的颜色。 + * + * @param color 颜色值,SSD1306_BLACK 表示关闭像素点(黑色),SSD1306_WHITE 表示打开像素点(白色) + */ +void ssd1306_fill(uint8_t color) +{ + ssd1306_clear_buffer(); + osel_memset(_buffer, color, ARRAY_LEN(_buffer)); + ssd1306_update_screen(); +} + +/** + * @brief 清空SSD1306显示屏 + * + * 该函数通过向SSD1306显示屏发送一系列命令来清空显示内容。 + * + * 首先,通过循环遍历每个页面(SSD1306显示屏有8个页面), + * 对每个页面执行以下操作: + * 1. 发送页面地址命令(0xb0 + y),其中y为当前页面索引。 + * 2. 发送列地址低位命令(0x01)。 + * 3. 发送列地址高位命令(0x10),表示从第一列开始。 + * 4. 循环遍历每一列(SSD1306显示屏的宽度), + * 发送数据0x00以清空该列的内容。 + */ +void ssd1306_clear(void) +{ + ssd1306_clear_buffer(); + ssd1306_update_screen(); +} + +void ssd1306_clear_buffer(void) +{ + osel_memset(_buffer, SSD1306_BLACK, ARRAY_LEN(_buffer)); + osel_memset(_buffer_copy, 0xff, ARRAY_LEN(_buffer_copy)); +} + +/** + * @brief 在指定区域内绘制BMP + * + * 在指定坐标区域内绘制一个BMP,使用SSD1306 OLED显示屏 + * ssd1306_draw_bmp(0, 0, SSD1306_WIDTH, 2); + * @param x0 BMP绘制的起始X坐标 + * @param y0 BMP绘制的起始Y坐标 + * @param x1 BMP绘制的结束X坐标 + * @param y1 BMP绘制的结束Y坐标 + */ +void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const uint8_t *bmp) +{ + uint8_t j = 0; + uint8_t x, y; + ssd1306_clear_buffer(); + if (y1 % 8 == 0) + y = y1 / 8; + else + y = y1 / 8 + 1; + for (y = y0; y < y1; y++) + { + set_position(x0, y); + for (x = x0; x < x1; x++) + { + i2c_write_data(bmp[j++]); + } + } +} + +/** + * @brief 在SSD1306 OLED显示屏上显示字符串 + * + * 在SSD1306 OLED显示屏上以6x8像素的字体显示给定的字符串。 + * + * @param x 显示字符串的起始x坐标 + * @param y 显示字符串的起始y坐标 + * @param str 要显示的字符串 + */ +void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch) +{ + uint8_t c = 0, i = 0, j = 0; + while (ch[j] != '\0') + { + c = ch[j] - 32; + if (x > 126) + { + x = 0; + y++; + } + for (i = 0; i < 6; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i]; + x += 6; + j++; + } +} + +/** + * @brief 将浮点数显示在SSD1306显示屏上 + * + * 该函数将给定的浮点数num转换为字符串,并将其显示在SSD1306显示屏的指定位置。 + * + * @param x 显示的起始x坐标 + * @param y 显示的起始y坐标 + * @param num 要显示的浮点数 + * @param dot_num 小数点后的位数,0表示不显示小数部分 + */ +void ssd1306_f6x8_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num) +{ + uint8_t ch[9] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; + uint8_t c = 0, i = 0, j = 0; + if (num < 0) + { + ch[i++] = '-'; + num = -num; + } + if (num > 32000) + return; + + c = 8 - i; + + if (num >= 10000) + { + ch[i++] = num / 10000 + 48; + ch[i++] = (int32_t)(num) % 10000 / 1000 + 48; + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 1000) + { + ch[i++] = (int32_t)(num) % 10000 / 1000 + 48; + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 100) + { + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 10) + { + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 0) + { + ch[i++] = (int32_t)(num) % 10 + 48; + } + if (dot_num > 0 && i < 7) + { + ch[i++] = '.'; + num = num - (int32_t)num; + + if (dot_num == 1 && i < 8) + { + num = num * 10; + ch[i++] = (int32_t)(num + 0.5) % 10 + 48; + } + if (dot_num >= 2 && i < 8) + { + num = num * 100; + ch[i++] = (int32_t)num % 100 / 10 + 48; + if (i < 8) + ch[i++] = (int32_t)(num + 0.5) % 10 + 48; + } + } + + while (ch[j] != '\0') + { + c = ch[j] - 32; + if (x > 120) + { + x = 0; + y++; + } + for (i = 0; i < 6; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i]; + x += 6; + j++; + } +} +/** + * @brief 在SSD1306 OLED屏幕上显示字符串和数字 + * + * 该函数用于在SSD1306 OLED屏幕上显示字符串和数字。首先显示一个字符串, + * 然后显示一个浮点数。字符串和数字按照指定的位置和单位显示。 + * + * @param x 起始位置的x坐标 + * @param y 起始位置的y坐标 + * @param ch 要显示的字符串 + * @param unit 数字的单位,例如'm'表示米 + * @param num 要显示的浮点数 + */ +void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num) +{ + uint8_t c = 0, i = 0, j = 0; + int8_t a, number[7] = {0, 0, 0, -2, 0, 0, 0}; + uint32_t d; + while (ch[j] != '\0') + { + c = ch[j] - 32; + if (x > 126) + { + x = 0; + y++; + } + for (i = 0; i < 6; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i]; + x += 6; + j++; + } + d = 1000 * num; + for (a = 0; a < 3; a++) + { + number[6 - a] = d % 10; + d = d / 10; + } + for (a = 4; a < 7; a++) + { + number[6 - a] = d % 10; + d = d / 10; + } + if (num >= 100) + { + a = 0; + } + else if (num >= 10) + { + a = 1; + } + else if (num >= 0) + { + a = 2; + } + for (; a < 7; a++) + { + c = number[a] + 16; + if (x > 126) + { + x = 0; + y++; + } + for (i = 0; i < 6; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i]; + x += 6; + j++; + } + for (int h = 0; h < 7; h++) + { + c = unit - 32; + for (i = 0; i < 6; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i]; + } +} + +/** + * @brief 在SSD1306 OLED显示屏上显示8x16大小的字符串 + * + * 该函数使用8x16字体在SSD1306 OLED显示屏上显示指定的字符串。字符串的字符位置由x和y参数指定。 + * + * @param x 显示字符串的起始x坐标 + * @param y 显示字符串的起始y坐标 + * @param str 要显示的字符串 + */ +void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch) +{ + uint8_t c = 0, i = 0, j = 0; + while (ch[j] != '\0') + { + c = ch[j] - 32; + if (x > 120) + { + x = 0; + y++; + } + for (i = 0; i < 8; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i]; + for (i = 0; i < 8; i++) + _buffer[((y + 1) * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i + 8]; + x += 8; + j++; + } +} + +/** + * @brief 在SSD1306 OLED显示屏上以8x16像素字体显示浮点数 + * + * 在指定的坐标位置 (x, y) 上,使用8x16像素大小的字体显示浮点数 num,并显示指定数量的小数点 dot_num。 + * + * @param x 显示位置的x坐标 + * @param y 显示位置的y坐标 + * @param num 要显示的浮点数 + * @param dot_num 要显示的小数点数量 + */ +void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num) +{ + uint8_t ch[9] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; + uint8_t c = 0, i = 0, j = 0; + if (num < 0) + { + ch[i++] = '-'; + num = -num; + } + if (num > 32000) + return; + + c = 8 - i; + + if (num >= 10000) + { + ch[i++] = num / 10000 + 48; + ch[i++] = (int32_t)(num) % 10000 / 1000 + 48; + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 1000) + { + ch[i++] = (int32_t)(num) % 10000 / 1000 + 48; + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 100) + { + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 10) + { + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 0) + { + ch[i++] = (int32_t)(num) % 10 + 48; + } + if (dot_num > 0 && i < 7) + { + ch[i++] = '.'; + num = num - (int32_t)num; + + if (dot_num == 1 && i < 8) + { + num = num * 10; + ch[i++] = (int32_t)(num + 0.5) % 10 + 48; + } + if (dot_num >= 2 && i < 8) + { + num = num * 100; + ch[i++] = (int32_t)num % 100 / 10 + 48; + if (i < 8) + ch[i++] = (int32_t)(num + 0.5) % 10 + 48; + } + } + + while (ch[j] != '\0') + { + c = ch[j] - 32; + if (x > 120) + { + x = 0; + y++; + } + for (i = 0; i < 8; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i]; + for (i = 0; i < 8; i++) + _buffer[((y + 1) * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i + 8]; + x += 8; + j++; + } +} + +// 在 SSD1306 显示屏上绘制一个像素 +void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color) +{ + if (x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT) + { + // 超出屏幕范围 + return; + } + + // 设置像素颜色 + if (color == SSD1306_WHITE) + { + _buffer[x + (y / 8) * SSD1306_WIDTH] |= 1 << (y % 8); + } + else + { + _buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8)); + } +} + +// 在 SSD1306 显示屏上绘制一条线 +void ssd1306_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color) +{ + int16_t dx, dy, sx, sy, err, e2; + + dx = ABS(x2 - x1); + dy = ABS(y2 - y1); + sx = (x1 < x2) ? 1 : -1; + sy = (y1 < y2) ? 1 : -1; + err = dx - dy; + + while (1) + { + ssd1306_draw_pixel(x1, y1, color); + if (x1 == x2 && y1 == y2) + break; + e2 = err * 2; + if (e2 > -dy) + { + err -= dy; + x1 += sx; + } + if (e2 < dx) + { + err += dx; + y1 += sy; + } + } +} + +// 在 SSD1306 显示屏上绘制一个矩形 +void ssd1306_draw_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color) +{ + // 绘制矩形的四条边 + ssd1306_draw_line(x, y, x + w, y, color); // 上边 + ssd1306_draw_line(x, y + h, x + w, y + h, color); // 下边 + ssd1306_draw_line(x, y, x, y + h, color); // 左边 + ssd1306_draw_line(x + w, y, x + w, y + h, color); // 右边 +} + +// 在 SSD1306 显示屏上绘制一个填充矩形 +void ssd1306_fill_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color) +{ + for (uint8_t i = 0; i < h; i++) + { + ssd1306_draw_line(x, y + i, x + w, y + i, color); + } +} + +// 绘制进度条 +void ssd1306_draw_progress_bar(uint8_t progress) +{ + uint8_t offset_y = 10; + char progress_text[5]; // 用于存储百分比文本 + // 绘制边框 + ssd1306_draw_rect_angle(10, 24 + offset_y, 108, 10, SSD1306_WHITE); + + // 绘制进度条 + ssd1306_fill_rect_angle(12, 26 + offset_y, 4 + progress, 7, SSD1306_WHITE); + + // 显示百分比文本 + snprintf(progress_text, sizeof(progress_text), "%3d%%", progress); + ssd1306_f8x16_string(SSD1306_WIDTH * 0.35, 2, (const uint8_t *)progress_text); + + // 更新显示 + ssd1306_update_screen(); +} + +// 在中间显示文字 +void ssd1306_draw_text_center(uint8_t y, const char *text) +{ + uint8_t x = (SSD1306_WIDTH - strlen(text) * 6) / 2; + ssd1306_f6x8_string(x, y, (const uint8_t *)text); + + // 更新显示 + ssd1306_update_screen(); +} diff --git a/User/system/driver/ssd1306_oled.h b/User/system/driver/ssd1306_oled.h new file mode 100644 index 0000000..32a3304 --- /dev/null +++ b/User/system/driver/ssd1306_oled.h @@ -0,0 +1,80 @@ +#ifndef __SSD1306_OLED_H +#define __SSD1306_OLED_H + +#include "main.h" + +// OLED引脚定义 +#define SSD1306_SDA_PORT OLED_SDA_GPIO_Port +#define SSD1306_SDA_PIN OLED_SDA_Pin +#define SSD1306_SCK_PORT OLDE_SCK_GPIO_Port +#define SSD1306_SCK_PIN OLDE_SCK_Pin + +// I2C地址 +#define SSD1306_I2C_ADDRESS 0x78 +// OLED显示参数 +#define SSD1306_WIDTH 128 +#define SSD1306_HEIGHT 64 +// OLED颜色 +#define SSD1306_WHITE 1 +#define SSD1306_BLACK 0 + +// OLED命令定义 +#define SSD1306_CMD_DISPLAY_OFF 0xAE +#define SSD1306_CMD_DISPLAY_ON 0xAF +#define SSD1306_CMD_SET_CONTRAST 0x81 +#define SSD1306_CMD_DISPLAY_ALL_ON_RESUME 0xA4 +#define SSD1306_CMD_DISPLAY_ALL_ON 0xA5 +#define SSD1306_CMD_NORMAL_DISPLAY 0xA6 +#define SSD1306_CMD_INVERT_DISPLAY 0xA7 +#define SSD1306_CMD_SET_DISPLAY_OFFSET 0xD3 +#define SSD1306_CMD_SET_COM_PINS 0xDA +#define SSD1306_CMD_SET_VCOM_DETECT 0xDB +#define SSD1306_CMD_SET_DISPLAY_CLOCK_DIV 0xD5 +#define SSD1306_CMD_SET_PRECHARGE 0xD9 +#define SSD1306_CMD_SET_MULTIPLEX 0xA8 +#define SSD1306_CMD_SET_LOW_COLUMN 0x00 +#define SSD1306_CMD_SET_HIGH_COLUMN 0x10 +#define SSD1306_CMD_SET_START_LINE 0x40 +#define SSD1306_CMD_MEMORY_MODE 0x20 +#define SSD1306_CMD_COLUMN_ADDR 0x21 +#define SSD1306_CMD_PAGE_ADDR 0x22 +#define SSD1306_CMD_COM_SCAN_INC 0xC0 +#define SSD1306_CMD_COM_SCAN_DEC 0xC8 +#define SSD1306_CMD_SEG_REMAP 0xA0 +#define SSD1306_CMD_CHARGE_PUMP 0x8D +#define SSD1306_CMD_SET_DC_DC_ENABLE 0x14 + +#define SDA_OUT() \ + { \ + GPIO_SET_OUTPUT(SSD1306_SDA_PORT, SSD1306_SDA_PIN); \ + } + +#define SDA_IN() \ + { \ + GPIO_SET_INPUT(SSD1306_SDA_PORT, SSD1306_SDA_PIN); \ + } + +// 函数声明 +void ssd1306_init(void); +void ssd1306_logo(void); +void ssd1306_display_on(void); +void ssd1306_display_off(void); +void ssd1306_update_screen(void); + +void ssd1306_fill(uint8_t color); +void ssd1306_clear(void); +void ssd1306_clear_buffer(void); +void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const uint8_t *bmp); +void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch); +void ssd1306_f6x8_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num); +void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num); +void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch); +void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num); + +void ssd1306_draw_text_center(uint8_t y, const char *text); +void ssd1306_draw_progress_bar(uint8_t progress); +void ssd1306_fill_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color); +void ssd1306_draw_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color); +void ssd1306_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color); +void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color); +#endif // __SSD1306_OLED_H diff --git a/User/system/driver/tmc2240.c b/User/system/driver/tmc2240.c new file mode 100644 index 0000000..5221d18 --- /dev/null +++ b/User/system/driver/tmc2240.c @@ -0,0 +1,368 @@ +#include "tmc2240.h" + +tmc2240_t _tmc2240[TMC2240_MAX]; + +static void tmc2240_write(tmc2240_index_e index, uint8_t *data) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + DBG_ASSERT(tmc->spi != NULL __DBG_LINE); + + tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs); + for (uint16_t i = 0; i < 5; i++) + { + tmc->spi->interface.u.normal.spi_send(tmc->spi, data[i]); + } + tmc->spi->gpios.cs->set(*tmc->spi->gpios.cs); +} + +static void tmc2240_read(tmc2240_index_e index, uint8_t *wdata, uint8_t *rdata) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + DBG_ASSERT(tmc->spi != NULL __DBG_LINE); + + tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs); + for (uint16_t i = 0; i < 5; i++) + { + rdata[i] = tmc->spi->interface.u.normal.spi_send(tmc->spi, wdata[i]); + } + tmc->spi->gpios.cs->set(*tmc->spi->gpios.cs); + + __NOP(); + __NOP(); + __NOP(); + + tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs); + for (uint16_t i = 0; i < 5; i++) + { + rdata[i] = tmc->spi->interface.u.normal.spi_send(tmc->spi, wdata[i]); + } + tmc->spi->gpios.cs->set(*tmc->spi->gpios.cs); +} + +static void tmc2240_reg_write(tmc2240_index_e index, uint8_t reg, uint32_t data) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + DBG_ASSERT(tmc->spi != NULL __DBG_LINE); + + uint8_t wdata[5] = {0}; + wdata[0] = TMC2240_HIGHT_BIT | reg; + wdata[1] = (data >> 24) & 0xFF; + wdata[2] = (data >> 16) & 0xFF; + wdata[3] = (data >> 8) & 0xFF; + wdata[4] = data & 0xFF; + tmc2240_write(index, wdata); +} + +static uint32_t tmc2240_reg_read(tmc2240_index_e index, uint8_t reg) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + DBG_ASSERT(tmc->spi != NULL __DBG_LINE); + + uint8_t wdata[5] = {0}; + uint8_t rdata[5] = {0}; + wdata[0] = reg; + tmc2240_read(index, wdata, rdata); + return (rdata[1] << 24) | (rdata[2] << 16) | (rdata[3] << 8) | rdata[4]; +} + +/** + * @brief 配置TMC2240步进电机驱动器 + * + * 该函数用于配置TMC2240步进电机驱动器的各种参数,包括步进电机的工作模式、加减速曲线等。 + * + * @param index TMC2240步进电机驱动器的索引,用于指定要配置的驱动器。 + */ +static void tmc2240_config_write(tmc2240_index_e index) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + tmc->config.gconf.data = 0x00000000; + + tmc->config.chopconf.data = 0x00410153; + tmc->config.chopconf.bits.mres = TMC2240_MRES_8; + + tmc->config.drvconf.data = 0x00000021; + tmc->config.global_scaler.data = 0x00000000; + + tmc->config.ihold_irun.bits.ihold = 31; + tmc->config.ihold_irun.bits.irun = 31; + tmc->config.ihold_irun.bits.iholddelay = 0; + tmc->config.ihold_irun.bits.irundelay = 0; + + tmc->config.pwmconf.data = 0xC44C261E; + tmc->config.gstat.data = 0x00000007; + tmc2240_reg_write(index, TMC2240_GCONF, tmc->config.gconf.data); + tmc2240_reg_write(index, TMC2240_CHOPCONF, tmc->config.chopconf.data); + tmc2240_reg_write(index, TMC2240_DRV_CONF, tmc->config.drvconf.data); + tmc2240_reg_write(index, TMC2240_GLOBAL_SCALER, tmc->config.global_scaler.data); + tmc2240_reg_write(index, TMC2240_IHOLD_IRUN, tmc->config.ihold_irun.data); + tmc2240_reg_write(index, TMC2240_PWMCONF, tmc->config.pwmconf.data); + tmc2240_reg_write(index, TMC2240_GSTAT, tmc->config.gstat.data); +} + +static void _tmc2240_motor_update(tmc2240_index_e index) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + switch (tmc->config.chopconf.bits.mres) + { + case TMC2240_MRES_256: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 256; + break; + case TMC2240_MRES_128: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 128; + break; + case TMC2240_MRES_64: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 64; + break; + case TMC2240_MRES_32: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 32; + break; + case TMC2240_MRES_16: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 16; + break; + case TMC2240_MRES_8: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 8; + break; + case TMC2240_MRES_4: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 4; + break; + case TMC2240_MRES_2: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE / 2; + break; + case TMC2240_MRES_1: + tmc->motor.step_angle = MOTOR_42_STEP_ANGLE; + break; + default: + break; + } + + tmc->motor.circle_pulse = 360 / tmc->motor.step_angle; +} + +static void _tmc2240_enable(tmc2240_index_e index, BOOL enable) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + BOOL state = tmc->en->read(*tmc->en) == 0 ? TRUE : FALSE; + + if (state == enable) + { + return; + } + + if (enable == TRUE) + { + PWM_START(tmc->timer, tmc->time_ch); + tmc->en->reset(*tmc->en); + tmc2240_reg_write(index, TMC2240_CHOPCONF, tmc->config.chopconf.data); + } + else + { + PWM_STOP(tmc->timer, tmc->time_ch); + tmc->en->set(*tmc->en); + chopconf_u chopconf; + osel_memset((uint8_t *)&chopconf, 0, sizeof(chopconf_u)); + chopconf.bits.mres = TMC2240_MRES_1; + tmc2240_reg_write(index, TMC2240_CHOPCONF, chopconf.data); + } +} + +static void _tmc2240_direction(tmc2240_index_e index, tmc2240_direction_e dir) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + if (dir == TMC2240_FORWARD) + { + tmc->dir->reset(*tmc->dir); + } + else + { + tmc->dir->set(*tmc->dir); + } +} + +void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, TIM_TypeDef *timer, uint32_t time_ch, spi_gpio_group_t *gpios) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + osel_memset((uint8_t *)tmc, 0, sizeof(tmc2240_t)); + + tmc->timer = timer; + tmc->time_ch = time_ch; + tmc->spi = spi_create(SPI_TYPE_NORMAL, *gpios, 0); + DBG_ASSERT(tmc->spi != NULL __DBG_LINE); + tmc->spi->interface.hardware_enable(tmc->spi, SPIx); + { + tmc->default_tm.sysclk = SystemCoreClock / 1000; + tmc->default_tm.psc = PWM_GET_PSC(tmc->timer); + tmc->default_tm.arr = PWM_GET_ARR(tmc->timer); + tmc->default_tm.freq = PWM_GET_FREQ(tmc->timer); + } + tmc->params.percent = TMC2240_PWM_DUTY_DEFAULT; + tmc->params.arr = 0; + tmc->params.freq = 0; + tmc->params.enable = FALSE; + tmc->params.direction = TMC2240_FORWARD; + tmc2240_config_write(index); + _tmc2240_motor_update(index); +} + +tmc2240_t *tmc2240_get(tmc2240_index_e index) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + return &_tmc2240[index]; +} + +void tmc2240_percent(tmc2240_index_e index, float32 percent) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + PWM_SET_DUTY(tmc->timer, tmc->time_ch, ABS(percent)); +} + +void tmc2240_config_read(tmc2240_index_e index) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + tmc->read_config.gconf.data = tmc2240_reg_read(index, TMC2240_GCONF); + tmc->read_config.chopconf.data = tmc2240_reg_read(index, TMC2240_CHOPCONF); + tmc->read_config.drvconf.data = tmc2240_reg_read(index, TMC2240_DRV_CONF); + tmc->read_config.global_scaler.data = tmc2240_reg_read(index, TMC2240_GLOBAL_SCALER); + tmc->read_config.ihold_irun.data = tmc2240_reg_read(index, TMC2240_IHOLD_IRUN); + tmc->read_config.pwmconf.data = tmc2240_reg_read(index, TMC2240_PWMCONF); + tmc->read_config.gstat.data = tmc2240_reg_read(index, TMC2240_GSTAT); + tmc->data.tmc2240_adc_temp = tmc2240_reg_read(index, TMC2240_ADC_TEMP); + tmc->data.tmc2240_temperature = (float32)(tmc->data.tmc2240_adc_temp - 2038) / 7.7; +} + +void tmc2240_test(tmc2240_index_e index) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + _tmc2240_enable(index, tmc->params.enable); + + if (tmc->params.enable == TRUE) + { + _tmc2240_direction(index, tmc->params.direction); + + if (PWM_GET_ARR(tmc->timer) != tmc->params.arr) + { + if (tmc->params.arr == 0) + { + tmc->params.arr = tmc->default_tm.arr; + } + PWM_SET_ARR(tmc->timer, tmc->params.arr); + tmc->params.freq = PWM_GET_FREQ(tmc->timer); + } + + tmc2240_percent(index, tmc->params.percent); + + if (tmc->config.chopconf.bits.mres != tmc->read_config.chopconf.bits.mres) + { + tmc2240_reg_write(index, TMC2240_CHOPCONF, tmc->config.chopconf.data); + _tmc2240_motor_update(index); + } + } +} + +void tmc2240_motor_set_angle(tmc2240_index_e index, int32_t angle) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + if (angle == 0) + { + return; + } + + tmc->params.enable = FALSE; + _tmc2240_enable(index, tmc->params.enable); + tmc->motor.pulse_count = 0; + + if (angle > 0) + { + tmc->params.direction = TMC2240_FORWARD; + } + else + { + tmc->params.direction = TMC2240_BACKWARD; + } + + tmc->motor.pulse_count = ABS(angle) / tmc->motor.step_angle; + tmc->motor.step_angle_count = 0; + + tmc->params.enable = TRUE; + + _tmc2240_direction(index, tmc->params.direction); + if (PWM_GET_ARR(tmc->timer) != tmc->params.arr) + { + if (tmc->params.arr == 0) + { + tmc->params.arr = tmc->default_tm.arr; + } + PWM_SET_ARR(tmc->timer, tmc->params.arr); + tmc->params.freq = PWM_GET_FREQ(tmc->timer); + } + + tmc2240_percent(index, tmc->params.percent); + + if (tmc->config.chopconf.bits.mres != tmc->read_config.chopconf.bits.mres) + { + tmc2240_reg_write(index, TMC2240_CHOPCONF, tmc->config.chopconf.data); + _tmc2240_motor_update(index); + } + _tmc2240_enable(index, tmc->params.enable); +} + +void tmc2240_motor_update(tmc2240_index_e index) +{ + DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); + tmc2240_t *tmc = &_tmc2240[index]; + DBG_ASSERT(tmc != NULL __DBG_LINE); + + if (tmc->motor.pulse_count > 0) + { + tmc->motor.pulse_count--; // 脉冲数 + tmc->motor.step_angle_count++; // 步距个数 + if (tmc->params.direction == TMC2240_FORWARD) + { + tmc->motor.add_pulse_count++; /* 绝对位置++ */ + } + else + { + tmc->motor.add_pulse_count--; /* 绝对位置-- */ + } + } + + /* 当脉冲数等于0的时候 代表需要发送的脉冲个数已完成,停止输出 */ + + if (tmc->motor.pulse_count <= 0) + { + tmc->params.enable = FALSE; + _tmc2240_enable(index, tmc->params.enable); + } +} diff --git a/User/system/driver/tmc2240.h b/User/system/driver/tmc2240.h new file mode 100644 index 0000000..1f5379d --- /dev/null +++ b/User/system/driver/tmc2240.h @@ -0,0 +1,372 @@ +/** + * @file tmc2240.h + * @author xushenghao + * @brief TMC2240驱动头文件 + * @version 0.1 + * @note + * 1. 芯片VM需要供电,否则SPI无法正常通信 + * 2. 42步进电机每步1.8度,1圈200步。1/8细分,1步=0.225度,电机转一周需要1600个脉冲 + */ + +#ifndef __TMC2240_H +#define __TMC2240_H +#include "main.h" +#include "spis.h" + +#define MOTOR_42_STEP_ANGLE 1.8f // 42步进电机每步1.8度 +#define TMC2240_PWM_DUTY_DEFAULT 50 // PWM默认占空比 + +/* +0x00 = 0x00002108 ;; writing GCONF @ address 0=0x00 with 0x00002108=8456=0.0 +0x03 = 0x00000000 ;; writing SLAVECONF @ address 1=0x03 with 0x00000000=0=0.0 +0x04 = 0x4001682C ;; writing IOIN @ address 2=0x04 with 0x4001682C=1073834028=0.0 +0x0A = 0x00000021 ;; writing DRV_CONF @ address 3=0x0A with 0x00000021=33=0.0 +0x0B = 0x00000000 ;; writing GLOBAL_SCALER @ address 4=0x0B with 0x00000000=0=0.0 +0x10 = 0x00001208 ;; writing IHOLD_IRUN @ address 5=0x10 with 0x00001208=4616=0.0 +0x11 = 0x00000000 ;; writing TPOWERDOWN @ address 6=0x11 with 0x00000000=0=0.0 +0x13 = 0x00000000 ;; writing TPWMTHRS @ address 7=0x13 with 0x00000000=0=0.0 +0x14 = 0x000003BE ;; writing TCOOLTHRS @ address 8=0x14 with 0x000003BE=958=0.0 +0x15 = 0x00000000 ;; writing THIGH @ address 9=0x15 with 0x00000000=0=0.0 +0x2D = 0x00000000 ;; writing DIRECT_MODE @ address 10=0x2D with 0x00000000=0=0.0 +0x38 = 0x00000000 ;; writing ENCMODE @ address 11=0x38 with 0x00000000=0=0.0 +0x39 = 0x00000000 ;; writing X_ENC @ address 12=0x39 with 0x00000000=0=0.0 +0x3A = 0x00010000 ;; writing ENC_CONST @ address 13=0x3A with 0x00010000=65536=0.0 +0x52 = 0x0B920F25 ;; writing OTW_OV_VTH @ address 14=0x52 with 0x0B920F25=194121509=0.0 +0x60 = 0xAAAAB554 ;; writing MSLUT[0] @ address 15=0x60 with 0xAAAAB554=0=0.0 +0x61 = 0x4A9554AA ;; writing MSLUT[1] @ address 16=0x61 with 0x4A9554AA=1251300522=0.0 +0x62 = 0x24492929 ;; writing MSLUT[2] @ address 17=0x62 with 0x24492929=608774441=0.0 +0x63 = 0x10104222 ;; writing MSLUT[3] @ address 18=0x63 with 0x10104222=269500962=0.0 +0x64 = 0xFBFFFFFF ;; writing MSLUT[4] @ address 19=0x64 with 0xFBFFFFFF=0=0.0 +0x65 = 0xB5BB777D ;; writing MSLUT[5] @ address 20=0x65 with 0xB5BB777D=0=0.0 +0x66 = 0x49295556 ;; writing MSLUT[6] @ address 21=0x66 with 0x49295556=1227445590=0.0 +0x67 = 0x00404222 ;; writing MSLUT[7] @ address 22=0x67 with 0x00404222=4211234=0.0 +0x68 = 0xFFFF8056 ;; writing MSLUTSEL @ address 23=0x68 with 0xFFFF8056=0=0.0 +0x69 = 0x00F70000 ;; writing MSLUTSTART @ address 24=0x69 with 0x00F70000=16187392=0.0 +0x6C = 0x00410153 ;; writing CHOPCONF @ address 25=0x6C with 0x00410153=4260179=0.0 +0x6D = 0x00040000 ;; writing COOLCONF @ address 26=0x6D with 0x00040000=262144=0.0 +0x70 = 0xC44C001E ;; writing PWMCONF @ address 27=0x70 with 0xC44C001E=0=0.0 +0x74 = 0x00000000 ;; writing SG4_THRS @ address 28=0x74 with 0x00000000=0=0.0 +*/ + +#define TMC2240_GCONF 0x00 +#define TMC2240_GSTAT 0x01 +#define TMC2240_IFCNT 0x02 +#define TMC2240_SLAVECONF 0x03 +#define TMC2240_IOIN 0x04 +#define TMC2240_DRV_CONF 0x0A +#define TMC2240_GLOBAL_SCALER 0x0B + +#define TMC2240_IHOLD_IRUN 0x10 +#define TMC2240_TPOWERDOWN 0x11 +#define TMC2240_TSTEP 0x12 +#define TMC2240_TPWMTHRS 0x13 +#define TMC2240_TCOOLTHRS 0x14 +#define TMC2240_THIGH 0x15 + +#define TMC2240_DIRECT_MODE 0x2D + +#define TMC2240_ENCMODE 0x38 +#define TMC2240_XENC 0x39 +#define TMC2240_ENC_CONST 0x3A +#define TMC2240_ENC_STATUS 0x3B +#define TMC2240_ENC_LATCH 0x3C + +#define TMC2240_ADC_VSUPPLY_AIN 0x50 +#define TMC2240_ADC_TEMP 0x51 +#define TMC2240_OTW_OV_VTH 0x52 + +#define TMC2240_MSLUT0 0x60 +#define TMC2240_MSLUT1 0x61 +#define TMC2240_MSLUT2 0x62 +#define TMC2240_MSLUT3 0x63 +#define TMC2240_MSLUT4 0x64 +#define TMC2240_MSLUT5 0x65 +#define TMC2240_MSLUT6 0x66 +#define TMC2240_MSLUT7 0x67 +#define TMC2240_MSLUTSEL 0x68 +#define TMC2240_MSLUTSTART 0x69 +#define TMC2240_MSCNT 0x6A +#define TMC2240_MSCURACT 0x6B +#define TMC2240_CHOPCONF 0x6C +#define TMC2240_COOLCONF 0x6D +#define TMC2240_DCCTRL 0x6E +#define TMC2240_DRVSTATUS 0x6F + +#define TMC2240_PWMCONF 0x70 +#define TMC2240_PWMSCALE 0x71 +#define TMC2240_PWM_AUTO 0x72 +#define TMC2240_SG4_THRS 0x74 +#define TMC2240_SG4_RESULT 0x75 +#define TMC2240_SG4_IND 0x76 + +#define TMC2240_HIGHT_BIT 0x80 + +typedef enum +{ + TMC2240_1, + TMC2240_MAX, +} tmc2240_index_e; + +typedef enum +{ + TMC2240_FORWARD, // 正转 + TMC2240_BACKWARD, // 反转 +} tmc2240_direction_e; + +typedef enum +{ + TMC2240_MRES_256, + TMC2240_MRES_128, + TMC2240_MRES_64, + TMC2240_MRES_32, + TMC2240_MRES_16, + TMC2240_MRES_8, + TMC2240_MRES_4, + TMC2240_MRES_2, + TMC2240_MRES_1, // FULL STEP +} tmc2240_mres_e; + +// 0x00 GCONF +typedef union +{ + uint32_t data; + struct + { + + uint32_t reserved1 : 1; + /** + * 停止之前的步骤执行超时检测。 + * 0x0:正常时间:2^20个时钟 + * 0x1:短时间:2^18个时钟 + */ + uint32_t fast_standstill : 1; + /** + * 启用StealthChop2模式。 + * 0x0:无StealthChop2 + * 0x1:StealthChop2电压PWM模式使能(取决于速度阈值)。从关闭状态切换 + 在静止状态下和在lHOLD = 时为开状态 仅限额定电流。 + */ + uint32_t en_pwm_mode : 1; + /** + * 启用StealthChop2的步进输入筛选 + * 0x0:无StealthChop2 + * 0x1:StealthChop2电压PWM模式使能 + (取决于速度阈值)。从关闭状态切换 + 在静止状态下和在lHOLD=时为开状态 + 仅限额定电流。 + */ + uint32_t multistep_filt : 1; + /** + * 更改电机方向/方向标志 + * 0x0:默认电机方向 + * 0x1:电机方向相反 + */ + uint32_t shaft : 1; + uint32_t diag0_error : 1; + uint32_t diag0_otpw : 1; + uint32_t diag0_stall : 1; + uint32_t diag1_stall : 1; + uint32_t diag1_index : 1; + uint32_t diag1_onstate : 1; + uint32_t reserved2 : 1; + uint32_t diag0_pushpull : 1; + uint32_t diag1_pushpull : 1; + uint32_t small_hysteresis : 1; + /** + * 电机硬停止功能启用。 + * 0x0:正常运行 + * 0x1:紧急停止:ENCA停止定序器 + 当绑得很高时(不执行任何步骤 + 定序器、电机进入停顿状态)。 + */ + uint32_t stop_enable : 1; + /** + * 通过以下方式启用直接motpr相电流控制 + * 0x0:正常运行 + * 0x1:电机线圈电流和极性直接 + 通过串口编程:寄存器 + 直接模式(0x2D)指定带符号线圈A + 电流(位8..0)和线圈B电流(位24..16)。在……里面 + 在此模式下,电流按lHOLD设置进行定标。 + 基于速度的StealthChop2电流调节 + 在此模式下不可用。自动的 + StealthChop2电流调节仅适用于 + 步进电机速度低。 + */ + uint32_t direct_mode : 1; + } bits; +} gconf_u; + +// 0x01 GSTAT +typedef union +{ + uint32_t data; + struct + { + uint32_t reset : 1; + uint32_t drv_err : 1; + uint32_t uv_cp : 1; + uint32_t register_reset : 1; + uint32_t vm_uvlo : 1; + } bits; +} gstat_u; + +// 0x0A DRVCONF +typedef union +{ + uint32_t data; + struct + { + uint32_t current_range : 2; // 0-1 + uint32_t reserved1 : 2; // 2-3 + uint32_t slope_control : 2; // 4-5 + } bits; +} drvconf_u; + +// 0x0B GLOBAL_SCALER +typedef union +{ + uint32_t data; + struct + { + uint32_t global_scale : 8; // 0-7 + } bits; +} global_scaler_u; + +// 0x10 IHOLD_IRUN +typedef union +{ + uint32_t data; + struct + { + uint32_t ihold : 5; // 0-4 + uint32_t reserved1 : 3; // 5-7 + uint32_t irun : 5; // 8-12 + uint32_t reserved2 : 3; // 13-15 + uint32_t iholddelay : 4; // 16-19 + uint32_t reserved3 : 4; // 20-23 + uint32_t irundelay : 4; // 24-27 + } bits; +} ihold_irun_u; + +// 0x6C CHOPCONF +typedef union +{ + uint32_t data; + struct + { + uint32_t toff : 4; // 0-3 + uint32_t hstrt : 3; // 4-6 + uint32_t hend : 4; // 7-10 + uint32_t fd3 : 1; // 11 + uint32_t disfdcc : 1; // 12 + uint32_t reserved1 : 1; + uint32_t chm : 1; // 14 + uint32_t tbl : 2; // 15-16 + uint32_t reserved2 : 1; + uint32_t vhighfs : 1; // 18 + uint32_t vhighchm : 1; // 19 + uint32_t tpfd : 4; // 20-23 + uint32_t mres : 4; // 24-27 + uint32_t intpol : 1; // 28 + uint32_t dedge : 1; // 29 + uint32_t diss2g : 1; // 30 + uint32_t diss2vs : 1; // 31 + } bits; +} chopconf_u; + +// 0x70 PWMCONF +typedef union +{ + uint32_t data; + struct + { + /** + * 用户定义的 PWM 幅度偏移(0-255)与静止状态下的全电机电流(CS_ACTUAL=31)相关。 (重置默认值=30) 使用 PWM_OFS 作为自动缩放的初始值, + * 以加快自动调谐过程。为此,请将 PWM_OFS 设置为确定的、特定于应用的值,并将 pwm_autoscale 设置为 0。之后,将 pwm_autoscale 设置为 1。 + * 完成后启用 StealthChop2。 PWM_OFS = 0 将禁用将电机电流缩放到低于电机特定的较低测量阈值。此设置应仅在某些条件下使用, + * 例如当电源电压可以上下变化两倍或更多时。它可以防止电机超出调节范围,但也会防止电流降到调节限制以下。 PWM_OFS > 0 允许自动缩放到低 PWM 占空比, + * 甚至低于较低的调节阈值。这允许基于实际(保持)电流比例(寄存器 IHOLD_IRUN)的低(静止)电流设置。 + */ + uint32_t pwm_ofs : 8; + /** + * PWM 幅度的速度依赖梯度: PWM_GRAD x 256 / TSTEP 此值加到 PWM_OFS 以补偿速度依赖的电机反电动势。 使用 PWM_GRAD 作为自动缩放的初始值, + * 以加快自动调谐过程。为此,请将 PWM_GRAD 设置为确定的、特定于应用的值,并将 pwm_autoscale 设置为 0。之后,将 pwm_autoscale 设置为 1。 + * 完成后启用 StealthChop2。 提示: 初始调谐后,可以从 PWM_GRAD_AUTO 中读取所需的初始值。 + */ + uint32_t pwm_grad : 8; + uint32_t pwm_freq : 2; + uint32_t pwm_autoscale : 1; + uint32_t pwm_autograd : 1; + } bits; +} pwmconf_u; + +typedef struct +{ + gconf_u gconf; // 0x00 GCONF + gstat_u gstat; // 0x01 GSTAT + drvconf_u drvconf; // 0x0A DRVCONF + global_scaler_u global_scaler; // 0x0B GLOBAL_SCALER + ihold_irun_u ihold_irun; // 0x10 IHOLD_IRUN + chopconf_u chopconf; // 0x6C CHOPCONF + pwmconf_u pwmconf; // 0x70 PWMCONF +} tmc2240_config_t; + +typedef struct +{ + gpio_t *en; ///< EN_PIN + gpio_t *dir; ///< DIR_PIN + TIM_TypeDef *timer; + uint32_t time_ch; + spi_t *spi; + + tmc2240_config_t config; + tmc2240_config_t read_config; + + uint32_t step; + __IO uint32_t step_count; + + // PRIVATE + struct + { + uint32_t sysclk; // 系统时钟 + uint32_t psc; // 预分频系数 + uint16_t arr; // 自动重装值 auto reload value + uint32_t freq; // 频率 + } default_tm; + struct + { + BOOL enable; // 使能 + tmc2240_direction_e direction; // 方向 + float32 percent; // 占空比 + uint16_t arr; // 自动重装值(改变速度) + uint32_t freq; // 频率 + } params; + + struct + { + float32 step_angle; // 步进角度 + uint16_t circle_pulse; // 一圈脉冲数 + + __IO int32_t add_pulse_count; /* 脉冲个数累计 */ + __IO uint32_t pulse_count; /* 脉冲个数记录 */ + __IO uint32_t step_angle_count; /* 步距个数 */ + } motor; + + struct + { + uint16_t tmc2240_adc_temp; // 温度ADC值 + float32 tmc2240_temperature; // 温度 + } data; + +} tmc2240_t; + +void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, TIM_TypeDef *timer, uint32_t time_ch, spi_gpio_group_t *gpios); +tmc2240_t *tmc2240_get(tmc2240_index_e index); + +void tmc2240_motor_set_angle(tmc2240_index_e index, int32_t angle); +void tmc2240_motor_update(tmc2240_index_e index); + +void tmc2240_test(tmc2240_index_e index); +void tmc2240_config_read(tmc2240_index_e index); +#endif // __TMC2240_H diff --git a/User/system/lib/bootload/bootload.c b/User/system/lib/bootload/bootload.c new file mode 100644 index 0000000..6dacd43 --- /dev/null +++ b/User/system/lib/bootload/bootload.c @@ -0,0 +1,229 @@ +#include "bootload.h" +#include "ymodem.h" +#include "sys.h" +#include "delay.h" +#include "cmac.h" +#define AES_CMAC_DIGEST_LENGTH 16 +typedef void (*fnc_ptr)(void); // 用于跳转到应用程序的函数指针 +static bootload_transmit_callback transmit_callback = NULL; +static bootload_end_callback end_callback = NULL; +uint8_t upgrade_key[] = + { + 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C}; // 密钥 + +static AES_CMAC_CTX upgrade_ctx; /**< AES CMAC context for upgrade process */ +static uint8_t pre_upgrade_mic[AES_CMAC_DIGEST_LENGTH]; /**< MIC (Message Integrity Code) before upgrade */ +static uint8_t upgrade_mic[AES_CMAC_DIGEST_LENGTH]; /**< MIC (Message Integrity Code) after upgrade */ +static uint32_t flashdestination = BOOTLOAD_APP_BACKUP_ADDR_START; /**< Flash destination address for bootloading */ +static uint32_t upgrade_size = 0; /**< Size of the upgrade */ +static uint8_t read_cache[LL_FLASH_PAGE_SIZE]; /**< Read cache for flash pages */ +static uint8_t data_src_from; /**< Data source for bootloading */ + +/** + * @brief Perform bootload inspection. + * + * This function calls the `rym_process()` function to perform bootload inspection. + */ +void bootload_inspection(void) +{ + rym_process(); +} + +/** + * @brief Checks if the bootload timeout has occurred. + * + * This function calls the `rym_timeout()` function to determine if the bootload timeout has occurred. + * + * @return TRUE if the bootload timeout has occurred, FALSE otherwise. + */ +BOOL bootload_timeout(void) +{ + return rym_timeout(); +} + +/** + * @brief Handles the beginning of the bootloading process. + * + * This function is responsible for handling the initial steps of the bootloading process. + * It checks if the length of the data to be bootloaded is greater than the end address of the application area. + * If the length is greater, it returns an error code indicating that the bootloading cannot proceed. + * Otherwise, it sets the flash destination address to the start address of the backup area, + * erases the bank of the flash memory where the application is stored, + * and initializes the AES-CMAC context for the upgrade process. + * + * @param p Pointer to the data to be bootloaded. + * @param len Length of the data to be bootloaded. + * @return Error code indicating the result of the operation. + * - RYM_CODE_CAN: If the length of the data is greater than the end address of the application area. + * - RYM_CODE_NONE: If the operation is successful. + */ +static rym_code_e on_begin(uint8_t *p, uint32_t len) +{ + if (len > BOOTLOAD_APP_END_ADDRESS) + { + return RYM_CODE_CAN; + } + + flashdestination = BOOTLOAD_APP_BACKUP_ADDR_START; + LL_FLASH_Unlock(FLASH); + LL_FLASH_EraseBank(LL_FLASH_BANK2); + LL_FLASH_Lock(FLASH); + + AES_CMAC_Init(&upgrade_ctx); + AES_CMAC_SetKey(&upgrade_ctx, upgrade_key); + return RYM_CODE_NONE; +} + +/** + * @brief Handles the received data and programs it into the flash memory. + * + * This function unlocks the flash memory, programs the received data into the specified flash destination, + * locks the flash memory again, updates the AES-CMAC context with the received data, and increments the flash destination. + * + * @param p Pointer to the data buffer. + * @param len Length of the data buffer. + * @return The result code indicating the success or failure of the operation. + */ +static rym_code_e on_data(uint8_t *p, uint32_t len) +{ + LL_FLASH_Unlock(FLASH); + LL_FLASH_Program(flashdestination, p, len); + LL_FLASH_Lock(FLASH); + AES_CMAC_Update(&upgrade_ctx, p, len); + flashdestination += len; + return RYM_CODE_NONE; +} + +/** + * @brief Calculate the MIC (Message Integrity Code) for the firmware upgrade. + * + * This function calculates the MIC using AES-CMAC algorithm for the firmware upgrade data. + * It reads the firmware data from flash memory in pages and updates the MIC calculation. + * Finally, it compares the calculated MIC with the pre-upgrade MIC to determine the success of the upgrade. + * + * @param p Pointer to the firmware data. + * @param len Length of the firmware data. + * @return The result code indicating the success or failure of the upgrade process. + */ +static rym_code_e on_end(uint8_t *p, uint32_t len) +{ + AES_CMAC_Final(pre_upgrade_mic, &upgrade_ctx); + upgrade_size = flashdestination - BOOTLOAD_APP_BACKUP_ADDR_START; + + AES_CMAC_Init(&upgrade_ctx); + AES_CMAC_SetKey(&upgrade_ctx, upgrade_key); + uint32_t start = BOOTLOAD_APP_BACKUP_ADDR_START; + uint16_t num = (upgrade_size / LL_FLASH_PAGE_SIZE); + uint16_t remain = (upgrade_size % LL_FLASH_PAGE_SIZE); + + // STM32L476RG的flash页大小为2K,先读取整数页,再读取余数 + for (uint16_t i = 0; i < num; i++) + { + LL_FLASH_Read((start + i * (LL_FLASH_PAGE_SIZE)), read_cache, LL_FLASH_PAGE_SIZE); + AES_CMAC_Update(&upgrade_ctx, read_cache, LL_FLASH_PAGE_SIZE); + } + + if (remain) + { + osel_memset(read_cache, 0, LL_FLASH_PAGE_SIZE); + LL_FLASH_Read((start + num * (LL_FLASH_PAGE_SIZE)), read_cache, remain); + AES_CMAC_Update(&upgrade_ctx, read_cache, remain); + } + + AES_CMAC_Final(upgrade_mic, &upgrade_ctx); + + // 比较mic,相同可以写入标志位告知应用程序升级成功 + if (osel_memcmp(upgrade_mic, pre_upgrade_mic, AES_CMAC_DIGEST_LENGTH) == 0) + { + end_callback(TRUE); + } + else + { + end_callback(FALSE); + } + return RYM_CODE_NONE; +} + +/** + * @brief Handles the transmission of data. + * + * This function calls the transmit_callback function to transmit the data from the specified source. + * + * @param p Pointer to the data buffer. + * @param len Length of the data buffer. + * @return The return code indicating the status of the transmission. + */ +static rym_code_e on_transmit(uint8_t *p, uint32_t len) +{ + transmit_callback(data_src_from, p, (uint16_t)len); + return RYM_CODE_NONE; +} + +/** + * @brief Initializes the bootload module. + * + * This function initializes the bootload module by setting the transmit callback + * and configuring the RYM module. It asserts if the initialization fails. + * + * @param transmit The transmit callback function. + */ +void bootload_init(bootload_transmit_callback transmit, bootload_end_callback end) +{ + BOOL res = FALSE; + + transmit_callback = transmit; + end_callback = end; + + res = rym_init(); + DBG_ASSERT(res == TRUE __DBG_LINE); + + res = rym_config(on_begin, on_data, on_end, on_transmit, BOOTLOAD_TIMEOUT); + DBG_ASSERT(res == TRUE __DBG_LINE); +} + +/** + * @brief Sets the data source index for bootload transmission. + * + * This function sets the data source index for bootload transmission. The data source index + * determines the starting point from which the data will be transmitted. + * + * @param to_index The index of the data source. + */ +void bootload_transmit_from(const uint8_t to_index) +{ + data_src_from = to_index; +} + +/** + * @brief Jump to the specified address and execute the bootloader. + * + * @param address The entry address of the bootloader. + */ +void bootload_jump(uint32_t address) +{ + // Get the entry address of the application program + fnc_ptr jump_to_bootload; + jump_to_bootload = (fnc_ptr)(*(__IO uint32_t *)(address + 4)); + + // Disable RCC + RCC->APB1ENR1 = 0; + RCC->APB1ENR2 = 0; + RCC->APB2ENR = 0; + RCC->AHB1ENR = 0; + RCC->AHB2ENR = 0; + RCC->AHB3ENR = 0; + + // Disable SysTick + SysTick->CTRL = 0; + // 清空SysTick + SysTick->LOAD = 0; + // 清空SysTick + SysTick->VAL = 0; + // 设置向量表偏移地址 + SCB->VTOR = address; + // 设置堆栈指针 + sys_msr_msp(*(__IO uint32_t *)address); + // 跳转 + jump_to_bootload(); +} diff --git a/User/system/lib/bootload/bootload.h b/User/system/lib/bootload/bootload.h new file mode 100644 index 0000000..e42c506 --- /dev/null +++ b/User/system/lib/bootload/bootload.h @@ -0,0 +1,102 @@ +#ifndef __BOOTLOAD_H +#define __BOOTLOAD_H +#include "lib.h" +#include "flash.h" +#include "flow.h" + +#define BOOTLOAD_SET_FLAG 0xbb01 +#define BOOTLOAD_UNSET_FLAG 0xbb02 +/** + * @brief Defines the start address of the application in flash memory. + */ +#define BOOTLOAD_APP_START_ADDRESS ((uint32_t)0x08000000u) + +/** + * @brief Defines the end address of the application in flash memory. + */ +#define BOOTLOAD_APP_END_ADDRESS (BOOTLOAD_APP_START_ADDRESS + 220 * LL_FLASH_PAGE_SIZE) // 220*2048 = 450560 + +/** + * @brief Defines the start address of the bootloader in flash memory. + */ +#define BOOTLOAD_START_ADDRESS BOOTLOAD_APP_END_ADDRESS + +/** + * @brief Defines the start address of the backup area for the application in flash memory. + */ +#define BOOTLOAD_APP_BACKUP_ADDR_START (BOOTLOAD_APP_START_ADDRESS + 256 * LL_FLASH_PAGE_SIZE) + +/** + * @brief Defines the timeout for the bootloading process. + * + * This macro defines the timeout for the bootloading process, in seconds. The default value is 10 seconds. + */ +#define BOOTLOAD_TIMEOUT 10 + +/** + * @brief A function pointer type for a bootload transmit callback function. + * + * This function pointer type is used for a bootload transmit callback function, which is + * called when data needs to be transmitted to the bootloader. The function is passed the + * source of the data (the index of the data packet), a pointer to the data buffer, and the + * length of the data buffer. + * + * @param data_src The index of the data packet that is being transmitted. + * @param buf A pointer to the data buffer. + * @param len The length of the data buffer. + */ +typedef void (*bootload_transmit_callback)(const uint8_t data_src, const uint8_t *buf, const uint16_t len); + +/** + * @brief A function pointer type for a bootload end callback function. + * + * This function pointer type is used for a bootload end callback function, which is called + * when the bootloading process is complete. The function takes no parameters and returns no + * value. + */ +typedef void (*bootload_end_callback)(BOOL); + +/** + * @brief initializes the bootloader + * + * This function initializes the bootloader, including setting up the communication + * with the host and configuring the flash memory for bootloading. + * + * @param transmit a pointer to the function that will be called to transmit data to the host + */ +void bootload_init(bootload_transmit_callback transmit, bootload_end_callback end); + +/** + * @brief Transmits data from the specified index. + * + * This function transmits data from the specified index to the bootloader. + * + * @param to_index The index from which the data should be transmitted. + */ +void bootload_transmit_from(const uint8_t to_index); + +/** + * @brief Jumps to the specified address. + * + * This function jumps to the specified address, which is typically the start address of the bootloader. + * + * @param address The address to jump to. + */ +void bootload_jump(uint32_t address); + +/** + * @brief Performs inspection of the bootloader. + * + * This function performs inspection of the bootloader, such as checking the version or integrity of the bootloader. + */ +void bootload_inspection(void); + +/** + * @brief Checks if a timeout has occurred. + * + * This function checks if a timeout has occurred during the bootloading process. + * + * @return TRUE if a timeout has occurred, FALSE otherwise. + */ +BOOL bootload_timeout(void); +#endif // __BOOTLOAD_H diff --git a/User/system/lib/bootload/readme.md b/User/system/lib/bootload/readme.md new file mode 100644 index 0000000..d0231d7 --- /dev/null +++ b/User/system/lib/bootload/readme.md @@ -0,0 +1,50 @@ + +# BOOTLOADER介绍 + + +STM32的BOOTLOADER是在芯片复位或从停机模式唤醒时执行的一段小程序,它负责将用户代码加载到内存中并启动它。STM32F1、F4、H7等不同系列的MCU可能会有不同的BOOTLOADER程序。 + +BOOTLOADER通常用于以下几种情况: + +1. 在应用程序无法正常启动时,提供一个后备启动方式。 +2. 在系统需要进行固件更新时,可以先通过BOOTLOADER加载新的用户代码。 +3. 用于在线调试或调试无法通过JTAG/SWD接口访问时,可以通过BOOTLOADER加载调试工具。 + +BOOTLOADER的设计和实现通常依赖于芯片的内部结构和特性,以及用户代码存储的介质(如内部FLASH,外部SPI FLASH等)。 + +一个简单的BOOTLOADER示例可能包括以下步骤: + +1. 复位后,芯片开始执行内部的BOOTLOADER程序。 +2. 通过某种通信接口(如USART,I2C,SPI)接收新的用户程序代码。 +3. 将接收到的代码写入用户代码存储区(如内部FLASH)。 +4. 设置启动引脚或者配置BOOT引导模式寄存器,选择启动用户代码。 +5. 重启芯片,这次不再执行BOOTLOADER,而是加载并运行新的用户程序代码。 + +注意:实际的BOOTLOADER实现可能会更加复杂,包括错误检查和处理、加密解密、固件完整性校验等安全措施。 + +# bootload.c 文件说明 + +`bootload.c`是一个实现引导加载程序(bootloader)功能的源代码文件。引导加载程序是一段在系统启动时运行的代码,负责初始化硬件设备、建立内存空间映射图,然后加载操作系统内核并将控制权转交给它。 + +以下是 `bootload.c`文件中可能包含的主要函数和其功能: + +1. **系统启动函数** :这个函数是引导加载程序的入口点,它负责启动整个引导加载过程。 +2. **硬件初始化函数** :这些函数负责初始化系统的硬件设备,包括CPU、内存、IO设备等。 +3. **内存映射设置函数** :这些函数负责建立内存空间的映射图,包括物理内存、虚拟内存的映射关系。 +4. **操作系统内核加载函数** :这些函数负责加载操作系统内核,包括从存储设备读取内核镜像,加载到内存中,然后跳转到内核的入口点。 +5. **错误处理函数** :这些函数负责处理在引导加载过程中可能出现的各种错误,包括硬件错误、内核加载错误等。 + + + +# ymodem.c 文件说明 + +`ymodem.c`是一个实现YMODEM协议的源代码文件。YMODEM是一种用于文件传输的协议,它在XMODEM协议的基础上增加了一些新的特性,例如支持更大的文件和文件名传输。 + +以下是 `ymodem.c`文件中可能包含的主要函数和其功能: + +1. **初始化和结束传输的函数** :这些函数负责设置传输的开始和结束,包括打开和关闭必要的硬件接口,设置传输参数等。 +2. **发送和接收数据包的函数** :这些函数负责实际的数据传输,包括将数据打包成YMODEM格式的数据包,通过硬件接口发送和接收数据包,处理数据包的确认和重传等。 +3. **CRC校验的函数** :这些函数负责计算和检查数据包的CRC(循环冗余校验)值,以确保数据的完整性。 +4. **处理错误和重试的函数** :这些函数负责处理在传输过程中可能出现的各种错误,包括数据包丢失、CRC校验失败等,并在必要时进行重试。 + +此外,`ymodem.c`文件还可能包含一些辅助函数,用于处理如超时、缓冲区管理等问题。 diff --git a/User/system/lib/bootload/test_ymodem.c b/User/system/lib/bootload/test_ymodem.c new file mode 100644 index 0000000..d7c6b08 --- /dev/null +++ b/User/system/lib/bootload/test_ymodem.c @@ -0,0 +1,79 @@ +#include "unity.h" +#include "ymodem.c" + +void setUp(void) +{ + // 这里可以进行每个测试用例开始前的设置 +} + +void tearDown(void) +{ + // 这里可以进行每个测试用例结束后的清理 +} + +void test_CRC16(void) +{ + unsigned char data[] = {0x01, 0x02, 0x03, 0x04, 0x05}; + TEST_ASSERT_EQUAL_HEX16(EXPECTED_CRC_VALUE, CRC16(data, sizeof(data))); +} + +void test_IS_CAP_LETTER(void) +{ + TEST_ASSERT_TRUE(IS_CAP_LETTER('A')); + TEST_ASSERT_FALSE(IS_CAP_LETTER('a')); +} + +void test_IS_LC_LETTER(void) +{ + TEST_ASSERT_TRUE(IS_LC_LETTER('a')); + TEST_ASSERT_FALSE(IS_LC_LETTER('A')); +} + +void test_IS_09(void) +{ + TEST_ASSERT_TRUE(IS_09('0')); + TEST_ASSERT_FALSE(IS_09('A')); +} + +void test_ISVALIDHEX(void) +{ + TEST_ASSERT_TRUE(ISVALIDHEX('A')); + TEST_ASSERT_TRUE(ISVALIDHEX('a')); + TEST_ASSERT_TRUE(ISVALIDHEX('0')); + TEST_ASSERT_FALSE(ISVALIDHEX('G')); +} + +void test_ISVALIDDEC(void) +{ + TEST_ASSERT_TRUE(ISVALIDDEC('0')); + TEST_ASSERT_FALSE(ISVALIDDEC('A')); +} + +void test_CONVERTDEC(void) +{ + TEST_ASSERT_EQUAL_HEX8(0, CONVERTDEC('0')); + TEST_ASSERT_EQUAL_HEX8(9, CONVERTDEC('9')); +} + +void test_CONVERTHEX(void) +{ + TEST_ASSERT_EQUAL_HEX8(10, CONVERTHEX('A')); + TEST_ASSERT_EQUAL_HEX8(10, CONVERTHEX('a')); + TEST_ASSERT_EQUAL_HEX8(0, CONVERTHEX('0')); +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(test_CRC16); + RUN_TEST(test_IS_CAP_LETTER); + RUN_TEST(test_IS_LC_LETTER); + RUN_TEST(test_IS_09); + RUN_TEST(test_ISVALIDHEX); + RUN_TEST(test_ISVALIDDEC); + RUN_TEST(test_CONVERTDEC); + RUN_TEST(test_CONVERTHEX); + + return UNITY_END(); +} diff --git a/User/system/lib/bootload/ymodem.c b/User/system/lib/bootload/ymodem.c new file mode 100644 index 0000000..8bafe13 --- /dev/null +++ b/User/system/lib/bootload/ymodem.c @@ -0,0 +1,633 @@ +/** + * @file ymodem.c + * @author xxx + * @date 2024-02-18 19:32:40 + * @brief + * 该模块实现了YMODEM协议的核心功能,包括初始化、配置、数据接收、握手、数据传输和结束处理。 + * 它使用了回调函数来处理不同阶段的事件,并使用信号量来同步不同的流程。CRC校验是用来确保数据传输的完整性和准确性 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#include "ymodem.h" +#include "sys.h" +#include "delay.h" +#include "flow.h" + +sqqueue_ctrl_t rym_sqqueue; // 一个接收队列控制结构体,用于管理接收到的数据。 +static uint32_t tm_sec = 0; // 握手超时时间,用于握手阶段的超时计时 +static enum rym_stage stage = RYM_STAGE_NONE; // 当前的阶段 +static int32_t rym_tm_sec = 0; // YMODEM超时计时器 + +static uint8_t aPacketData[_RYM_PKG_SZ]; // 数据包缓冲区 + +// 回调函数,用于处理不同阶段的事件 +static rym_callback rym_on_begin = NULL; +static rym_callback rym_on_data = NULL; +static rym_callback rym_on_end = NULL; +static rym_callback rym_transmit = NULL; + +static struct flow handshake_fw; // 握手流程 +static struct flow trans_fw; // 传输流程 +static struct flow finsh_fw; // 结束流程 +static struct flow_sem msg_sem; // 消息信号量,用于同步 + +static const uint16_t ccitt_table[256] = + { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0}; + +uint16_t CRC16(unsigned char *q, int len) +{ + uint16_t crc = 0; + + while (len-- > 0) + crc = (crc << 8) ^ ccitt_table[((crc >> 8) ^ *q++) & 0xff]; + return crc; +} + +/* Exported macro ------------------------------------------------------------*/ +#define IS_CAP_LETTER(c) (((c) >= 'A') && ((c) <= 'F')) +#define IS_LC_LETTER(c) (((c) >= 'a') && ((c) <= 'f')) +#define IS_09(c) (((c) >= '0') && ((c) <= '9')) +#define ISVALIDHEX(c) (IS_CAP_LETTER(c) || IS_LC_LETTER(c) || IS_09(c)) +#define ISVALIDDEC(c) IS_09(c) +#define CONVERTDEC(c) (c - '0') + +#define CONVERTHEX_ALPHA(c) (IS_CAP_LETTER(c) ? ((c) - 'A' + 10) : ((c) - 'a' + 10)) +#define CONVERTHEX(c) (IS_09(c) ? ((c) - '0') : CONVERTHEX_ALPHA(c)) +/** + * @brief Convert a string to an integer + * @param p_inputstr: The string to be converted + * @param p_intnum: The integer value + * @retval 1: Correct + * 0: Error + */ +uint32_t Str2Int(uint8_t *p_inputstr, uint32_t *p_intnum) +{ + uint32_t i = 0, res = 0; + uint32_t val = 0; + + if ((p_inputstr[0] == '0') && ((p_inputstr[1] == 'x') || (p_inputstr[1] == 'X'))) + { + i = 2; + while ((i < 11) && (p_inputstr[i] != '\0')) + { + if (ISVALIDHEX(p_inputstr[i])) + { + val = (val << 4) + CONVERTHEX(p_inputstr[i]); + } + else + { + /* Return 0, Invalid input */ + res = 0; + break; + } + i++; + } + + /* valid result */ + if (p_inputstr[i] == '\0') + { + *p_intnum = val; + res = 1; + } + } + else /* max 10-digit decimal input */ + { + while ((i < 11) && (res != 1)) + { + if (p_inputstr[i] == '\0') + { + *p_intnum = val; + /* return 1 */ + res = 1; + } + else if (((p_inputstr[i] == 'k') || (p_inputstr[i] == 'K')) && (i > 0)) + { + val = val << 10; + *p_intnum = val; + res = 1; + } + else if (((p_inputstr[i] == 'm') || (p_inputstr[i] == 'M')) && (i > 0)) + { + val = val << 20; + *p_intnum = val; + res = 1; + } + else if (ISVALIDDEC(p_inputstr[i])) + { + val = val * 10 + CONVERTDEC(p_inputstr[i]); + } + else + { + /* return 0, Invalid input */ + res = 0; + break; + } + i++; + } + } + + return res; +} + +/** + * @brief Read data from the circular queue. + * + * This function reads the specified length of data from the circular queue and stores it in the given buffer. + * If the length of data in the queue is greater than or equal to the specified length, it directly reads the specified length of data. + * If the length of data in the queue is less than the specified length, it reads all the data in the queue. + * + * @param buffer The buffer to store the data. + * @param len The length of data to read. + * + * @return The actual length of data read. + */ +static uint16_t rym_sqqueue_read(void *buffer, uint16_t len) +{ + uint16_t i = 0; + uint8_t *buf = buffer; + if (rym_sqqueue.get_len(&rym_sqqueue) >= len) + { + for (i = 0; i < len; i++) + { + buf[i] = *((uint8_t *)rym_sqqueue.del(&rym_sqqueue)); + } + } + else + { + while ((rym_sqqueue.get_len(&rym_sqqueue) != 0) && (i < len)) + { + buf[i] = *((uint8_t *)rym_sqqueue.del(&rym_sqqueue)); + } + } + + return i; +} + +/** + * @brief Initializes the parameters for the YMODEM process. + * + * This function sets the stage variable to the specified stage and initializes the rym_tm_sec variable with the value of tm_sec. + * If the stage is RYM_STAGE_ESTABLISHING, it also clears the rym_sqqueue. + * + * @param st The stage of the YMODEM process. + */ +static void rym_process_params_init(enum rym_stage st) +{ + stage = st; + rym_tm_sec = tm_sec; + if (st == RYM_STAGE_ESTABLISHING) + { + rym_sqqueue.clear_sqq(&rym_sqqueue); + } +} + +/** + * @brief Performs the handshake process for the YMODEM protocol. + * + * This function reads packets from the input queue and performs the necessary checks and actions + * to establish a connection and initiate file transfer using the YMODEM protocol. + * + * @param fl The flow structure containing the necessary variables and synchronization mechanisms. + * @return The result of the handshake process. + * - 0: Handshake process completed successfully. + * - Non-zero: Handshake process failed. + */ +static uint8_t rym_do_handshake_process(struct flow *fl) +{ + uint8_t index = 0; + FL_HEAD(fl); + static uint16_t rym_recv_len = 0; + static uint16_t recv_crc, cal_crc; + static uint8_t *file_ptr = NULL; + static uint8_t file_name[FILE_NAME_LENGTH]; + static uint8_t file_size[FILE_SIZE_LENGTH]; + static uint32_t filesize; + for (;;) + { + FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, &msg_sem, FL_CLOCK_SEC); + if (FL_SEM_IS_RELEASE(fl, &msg_sem)) + { + rym_recv_len = rym_sqqueue_read(&aPacketData[PACKET_START_INDEX], 1); + if (rym_recv_len == 1) + { + if (aPacketData[PACKET_START_INDEX] != RYM_CODE_SOH && aPacketData[PACKET_START_INDEX] != RYM_CODE_STX) + continue; + + /* SOH/STX + seq + payload + crc */ + rym_recv_len = rym_sqqueue_read(&aPacketData[PACKET_NUMBER_INDEX], + _RYM_PKG_SZ - 1); + if (rym_recv_len != (_RYM_PKG_SZ - 1)) + continue; + /* sanity check */ + if ((aPacketData[PACKET_NUMBER_INDEX] != 0) || (aPacketData[PACKET_CNUMBER_INDEX] != 0xFF)) + continue; + recv_crc = (uint16_t)(*(&aPacketData[PACKET_START_INDEX] + _RYM_PKG_SZ - 2) << 8) | + *(&aPacketData[PACKET_START_INDEX] + _RYM_PKG_SZ - 1); + cal_crc = CRC16(aPacketData + PACKET_DATA_INDEX, _RYM_PKG_SZ - 5); + if (recv_crc != cal_crc) + continue; + + if (rym_on_begin != NULL) + { + file_ptr = aPacketData + PACKET_DATA_INDEX; + while ((*file_ptr != 0) && (index < FILE_NAME_LENGTH)) + { + file_name[index++] = *file_ptr++; + } + file_name[index++] = '\0'; + index = 0; + file_ptr++; + while ((*file_ptr != ' ') && (index < FILE_SIZE_LENGTH)) + { + file_size[index++] = *file_ptr++; + } + file_size[index++] = '\0'; + Str2Int(file_size, &filesize); + + if (RYM_CODE_NONE != rym_on_begin(file_name, filesize)) + { + for (uint8_t i = 0; i < RYM_END_SESSION_SEND_CAN_NUM; i++) + { + aPacketData[0] = RYM_CODE_CAN; + rym_transmit(aPacketData, 1); + } + } + else + { + aPacketData[0] = RYM_CODE_ACK; + rym_transmit(aPacketData, 1); + FL_LOCK_DELAY(fl, FL_CLOCK_100MSEC * 5); + aPacketData[0] = RYM_CODE_C; + rym_transmit(aPacketData, 1); + rym_process_params_init(RYM_STAGE_TRANSMITTING); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC); + } + } + } + } + else + { + aPacketData[0] = RYM_CODE_C; + rym_transmit(aPacketData, 1); + rym_tm_sec--; + } + } + FL_TAIL(fl); +} + +/** + * @brief Transfers data using the YMODEM protocol. + * + * This function is responsible for transferring data using the YMODEM protocol. + * It receives the size of the data to be transferred and a pointer to the code + * that will be returned. It performs various checks on the received data and + * calculates the CRC to ensure data integrity. If all checks pass, it sets the + * code to RYM_CODE_ACK and returns 0. Otherwise, it returns an error code. + * + * @param data_size The size of the data to be transferred. + * @param code Pointer to the code that will be returned. + * @return 0 if successful, otherwise an error code. + */ +static int8_t rym_tran_data(uint16_t data_size, uint8_t *code) +{ + DBG_ASSERT(NULL != code __DBG_LINE); + uint16_t recv_len = 0; + uint16_t recv_crc, cal_crc; + const uint16_t tran_size = PACKET_HEADER_SIZE - 1 + data_size + PACKET_TRAILER_SIZE; + + /* seq + data + crc */ + recv_len = rym_sqqueue_read(&aPacketData[PACKET_NUMBER_INDEX], + tran_size); + if (recv_len != tran_size) + return -RYM_ERR_DSZ; + /* sanity check */ + if ((aPacketData[PACKET_NUMBER_INDEX] + aPacketData[PACKET_CNUMBER_INDEX]) != 0xFF) + return -RYM_ERR_SEQ; + /* As we are sending C continuously, there is a chance that the + * sender(remote) receive an C after sending the first handshake package. + * So the sender will interpret it as NAK and re-send the package. So we + * just ignore it and proceed. */ + if (stage == RYM_STAGE_ESTABLISHED && aPacketData[PACKET_NUMBER_INDEX] == RYM_CODE_NONE) + { + *code = RYM_CODE_NONE; + return 0; + } + + stage = RYM_STAGE_TRANSMITTING; + + recv_crc = (uint16_t)(*(&aPacketData[PACKET_START_INDEX] + tran_size - 1) << 8) | + *(&aPacketData[PACKET_START_INDEX] + tran_size); + cal_crc = CRC16(aPacketData + PACKET_DATA_INDEX, data_size); + if (recv_crc != cal_crc) + return -RYM_ERR_CRC; + + *code = RYM_CODE_ACK; + return 0; +} + +/** + * @brief Performs the YMODEM transmission process. + * + * This function is responsible for handling the YMODEM transmission process. + * It receives packets of data and performs the necessary operations based on the received data. + * It handles timeouts and retransmissions if necessary. + * + * @param fl The flow structure pointer. + * @return The status of the transmission process. + */ +static uint8_t rym_do_trans_process(struct flow *fl) +{ + FL_HEAD(fl); + static uint16_t data_size, rym_recv_len; + static uint8_t rym_code; + static uint16_t tran_timeout = 0; + for (;;) + { + FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, &msg_sem, FL_CLOCK_SEC); + if (FALSE == FL_SEM_IS_RELEASE(fl, &msg_sem)) + { + if (tran_timeout++ >= 5) + { + tran_timeout = 0; + rym_process_params_init(RYM_STAGE_ESTABLISHING); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC); + } + } + else + { + tran_timeout = 0; + rym_recv_len = rym_sqqueue_read(&aPacketData[PACKET_START_INDEX], 1); + if (rym_recv_len == 1) + { + if (aPacketData[PACKET_START_INDEX] == RYM_CODE_SOH) + data_size = PACKET_SIZE; + else if (aPacketData[PACKET_START_INDEX] == RYM_CODE_STX) + data_size = PACKET_1K_SIZE; + else if (aPacketData[PACKET_START_INDEX] == RYM_CODE_EOT) + { + aPacketData[0] = RYM_CODE_NAK; + rym_transmit(aPacketData, 1); + rym_process_params_init(RYM_STAGE_FINISHING); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC); + continue; + } + else + { + rym_process_params_init(RYM_STAGE_ESTABLISHING); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC); + continue; + } + + if (rym_tran_data(data_size, &rym_code) == 0) + { + if (rym_on_data != NULL) + rym_on_data(aPacketData + PACKET_DATA_INDEX, data_size); + + if (rym_code == RYM_CODE_CAN) + { + for (uint8_t i = 0; i < RYM_END_SESSION_SEND_CAN_NUM; i++) + { + aPacketData[0] = RYM_CODE_CAN; + rym_transmit(aPacketData, 1); + } + } + else if (rym_code == RYM_CODE_ACK) + { + aPacketData[0] = RYM_CODE_ACK; + rym_transmit(aPacketData, 1); + } + } + } + } + } + FL_TAIL(fl); +} + +/** + * @brief Performs the finishing process for the YMODEM protocol. + * + * This function is responsible for handling the final stage of the YMODEM protocol, + * where the receiver receives the end of transmission (EOT) signal from the sender. + * It verifies the received EOT signal, sends an acknowledgement (ACK) signal back to + * the sender, and waits for the start of header (SOH) signal to receive the final + * packet containing the payload and checksum. If the received packet is valid, it + * calculates the checksum and compares it with the received checksum. If they match, + * it sets the stage to RYM_STAGE_FINISHED and invokes the callback function if + * available. This function also handles timeout conditions and reinitializes the + * protocol parameters if necessary. + * + * @param fl The flow structure pointer. + * @return The result of the finishing process. + */ +static uint8_t rym_do_finish_process(struct flow *fl) +{ + FL_HEAD(fl); + static uint16_t rym_recv_len; + static uint16_t recv_crc, cal_crc; + static uint16_t tran_timeout = 0; + + for (;;) + { + FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, &msg_sem, FL_CLOCK_SEC); + if (FALSE == FL_SEM_IS_RELEASE(fl, &msg_sem)) + { + if (tran_timeout++ >= 5) + { + tran_timeout = 0; + rym_process_params_init(RYM_STAGE_ESTABLISHING); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC); + } + } + else + { + tran_timeout = 0; + /* read the length of the packet */ + rym_recv_len = rym_sqqueue_read(&aPacketData[PACKET_START_INDEX], 1); + if (rym_recv_len == 1) + { + if (aPacketData[PACKET_START_INDEX] != RYM_CODE_EOT) + continue; + + /* send an ACK */ + aPacketData[0] = RYM_CODE_ACK; + rym_transmit(aPacketData, 1); + FL_LOCK_DELAY(fl, FL_CLOCK_100MSEC * 5); + /* send a C */ + aPacketData[0] = RYM_CODE_C; + rym_transmit(aPacketData, 1); + + FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, &msg_sem, FL_CLOCK_SEC); + if (FALSE == FL_SEM_IS_RELEASE(fl, &msg_sem)) + continue; + /* read the length of the packet */ + rym_recv_len = rym_sqqueue_read(&aPacketData[PACKET_START_INDEX], 1); + if (rym_recv_len == 1) + { + if (aPacketData[PACKET_START_INDEX] != RYM_CODE_SOH) + continue; + + /* SOH/STX + seq + payload + crc */ + rym_recv_len = rym_sqqueue_read(&aPacketData[PACKET_NUMBER_INDEX], + _RYM_SOH_PKG_SZ - 1); + if (rym_recv_len != (_RYM_SOH_PKG_SZ - 1)) + continue; + /* sanity check */ + if ((aPacketData[PACKET_NUMBER_INDEX] != 0) || (aPacketData[PACKET_CNUMBER_INDEX] != 0xFF)) + continue; + recv_crc = (uint16_t)(*(&aPacketData[PACKET_START_INDEX] + _RYM_SOH_PKG_SZ - 2) << 8) | + *(&aPacketData[PACKET_START_INDEX] + _RYM_SOH_PKG_SZ - 1); + cal_crc = CRC16(aPacketData + PACKET_DATA_INDEX, _RYM_SOH_PKG_SZ - 5); + if (recv_crc != cal_crc) + continue; + + /* we got a valid packet. invoke the callback if there is one. */ + stage = RYM_STAGE_FINISHED; + aPacketData[0] = RYM_CODE_ACK; + rym_transmit(aPacketData, 1); + /* we already got one EOT in the caller. invoke the callback if there is + * one. */ + if (rym_on_end) + rym_on_end(&aPacketData[PACKET_DATA_INDEX], PACKET_SIZE); + } + } + } + } + FL_TAIL(fl); +} + +/** + * @brief Process the Ymodem protocol stages. + * + * This function is responsible for handling the different stages of the Ymodem protocol. + * It performs the necessary actions based on the current stage. + * + * @note The stages include establishing connection, transmitting data, finishing, and others. + * + * @param None + * @return None + */ +void rym_process(void) +{ + switch (stage) + { + case RYM_STAGE_ESTABLISHING: // 建立连接 (Establishing connection) + rym_do_handshake_process(&handshake_fw); + break; + case RYM_STAGE_TRANSMITTING: // 传输中 (Transmitting) + rym_do_trans_process(&trans_fw); + break; + case RYM_STAGE_FINISHING: // 结束 (Finishing) + rym_do_finish_process(&finsh_fw); + break; + case RYM_STAGE_NONE: + rym_process_params_init(RYM_STAGE_ESTABLISHING); + break; + case RYM_STAGE_FINISHED: + rym_tm_sec = 0; + break; + default: + // rym_process_params_init(RYM_STAGE_ESTABLISHING); + break; + } +} + +/** + * @brief Checks if the YMODEM receive timeout has occurred. + * @return TRUE if the timeout has occurred, FALSE otherwise. + */ +BOOL rym_timeout(void) +{ + return rym_tm_sec == 0; +} + +/** + * @brief Initializes the YMODEM protocol for receiving files. + * + * This function initializes the necessary data structures and variables + * for receiving files using the YMODEM protocol. + * + * @return TRUE if initialization is successful, FALSE otherwise. + */ +BOOL rym_init(void) +{ + sqqueue_ctrl_init(&rym_sqqueue, sizeof(uint8_t), _RYM_PKG_SZ); + FL_INIT(&handshake_fw); + FL_INIT(&trans_fw); + FL_INIT(&finsh_fw); + return TRUE; +} + +/** + * @brief Receive data using the Ymodem protocol. + * + * This function is used to receive data transmitted using the Ymodem protocol and store it in the specified buffer. + * + * @param p Pointer to the data storage buffer. + */ +uint16_t rym_receive(void *p, uint16_t size) +{ + rym_sqqueue.string_enter(&rym_sqqueue, p, size); + FLOW_SEM_RELEASE(&msg_sem); + return 0; +} + +/** + * @brief Configures the YMODEM protocol with the specified callbacks and handshake timeout. + * + * This function sets the callback functions for the YMODEM protocol, which will be called during different stages of the protocol. + * The `on_begin` callback is called when the YMODEM transfer begins. + * The `on_data` callback is called when a data packet is received during the transfer. + * The `on_end` callback is called when the YMODEM transfer ends. + * The `on_transmit` callback is called when a data packet needs to be transmitted during the transfer. + * The `handshake_timeout` parameter specifies the timeout duration for the handshake phase of the YMODEM protocol. + * + * @param on_begin The callback function to be called when the YMODEM transfer begins. + * @param on_data The callback function to be called when a data packet is received during the transfer. + * @param on_end The callback function to be called when the YMODEM transfer ends. + * @param on_transmit The callback function to be called when a data packet needs to be transmitted during the transfer. + * @param handshake_timeout The timeout duration for the handshake phase of the YMODEM protocol. + * + * @return TRUE if the configuration was successful, FALSE otherwise. + */ +BOOL rym_config(rym_callback on_begin, rym_callback on_data, + rym_callback on_end, rym_callback on_transmit, + int handshake_timeout) +{ + rym_on_begin = on_begin; + rym_on_data = on_data; + rym_on_end = on_end; + rym_transmit = on_transmit; + tm_sec = handshake_timeout; + return TRUE; +} diff --git a/User/system/lib/bootload/ymodem.h b/User/system/lib/bootload/ymodem.h new file mode 100644 index 0000000..e6ce0f1 --- /dev/null +++ b/User/system/lib/bootload/ymodem.h @@ -0,0 +1,180 @@ +/** + * @file ymodem.h + * @author xsh + * @date 2024-02-18 19:32:46 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __YMODEM_H__ +#define __YMODEM_H__ + +#include "lib.h" + +enum rym_code +{ + RYM_CODE_NONE = 0x00, + RYM_CODE_SOH = 0x01, /* start of 128-byte data packet */ + RYM_CODE_STX = 0x02, /* start of 1024-byte data packet */ + RYM_CODE_EOT = 0x04, /* end of transmission */ + RYM_CODE_ACK = 0x06, /* acknowledge */ + RYM_CODE_NAK = 0x15, /* negative acknowledge */ + RYM_CODE_CAN = 0x18, /* two of these in succession aborts transfer */ + RYM_CODE_C = 0x43, /* 'C' == 0x43, request 16-bit CRC */ +}; +typedef enum rym_code rym_code_e; + +/* RYM error code + * + * We use the rt_err_t to return error values. We take use of current error + * codes available in RTT and append ourselves. + */ +/* timeout on handshake */ +#define RYM_ERR_TMO 0x70 +/* wrong code, wrong SOH, STX etc. */ +#define RYM_ERR_CODE 0x71 +/* wrong sequence number */ +#define RYM_ERR_SEQ 0x72 +/* wrong CRC checksum */ +#define RYM_ERR_CRC 0x73 +/* not enough data received */ +#define RYM_ERR_DSZ 0x74 +/* the transmission is aborted by user */ +#define RYM_ERR_CAN 0x75 + +/* how many ticks wait for chars between packet. */ +#ifndef RYM_WAIT_CHR_TICK +#define RYM_WAIT_CHR_TICK (OSEL_TICK_RATE_HZ * 3) +#endif +/* how many ticks wait for between packet. */ +#ifndef RYM_WAIT_PKG_TICK +#define RYM_WAIT_PKG_TICK (OSEL_TICK_RATE_HZ * 3) +#endif +/* how many ticks between two handshake code. */ +#ifndef RYM_CHD_INTV_TICK +#define RYM_CHD_INTV_TICK (OSEL_TICK_RATE_HZ * 3) +#endif + +/* how many CAN be sent when user active end the session. */ +#ifndef RYM_END_SESSION_SEND_CAN_NUM +#define RYM_END_SESSION_SEND_CAN_NUM 0x03 +#endif + +/* Exported constants --------------------------------------------------------*/ +/* Packet structure defines */ +#define PACKET_HEADER_SIZE ((uint32_t)3) +#define PACKET_DATA_INDEX ((uint32_t)4) +#define PACKET_START_INDEX ((uint32_t)1) +#define PACKET_NUMBER_INDEX ((uint32_t)2) +#define PACKET_CNUMBER_INDEX ((uint32_t)3) +#define PACKET_TRAILER_SIZE ((uint32_t)2) +#define PACKET_OVERHEAD_SIZE (PACKET_HEADER_SIZE + PACKET_TRAILER_SIZE - 1) +#define PACKET_SIZE ((uint32_t)128) +#define PACKET_1K_SIZE ((uint32_t)1024) +#define _RYM_SOH_PKG_SZ (PACKET_SIZE + PACKET_HEADER_SIZE + PACKET_TRAILER_SIZE) +#define _RYM_STX_PKG_SZ (PACKET_1K_SIZE + PACKET_HEADER_SIZE + PACKET_TRAILER_SIZE) +#define _RYM_PKG_SZ _RYM_STX_PKG_SZ // 这里定义的是数据包的大小 + +/* 因为data是需要写入到flash里面,如果不对齐,会出现UNALIGNED异常 + * /-------- Packet in IAP memory ------------------------------------------\ + * | 0 | 1 | 2 | 3 | 4 | ... | n+4 | n+5 | n+6 | + * |------------------------------------------------------------------------| + * | unused | start | number | !num | data[0] | ... | data[n] | crc0 | crc1 | + * \------------------------------------------------------------------------/ + * the first byte is left unused for memory alignment reasons */ + +#define FILE_NAME_LENGTH ((uint32_t)64) +#define FILE_SIZE_LENGTH ((uint32_t)16) + +#define NEGATIVE_BYTE ((uint8_t)0xFF) + +#define ABORT1 ((uint8_t)0x41) /* 'A' == 0x41, abort by user */ +#define ABORT2 ((uint8_t)0x61) /* 'a' == 0x61, abort by user */ + +#define MAX_ERRORS ((uint32_t)5) + +enum rym_stage +{ + RYM_STAGE_NONE, + /* set when C is send */ + RYM_STAGE_ESTABLISHING, + /* set when we've got the packet 0 and sent ACK and second C */ + RYM_STAGE_ESTABLISHED, + /* set when the sender respond to our second C and recviever got a real + * data packet. */ + RYM_STAGE_TRANSMITTING, + /* set when the sender send a EOT */ + RYM_STAGE_FINISHING, + /* set when transmission is really finished, i.e., after the NAK, C, final + * NULL packet stuff. */ + RYM_STAGE_FINISHED, +}; + +/* when receiving files, the buf will be the data received from ymodem protocol + * and the len is the data size. + * + * TODO: + * When sending files, the len is the buf size in RYM. The callback need to + * fill the buf with data to send. Returning RYM_CODE_EOT will terminate the + * transfer and the buf will be discarded. Any other return values will cause + * the transfer continue. + */ +typedef enum rym_code (*rym_callback)(uint8_t *buf, uint32_t len); + +/** recv a file on device dev with ymodem session ctx. + * + * If an error happens, you can get where it is failed from ctx->stage. + * + * @param on_begin The callback will be invoked when the first packet arrived. + * This packet often contain file names and the size of the file, if the sender + * support it. So if you want to save the data to a file, you may need to + * create the file on need. It is the on_begin's responsibility to parse the + * data content. The on_begin can be NULL, in which case the transmission will + * continue without any side-effects. + * + * @param on_data The callback will be invoked on the packets received. The + * callback should save the data to the destination. The return value will be + * sent to the sender and in turn, only RYM_{ACK,CAN} is valid. When on_data is + * NULL, RYM will barely send ACK on every packet and have no side-effects. + * + * @param on_end The callback will be invoked when one transmission is + * finished. The data should be 128 bytes of NULL. You can do some cleaning job + * in this callback such as closing the file. The return value of this callback + * is ignored. As above, this parameter can be NULL if you don't need such + * function. + * + * @param handshake_timeout the timeout when hand shaking. The unit is in + * second. + */ +BOOL rym_config(rym_callback on_begin, rym_callback on_data, + rym_callback on_end, rym_callback on_transmit, + int handshake_timeout); + +/** + * @brief Initializes the YMODEM protocol for receiving data. + * + * @return BOOL Returns TRUE if initialization is successful, FALSE otherwise. + */ +BOOL rym_init(void); + +/** + * @brief Receives data using the YMODEM protocol. + * + * @param p Pointer to the buffer where the received data will be stored. + * @param size The size of the buffer. + * @return uint16_t The number of bytes received. + */ +uint16_t rym_receive(void *p, uint16_t size); + +/** + * @brief Processes the received data using the YMODEM protocol. + */ +void rym_process(void); + +/** + * @brief Checks if a timeout has occurred during the YMODEM protocol. + * + * @return BOOL Returns TRUE if a timeout has occurred, FALSE otherwise. + */ +BOOL rym_timeout(void); + +#endif diff --git a/User/system/lib/control/custom/pid_c.c b/User/system/lib/control/custom/pid_c.c new file mode 100644 index 0000000..4354fbc --- /dev/null +++ b/User/system/lib/control/custom/pid_c.c @@ -0,0 +1,38 @@ +#include "pid_c.h" + +/** + * @brief 设置PID控制器参数 + * @param {PID_C} *self - PID控制器结构体指针 + * @param {float32} kp - 比例系数 + * @param {float32} ki - 积分系数 + * @param {float32} kd - 微分系数 + * @param {float32} out_min - 最小输出 + * @param {float32} out_max - 最大输出 + * @return {*} - 空 + */ +static void _set_ctrl_prm(struct PID_C *self, float32 kp, float32 ki, float32 kd, float32 out_min, float32 out_max) +{ + self->pri.kp = kp; /*比例系数*/ + self->pri.ki = ki; /*积分系数*/ + self->pri.kd = kd; /*微分系数*/ + + self->pri.deadband = 0.5; /*死区*/ + self->pri.maximum = out_max; /*最大输出*/ + self->pri.minimum = out_min; /*最小输出*/ + self->pri.last_error = 0; /*上一次误差*/ + self->pri.prev_error = 0; /*上上次误差*/ +} + +static float32 _PID(struct PID_C *self, float32 target, float32 feedback) +{ + /** + * 实现PID算法 + */ + return 0; +} + +void pid_c_constructor(struct PID_C *self) +{ + self->set_ctrl_prm = _set_ctrl_prm; + self->PID = _PID; +} diff --git a/User/system/lib/control/custom/pid_c.h b/User/system/lib/control/custom/pid_c.h new file mode 100644 index 0000000..ccc7e86 --- /dev/null +++ b/User/system/lib/control/custom/pid_c.h @@ -0,0 +1,34 @@ +#ifndef __PID_C_H__ +#define __PID_C_H__ +#include "lib.h" + +typedef struct PID_C +{ + /* 设置PID三个参数 */ + void (*set_ctrl_prm)(struct PID_C *self, float32 kp, float32 ki, float32 kd, float32 out_min, float32 out_max); + /* 控制接口 */ + float32 (*PID)(struct PID_C *self, float32 target, float32 feedback); + + // 自定义参数 + /* 实际值与目标值之间的误差 */ + float32 err; + /* 输出值 */ + float32 out; + /* private */ + struct + { + float32 kp; /*比例学习速度*/ + float32 ki; /*积分学习速度*/ + float32 kd; /*微分学习速度*/ + float32 ki_error; /*积分误差*/ + float32 last_error; /*前一拍偏差*/ + float32 prev_error; /*前两拍偏差*/ + float32 deadband; /*死区*/ + float32 maximum; /*输出值的上限*/ + float32 minimum; /*输出值的下限*/ + } pri; +} pid_c_t; + +extern void pid_c_constructor(struct PID_C *self); + +#endif // __PID_C_H__ diff --git a/User/system/lib/control/custom/pid_g.c b/User/system/lib/control/custom/pid_g.c new file mode 100644 index 0000000..615ec17 --- /dev/null +++ b/User/system/lib/control/custom/pid_g.c @@ -0,0 +1,285 @@ +#include "pid_g.h" +#include + +/** + * @brief 复位PID积分及微分控制数据 + * @param {PID_G} *self + * @return {*} + */ +static void _restctrl(struct PID_G *self) +{ + self->pri.pre_error = 0; + self->pri.sum_iterm = 0; +} + +/** + * @brief 更新控制区间 + * @param {PID_G} *self + * @param {float32} out_min + * @param {float32} out_max + * @return {*} + * @note + */ +static void _set_range(struct PID_G *self, float32 out_min, float32 out_max) +{ + self->pri.out_max = out_max; + self->pri.out_min = out_min; +} + +/** + * @brief 更新kp + * @param {PID_G} *self + * @param {float32} kp + * @return {*} + * @note + */ +static void _set_kp(struct PID_G *self, float32 kp) +{ + self->pri.kp = kp; +} + +/** + * @brief 更新ki + * @param {PID_G} *self + * @param {float32} ki + * @return {*} + * @note + */ +static void _set_ki(struct PID_G *self, float32 ki) +{ + self->pri.ki = ki; +} + +/** + * @brief 更新kd + * @param {PID_G} *self + * @param {float32} kd + * @return {*} + * @note + */ +static void _set_kd(struct PID_G *self, float32 kd) +{ + self->pri.kd = kd; +} + +/** + * @brief 使能积分控制 + * @param {PID_G} *self + * @param {BOOL} enable + * @return {*} + * @note + */ +static void _set_ki_enable(struct PID_G *self, BOOL enable) +{ + self->pri.ki_enable = enable; +} + +/** + * @brief 使能微分控制 + * @param {PID_G} *self + * @param {BOOL} enable + * @return {*} + * @note + */ +static void _set_kd_enable(struct PID_G *self, BOOL enable) +{ + self->pri.kd_enable = enable; +} + +/** + * @brief 初始化控制参数 + * @return {*} + * @note + */ +static void _set_ctrl_prm(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max) +{ + g_param_t *pri = &self->pri; + osel_memset((uint8_t *)pri, 0, sizeof(pid_g_t)); + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; + pri->detach = FALSE; +} + +static void _update_ctrl_prm(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max) +{ + g_param_t *pri = &self->pri; + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; + pri->detach = FALSE; +} + +/** + * @brief 非0时配置为积分分离+抗积分饱和PID,否则为普通抗积分饱和PID + * @param {PID_G} *self + * @param {float32} max_err + * @param {BOOL} mode + * @return {*} + */ +static void _set_cfg(struct PID_G *self, float32 max_err, BOOL mode) +{ + self->pri.err_limit = max_err; + self->pri.detach = mode == FALSE ? FALSE : TRUE; +} + +/** + * @brief 设置积分权重 + * @param {PID_G} *self + * @param {float32} max_weight + * @return {*} + * @note + */ +static void _set_weight(struct PID_G *self, float32 max_ratio, BOOL mode) +{ + self->pri.ui_ratio = max_ratio; + self->pri.weight = mode == FALSE ? FALSE : TRUE; +} + +/** + * @brief PID算法函数 + * @param {PID_G} *self + * @param {float32} target 目标位置 + * @param {float32} feedback 实际位置 + * @return {*} + * @note + */ +static float32 _PID(struct PID_G *self, float32 target, float32 feedback) +{ + float32 error = 0.0f; + float32 insert = 0.0f; ///< 该值为0时积分不介入计算 + float32 temp_iterm = 0.0f; + float32 temp_kd = 0.0f; + + g_param_t *pri = &self->pri; + + pri->ref = target; ///< 目标位置 + pri->feed_back = feedback; ///< 实际位置 + pri->error = pri->ref - pri->feed_back; /// 误差 + error = pri->error; + if (fabs(pri->error) <= pri->err_dead) ///< 误差小于死区,不计算 + { + error = 0; + } + + /*根据PID配置的模式,获取积分数据,进行积分累加*/ + if (pri->out >= pri->out_max) ///< 到达输出上限 + { + if (fabs(error) > pri->err_limit && pri->detach) ///< 误差大于积分介入区间,积分不介入计算 + { + insert = 0; + } + else + { + insert = 1; + if (error < 0) + { + temp_iterm = pri->ki * error; + } + } + } + else if (pri->out <= pri->out_min) ///< 到达输出下限 + { + if (fabs(error) > pri->err_limit && pri->detach) ///< 误差大于积分介入区间,积分不介入计算 + { + insert = 0; + } + else + { + insert = 1; + if (error > 0) + { + temp_iterm = pri->ki * error; + } + } + } + else + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + temp_iterm = pri->ki * error; + } + } + if (pri->ki_enable == FALSE) + { + temp_iterm = 0; + insert = 0; + } + + /* integral */ + pri->sum_iterm += temp_iterm; + + if (pri->weight == TRUE) + { + if (pri->sum_iterm > pri->ui_ratio) + { + pri->sum_iterm = pri->ui_ratio; + } + else if (pri->sum_iterm < -pri->ui_ratio) + { + pri->sum_iterm = -pri->ui_ratio; + } + } + else + { + if (pri->sum_iterm > pri->out_max) + { + pri->sum_iterm = pri->out_max; + } + else if (pri->sum_iterm < pri->out_min) + { + pri->sum_iterm = pri->out_min; + } + } + + /* differential */ + if (pri->kd_enable == TRUE) + { + temp_kd = pri->kd; + } + else + { + temp_kd = 0; + } + + pri->out = pri->kp * pri->error + pri->sum_iterm * insert + (pri->error - pri->pre_error) * temp_kd; + pri->pre_error = pri->error; ///< 记录这次误差,为下次微分计算做准备 + pri->pre_feed_back = pri->feed_back; + + /*limt pid output*/ + pri->out = RANGE(pri->out, pri->out_min, pri->out_max); ///< 限制输出 + return pri->out; +} + +/** + * @brief PID接口 + * @param {PID_G} *self + * @return {*} + * @note + */ +void pid_g_constructor(struct PID_G *self) +{ + self->set_ctrl_prm = _set_ctrl_prm; + self->update_ctrl_prm = _update_ctrl_prm; + self->set_cfg = _set_cfg; + self->set_kp = _set_kp; + self->set_ki_enable = _set_ki_enable; + self->set_ki = _set_ki; + self->set_kd_enable = _set_kd_enable; + self->set_kd = _set_kd; + self->set_range = _set_range; + self->restctrl = _restctrl; + self->PID = _PID; + self->set_weight = _set_weight; +} diff --git a/User/system/lib/control/custom/pid_g.h b/User/system/lib/control/custom/pid_g.h new file mode 100644 index 0000000..143051d --- /dev/null +++ b/User/system/lib/control/custom/pid_g.h @@ -0,0 +1,65 @@ +#ifndef __PID_G_H__ +#define __PID_G_H__ +#include "lib.h" + +typedef struct +{ + float32 ref; /*目标*/ + float32 feed_back; /*实际*/ + float32 pre_feed_back; /*上一次实际*/ + float32 kp; /*比例学习速度*/ + float32 ki; /*积分学习速度*/ + float32 kd; /*微分学习速度*/ + float32 ki_error; /*积分误差*/ + float32 error; /*误差*/ + float32 pre_error; /*前一拍偏差*/ + float32 prev_error; /*前两拍偏差*/ + float32 err_dead; /*死区*/ + float32 err_limit; /*积分分离上限*/ + float32 maximum; /*输出值的上限*/ + float32 minimum; /*输出值的下限*/ + float32 out; /*输出值*/ + float32 sum_iterm; /*积分累加*/ + float32 ui_ratio; /*积分权重*/ + BOOL ki_enable; /*积分使能*/ + BOOL kd_enable; /*微分使能*/ + BOOL detach; /*积分分离标志*/ + BOOL weight; /*积分权重标志*/ + float32 out_max; /*输出最大值*/ + float32 out_min; /*输出最小值*/ +} g_param_t; + +typedef struct PID_G +{ + /* 设置PID三个参数 */ + void (*set_ctrl_prm)(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max); + /* 更新PID参数 */ + void (*update_ctrl_prm)(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max); + /* 控制接口 */ + float32 (*PID)(struct PID_G *self, float32 target, float32 feedback); + /* 更新控制区间 */ + void (*set_range)(struct PID_G *self, float32 out_min, float32 out_max); + /* 设置积分分离 */ + void (*set_cfg)(struct PID_G *self, float32 max_err, BOOL mode); + /* 设置积分权重 */ + void (*set_weight)(struct PID_G *self, float32 max_ratio, BOOL mode); + /* 更新kp */ + void (*set_kp)(struct PID_G *self, float32 kp); + /* 使能ki */ + void (*set_ki_enable)(struct PID_G *self, BOOL enable); + /* 更新ki */ + void (*set_ki)(struct PID_G *self, float32 ki); + /* 使能kd */ + void (*set_kd_enable)(struct PID_G *self, BOOL enable); + /* 更新kd */ + void (*set_kd)(struct PID_G *self, float32 kd); + /* 复位PID积分及微分控制数据 */ + void (*restctrl)(struct PID_G *self); + + /* private */ + g_param_t pri; + +} pid_g_t; + +extern void pid_g_constructor(struct PID_G *self); +#endif // __PID_G_H__ diff --git a/User/system/lib/control/custom/pid_hd.c b/User/system/lib/control/custom/pid_hd.c new file mode 100644 index 0000000..0a98366 --- /dev/null +++ b/User/system/lib/control/custom/pid_hd.c @@ -0,0 +1,166 @@ +#include "pid_hd.h" +#include +#include "sys.h" +#include "app.h" + +#if INCOMPLETE_DIFFEREN_HD == 1 // 积分分离 +/*计算微分项,使用追随误差微分项*/ +static float32 td_derivative(struct PID_HD *self, float32 current_err, float32 pre_err, float32 dt) +{ + pid_hd_position_t *pri = &self->pri_u.position; + float32 derivative = (current_err - pre_err) / dt; // 计算积分项 + derivative = pri->td_alpha * derivative + (1 - pri->td_alpha) * pri->td_beta * pri->pre_derivative; // 追随误差微分器平滑输出 + pri->pre_derivative = derivative; // 更新上一次误差 + return derivative; +} +#endif + +/*杭电:设置位置式PID参数*/ +static void _set_ctrl_prm_position(struct PID_HD *self, float32 kp, float32 ki, float32 kd) +{ + pid_hd_position_t *pri = &self->pri_u.position; + osel_memset((uint8_t *)pri, 0, sizeof(pid_hd_position_t)); + + /*观测传进来的Kp、Ki、Kd*/ + + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->ki_limit = 10; // 积分分离界限 + pri->err_dead = 0.5; // 控制死区范围 +#if INCOMPLETE_DIFFEREN_HD == 1 + /*不完全微分系数*/ + pri->td_alpha = 0.5; + pri->td_beta = 0.5; +#endif +} + +/*杭电:设置输出限幅参数*/ +static void _set_out_prm_position(struct PID_HD *self, float32 maximum, float32 minimum) +{ + self->pri_u.position.out_max = maximum; + self->pri_u.position.out_min = minimum; +} + +/*杭电:位置式PID控制算法*/ +static float32 _pid_position(struct PID_HD *self, float32 err) +{ + /*计算控制的运行时间*/ + // sys_millis_reset(); + self->pri_u.position.control_time = sys_millis(); + self->pri_u.position.tmp_time = 0; + + /*测试:4.18*/ + if (fabs(err) < 0.1) + { + err = 0; + } + + float32 x[3]; + self->pri_u.position.err = err; + + /*抗积分饱和*/ +#if INTEGRAL_SEPARATION == 1 // 积分分离 + if (self->pri_u.position.out > self->pri_u.position.out_max) + { + if (self->pri_u.position.err > self->pri_u.position.ki_limit) // 积分分离 + { + self->pri_u.position.ki_error += 0; + } + else + { + if (self->pri_u.position.err < 0) // 若偏差为负值,执行负偏差的累加 + { + self->pri_u.position.ki_error += self->pri_u.position.err; + } + } + } + else if (self->pri_u.position.out < self->pri_u.position.out_min) + { + if (self->pri_u.position.err > self->pri_u.position.ki_limit) // 若偏差为负值,停止积分 + { + self->pri_u.position.ki_error += 0; + } + else + { + if (self->pri_u.position.err > 0) // 若偏差为正值,执行正偏差的累加 + { + self->pri_u.position.ki_error += self->pri_u.position.err; + } + } + } + else + { + if (fabs(err) > self->pri_u.position.ki_limit || fabs(err) < 0.5) + { + self->pri_u.position.ki_error += 0; + } + else + { + self->pri_u.position.ki_error += self->pri_u.position.err; + } + } +#else /*无积分分离操作*/ + if (fabs(err) < 0.4) + { + self->pri_u.position.ki_error += 0; + } + else + { + self->pri_u.position.ki_error += self->pri_u.position.err; + } +#endif + + /*输出*/ + if (fabs(err) < self->pri_u.position.err_dead) + { + /*输出上一次的值*/ + // self->pri_u.position.out = self->pri_u.position.pre_out; + x[0] = self->pri_u.position.err; + x[1] = self->pri_u.position.ki_error; + self->pri_u.position.out = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2]; + } + else + { + x[0] = self->pri_u.position.err; + x[1] = self->pri_u.position.ki_error; + +#if INCOMPLETE_DIFFEREN_HD == 1 + /*不完全微分项,为了解决普通PID为微分环节容易振荡的问题*/ + self->pri_u.position.tmp_time = sys_millis(); + self->pri_u.position.control_time -= self->pri_u.position.tmp_time; + self->pri_u.position.control_time /= 1000.0; // 将单位转换为秒 + x[2] = td_derivative(&_pid.pid_u.hd, err, self->pri_u.position.pre_error, self->pri_u.position.control_time); +#else + // 普通的微分环节 + x[2] = self->pri_u.position.err - self->pri_u.position.pre_error; +#endif + + self->pri_u.position.out = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2]; + } + + /*输出限幅*/ + if (self->pri_u.position.out > self->pri_u.position.out_max) + { + self->pri_u.position.out = self->pri_u.position.out_max; + } + if (self->pri_u.position.out < self->pri_u.position.out_min) + { + self->pri_u.position.out = self->pri_u.position.out_min; + } + + // 更新误差历史 + self->pri_u.position.pre_error = self->pri_u.position.err; /*上一次误差值*/ + // 更新输出历史 + self->pri_u.position.pre_out = self->pri_u.position.out; /*上一次输出值*/ + + return self->pri_u.position.out; +} + +/*杭电:参数控制器*/ +void pid_hd_constructor(struct PID_HD *self) +{ + self->set_ctrl_prm_position = _set_ctrl_prm_position; + self->set_out_prm_position = _set_out_prm_position; + self->pid_position = _pid_position; +} diff --git a/User/system/lib/control/custom/pid_hd.h b/User/system/lib/control/custom/pid_hd.h new file mode 100644 index 0000000..2fa96f0 --- /dev/null +++ b/User/system/lib/control/custom/pid_hd.h @@ -0,0 +1,66 @@ +#ifndef __PID_HD__ +#define __PID_HD__ +#include "lib.h" + +#define INTEGRAL_SEPARATION 1 // 积分分离 +#define INCOMPLETE_DIFFEREN_HD 1 // 不完全微分 + +typedef struct +{ + float32 ref; + float32 feed_back; + float32 pre_feed_back; + float32 pre_error; + float32 ki_error; /*积分误差*/ + float32 ki_limit; /*积分分离界限*/ + float32 ki_alpha; /*变积分的系数*/ + float32 err; + float32 sum_iterm; + float32 kp; + float32 kp_small; /*在接近稳态时的Kp*/ + float32 kp_big; /*在大范围时的Kp*/ + float32 ki; + float32 kd; + float32 err_limit; + BOOL detach; + float32 err_dead; +#if INCOMPLETE_DIFFEREN_HD == 1 + float32 td_alpha; /*不完全微分系数*/ + float32 td_beta; /*不完全微分系数beta*/ + float32 pre_derivative; /*上一次微分值*/ +#endif + float32 out; + float32 pre_out; + float32 out_max; + float32 out_min; + BOOL sm; + float32 sv_range; + uint32_t control_time; /*控制算法运行一次花费的时间*/ + uint32_t tmp_time; /*临时用来记录控制的运行时间*/ +} pid_hd_position_t; // 位置式PID + +typedef struct PID_HD +{ + /* 设置PID三个参数 */ + void (*set_ctrl_prm_position)(struct PID_HD *self, float32 kp, float32 ki, float32 kd); + /* 设置输出范围 */ + void (*set_out_prm_position)(struct PID_HD *self, float32 maximum, float32 minimum); + + /* 控制接口 */ + float32 (*pid_position)(struct PID_HD *self, float32 err); + + // 自定义参数 + /* 实际值与目标值之间的误差 */ + float32 err; + /* 输出值 */ + float32 out; + /* private */ + struct + { + pid_hd_position_t position; + } pri_u; +} pid_hd_t; + +extern void pid_hd_constructor(struct PID_HD *self); + +#endif // __PID_HD__ diff --git a/User/system/lib/control/custom/pid_x.c b/User/system/lib/control/custom/pid_x.c new file mode 100644 index 0000000..747049c --- /dev/null +++ b/User/system/lib/control/custom/pid_x.c @@ -0,0 +1,481 @@ +#include "pid_x.h" +#include "math.h" +#define LAG_PHASE (6) // 迟滞相位,单位:拍 + +#ifndef PI +#define PI 3.14159265358979f +#endif +// 注1:自适应模糊pid最重要的就是论域的选择,要和你应该控制的对象相切合 +// 注2:以下各阀值、限幅值、输出值均需要根据具体的使用情况进行更改 +// 注3:因为我的控制对象惯性比较大,所以以下各部分取值较小 +// 论域e:[-5,5] ec:[-0.5,0.5] + +// 误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡 +#define Emin 0.3f +#define Emid 1.0f +#define Emax 5.0f +// 调整值限幅,防止积分饱和 +#define Umax 1 +#define Umin -1 + +#define NB 0 +#define NM 1 +#define NS 2 +#define ZO 3 +#define PS 4 +#define PM 5 +#define PB 6 + +int32_t kp[7][7] = {{PB, PB, PM, PM, PS, ZO, ZO}, + {PB, PB, PM, PS, PS, ZO, ZO}, + {PM, PM, PM, PS, ZO, NS, NS}, + {PM, PM, PS, ZO, NS, NM, NM}, + {PS, PS, ZO, NS, NS, NM, NM}, + {PS, ZO, NS, NM, NM, NM, NB}, + {ZO, ZO, NM, NM, NM, NB, NB}}; + +int32_t kd[7][7] = {{PS, NS, NB, NB, NB, NM, PS}, + {PS, NS, NB, NM, NM, NS, ZO}, + {ZO, NS, NM, NM, NS, NS, ZO}, + {ZO, NS, NS, NS, NS, NS, ZO}, + {ZO, ZO, ZO, ZO, ZO, ZO, ZO}, + {PB, NS, PS, PS, PS, PS, PB}, + {PB, PM, PM, PM, PS, PS, PB}}; + +int32_t ki[7][7] = {{NB, NB, NM, NM, NS, ZO, ZO}, + {NB, NB, NM, NS, NS, ZO, ZO}, + {NB, NM, NS, NS, ZO, PS, PS}, + {NM, NM, NS, ZO, PS, PM, PM}, + {NM, NS, ZO, PS, PS, PM, PB}, + {ZO, ZO, PS, PS, PM, PB, PB}, + {ZO, ZO, PS, PM, PM, PB, PB}}; + +static float32 ec; // 误差变化率 +/**************求隶属度(三角形)***************/ +float32 FTri(float32 x, float32 a, float32 b, float32 c) // FuzzyTriangle +{ + if (x <= a) + return 0; + else if ((a < x) && (x <= b)) + return (x - a) / (b - a); + else if ((b < x) && (x <= c)) + return (c - x) / (c - b); + else if (x > c) + return 0; + else + return 0; +} +/*****************求隶属度(梯形左)*******************/ +float32 FTraL(float32 x, float32 a, float32 b) // FuzzyTrapezoidLeft +{ + if (x <= a) + return 1; + else if ((a < x) && (x <= b)) + return (b - x) / (b - a); + else if (x > b) + return 0; + else + return 0; +} +/*****************求隶属度(梯形右)*******************/ +float32 FTraR(float32 x, float32 a, float32 b) // FuzzyTrapezoidRight +{ + if (x <= a) + return 0; + if ((a < x) && (x < b)) + return (x - a) / (b - a); + if (x >= b) + return 1; + else + return 1; +} +/****************三角形反模糊化处理**********************/ +float32 uFTri(float32 x, float32 a, float32 b, float32 c) +{ + float32 y, z; + z = (b - a) * x + a; + y = c - (c - b) * x; + return (y + z) / 2; +} +/*******************梯形(左)反模糊化***********************/ +float32 uFTraL(float32 x, float32 a, float32 b) +{ + return b - (b - a) * x; +} +/*******************梯形(右)反模糊化***********************/ +float32 uFTraR(float32 x, float32 a, float32 b) +{ + return (b - a) * x + a; +} +/**************************求交集****************************/ +float32 fand(float32 a, float32 b) +{ + return (a < b) ? a : b; +} +/**************************求并集****************************/ +float32 forr(float32 a, float32 b) +{ + return (a < b) ? b : a; +} + +static float32 _PID(struct PID_X *self, float32 target, float32 feedback) +{ + float32 pwm_var; // pwm调整量 + float32 iError; // 当前误差 + float32 set, input; + CLASSICPID *pri = &self->pri; + // 计算隶属度表 + float32 es[7], ecs[7], e; + float32 form[7][7]; + int i = 0, j = 0; + int MaxX = 0, MaxY = 0; + + // 记录隶属度最大项及相应推理表的p、i、d值 + float32 lsd; + int temp_p, temp_d, temp_i; + float32 detkp, detkd, detki; // 推理后的结果 + + // 输入格式的转化及偏差计算 + set = target; + input = feedback; + iError = set - input; // 偏差 + + e = iError; + ec = iError - pri->lasterror; + + // 当温度差的绝对值小于Emax时,对pid的参数进行调整 + if (fabs(iError) <= Emax) + { + // 计算iError在es与ecs中各项的隶属度 + es[NB] = FTraL(e * 5, -3, -1); // e + es[NM] = FTri(e * 5, -3, -2, 0); + es[NS] = FTri(e * 5, -3, -1, 1); + es[ZO] = FTri(e * 5, -2, 0, 2); + es[PS] = FTri(e * 5, -1, 1, 3); + es[PM] = FTri(e * 5, 0, 2, 3); + es[PB] = FTraR(e * 5, 1, 3); + + ecs[NB] = FTraL(ec * 30, -3, -1); // ec + ecs[NM] = FTri(ec * 30, -3, -2, 0); + ecs[NS] = FTri(ec * 30, -3, -1, 1); + ecs[ZO] = FTri(ec * 30, -2, 0, 2); + ecs[PS] = FTri(ec * 30, -1, 1, 3); + ecs[PM] = FTri(ec * 30, 0, 2, 3); + ecs[PB] = FTraR(ec * 30, 1, 3); + + // 计算隶属度表,确定e和ec相关联后表格各项隶属度的值 + for (i = 0; i < 7; i++) + { + for (j = 0; j < 7; j++) + { + form[i][j] = fand(es[i], ecs[j]); + } + } + + // 取出具有最大隶属度的那一项 + for (i = 0; i < 7; i++) + { + for (j = 0; j < 7; j++) + { + if (form[MaxX][MaxY] < form[i][j]) + { + MaxX = i; + MaxY = j; + } + } + } + // 进行模糊推理,并去模糊 + lsd = form[MaxX][MaxY]; + temp_p = kp[MaxX][MaxY]; + temp_d = kd[MaxX][MaxY]; + temp_i = ki[MaxX][MaxY]; + + if (temp_p == NB) + detkp = uFTraL(lsd, -0.3, -0.1); + else if (temp_p == NM) + detkp = uFTri(lsd, -0.3, -0.2, 0); + else if (temp_p == NS) + detkp = uFTri(lsd, -0.3, -0.1, 0.1); + else if (temp_p == ZO) + detkp = uFTri(lsd, -0.2, 0, 0.2); + else if (temp_p == PS) + detkp = uFTri(lsd, -0.1, 0.1, 0.3); + else if (temp_p == PM) + detkp = uFTri(lsd, 0, 0.2, 0.3); + else if (temp_p == PB) + detkp = uFTraR(lsd, 0.1, 0.3); + + if (temp_d == NB) + detkd = uFTraL(lsd, -3, -1); + else if (temp_d == NM) + detkd = uFTri(lsd, -3, -2, 0); + else if (temp_d == NS) + detkd = uFTri(lsd, -3, 1, 1); + else if (temp_d == ZO) + detkd = uFTri(lsd, -2, 0, 2); + else if (temp_d == PS) + detkd = uFTri(lsd, -1, 1, 3); + else if (temp_d == PM) + detkd = uFTri(lsd, 0, 2, 3); + else if (temp_d == PB) + detkd = uFTraR(lsd, 1, 3); + + if (temp_i == NB) + detki = uFTraL(lsd, -0.06, -0.02); + else if (temp_i == NM) + detki = uFTri(lsd, -0.06, -0.04, 0); + else if (temp_i == NS) + detki = uFTri(lsd, -0.06, -0.02, 0.02); + else if (temp_i == ZO) + detki = uFTri(lsd, -0.04, 0, 0.04); + else if (temp_i == PS) + detki = uFTri(lsd, -0.02, 0.02, 0.06); + else if (temp_i == PM) + detki = uFTri(lsd, 0, 0.04, 0.06); + else if (temp_i == PB) + detki = uFTraR(lsd, 0.02, 0.06); + + // pid三项系数的修改 + pri->pKp += detkp; + pri->pKi += detki; + if (pri->kd_e) + { + pri->pKd += detkd; + } + else + { + pri->pKd = 0; // 取消微分作用 + } + + // 对Kp,Ki进行限幅 + if (pri->pKp < 0) + { + pri->pKp = 0; + } + if (pri->pKi < 0) + { + pri->pKi = 0; + } + + // 计算新的K1,nKi,nKd + pri->nKp = pri->pKp + pri->pKi + pri->pKd; + pri->nKi = -(pri->pKp + 2 * pri->pKd); + pri->nKd = pri->pKd; + } + + if (iError > Emax) + { + pri->out = pri->max; + pwm_var = 0; + pri->flag = 1; // 设定标志位,如果误差超过了门限值,则认为当控制量第一次到达给定值时,应该采取下面的 抑制超调 的措施 + } + else if (iError < -Emax) + { + pri->out = pri->min; + pwm_var = 0; + } + else if (fabsf(iError) <= Emin) + { + pwm_var = 0; + } + else + { + if (iError < Emid && pri->flag == 1) // 第一次超过(设定值-Emid(-0.08)摄氏度),是输出为零,防止超调,也可以输出其他值,不至于太小而引起震荡 + { + pri->out = 0; + pri->flag = 0; + } + else if (-iError > Emid) // 超过(设定+Emid(+0.08)摄氏度) + { + pwm_var = -1; + } + else + { + // 增量计算 + pwm_var = (pri->nKp * iError // e[k] + + pri->nKi * pri->lasterror // e[k-1] + + pri->nKd * pri->preverror); // e[k-2] + } + if (pwm_var >= Umax) + pwm_var = Umax; // 调整值限幅,防止积分饱和 + if (pwm_var <= Umin) + pwm_var = Umin; // 调整值限幅,防止积分饱和 + } + pri->preverror = pri->lasterror; + pri->lasterror = iError; + + pri->out += pwm_var; // 调整PWM输出 + + if (pri->out > pri->max) + pri->out = pri->max; // 输出值限幅 + if (pri->out < pri->min) + pri->out = pri->min; // 输出值限幅 + + return pri->out; +} + +/*整定开始前的预处理,判断状态及初始化变量*/ +static void tune_pretreatment(struct PID_X *self) +{ + CLASSIC_AUTOTUNE *tune = &self->tune; + CLASSICPID *vPID = &self->pri; + + tune->tuneTimer = 0; + tune->startTime = 0; + tune->endTime = 0; + tune->outputStep = 100; + + if (*vPID->pSV >= *vPID->pPV) + { + tune->initialStatus = 1; + tune->outputStatus = 0; + } + else + { + tune->initialStatus = 0; + tune->outputStatus = 1; + } + tune->tuneEnable = 1; + tune->preEnable = 0; + tune->zeroAcrossCounter = 0; + tune->riseLagCounter = 0; + tune->fallLagCounter = 0; +} + +/*计算PID参数值*/ +static void calculation_parameters(struct PID_X *self) +{ + CLASSIC_AUTOTUNE *tune = &self->tune; + CLASSICPID *vPID = &self->pri; + float32 kc = 0.0f; + float32 tc = 0.0f; + float32 zn[3][3] = {{0.5f, 100000.0f, 0.0f}, {0.45f, 0.8f, 0.0f}, {0.6f, 0.5f, 0.125f}}; + + tc = (tune->endTime - tune->startTime) * tune->tunePeriod / 1000.0; + kc = (8.0f * tune->outputStep) / (PI * (tune->maxPV - tune->minPV)); + + vPID->pKp = zn[tune->controllerType][0] * kc; // 比例系数 + vPID->pKi = vPID->pKp * tune->tunePeriod / (zn[tune->controllerType][1] * tc); // 积分系数 + vPID->pKd = vPID->pKp * zn[tune->controllerType][2] * tc / tune->tunePeriod; // 微分系数 +} + +/** + * @brief 自整定函数 + * @param {PID_X} *self + * @return {*} + * @note 成员变量tuneEnable、preEnable和controllerType需要提前赋值。tuneEnable变量值为0时是使用PID控制器,而tuneEnable变量值为1时是开启整定过程,当tuneEnable变量值为2时是指示整定失败。preEnable变量在整定前赋值为1,表示先做预处理。而controllerType则根据所整定的控制器的类型来定,主要用于参数的计算。 + */ +static uint8_t _auto_tune(struct PID_X *self) +{ + CLASSIC_AUTOTUNE *tune = &self->tune; + CLASSICPID *vPID = &self->pri; + /*整定开始前的预处理,只执行一次*/ + if (tune->preEnable == 1) + { + tune_pretreatment(self); + } + + uint32_t tuneDuration = 0; + tune->tuneTimer++; + tuneDuration = (tune->tuneTimer * tune->tunePeriod) / 1000; + if (tuneDuration > (10 * 60)) // 整定过程持续超过10分钟,未能形成有效振荡,整定失败 + { + tune->tuneEnable = 2; + tune->preEnable = 1; + return tune->tuneEnable; + } + + if (*vPID->pSV >= *vPID->pPV) // 设定值大于测量值,则开执行单元 + { + tune->riseLagCounter++; + tune->fallLagCounter = 0; + + if (tune->riseLagCounter > LAG_PHASE) + { + *vPID->pMV = vPID->max; + if (tune->outputStatus == 0) + { + tune->outputStatus = 1; + tune->zeroAcrossCounter++; + + if (tune->zeroAcrossCounter == 3) + { + tune->startTime = tune->tuneTimer; + } + } + } + } + else + { + tune->riseLagCounter = 0; + tune->fallLagCounter++; + + if (tune->fallLagCounter > LAG_PHASE) + { + *vPID->pMV = vPID->min; + if (tune->outputStatus == 1) + { + tune->outputStatus = 0; + tune->zeroAcrossCounter++; + + if (tune->zeroAcrossCounter == 3) + { + tune->startTime = tune->tuneTimer; + } + } + } + } + + if (tune->zeroAcrossCounter == 3) // 已经两次过零,可以记录波形数据 + { + if (tune->initialStatus == 1) // 初始设定值大于测量值,则区域3出现最小值 + { + if (*vPID->pPV < tune->minPV) + { + tune->minPV = *vPID->pPV; + } + } + else if (tune->initialStatus == 0) // 初始设定值小于测量值,则区域3出现最大值 + { + if (*vPID->pPV > tune->maxPV) + { + tune->maxPV = *vPID->pPV; + } + } + } + else if (tune->zeroAcrossCounter == 4) // 已经三次过零,记录另半波的数据 + { + if (tune->initialStatus == 1) // 初始设定值大于测量值,则区域4出现最大值 + { + if (*vPID->pPV > tune->maxPV) + { + tune->maxPV = *vPID->pPV; + } + } + else if (tune->initialStatus == 0) // 初始设定值小于测量值,则区域4出现最小值 + { + if (*vPID->pPV < tune->minPV) + { + tune->minPV = *vPID->pPV; + } + } + } + else if (tune->zeroAcrossCounter == 5) // 已经四次过零,振荡已形成可以整定参数 + { + calculation_parameters(self); + + tune->tuneEnable = 0; + tune->preEnable = 1; + } + + return tune->tuneEnable; +} + +void pid_x_constructor(struct PID_X *self) +{ + self->PID = _PID; + self->AUTO_TUNE = _auto_tune; + self->pri.flag = 0; + self->pri.out = 0; + self->tune.preEnable = 1; +} diff --git a/User/system/lib/control/custom/pid_x.h b/User/system/lib/control/custom/pid_x.h new file mode 100644 index 0000000..2be7c04 --- /dev/null +++ b/User/system/lib/control/custom/pid_x.h @@ -0,0 +1,71 @@ +#ifndef __PID_X_H__ +#define __PID_X_H__ +#include "lib.h" + +/*定义PID对象类型*/ +typedef struct CLASSIC +{ + float32 *pPV; // 测量值指针 + float32 *pSV; // 设定值指针 + float32 *pMV; // 输出值指针 + BOOL *pMA; // 手自动操作指针 + + float32 out; // 输出值 + float32 setpoint; // 设定值 + float32 lasterror; // 前一拍偏差 + float32 preverror; // 前两拍偏差 + float32 max; // 输出值上限 + float32 min; // 输出值下限 + + uint16_t flag; // 状态标志位 + + float32 pKp; // 比例系数 + float32 pKi; // 积分系数 + float32 pKd; // 微分系数 + + float32 nKp; // 比例系数 + float32 nKi; // 积分系数 + float32 nKd; // 微分系数 + + BOOL direct; // 正反作用 + BOOL sm; // 设定值平滑 + BOOL cas; // 串级设定 + BOOL pac; // 输出防陡变 + BOOL kd_e; // 微分使能 +} CLASSICPID; + +// 定义整定参数 +typedef struct +{ + uint8_t tuneEnable : 2; // 整定与PID控制开关,0:PID控制;1:参数整定;2:整定失败 + uint8_t preEnable : 2; // 预处理使能,在开始整定前置位 + uint8_t initialStatus : 1; // 记录开始整定前偏差的初始状态 + uint8_t outputStatus : 1; // 记录输出的初始状态,0允许上升过零计数;1允许下降过零计数 + uint8_t controllerType : 2; // 控制器类型:0,P控制器;1,PI控制器;2,PID控制器 + + uint8_t zeroAcrossCounter; // 过零点计数器,每次输出改变加1,比实际过零次数多1 + uint8_t riseLagCounter; // 上升迟滞时间计数器 + uint8_t fallLagCounter; // 下降迟滞时间计数器 + + uint16_t tunePeriod; // 整定采样周期 + uint32_t tuneTimer; // 整定计时器 + uint32_t startTime; // 记录波形周期起始时间 + uint32_t endTime; // 记录波形周期结束时间 + + float32 outputStep; // 输出阶跃d + float32 maxPV; // 振荡波形中测量值的最大值 + float32 minPV; // 振荡波形中测量值的最小值 +} CLASSIC_AUTOTUNE; + +typedef struct PID_X +{ + /* 控制接口 */ + float32 (*PID)(struct PID_X *self, float32 target, float32 feedback); + uint8_t (*AUTO_TUNE)(struct PID_X *self); + /* private */ + CLASSICPID pri; + CLASSIC_AUTOTUNE tune; +} pid_x_t; + +extern void pid_x_constructor(struct PID_X *self); +#endif // __PID_X_H__ diff --git a/User/system/lib/control/custom/pid_zh.c b/User/system/lib/control/custom/pid_zh.c new file mode 100644 index 0000000..2156d3a --- /dev/null +++ b/User/system/lib/control/custom/pid_zh.c @@ -0,0 +1,467 @@ +#include "pid_zh.h" +#include "sys.h" +#include + +// 定义输出量比例因子 +#ifdef GPS3000 +#define KUP 0.0f // #define KUP 3.0f +#define KUI 0.00f +#define KUD 0.0f // #define KUP 3.0f +#else +#define KUP 3.0f +#define KUI 0.0f +#define KUD 0.0f +#endif + +// 模糊集合 +#define NL -3 +#define NM -2 +#define NS -1 +#define ZE 0 +#define PS 1 +#define PM 2 +#define PL 3 + +// 定义偏差E的范围,因为设置了非线性区间,误差在10时才开始进行PID调节,这里E的范围为10 +#define MAXE (10) +#define MINE (-MAXE) +// 定义EC的范围,因为变化非常缓慢!,每次的EC都非常小,这里可以根据实际需求来调整, +#define MAXEC (10) +#define MINEC (-MAXEC) +// 定义e,ec的量化因子 +#define KE 3 / MAXE +#define KEC 3 / MAXEC + +static const float32 fuzzyRuleKp[7][7] = { + PL, PL, PM, PL, PS, PM, PL, + PL, PM, PM, PM, PS, PM, PL, + PM, PS, PS, PS, PS, PS, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PS, PS, PS, PS, PS, PM, PM, + PM, PM, PM, PM, PL, PL, PL, + PM, PL, PL, PL, PL, PL, PL}; + +static const float32 fuzzyRuleKi[7][7] = { + PL, PL, PL, PL, PM, PL, PL, + PL, PL, PM, PM, PM, PL, PL, + PM, PM, PS, PS, PS, PM, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PM, PS, PS, PS, PS, PM, PM, + PM, PM, PS, PM, PM, PL, PL, + PM, PL, PM, PL, PL, PL, PL}; + +/* +static const float32 fuzzyRuleKi[7][7] = { + NL, NL, NL, NL, NM, NL, NL, + NL, NL, NM, NM, NM, NL, NL, + NM, NM, NS, NS, NS, NM, NM, + NM, NS, ZE, ZE, ZE, NS, NM, + NM, NS, NS, NS, NS, NM, NM, + NM, NM, NS, NM, NM, NL, NL, + NM, NL, NM, NL, NL, NL, NL}; +*/ + +static const float32 fuzzyRuleKd[7][7] = { + PS, PS, ZE, ZE, ZE, PL, PL, + PS, PS, PS, PS, ZE, PS, PM, + PL, PL, PM, PS, ZE, PS, PM, + PL, PM, PM, PS, ZE, PS, PM, + PL, PM, PS, PS, ZE, PS, PS, + PM, PS, PS, PS, ZE, PS, PS, + PS, ZE, ZE, ZE, ZE, PL, PL}; + +/* +static const float32 fuzzyRuleKp[7][7] = { + PL, PL, PM, PM, PS, ZE, ZE, + PL, PL, PM, PS, PS, ZE, NS, + PM, PM, PM, PS, ZE, NS, NS, + PM, PM, PS, ZE, NS, NM, NM, + PS, PS, ZE, NS, NS, NM, NM, + PS, ZE, NS, NM, NM, NM, NL, + ZE, ZE, NM, NM, NM, NL, NL}; + +static const float32 fuzzyRuleKi[7][7] = { + NL, NL, NM, NM, NS, ZE, ZE, + NL, NL, NM, NS, NS, ZE, ZE, + NL, NM, NS, NS, ZE, PS, PS, + NM, NM, NS, ZE, PS, PM, PM, + NM, NS, ZE, PS, PS, NM, PL, + ZE, ZE, PS, PS, PM, PL, PL, + ZE, ZE, PS, PM, PM, PL, PL}; + +static const float32 fuzzyRuleKd[7][7] = { + PS, NS, NL, NL, NL, NM, PS, + PS, NS, NL, NM, NM, NS, ZE, + ZE, NS, NM, NM, NS, NS, ZE, + ZE, NS, NS, NS, NS, NS, ZE, + + ZE, ZE, ZE, ZE, ZE, ZE, ZE, + PL, NS, PS, PS, PS, PS, PL, + PL, PM, PM, PM, PS, PS, PL}; +*/ + +static void fuzzy(float32 e, float32 ec, FUZZY_PID_ZH_t *fuzzy_pid) +{ + + float32 etemp, ectemp; + float32 eLefttemp, ecLefttemp; // ec,e,左隶属度 + float32 eRighttemp, ecRighttemp; + + int eLeftIndex, ecLeftIndex; // 模糊位置标号 + int eRightIndex, ecRightIndex; + e = RANGE(e, MINE, MAXE); + ec = RANGE(ec, MINEC, MAXEC); + e = e * KE; + ec = ec * KEC; + + etemp = e > 3.0f ? 0.0f : (e < -3.0f ? 0.0f : (e >= 0.0f ? (e >= 2.0f ? 2.5f : (e >= 1.0f ? 1.5f : 0.5f)) : (e >= -1.0f ? -0.5f : (e >= -2.0f ? -1.5f : (e >= -3.0f ? -2.5f : 0.0f))))); + eLeftIndex = (int)((etemp - 0.5f) + 3); //[-3,2] -> [0,5] + eRightIndex = (int)((etemp + 0.5f) + 3); + eLefttemp = etemp == 0.0f ? 0.0f : ((etemp + 0.5f) - e); + eRighttemp = etemp == 0.0f ? 0.0f : (e - (etemp - 0.5f)); + + ectemp = ec > 3.0f ? 0.0f : (ec < -3.0f ? 0.0f : (ec >= 0.0f ? (ec >= 2.0f ? 2.5f : (ec >= 1.0f ? 1.5f : 0.5f)) : (ec >= -1.0f ? -0.5f : (ec >= -2.0f ? -1.5f : (ec >= -3.0f ? -2.5f : 0.0f))))); + ecLeftIndex = (int)((ectemp - 0.5f) + 3); //[-3,2] -> [0,5] + ecRightIndex = (int)((ectemp + 0.5f) + 3); + ecLefttemp = ectemp == 0.0f ? 0.0f : ((ectemp + 0.5f) - ec); + ecRighttemp = ectemp == 0.0f ? 0.0f : (ec - (ectemp - 0.5f)); + + /*************************************反模糊*************************************/ + + fuzzy_pid->kp = (eLefttemp * ecLefttemp * fuzzyRuleKp[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKp[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKp[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKp[eRightIndex][ecRightIndex]); + + fuzzy_pid->ki = (eLefttemp * ecLefttemp * fuzzyRuleKi[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKi[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKi[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKi[eRightIndex][ecRightIndex]); + + fuzzy_pid->kd = (eLefttemp * ecLefttemp * fuzzyRuleKd[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKd[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKd[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKd[eRightIndex][ecRightIndex]); + // 对解算出的KP,KI,KD进行量化映射 + fuzzy_pid->kp = fuzzy_pid->kp * fuzzy_pid->kup; + fuzzy_pid->ki = fuzzy_pid->ki * fuzzy_pid->kui; + fuzzy_pid->kd = fuzzy_pid->kd * fuzzy_pid->kud; +} + +static void smoothSetpoint(struct PID_FUZZY_ZH *self, float32 target_sv) +{ +#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION + pid_zh_position_t *pri = &self->pri; +#else + pid_common_increment_t *pri = &self->pri; +#endif + float32 stepIn = (pri->sv_range) * 0.1f; + float32 kFactor = 0.0f; + if (fabs(pri->ref - target_sv) <= stepIn) + { + pri->ref = target_sv; + } + else + { + if (pri->ref - target_sv > 0) + { + kFactor = -1.0f; + } + else if (pri->ref - target_sv < 0) + { + kFactor = 1.0f; + } + else + { + kFactor = 0.0f; + } + pri->ref = pri->ref + kFactor * stepIn; + } +} + +/*封装模糊接口*/ +static void compensate(float32 e, float32 ec, FUZZY_PID_ZH_t *fuzzy_d) +{ + fuzzy(e, ec, fuzzy_d); +} + +/** + * @brief 复位PID积分及微分控制数据 + * @param {PID_FUZZY_ZH} *self + * @return {*} + */ +static void _restctrl(struct PID_FUZZY_ZH *self) +{ + self->pri.pre_error = 0; + self->pri.sum_iterm = 0; +#if INCOMPLETE_DIFFEREN == 1 + self->pri.lastdev = 0; +#endif +} + +/** + * @brief 更新最大最小值 + * @param {PID_FUZZY_ZH} *self + * @param {float32} out_min + * @param {float32} out_max + * @return {*} + * @note + */ +static void _set_range(struct PID_FUZZY_ZH *self, float32 out_min, float32 out_max) +{ + self->pri.out_max = out_max; + self->pri.out_min = out_min; +} + +/** + * @brief 使能积分控制 + * @param {PID_FUZZY_ZH} *self + * @param {BOOL} enable + * @return {*} + * @note + */ +// static void _set_ki_enable(struct PID_FUZZY_ZH *self, BOOL enable) +// { +// self->pri.ki_enable = enable; +// } + +/** + * @brief 使能微分控制 + * @param {PID_FUZZY_ZH} *self + * @param {BOOL} enable + * @return {*} + * @note + */ +static void _set_kd_enable(struct PID_FUZZY_ZH *self, BOOL enable) +{ + self->pri.kd_enable = enable; +} + +/* + * Function:使能平滑控制 + * parameter:*pid需要配,PID参数结构指针,sv_range控制范围sv的范围 + * return:无 + */ +static void _set_smooth_enable(struct PID_FUZZY_ZH *self, BOOL enable, float32 sv_range) +{ +#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION + pid_zh_position_t *pri = &self->pri; +#else + pid_common_increment_t *pri = &self->pri; +#endif + pri->sm = enable; + pri->sv_range = sv_range; +} + +// 设置控制参数 +static void _set_ctrl_prm(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead, + float32 out_min, float32 out_max) +{ + self->open = TRUE; + self->fuzzy.kup = KUP; + self->fuzzy.kui = KUI; + self->fuzzy.kud = KUD; +#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION + pid_zh_position_t *pri = &self->pri; + osel_memset((uint8_t *)pri, 0, sizeof(pid_zh_position_t)); + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; + pri->detach = FALSE; + pri->sm = FALSE; +#else + pid_common_increment_t *pri = &self->pri; + osel_memset((uint8_t *)pri, 0, sizeof(pid_common_increment_t)); + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; +#endif + + if (kd > 0) + { + pri->kd_enable = TRUE; + } + else + { + pri->kd_enable = FALSE; + } +} + +static void _update_ctrl_prm(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead, + float32 out_min, float32 out_max) +{ +#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION + pid_zh_position_t *pri = &self->pri; + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; + pri->detach = FALSE; + pri->sm = FALSE; +#else + pid_common_increment_t *pri = &self->pri; + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; +#endif + + if (kd > 0) + { + pri->kd_enable = TRUE; + } + else + { + pri->kd_enable = FALSE; + } +} + +/** + * @brief 非0时配置为积分分离+抗积分饱和PID,否则为普通抗积分饱和PID + * @param {PID_FUZZY_ZH} *self + * @param {float32} max_err + * @param {BOOL} mode + * @return {*} + */ +static void _set_cfg(struct PID_FUZZY_ZH *self, float32 max_err, BOOL mode) +{ + self->pri.err_limit = max_err; + self->pri.detach = mode == FALSE ? FALSE : TRUE; +} + +#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION +static float32 _PID(struct PID_FUZZY_ZH *self, float32 target, float32 feedback) +{ + float32 error = 0; + float32 insert = 0; + float32 ec = 0; + float32 kd = 0; +#if INCOMPLETE_DIFFEREN == 1 + float32 thisdev = 0; +#else + // float32 dinput = 0.0f; +#endif + float32 temp_iterm = 0.0f; + pid_zh_position_t *pri = &self->pri; + + /*获取期望值与实际值,进行偏差计算*/ + if (pri->sm == 1) + { + smoothSetpoint(self, target); + } + else + { + pri->ref = target; + } + + pri->feed_back = feedback; + error = pri->ref - pri->feed_back; + if (fabs(error) <= pri->err_dead) + error = 0; + + /* fuzzy control caculate */ + ec = error - pri->pre_error; + if (self->open == TRUE) + { + compensate(error, ec, &self->fuzzy); + } + + /*根据PID配置的模式,获取积分数据,进行积分累加*/ + if (pri->out >= pri->out_max) + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + if (error < 0) + { + temp_iterm = (pri->ki + self->fuzzy.ki) * error; + } + } + } + else if (pri->out <= pri->out_min) + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + if (error > 0) + { + temp_iterm = (pri->ki + self->fuzzy.ki) * error; + } + } + } + else + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + temp_iterm = (pri->ki + self->fuzzy.ki) * error; + } + } + pri->sum_iterm += temp_iterm; + /* limt integral */ + pri->sum_iterm = RANGE(pri->sum_iterm, pri->out_min, pri->out_max); + /* + if (pri->sum_ref) + pri->sum_iterm = RANGE(pri->sum_iterm, pri->sum_ref - 1.0f, pri->sum_ref + 1.0f); + else + pri->sum_iterm = RANGE(pri->sum_iterm, pri->out_min, pri->out_max); + */ +#if INCOMPLETE_DIFFEREN == 1 + /*不完全微分*/ + thisdev = (pri->kd + self->fuzzy.kd) * (1.0 - pri->alpha) * (error - pri->pre_error) + pri->alpha * pri->lastdev; + /*caculate pid out*/ + pri->out = (pri->kp + self->fuzzy.kp) * error + pri->sum_iterm * insert + thisdev; + + /*record last dev result*/ + pri->lastdev = thisdev; +#else + + if (pri->kd_enable == TRUE) + { + kd = pri->kd + self->fuzzy.kd; + } + else + { + kd = 0; + } + + pri->out = (pri->kp + self->fuzzy.kp) * error + pri->sum_iterm * insert + (error - pri->pre_error) * (kd); + // pri->out += pri->sum_ref; + +#endif + + pri->pre_error = error; + /*record last feedback sensor result*/ + pri->pre_feed_back = pri->feed_back; + /*limt pid output*/ + pri->out = RANGE(pri->out, pri->out_min, pri->out_max); + return pri->out; +} +#else +#endif + +void pid_zh_constructor(struct PID_FUZZY_ZH *self) +{ + self->set_ctrl_prm = _set_ctrl_prm; + self->update_ctrl_prm = _update_ctrl_prm; + self->set_cfg = _set_cfg; + self->set_smooth_enable = _set_smooth_enable; + // self->set_ki_enable = _set_ki_enable; + self->set_kd_enable = _set_kd_enable; + self->set_range = _set_range; + self->restctrl = _restctrl; + self->PID = _PID; +} diff --git a/User/system/lib/control/custom/pid_zh.h b/User/system/lib/control/custom/pid_zh.h new file mode 100644 index 0000000..06f551a --- /dev/null +++ b/User/system/lib/control/custom/pid_zh.h @@ -0,0 +1,73 @@ +#ifndef __PID_ZH_H__ +#define __PID_ZH_H__ +#include "lib.h" +#include "pid_auto_tune.h" + +#define GPS2000 + +typedef struct +{ + float32 ref; + float32 feed_back; + float32 pre_feed_back; + float32 pre_error; + float32 sum_ref; + float32 sum_iterm; + float32 kp; + float32 ki; + float32 kd; + float32 err_limit; + BOOL detach; + float32 err_dead; +#if INCOMPLETE_DIFFEREN == 1 + float32 alpha; + float32 lastdev; +#endif + float32 out; + float32 out_max; + float32 out_min; + float32 sv_range; + BOOL sm; + BOOL ki_enable; + BOOL kd_enable; +} pid_zh_position_t; // 位置式PID + +typedef struct +{ + float32 kp; + float32 ki; + float32 kd; + + float32 kup; + float32 kui; + float32 kud; +} FUZZY_PID_ZH_t; + +// 模糊PID +typedef struct PID_FUZZY_ZH +{ + /* 设置PID三个参数 */ + void (*set_ctrl_prm)(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead, + float32 out_min, float32 out_max); // 设置PID参数 + void (*update_ctrl_prm)(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead, + float32 out_min, float32 out_max); // 更新PID参数 + void (*set_range)(struct PID_FUZZY_ZH *self, float32 out_min, float32 out_max); // 更新最大最小值 + void (*set_cfg)(struct PID_FUZZY_ZH *self, float32 max_err, BOOL mode); // 配置PID模式,默认不使用积分分离 + void (*set_smooth_enable)(struct PID_FUZZY_ZH *self, BOOL enable, float32 sv_range); // 设置平滑范围 + // void (*set_ki_enable)(struct PID_FUZZY *self, BOOL enable); + // 微分开启使能 + void (*set_kd_enable)(struct PID_FUZZY_ZH *self, BOOL enable); + void (*restctrl)(struct PID_FUZZY_ZH *self); // 复位PID积分及微分控制数据 + /* 控制接口 */ + float32 (*PID)(struct PID_FUZZY_ZH *self, float32 target, float32 feedback); + + pid_zh_position_t pri; + + BOOL open; // 是否使用模糊PID控制 + + FUZZY_PID_ZH_t fuzzy; + +} pid_zh_t; // 模糊PID + +extern void pid_zh_constructor(struct PID_FUZZY_ZH *self); +#endif diff --git a/User/system/lib/control/custom/pid_zh1.c b/User/system/lib/control/custom/pid_zh1.c new file mode 100644 index 0000000..977f169 --- /dev/null +++ b/User/system/lib/control/custom/pid_zh1.c @@ -0,0 +1,619 @@ + +#include +#include "pid_zh1.h" + +// 定义输出量比例因子 +#define KUP 1.0f +#define KUI 1.0f +#define KUD 1.0f + +// 模糊集合 +#define NL -3 +#define NM -2 +#define NS -1 +#define ZE 0 +#define PS 1 +#define PM 2 +#define PL 3 + +// 定义偏差E的范围,因为设置了非线性区间,误差在10时才开始进行PID调节,这里E的范围为10 +#define MAXE (10) +#define MINE (-MAXE) +// 定义EC的范围,因为变化非常缓慢!,每次的EC都非常小,这里可以根据实际需求来调整, +#define MAXEC (10) +#define MINEC (-MAXEC) +// 定义e,ec的量化因子 +#define KE 3 / MAXE +#define KEC 3 / MAXEC +/* +static const float fuzzyRuleKp[7][7] = { + PL, PL, PM, PL, PS, PM, PL, + PL, PM, PM, PM, PS, PM, PL, + PM, PS, PS, PS, PS, PS, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PS, PS, PS, PS, PS, PM, PM, + PM, PM, PM, PM, PL, PL, PL, + PM, PL, PL, PL, PL, PL, PL}; + +static const float fuzzyRuleKi[7][7] = { + PL, PL, PL, PL, PM, PL, PL, + PL, PL, PM, PM, PM, PL, PL, + PM, PM, PS, PS, PS, PM, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PM, PS, PS, PS, PS, PM, PM, + PM, PM, PS, PM, PM, PL, PL, + PM, PL, PM, PL, PL, PL, PL}; + +static const float fuzzyRuleKd[7][7] = { + PS, PS, ZE, ZE, ZE, PL, PL, + PS, PS, PS, PS, ZE, PS, PM, + PL, PL, PM, PS, ZE, PS, PM, + PL, PM, PM, PS, ZE, PS, PM, + PL, PM, PS, PS, ZE, PS, PS, + PM, PS, PS, PS, ZE, PS, PS, + PS, ZE, ZE, ZE, ZE, PL, PL}; +*/ +static const float fuzzyRuleKp[7][7] = { + PL, PL, PM, PL, PS, PM, PL, + PL, PM, PM, PM, PS, PM, PL, + PM, PS, PS, PS, PS, PS, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PS, PS, PS, PS, PS, PM, PM, + PM, PM, PM, PM, PL, PL, PL, + PM, PL, PL, PL, PL, PL, PL}; + +static const float fuzzyRuleKi[7][7] = { + PL, PL, PL, PL, PM, PL, PL, + PL, PL, PM, PM, PM, PL, PL, + PM, PM, PS, PS, PS, PM, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PM, PS, PS, PS, PS, PM, PM, + PM, PM, PS, PM, PM, PL, PL, + PM, PL, PM, PL, PL, PL, PL}; + +static const float fuzzyRuleKd[7][7] = { + PS, PS, ZE, ZE, ZE, PL, PL, + PS, PS, PS, PS, ZE, PS, PM, + PL, PL, PM, PS, ZE, PS, PM, + PL, PM, PM, PS, ZE, PS, PM, + PL, PM, PS, PS, ZE, PS, PS, + PM, PS, PS, PS, ZE, PS, PS, + PS, ZE, ZE, ZE, ZE, PL, PL}; + +static void fuzzy(float e, float ec, fuzzy_pid_t *fuzzy_pid) +{ + + float etemp, ectemp; + float eLefttemp, ecLefttemp; // 左隶属度 + float eRighttemp, ecRighttemp; // 右隶属度 + + int eLeftIndex, ecLeftIndex; // 模糊位置标号 + int eRightIndex, ecRightIndex; + e = RANGE(e, MINE, MAXE); + ec = RANGE(ec, MINEC, MAXEC); + e = e * KE; + ec = ec * KEC; + + etemp = e > 3.0f ? 0.0f : (e < -3.0f ? 0.0f : (e >= 0.0f ? (e >= 2.0f ? 2.5f : (e >= 1.0f ? 1.5f : 0.5f)) : (e >= -1.0f ? -0.5f : (e >= -2.0f ? -1.5f : (e >= -3.0f ? -2.5f : 0.0f))))); + eLeftIndex = (int)((etemp - 0.5f) + 3); + eRightIndex = (int)((etemp + 0.5f) + 3); + eLefttemp = etemp == 0.0f ? 0.0f : ((etemp + 0.5f) - e); + eRighttemp = etemp == 0.0f ? 0.0f : (e - (etemp - 0.5f)); + + ectemp = ec > 3.0f ? 0.0f : (ec < -3.0f ? 0.0f : (ec >= 0.0f ? (ec >= 2.0f ? 2.5f : (ec >= 1.0f ? 1.5f : 0.5f)) : (ec >= -1.0f ? -0.5f : (ec >= -2.0f ? -1.5f : (ec >= -3.0f ? -2.5f : 0.0f))))); + ecLeftIndex = (int)((ectemp - 0.5f) + 3); + ecRightIndex = (int)((ectemp + 0.5f) + 3); + ecLefttemp = ectemp == 0.0f ? 0.0f : ((ectemp + 0.5f) - ec); + ecRighttemp = ectemp == 0.0f ? 0.0f : (ec - (ectemp - 0.5f)); + + /*************************************反模糊*************************************/ + + fuzzy_pid->kp = (eLefttemp * ecLefttemp * fuzzyRuleKp[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKp[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKp[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKp[eRightIndex][ecRightIndex]); + + fuzzy_pid->ki = (eLefttemp * ecLefttemp * fuzzyRuleKi[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKi[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKi[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKi[eRightIndex][ecRightIndex]); + + fuzzy_pid->kd = (eLefttemp * ecLefttemp * fuzzyRuleKd[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKd[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKd[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKd[eRightIndex][ecRightIndex]); + // 对解算出的KP,KI,KD进行量化映射 + fuzzy_pid->kp = fuzzy_pid->kp * fuzzy_pid->kup; + fuzzy_pid->ki = fuzzy_pid->ki * fuzzy_pid->kui; + fuzzy_pid->kd = fuzzy_pid->kd * fuzzy_pid->kud; +} + +static void smooth_init(smart_pid_t *pid, BOOL sm_open, float maxTarget) +{ + if (!pid) + return; + + pid->sm_open = sm_open; + pid->maxTarget = maxTarget; +} + +static void smooth_target(smart_pid_t *pid, float *target) +{ + + if ((!pid) || (!target)) + return; + + if (!pid->maxTarget) + return; + + float sm_step = (pid->maxTarget) * 0.1f; + float k = 0.0f; + + if (fabs(pid->target - *target) <= sm_step) + { + pid->target = *target; + } + else + { + if (pid->target - *target > 0) + { + k = -1.0f; + } + else if (pid->target - *target < 0) + { + k = 1.0f; + } + else + { + k = 0.0f; + } + pid->target += k * sm_step; + } +} + +static void smart_pid_init(smart_pid_t *pid, float *duty, float *kp, float *ki, float *kd, float *errorDead, float *iDetachCondation, float *maxOut) +{ + if ((!pid) || (!duty) || (!kp) || (!ki) || (!kd) || (!iDetachCondation) || (!maxOut)) + return; + + pid->duty = *duty; + pid->kp = *kp; + pid->ki = *ki; + pid->kd = *kd; + pid->errorDead = *errorDead; + pid->iDetachCondation = *iDetachCondation; + pid->maxOutput = *maxOut; +} + +void cascade_pid_init(cascade_pid_t *pid, smart_pid_t *pid_outer, smart_pid_t *pid_inner) +{ + + smooth_init(&pid->outer, pid_outer->sm_open, pid_outer->maxTarget); + smooth_init(&pid->inner, pid_inner->sm_open, pid_inner->maxTarget); + + smart_pid_init(&pid->outer, &pid_outer->duty, &pid_outer->kp, &pid_outer->ki, &pid_outer->kd, &pid_outer->errorDead, &pid_outer->iDetachCondation, &pid_outer->maxOutput); + smart_pid_init(&pid->inner, &pid_inner->duty, &pid_inner->kp, &pid_inner->ki, &pid_inner->kd, &pid_inner->errorDead, &pid_inner->iDetachCondation, &pid_inner->maxOutput); +} + +void smart_pid_calc(smart_pid_t *pid, float *target, float *feedback) +{ + // 将旧error存起来 + pid->lastError = pid->error; + // 平滑处理目标值 + if (pid->sm_open == TRUE) + smooth_target(pid, target); + else + pid->target = *target; + // 计算新error + pid->error = pid->target - *feedback; + if (fabs(pid->error) <= pid->errorDead) + pid->error = 0.0f; + // 计算误差变化 + pid->dError = pid->error - pid->lastError; + // 选用模糊规则 + if (pid->fuzzy_open == TRUE) + { + fuzzy(pid->error, pid->dError, &pid->fuzzy_pid); + } + // 计算微分 + float dout = pid->dError * (pid->kd + pid->fuzzy_pid.kd); + // 计算比例 + float pout = pid->error * (pid->kp + pid->fuzzy_pid.kp); + // 积分分离 + if (fabs(pid->error) <= pid->iDetachCondation) + { + pid->integral += pid->error * (pid->ki + pid->fuzzy_pid.ki); + pid->iDetach = FALSE; + } + else + { + pid->iDetach = TRUE; + pid->integral = 0; + } + // 积分限幅 + if (pid->integral > pid->maxOutput) + pid->integral = pid->maxOutput; + else if (pid->integral < -pid->maxOutput) + pid->integral = -pid->maxOutput; + // 计算输出 + pid->output = pout + dout + pid->integral * (!pid->iDetach); + // 输出限幅 + if (pid->output > pid->maxOutput) + pid->output = pid->maxOutput; + else if (pid->output < -pid->maxOutput) + pid->output = -pid->maxOutput; +} + +void cascade_pid_calc(struct CascadePID *pid, float *outerRef, float *outerFdb, float *innerFdb) +{ + // 外环位置控制 + smart_pid_calc(&pid->cascade_pid.outer, outerRef, outerFdb); + // 内环速度控制 + smart_pid_calc(&pid->cascade_pid.inner, &pid->cascade_pid.outer.output, innerFdb); + // 内环输出就是串级PID的输出 + // pid->cascade_pid.output = pid->cascade_pid.inner.output; + pid->cascade_pid.output = pid->cascade_pid.outer.output; +} + +void pid_zh_constructor1(struct CascadePID *pid) +{ + pid->smart_pid_init = smart_pid_init; + pid->smart_pid_calc = smart_pid_calc; + pid->cascade_pid_init = cascade_pid_init; + pid->cascade_pid_calc = cascade_pid_calc; +} + +/* +典型输入信号 +L[1] -> 1/s +L[t] -> 1/s^2 +L[1/2t^2] -> 1/s^3 +系统传递函数 +G(s) = k/(TS+1) +G(s) = k/S^i(TS+1) +i = 0 0型系统 i = 1 I 型系统 I = 2 II 型系统 +系统开环传递函数: G(s) +系统闭环传递函数: G闭(s) = G(s) / 1 + G(s) +系统静差: R(s) = 1/1+G(s) +终值定理:limf(t) = lim s*G(s) + t->无穷 s->0 +o型系统,单位输入:r/s + e = lim f(t) = lim s*G(s) = G(s) = k/1+G(s) = k/ 1 + (Ts+1+k).. + t->无穷 s->0 s->0 s->0 = s->0 +*系统误差有给定和扰动引起的 +*线性系统符合叠加原理 +*动态性能指标 +超调 、过度过程时间、上升时间 tr 延迟时间 td 峰值指标tp +误差积分指标大 好小 好? +典型二阶系统 +G(s) = 1/ s^2 *(2ξwn)s + wn^2 +ξ:阻尼系统 +wn = 1/T:震荡频率 +如果有一个极点和零点很接近,可以忽略该极点。 +主导极点用二阶系统定义的 +开环传递函数 K T +复变函数 +频率特性 +阻容RC电路 一阶低通滤波器 一阶惰性系统 +Gs = 1/Ts+1 +正弦稳态 + +控制系统设计依据: +考虑到被控对象包含 弹簧储能、填料阻尼、EPM气压控制等主导环节,忽略其它非主导惯性、阻尼环节,将被控系统模型归纳为典型二阶阻尼震荡系统: +被控对象开环传递函数:G(s) = wn^2/ s*( s + 2ξwn) +未加控制器被控对象闭环传递函数:G(s) = wn^2/ (s^2 + (2ξwn)s + wn^2) + ξ :为系统阻尼比。跟阀座填料材、压力正相关(忽略其他非主导阻尼环节) + Wn :无阻尼自然震荡角频率。跟弹簧的固有振荡频率正相关(忽略其他非主导惯性环节) + +阀杆填料阻尼比: 0 < ξ < 1 + +系统特征方程s^2 + (2ξwn)s + wn^2 = 0 时,有两个共轭复根,要想系统稳定,根的实部要远离虚轴,且在允许情况下,越远越稳定。 +标准二阶系统是零型系统,存在静差。而且,考虑气体压缩比大,导致系统的惯性环节增大。 +因此需要控制器将系统变为I型系统来消除静差(增加积分环节),而且需要在控制器传递函数的零点增加最小项来克服系统的大惯性(增加微分环节)。因此,设计控制器类型为PID控制器。 + +※ 难点在于系统的无阻尼自然震荡角频率和阀座阻尼系数无法准确获得,整定算法计算的特性参数不一定合理。 +※ 另一个难点在于EPM本身的控制特性线性度差,会导致控制器的矫正环节达不到理想效果或在部分区间达不到理想效果,因此, + 系统会不稳定或在部分区间不稳定。 +※ EMP本身的控制线性度差,通过控制器弥补EPM性能的不足。 +(因为阀杆速度变化快慢,直接由EPM IP开度大小决定,因此考虑增加阀杆速度环控制来弥补EPM本身的不足) + +算法核心原理说明 : +核心算法: PID +    u(t) = k*(e(t) +∫e(t)dt + de(t)dt) + u(n) = k*(e(n) +  ∑e(n)/Ti + Td*(e(n) - e(n-1))) + +位置控制:PID + PD控制 +    误差在[-5%,5%] 内 PID 控制,控制静差 < 0.3% +    误差在[-100%,5%] 或 [5%,100%] 时,PD控制,防止积分引起的系统不稳定 +    +    积分分离:当误差<= 5% 时,加入积分 +              当误差> 5%时,积分分离、积分项清零 +    积分限幅: +              当积分项 >= 100%  积分项 =  100% +              当积分项 <= -100% 积分项 = -100% + +整定算法: 继电反馈整定 +    设定目标位置:额定行程 60% +    控制初始位置: < 60% +    施加最大控制量 ->检测实时位置->过零,计t0、上冲峰值 -> 施加最小控制量 -> 检测实时位置 -> 过零,计t1、下冲峰值— ↓ +      ↑ <—————————————————————————————————————————————————————————————————————————————————————————————————| + +    循环三次,记录系统稳态下波峰、波谷,和震荡周期Tu +    计算: Ku = (控制量最大值 - 控制量最小值)/ (位置波峰 - 位置波谷) +    查表:Kp = 0.8 * Ku +          Ti = 0.6 * Tu +          Td = 0.125 * Tu +          Ki = Kp / Ti = Kp / (0.6 * Tu) +          Kd = Kp * Td = Kp * 0.125 * Td + +速度控制算法: +    s1:初始位置AD值 +    s2:单位时间位置移动后AD值 +    v1:当前速度 +    v2:  前速度 +    v: 实时速度 +a:实时加速度 +t: 速度计算周期 +v = (s2 - s1) / t +a = (v2 - v1) / t + +    整定过程,分别整定上升过程平均速度和下降过程平均速度。 +    分别以上升和下降速度为PID 内环参考速度,计算速度控制量。 +    速度偏差 = 当前速度 - 参考速度 +    加速度 = 速度偏差变化(即位置的二阶导数) +速度控制量 = Kp*速度偏差  +  Ki * ∑速度偏差  + Kd * 加速度 + +串级控制 +    外环位置检测,进行速度控制 +    内环速度检测,进行位置控制 +     位置偏差 = 位置给定 - 位置反馈 +     位置偏差变化 = 位置偏差 - 上次位置偏差 +     速度控制量 = Kp1*位置偏差  +  Ki1 * ∑位置偏差  + Kd1 * 位置偏差变化 +     速度偏差 = 速度控制量 - 速度反馈 +     速度偏差变化 = 速度偏差 - 上次速度偏差 +     位置控制量 = Kp2*速度偏差  +  Ki2 * ∑速度偏差  + Kd2 * 速度偏差变化 +串级速度整定:??? + +automatic control theory +control system +linear and nonlinear system +线性连续系统 +离散系统 +modelling +analysis +矫正 +分析 时域分析方法 微分方程 传递函数 一阶系统 二阶系统 +频域分析方法 闭环特性 低频特性 高频特性 +根轨迹 +建模 分析 矫正 +离散系统 +非线性控制理论 +L变换 Z变换 +采样控制系统 数字控制系统 +条件稳定系统 +problems +time consuming +行列式计算 +相对稳定性 +劳斯准则只能判断系统是否稳定,不能判断稳定程度 +伯德图 +nyquist 图 +相位裕度 +闭环特征方程的根闭,开环增益0到无穷 特征方程根的变化规律 +root locus +单位负反馈 +G(s) = k/s(s+1) +复角条件复值条件 +渐近线与实轴交点 +出射角p-n/n-m + +lambda +大纯滞后 +积分对象 +lambda +纯滞后 tao/t +斯密斯预估 闭环传递函数 整定方法 +阶跃响应 鲁棒性 积分过程 输入干扰 +执行机构偏离,不确定不准确,调整速度 +PI 为主 D +两自由度PID 比例积分先行 +鲁棒性 性能不完全微分 +负载扰 + +makefile 工作原理: +1、可执行文件生成过程:预处理->编译->链接 +#source object target +SRC := *.c +OBJ := *.o +TARGET := mqtt_test + +#compile library include +CC := cc +LIB:= -lpthread +LDFLAG := -L. libmosquitto.so +CFLAG := +CXXFLAG := +#link +$(TARGET):$(OBJ) + $(CC) -o $(TARGET) $(BOJ) $(LIB) $(LDFLAG) + $(CC) -o $@ $^ $(LIB) $(LDFLAG) +$(OBJ):$(SRC) + $(CC) -c $(SRC) +#all +all:$(TARGET) + $(CC) -o $(TARGET) $(SRC) $(LIB) $(LDFLAG) +#clean +clean: + rm -rf *.o $(TARGET) +*/ +// ———————————————————————————————————— + +/* +typedef struct +{ + int argc; + char **argv; + int sock; +}st_app_param; + +const char *g_version = "V1.0.0 24.08.16"; +int child_mian_ini() +{ + int i_re; + i_re = gw_support_init(); + if(i_re < 0) + { + printf("解析支持文件错误.\n"); + return -1; + } + + i_re = gw_config_init(); + if(i_re < 0) + { + printf("解析配置文件错误.\n"); + return -1; + } + + i_re = gw_data_init(); + if(i_re < 0) + { + printf("数据初始化错误.\n"); + return -1; + } + + i_re = gw_modol_init(); + if(i_re < 0) + { + printf("解析模型文件错误.\n"); + return -1; + } + + i_re = gw_stat_init(); + if(i_re < 0) + { + printf("数据统计初始化错误.\n"); + return -1; + } + + i_re = gw_process_init(); + if(i_re < 0) + { + printf("规约初始化错误.\n"); + return -1; + } + + i_re = gw_manage_init(); + if(i_re < 0) + { + printf("界面通讯初始化错误.\n"); + return -1; + } + + + pthread_create(tid,thread_task1,p_param); + + while(1) + { + get_sys_time(); + sleep(1); + } +} + +int child_main(int argc,char **argv) +{ + + if((argc == 2)&&(strcasecmp(argv[1],"-version") == 0)) + { + printf("version [%s]",g_version); + } + + child_mian_ini(); + +} + +static int run_child_process_thread((void *)param) +{ + st_app_param *p_param; + + p_param = param; + chlid_main(p_parm->argc,p_param->argv); +} + +static int run_child_process(int argc,char **argv,int sock) +{ + int i_re; + pthread_t *tid; + st_app_param p_param; + + p_param.argc = argc; + p_param.argv = argv; + p_param.sock = sock; + + pthread_creat(tid,run_child_process_thread,(void *)p_param); + i_re = recv(sock,..,0);//阻塞接收 + send(sock,'q',0); +} + +int main(int argc,char**argv) +{ + int i_re,fd,pid; + char lock_file[16]; + socketpair sockpaire[2]; + + sprintf(lock_file,"%s.lock",argv[0]); + + fd = open(lock_file,_O_WRONLY|_EXC,0777); + if(fd < 0) + { + printf("应用:[%s]已运行.\n",argv[0]); + return 0; + } + + sockpaire[0] = -1; + + while(1) + { + i_re = socketpaire(sockpaire,AN_UNIX,..); + if(i_re < 0) + { + printf("[%d]创建sockpaire失败.\n",getpid()); + return 0; + } + + pid = fork(); + + if(pid < 0) + { + printf("[%d]创建进程失败.\n",getpid()); + close(sockpaire[0]); + sockpaire[0] = -1 + close(sockpaire[1]); + return 0; + } + + if(pid == 0)//child process + { + close(sockpair[0]); + return run_child_process(argc,argv,sockpair[1]); + } + + printf("[%d]创建子进程成功.\n",getpid()); + close(sockpair[1]); + while(1)//father process + { + i_re = recv(sockpaire[0],....,0);//阻塞接收 + if(i_re <= 0) + { + //连接中断,重连 + sockpaire[0] = -1; + break; + } + else + { + //正常退出 + goto EXIT: + } + } + +EXIT: + //退出操作 + if(sockpaire[0] == -1) + { + //有子进程,关闭子进程 + } + close(fd); + unlink(file_lock); + } +} +*/ diff --git a/User/system/lib/control/custom/pid_zh1.h b/User/system/lib/control/custom/pid_zh1.h new file mode 100644 index 0000000..addfbe8 --- /dev/null +++ b/User/system/lib/control/custom/pid_zh1.h @@ -0,0 +1,63 @@ +/* + * @Author: 张小明 zxm5337@163.com + * @Date: 2024-06-25 10:26:36 + * @LastEditors: DaMingSY zxm5337@163.com + * @LastEditTime: 2024-09-03 09:19:23 + * @FilePath: \controller-v2\User\lib\control\custom\cascade_pid_zh.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +#ifndef __CASCADE_PID_ZH__ +#define __CASCADE_PID_ZH__ + +#include "data_type_def.h" + +typedef enum +{ + TARGET_DIR_ADD, + TARGET_DIR_SUB, +} target_dir_e; + +typedef struct +{ + float kp; + float ki; + float kd; + + float kup; + float kui; + float kud; +} fuzzy_pid_t; + +typedef struct +{ + BOOL iDetach, sm_open, fuzzy_open; + float feedBack; + float target, maxTarget; + float duty, kp, ki, kd; + float error, dError, lastError, errorDead; + float integral, iDetachCondation; + float output, maxOutput; + fuzzy_pid_t fuzzy_pid; +} smart_pid_t; + +typedef struct +{ + smart_pid_t inner; + smart_pid_t outer; + float output; +} cascade_pid_t; + +typedef struct CascadePID +{ + void (*smart_pid_init)(smart_pid_t *pid, float *duty, float *kp, float *ki, float *kd, float *errorDead, float *iDetachCondation, float *maxOut); + void (*cascade_pid_init)(cascade_pid_t *pid, smart_pid_t *pid_outer, smart_pid_t *pid_inner); + void (*smart_pid_calc)(smart_pid_t *pid, float *target, float *feedback); + void (*cascade_pid_calc)(struct CascadePID *pid, float *outerRef, float *outerFdb, float *innerFdb); + + smart_pid_t smart_pid; + cascade_pid_t cascade_pid; +} pid_zh1_t; // PID_t; + +extern void pid_zh_constructor1(struct CascadePID *pid); + +#endif diff --git a/User/system/lib/control/custom/独立PID算法开发.md b/User/system/lib/control/custom/独立PID算法开发.md new file mode 100644 index 0000000..7d32003 --- /dev/null +++ b/User/system/lib/control/custom/独立PID算法开发.md @@ -0,0 +1,26 @@ +# 架构 +|文件|路径|
说明
| +|:--|:--|:--| +|pid|User\lib\control\src|PID算法模块| +|execute|User\application\src|执行器| +|app_flow|User|任务流程控制| + +## APP_FLOW任务流程控制 +> adjust_inspection 中在没有检测到调试信号时执行execute_dac,EXECUTE_PLAN定义了需要执行的算法任务计划 + +## PID算法模块 +文件内容: +|文件|
说明
| +|:--|:--| +|pid.c|构造算法的入口| +|pid_common.c|普通算法| +|pid_neural.c|神经网络算法| +|pid_fuzzy.c|模糊算法| + +custom 目录下为各自算法实现 + + +## EXECUTE执行器 +> execute_pid_init中定义了初始化参数 +> execute_dac中定义了执行器 + diff --git a/User/system/lib/control/inc/pid.h b/User/system/lib/control/inc/pid.h new file mode 100644 index 0000000..dfe5d1a --- /dev/null +++ b/User/system/lib/control/inc/pid.h @@ -0,0 +1,252 @@ +#ifndef __PID_H__ +#define __PID_H__ +#include "lib.h" + +#include "pid_auto_tune.h" + +#include "pid_c.h" +#include "pid_g.h" +#include "pid_x.h" +#include "pid_zh.h" +#include "pid_zh1.h" +#include "pid_hd.h" + +#define INCOMPLETE_DIFFEREN 1 // 不完全微分 + +typedef enum +{ + PID_SUB_TYPE_POSITION = 1, // 位置式 + PID_SUB_TYPE_INCREMENT = 2, // 增量式 +} pid_sub_type_e; +typedef enum +{ + DEAD_ZONE_BOTH = 0, // 正负都可以 + DEAD_ZONE_POSITIVE = 1, // 正数 + DEAD_ZONE_NEGATIVE = 2, // 负数 +} deadzone_e; +typedef enum +{ + // PID自整定 + PID_TYPE_AUTO_TUNE, + // 通用PID + PID_TYPE_COMMON, + // 神经PID + PID_TYPE_NEURAL, + // 模糊PID + PID_TYPE_FUZZY, + + // 以下是自定义PID + + // cj PID + PID_TYPE_CUSTOM_CAO, + // gp jPID + PID_TYPE_CUSTOM_GAO, + // xsh PID + PID_TYPE_CUSTOM_XU, + // zxm PID + PID_TYPE_CUSTOM_ZHANG, + // hangdian PID + PID_TYPE_CUSTOM_HANGDIAN, +} pid_type_e; + +typedef struct +{ + float32 ref; + float32 feedback; + float32 pre_feedback; + float32 e_0; // 当前误差 + float32 e_1; // 上一次误差 + float32 kp; + float32 ki; + float32 kd; + float32 err_limit; + BOOL detach; + float32 err_dead; + // 不完全微分方式在微分环节采用了低通滤波有效地提高了微分项的特性。其中α的取值是一个0~1之间的数。两个极限值,在0时其实就是没有滤波的普通微分环节;而取1时,则没有微分作用。所以α的取值对不完全微分的效果是至关重要的,一般要根据被控对象的特性来确定 + float32 alpha; + float32 lastdev; + float32 out; + float32 out_max; + float32 out_min; + float32 sv_range; + float32 iout; // 积分输出 + BOOL sm; + BOOL ki_enable; + BOOL kd_enable; + float32 deviation; // 纠正系统误差造成的影响,作用于死区,大于0需要补偿,小于0需要反向补偿 + BOOL in_dead_zone; // 是否在死区内 +} pid_common_position_t; // 位置式PID + +typedef struct +{ + float32 ref; // 目标设定值 + float32 feedback; // 传感器采集值 + float32 out; // PID计算结果 + float32 kp; + float32 ki; + float32 kd; + float32 e_0; // 当前误差 + float32 e_1; // 上一次误差 + float32 e_2; // 上上次误差 + float32 err_dead; + float32 deviation; // 纠正系统误差造成的影响,作用于死区 + float32 out_max; // 输出限幅 + float32 out_min; // 输出限幅 + float32 sum_iterm; + float32 iout; // 积分输出 + float32 alpha; // 不完全微分参数 + float32 lastdev; // 不完全微分参数 + + BOOL sm; + BOOL ki_enable; + BOOL kd_enable; + float32 sv_range; + // 没有用的 + float32 err_limit; + BOOL detach; +} pid_common_increment_t; // 增量式PID + +typedef struct PID_COMMON +{ + uint8_t type; + + /* 设置PID三个参数 */ + void (*set_ctrl_prm)(struct PID_COMMON *self, float32 kp, float32 ki, float32 kd); + /* 设置积分范围 */ + void (*set_integral_prm)(struct PID_COMMON *self, float32 integral_up, float32 integral_low); + + /* 控制接口 */ + float32 (*PID)(struct PID_COMMON *self, float32 err); + + /* in value */ + float32 err; + /* out value */ + float32 out; + + union + { + pid_common_position_t position; + pid_common_increment_t increment; + } pri_u; + +} pid_common_t; // 通用PID + +typedef struct PID_NEURAL +{ + uint8_t type; + /* 设置PID三个参数 */ + void (*set_ctrl_prm)(struct PID_NEURAL *self, float32 minimum, float32 maximum); + /* 设置输出范围 */ + void (*set_out_prm)(struct PID_NEURAL *self, float32 minimum, float32 maximum); + /* 控制接口 */ + float32 (*PID)(struct PID_NEURAL *self, float32 target, float32 feedback); + + struct + { + float32 setpoint; /*设定值*/ + float32 kcoef; /*神经元输出比例*/ + float32 kp; /*比例学习速度*/ + float32 ki; /*积分学习速度*/ + float32 kd; /*微分学习速度*/ + float32 lasterror; /*前一拍偏差*/ + float32 preerror; /*前两拍偏差*/ + float32 deadband; /*死区*/ + float32 result; /*输出值*/ + float32 output; /*百分比输出值*/ + float32 maximum; /*输出值的上限*/ + float32 minimum; /*输出值的下限*/ + float32 wp; /*比例加权系数*/ + float32 wi; /*积分加权系数*/ + float32 wd; /*微分加权系数*/ + } pri; +} pid_neural_t; // 神经PID + +typedef struct +{ + float32 kp; + float32 ki; + float32 kd; + + float32 kup; + float32 kui; + float32 kud; + + float32 maxe; // 非线性区间最大值 + float32 mine; // 非线性区间最小值 +} FUZZY_PID_t; + +// 模糊PID +typedef struct PID_FUZZY +{ + /* 设置PID三个参数 */ + void (*set_ctrl_prm)(struct PID_FUZZY *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 deviation, + float32 out_min, float32 out_max); // 设置PID参数 + void (*set_error_max_min)(struct PID_FUZZY *self, float32 mine, float32 maxe); // 设置非线性区间值 + void (*update_ctrl_prm)(struct PID_FUZZY *self, float32 kp, float32 ki, float32 kd, float32 err_dead, + float32 out_min, float32 out_max); // 更新PID参数 + void (*set_range)(struct PID_FUZZY *self, float32 out_min, float32 out_max); // 更新最大最小值 + void (*set_cfg)(struct PID_FUZZY *self, float32 max_err, BOOL mode); // 配置PID模式,默认不使用积分分离 + void (*set_smooth_enable)(struct PID_FUZZY *self, BOOL enable, float32 sv_range); // 设置平滑范围 + void (*set_iout)(struct PID_FUZZY *self, float32 iout); // 设置积分输出 + void (*set_err_dead)(struct PID_FUZZY *self, float32 err_dead); // 设置死区 + void (*set_kp)(struct PID_FUZZY *self, float32 kp); + void (*set_ki_enable)(struct PID_FUZZY *self, BOOL enable); + void (*set_ki)(struct PID_FUZZY *self, float32 ki); + // 微分开启使能 + void (*set_kd_enable)(struct PID_FUZZY *self, BOOL enable); + void (*set_kd)(struct PID_FUZZY *self, float32 kd); + void (*set_kd_dev)(struct PID_FUZZY *self, float32 alpha); + void (*restctrl)(struct PID_FUZZY *self, float32 out); // 复位PID积分及微分控制数据 + /* 控制接口 */ + float32 (*execute)(struct PID_FUZZY *self, float32 target, float32 feedback); + + BOOL(*in_dead_zone) + (struct PID_FUZZY *self); + + union + { + pid_common_position_t position; + pid_common_increment_t increment; + } pri_u; + + pid_sub_type_e sub_type; // 位置式PID,增量式PID + BOOL open; // 是否使用模糊PID控制 + BOOL speed_integral_enable; // 变速积分,暂时没有验证成功 + deadzone_e deadzone_dir; + FUZZY_PID_t pid_params; + +} pid_fuzzy_t; // 模糊PID + +// PID +typedef struct +{ + BOOL is_init; // 是否初始化 + pid_type_e type; // 不同的算法类型,模糊PID,神经PID,通用PID + pid_sub_type_e sub_type; // 位置式PID,增量式PID + union + { + pid_common_t common; + pid_neural_t neural; + pid_fuzzy_t fuzzy; + + // 自定义PID + pid_c_t cao; + pid_g_t gao; + pid_x_t xu; + pid_zh_t zhang; + pid_zh1_t zhang1; + pid_hd_t hd; + } pid_u; + pid_auto_tune_t auto_tune; +} pid_t; + +// PID控制 +extern void pid_constructor(pid_t *self); + +// private +// 神经元PID +extern void pid_neural_constructor(struct PID_NEURAL *self); +// 模糊PID +extern void pid_fuzzy_constructor(struct PID_FUZZY *self); + +#endif diff --git a/User/system/lib/control/inc/pid_auto_tune.h b/User/system/lib/control/inc/pid_auto_tune.h new file mode 100644 index 0000000..e9e701c --- /dev/null +++ b/User/system/lib/control/inc/pid_auto_tune.h @@ -0,0 +1,53 @@ +/*** + * @Author: + * @Date: 2023-07-24 11:17:55 + * @LastEditors: xxx + * @LastEditTime: 2023-07-24 11:19:06 + * @Description:pid自动调参,构建闭环回路 确定稳定极限 确定两个参数 极限值KP和震荡周期 + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ +#ifndef __PID_AUTO_TUNE_H__ +#define __PID_AUTO_TUNE_H__ +#include "lib.h" + +typedef struct PID_AUTO_TUNE +{ + // public: + void (*set_ctrl_prm)(struct PID_AUTO_TUNE *self, float32 *input, float32 *output); + int32_t (*runtime)(struct PID_AUTO_TUNE *self); + void (*set_output_step)(struct PID_AUTO_TUNE *self, int32_t step); + void (*set_control_type)(struct PID_AUTO_TUNE *self, int32_t type); + void (*set_noise_band)(struct PID_AUTO_TUNE *self, int32_t band); + void (*set_look_back)(struct PID_AUTO_TUNE *self, int32_t n); + float32 (*get_kp)(struct PID_AUTO_TUNE *self); + float32 (*get_ki)(struct PID_AUTO_TUNE *self); + float32 (*get_kd)(struct PID_AUTO_TUNE *self); + // private: + struct + { + BOOL isMax, isMin; // 运算中出现最大、最小值标志 + float32 *input, *output; + float32 setpoint; // 反向控制判断值,这个值需要根据对象的实际工作值确定!是通过第一次启动时对应的输入值带入的。 + int32_t noiseBand; // 判断回差,类似于施密特触发器,实际控制反向的比较值是 setpoint + noiseBand 或 setpoint - noiseBand + int32_t controlType; // 计算 PID 参数时,选择 PI 或 PID 模式,输出 Kp Ki,或 Kp、Ki、Kd + BOOL running; + uint32_t peak1, peak2, lastTime; // 峰值对应的时间 + int32_t sampleTime; + int32_t nLookBack; + int32_t peakType; + int32_t lastInputs[51]; // 保存的历史输入值, 改为 50 次。 by shenghao.xu + int32_t peaks[13]; // 保存的历史峰值,最多存前 12 次,对应 6个最大、6个最小。20221124 by Embedream + int32_t peakCount; // 峰值计数 + int32_t peakPeriod[7]; // 保存前 6 次的最大值间隔时间 by shenghao.xu + int32_t peakMaxCount; // 最大峰值计数 by shenghao.xu + BOOL justchanged; + int32_t oStep; // 这个值是用于计算控制高低值的,以 outputStart 为中值,输出高值用 outputStart + oStep, 输出低值用 outputStart - oStep + float32 outputStart; // 输出控制的基础值,这个需要结合对象特征确定,此值也是通过第一次启动时对应的输出值带入的。 + float32 Ku, Pu; + } pri; + +} pid_auto_tune_t; + +extern void pid_auto_tune_constructor(struct PID_AUTO_TUNE *self); +#endif // __PID_AUTO_TUNE_H__ diff --git a/User/system/lib/control/src/pid.c b/User/system/lib/control/src/pid.c new file mode 100644 index 0000000..8255ea2 --- /dev/null +++ b/User/system/lib/control/src/pid.c @@ -0,0 +1,43 @@ +#include "pid.h" +#include + +// 构造函数将接口绑定 +void pid_constructor(pid_t *self) +{ + switch (self->type) + { + case PID_TYPE_COMMON: + /* code */ + break; + case PID_TYPE_NEURAL: + pid_neural_constructor(&self->pid_u.neural); + break; + case PID_TYPE_FUZZY: + DBG_ASSERT(self->sub_type != 0 __DBG_LINE); + self->pid_u.fuzzy.sub_type = self->sub_type; + pid_fuzzy_constructor(&self->pid_u.fuzzy); + break; + case PID_TYPE_AUTO_TUNE: + pid_auto_tune_constructor(&self->auto_tune); + break; + case PID_TYPE_CUSTOM_CAO: + pid_c_constructor(&self->pid_u.cao); + break; + case PID_TYPE_CUSTOM_GAO: + pid_g_constructor(&self->pid_u.gao); + break; + case PID_TYPE_CUSTOM_XU: + pid_x_constructor(&self->pid_u.xu); + break; + case PID_TYPE_CUSTOM_ZHANG: + // pid_zh_constructor(&self->pid_u.zhang); + pid_zh_constructor1(&self->pid_u.zhang1); + break; + case PID_TYPE_CUSTOM_HANGDIAN: + pid_hd_constructor(&self->pid_u.hd); + break; + default: + break; + } + self->is_init = TRUE; +} diff --git a/User/system/lib/control/src/pid_auto_tune.c b/User/system/lib/control/src/pid_auto_tune.c new file mode 100644 index 0000000..5204421 --- /dev/null +++ b/User/system/lib/control/src/pid_auto_tune.c @@ -0,0 +1,230 @@ +#include "pid_auto_tune.h" +#include "sys.h" + +/* + 设置峰值回溯时间,单位 0.1 秒,最小 0.2秒, 最大 4 秒 +*/ +static void set_look_backsec(pid_auto_tune_t *self, int32_t value) +{ + if (value < 2) + value = 2; + if (value > 40) + value = 40; + + if (value < 40) + { + self->pri.nLookBack = 12; // 按目前实际周期约300ms、采样周期 10ms 考虑,一个周期只有 30 点,回溯 12 点即可。 + self->pri.sampleTime = value * 10; // 改为 Value*10 ms, 20、30、40 ~ 200ms + } + else + { + self->pri.nLookBack = 50 + value; + self->pri.sampleTime = 4000; + } +} + +static void _set_ctrl_prm(struct PID_AUTO_TUNE *self, float32 *input, float32 *output) +{ + self->pri.input = input; + self->pri.output = output; + self->pri.controlType = 0; // 默认为 PI 模式 + self->pri.noiseBand = 1; + self->pri.running = FALSE; + self->pri.oStep = 1; + set_look_backsec(self, 8); + self->pri.lastTime = sys_millis(); +} + +static void _set_noise_band(struct PID_AUTO_TUNE *self, int32_t value) +{ + self->pri.noiseBand = value; +} + +static void _set_output_step(struct PID_AUTO_TUNE *self, int32_t value) +{ + self->pri.oStep = value; +} + +// * Determies if the tuning parameters returned will be PI (D=0) +// or PID. (0=PI, 1=PID) +static void _set_control_type(struct PID_AUTO_TUNE *self, int32_t value) +{ + self->pri.controlType = value; +} + +static void _set_look_back(struct PID_AUTO_TUNE *self, int32_t value) +{ + set_look_backsec(self, value); +} + +static float32 _get_kp(struct PID_AUTO_TUNE *self) +{ + float32 kp = self->pri.controlType == 1 ? 0.6f * self->pri.Ku : 0.4f * self->pri.Ku; + return kp; +} + +static float32 _get_ki(struct PID_AUTO_TUNE *self) +{ + float32 ki = self->pri.controlType == 1 ? 1.2f * self->pri.Ku / self->pri.Pu : 0.48f * self->pri.Ku / self->pri.Pu; + return ki; +} + +static float32 _get_kd(struct PID_AUTO_TUNE *self) +{ + return self->pri.controlType == 1 ? 0.075f * self->pri.Ku * self->pri.Pu : 0; +} + +/** + * @brief 修改返回值,0 - 执行计算,未完成整定, 1 - 执行计算,完成整定过程, 2 - 采样时间未到 + * @return {*} + */ +static int32_t _runtime(struct PID_AUTO_TUNE *self) +{ + int32_t i, iSum; + + uint32_t now = sys_millis(); + if ((now - self->pri.lastTime) < ((uint32_t)self->pri.sampleTime)) + { + return 2; // 原来返回值为 FALSE 不符合函数定义,也无法区分,改为 2,by shenghao.xu + } + + // 开始整定计算 + self->pri.lastTime = now; + float32 refVal = *(self->pri.input); + if (FALSE == self->pri.running) // 首次进入,初始化参数 + { + self->pri.peakType = 0; + self->pri.peakCount = 0; + self->pri.peakMaxCount = 0; + self->pri.peak1 = 0; + self->pri.peak2 = 0; + self->pri.justchanged = FALSE; + self->pri.setpoint = refVal; // 不变 + self->pri.running = TRUE; + self->pri.outputStart = *self->pri.output; + *self->pri.output = self->pri.outputStart + self->pri.oStep; + } + + // 根据输入与设定点的关系振荡输出 + if (refVal > (self->pri.setpoint + self->pri.noiseBand)) + *self->pri.output = self->pri.outputStart - self->pri.oStep; + else if (refVal < (self->pri.setpoint - self->pri.noiseBand)) + *self->pri.output = self->pri.outputStart + self->pri.oStep; + + // bool isMax=TRUE, isMin=TRUE; + self->pri.isMax = TRUE; + self->pri.isMin = TRUE; + // id peaks + /* + 以下循环完成,对回溯次数的输入缓存进行判断,如果输入值均大于或小于缓存值,则确定此次为峰值。 + 峰值特征根据 isMax、isMin 哪个为真确定。 + 同时完成输入缓存向后平移,腾出第一个单元存放新的输入值。 + 这一段代码完成的噪声所产生的虚假峰值判断,应该没有问题! + */ + for (i = self->pri.nLookBack - 1; i >= 0; i--) + { + int32_t val = self->pri.lastInputs[i]; + if (self->pri.isMax) + self->pri.isMax = (refVal > val); // 第一次是新输入和缓存最后一个值比较,如果大于,则前面的值均判是否大于 + if (self->pri.isMin) + self->pri.isMin = (refVal < val); // 第一次是新输入和缓存最后一个值比较,如果小于,则前面的值均判是否小于 + self->pri.lastInputs[i + 1] = self->pri.lastInputs[i]; // 每采样一次,将输入缓存的数据向后挪一次 + } + self->pri.lastInputs[0] = refVal; // 新采样的数据放置缓存第一个单元。 + + /* + 以下代码完成峰值的确定,以及对应峰值的时间纪录。 + 因为上述代码只是去掉噪产生的波动峰值,但如果是连续超过 nLookBack 次数的的上升或下降, + 则上述算法所确定的最大或最小值,并非是峰值,只能是前 nLookBack 次中的最大或最小值。 + 但逐句消化程序后,发现这段处理有几点疑惑: + 1、peaks[] 的纪录好像不对,在执行最小到最大值转换时,peakCount 也应该+1,否则应该把 + 纪录的最小值覆盖了!所以后面的峰值判断总是满足条件。 + 2、峰值对应时间似乎也应该多次存放,取平均值,因对象没有那么理想化,目前应该是取的最后一组峰值的周期。 + 3、后续计算 Ku 用的是整个整定过程的最大、最小值,这对于非理想的对象而言也不是很合适。 + + 考虑做如下改进: + 1)修改峰值纪录,设计12个峰值保存单元,存满12个峰值(6大、6小)后再计算。 + 2)纪录 6 组最大值的间隔时间,作为最终计算 Pu 的数据。 + */ + if (self->pri.isMax) + { + if (self->pri.peakType == 0) + self->pri.peakType = 1; // 首次最大值,初始化 + + if (self->pri.peakType == -1) // 如果前一次为最小值,则标识目前进入最大值判断 + { + self->pri.peakType = 1; // 开始最大值判断 + self->pri.peakCount++; // 峰值计数 by shenghao.xu + self->pri.justchanged = TRUE; // 标识峰值转换 + if (self->pri.peak2 != 0) // 已经纪录一次最大峰值对应时间后,开始记录峰值周期 by shenghao.xu + { + self->pri.peakPeriod[self->pri.peakMaxCount] = (int32_t)(self->pri.peak1 - self->pri.peak2); // 最大峰值间隔时间(即峰值周期) + self->pri.peakMaxCount++; // 最大峰值计数 + } + self->pri.peak2 = self->pri.peak1; // 刷新上次最大值对应时间 + } + self->pri.peak1 = now; // 保存最大值对应时间 peak1 + self->pri.peaks[self->pri.peakCount] = refVal; // 保存最大值 + } // 此段代码可以保证得到的是真正的最大值,因为peakType不变,则会不断刷新最大值 + else if (self->pri.isMin) + { + if (self->pri.peakType == 0) + self->pri.peakType = -1; // 首次最小值,初始化 + + if (self->pri.peakType == 1) // 如果前一次是最大值判断,则转入最小值判断 + { + self->pri.peakType = -1; // 开始最小值判断 + self->pri.peakCount++; // 峰值计数 + self->pri.justchanged = TRUE; + } + + if (self->pri.peakCount < 10) + self->pri.peaks[self->pri.peakCount] = refVal; // 只要类型不变,就不断刷新最小值 + } + + /* by shenghao.xu + 以下计算是作为判断采集数据是否合适的部分,如果 2 次峰值判断条件满足,就结束整定过程,感觉不甚合理。 + 拟修改为: + 1)计满 12 次峰值后再计算(到第 13 次)。 + 2)不再判断是否合理,因为对象如果特性好,自然已经稳定,如果不好,再长时间也无效果。 + 3)将后面5次的数据作为素材,去掉第一组数据,因为考虑第一组时对象可能处于过渡过程。 + 4)用后 10 点得到的 9 个峰值差平均值作为 Ku 计算值中的 A,取代原来的整个过程的最大、最小值差。 + 5)用后 5 点峰值周期平均值作为 Pu 的计算值,取代原来用最后一组的值。 + */ + if (self->pri.justchanged && self->pri.peakCount == 12) + { + // we've transitioned. check if we can autotune based on the last peaks + iSum = 0; + for (i = 2; i <= 10; i++) + iSum += ABS(self->pri.peaks[i] - self->pri.peaks[i + 1]); + iSum /= 9; // 取 9 次峰峰值平均值 + self->pri.Ku = (float32)(4 * (2 * self->pri.oStep)) / (iSum * 3.14159); // 用峰峰平均值计算 Ku + + iSum = 0; + for (i = 1; i <= 5; i++) + iSum += self->pri.peakPeriod[i]; + iSum /= 5; // 计算峰值的所有周期平均值 + self->pri.Pu = (float32)(iSum) / 1000; // 用周期平均值作为 Pu,单位:秒 + + *self->pri.output = 0; + self->pri.running = FALSE; + return 1; + } + + self->pri.justchanged = FALSE; + return 0; +} + +void pid_auto_tune_constructor(struct PID_AUTO_TUNE *self) +{ + self->set_ctrl_prm = _set_ctrl_prm; + self->runtime = _runtime; + self->set_output_step = _set_output_step; + self->set_control_type = _set_control_type; + self->set_noise_band = _set_noise_band; + self->set_look_back = _set_look_back; + + self->get_kp = _get_kp; + self->get_ki = _get_ki; + self->get_kd = _get_kd; +} diff --git a/User/system/lib/control/src/pid_common.c b/User/system/lib/control/src/pid_common.c new file mode 100644 index 0000000..e69de29 diff --git a/User/system/lib/control/src/pid_fuzzy.c b/User/system/lib/control/src/pid_fuzzy.c new file mode 100644 index 0000000..0c3f770 --- /dev/null +++ b/User/system/lib/control/src/pid_fuzzy.c @@ -0,0 +1,896 @@ +#include "pid.h" +#include +// 定义死区枚举 + +#define DEADZONE DEAD_ZONE_POSITIVE +// 模糊集合 +#define NL -3 +#define NM -2 +#define NS -1 +#define ZE 0 +#define PS 1 +#define PM 2 +#define PL 3 + +// 定义偏差E的范围,因为设置了非线性区间,误差在10时才开始进行PID调节,这里E的范围为10 +#define MAXE (30) +#define MINE (-MAXE) +// 定义EC的范围,因为变化非常缓慢!,每次的EC都非常小,这里可以根据实际需求来调整, +#define MAXEC (30) +#define MINEC (-MAXEC) +// 定义e,ec的量化因子 +#define KE 3 / MAXE +#define KEC 3 / MAXEC + +// 定义输出量比例因子 +#define KUP 3.0f // 这里只使用了模糊PID的比例增益 +#define KUI 0.0f +#define KUD 0.0f + +static const float32 fuzzyRuleKp[7][7] = { + PL, PL, PM, PL, PS, PM, PL, + PL, PM, PM, PM, PS, PM, PL, + PM, PS, PS, PS, PS, PS, PM, + PM, PS, ZE, ZE, ZE, PS, PM, + PS, PS, PS, PS, PS, PM, PM, + PM, PM, PM, PM, PL, PL, PL, + PM, PL, PL, PL, PL, PL, PL}; + +static const float32 fuzzyRuleKi[7][7] = { + NL, NL, NL, NL, NM, NL, NL, + NL, NL, NM, NM, NM, NL, NL, + NM, NM, NS, NS, NS, NM, NM, + NM, NS, ZE, ZE, ZE, NS, NM, + NM, NS, NS, NS, NS, NM, NM, + NM, NM, NS, NM, NM, NL, NL, + NM, NL, NM, NL, NL, NL, NL}; + +static const float32 fuzzyRuleKd[7][7] = { + PS, PS, ZE, ZE, ZE, PL, PL, + NS, NS, NS, NS, ZE, NS, PM, + NL, NL, NM, NS, ZE, PS, PM, + NL, NM, NM, NS, ZE, PS, PM, + NL, NM, NS, NS, ZE, PS, PS, + NM, NS, NS, NS, ZE, PS, PS, + PS, ZE, ZE, ZE, ZE, PL, PL}; + +static void fuzzy(float32 e, float32 ec, FUZZY_PID_t *fuzzy_pid) +{ + + float32 etemp, ectemp; + float32 eLefttemp, ecLefttemp; // ec,e,左隶属度 + float32 eRighttemp, ecRighttemp; + + int eLeftIndex, ecLeftIndex; // 模糊位置标号 + int eRightIndex, ecRightIndex; + e = RANGE(e, fuzzy_pid->mine, fuzzy_pid->maxe); + ec = RANGE(ec, MINEC, MAXEC); + e = e * KE; + ec = ec * KEC; + + etemp = e > 3.0f ? 0.0f : (e < -3.0f ? 0.0f : (e >= 0.0f ? (e >= 2.0f ? 2.5f : (e >= 1.0f ? 1.5f : 0.5f)) : (e >= -1.0f ? -0.5f : (e >= -2.0f ? -1.5f : (e >= -3.0f ? -2.5f : 0.0f))))); + eLeftIndex = (int)((etemp - 0.5f) + 3); //[-3,3] -> [0,6] + eRightIndex = (int)((etemp + 0.5f) + 3); + eLefttemp = etemp == 0.0f ? 0.0f : ((etemp + 0.5f) - e); // + eRighttemp = etemp == 0.0f ? 0.0f : (e - (etemp - 0.5f)); + ectemp = ec > 3.0f ? 0.0f : (ec < -3.0f ? 0.0f : (ec >= 0.0f ? (ec >= 2.0f ? 2.5f : (ec >= 1.0f ? 1.5f : 0.5f)) : (ec >= -1.0f ? -0.5f : (ec >= -2.0f ? -1.5f : (ec >= -3.0f ? -2.5f : 0.0f))))); + ecLeftIndex = (int)((ectemp - 0.5f) + 3); //[-3,3] -> [0,6] + ecRightIndex = (int)((ectemp + 0.5f) + 3); + + ecLefttemp = ectemp == 0.0f ? 0.0f : ((ectemp + 0.5f) - ec); + ecRighttemp = ectemp == 0.0f ? 0.0f : (ec - (ectemp - 0.5f)); + + /*************************************反模糊*************************************/ + + fuzzy_pid->kp = (eLefttemp * ecLefttemp * fuzzyRuleKp[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKp[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKp[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKp[eRightIndex][ecRightIndex]); + + fuzzy_pid->ki = (eLefttemp * ecLefttemp * fuzzyRuleKi[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKi[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKi[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKi[eRightIndex][ecRightIndex]); + + fuzzy_pid->kd = (eLefttemp * ecLefttemp * fuzzyRuleKd[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKd[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKd[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKd[eRightIndex][ecRightIndex]); + // 对解算出的KP,KI,KD进行量化映射 + + fuzzy_pid->kp = fuzzy_pid->kp * fuzzy_pid->kup; + fuzzy_pid->ki = fuzzy_pid->ki * fuzzy_pid->kui; + fuzzy_pid->kd = fuzzy_pid->kd * fuzzy_pid->kud; +} + +/** + * @brief SV平滑给定,步长默认为0.1,范围0-1之间,越大平滑性越差 + * @param {PID_FUZZY} *self + * @param {float32} target_sv + * @return {*} + * @note + */ +static void smooth_setpoint(struct PID_FUZZY *self, float32 target_sv) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + float32 stepIn = (pri->sv_range) * 0.1f; + float32 kFactor = 0.0f; + if (fabs(pri->ref - target_sv) <= stepIn) + { + pri->ref = target_sv; + } + else + { + if (pri->ref - target_sv > 0) + { + kFactor = -1.0f; + } + else if (pri->ref - target_sv < 0) + { + kFactor = 1.0f; + } + else + { + kFactor = 0.0f; + } + pri->ref = pri->ref + kFactor * stepIn; + } + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + float32 stepIn = (pri->sv_range) * 0.1f; + float32 kFactor = 0.0f; + if (fabs(pri->ref - target_sv) <= stepIn) + { + pri->ref = target_sv; + } + else + { + if (pri->ref - target_sv > 0) + { + kFactor = -1.0f; + } + else if (pri->ref - target_sv < 0) + { + kFactor = 1.0f; + } + else + { + kFactor = 0.0f; + } + pri->ref = pri->ref + kFactor * stepIn; + } + } +} + +// 变速积分 +static float32 changing_integral_rate(struct PID_FUZZY *self) +{ + float32 err = 0, iout = 0; + float32 err_1 = 1, // 误差下限 + err_2 = 10; // 误差上限 + float32 index = 0; + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + err = pri->e_0; + iout = pri->iout; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + err = pri->e_0; + iout = pri->iout; + } + + if (err * iout > 0) // 判断积分是否为积累趋势 + { + if (ABS(err) <= err_1) + { + index = 1; // 完整积分 + } + else if (ABS(err) <= (err_1 + err_2)) + { + // 使用线性函数过渡 + index = (float)(err_2 - ABS(err) + err_1) / err_2; + } + else + { + index = 0; + } + } + + return index; +} + +/*封装模糊接口*/ +static void compensate(float32 e, float32 ec, FUZZY_PID_t *fuzzy_d) +{ + fuzzy(e, ec, fuzzy_d); +} + +/** + * @brief 更新最大最小值 + * @param {PID_FUZZY} *self + * @param {float32} out_min + * @param {float32} out_max + * @return {*} + * @note + */ +static void _set_range(struct PID_FUZZY *self, float32 out_min, float32 out_max) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->out_max = out_max; + pri->out_min = out_min; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->out_max = out_max; + pri->out_min = out_min; + } +} + +/** + * @brief 设置死区 + * @param {PID_FUZZY} *self + * @param {float32} err_dead + * @return {*} + * @note + */ +static void _set_err_dead(struct PID_FUZZY *self, float32 err_dead) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->err_dead = err_dead; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->err_dead = err_dead; + } +} + +static void _set_iout(struct PID_FUZZY *self, float32 iout) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->iout = iout; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->iout = iout; + } +} + +static void _set_kp(struct PID_FUZZY *self, float32 kp) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->kp = kp; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->kp = kp; + } +} + +/** + * @brief 使能积分控制 + * @param {PID_FUZZY} *self + * @param {BOOL} enable + * @return {*} + * @note + */ +// static void _set_ki_enable(struct PID_FUZZY *self, BOOL enable) +// { +// pri->ki_enable = enable; +// } + +/** + * @brief 使能微分控制 + * @param {PID_FUZZY} *self + * @param {BOOL} enable + * @return {*} + * @note + */ +static void _set_kd_enable(struct PID_FUZZY *self, BOOL enable) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->kd_enable = enable; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->kd_enable = enable; + } +} + +static void _set_kd(struct PID_FUZZY *self, float32 kd) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->kd = kd; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->kd = kd; + } +} + +/** + * @brief 配置不完全微分系数 + * @param {PID_FUZZY} *self + * @param {float32} alpha + * @return {*} + * @note alpha范围0-1,系数越大,不完全微分的作用越强 + */ +static void _set_kd_dev(struct PID_FUZZY *self, float32 alpha) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->alpha = alpha; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->alpha = alpha; + } +} + +static void _set_ki_enable(struct PID_FUZZY *self, BOOL enable) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->ki_enable = enable; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->ki_enable = enable; + } +} + +static void _set_ki(struct PID_FUZZY *self, float32 ki) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->ki = ki; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->ki = ki; + } +} + +/* + * Function:使能平滑控制 + * parameter:*pid需要配,PID参数结构指针,sv_range控制范围sv的范围 + * return:无 + */ +static void _set_smooth_enable(struct PID_FUZZY *self, BOOL enable, float32 sv_range) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->sm = enable; + pri->sv_range = sv_range; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->sm = enable; + pri->sv_range = sv_range; + } +} + +// 设置控制参数 +static void _set_ctrl_prm(struct PID_FUZZY *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 deviation, + float32 out_min, float32 out_max) +{ + self->open = TRUE; + self->pid_params.kup = KUP; + self->pid_params.kui = KUI; + self->pid_params.kud = KUD; + self->pid_params.mine = MINE; + self->pid_params.maxe = MAXE; + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + osel_memset((uint8_t *)pri, 0, sizeof(pid_common_position_t)); + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->deviation = deviation; + pri->out_max = out_max; + pri->out_min = out_min; + pri->detach = FALSE; + pri->sm = FALSE; + pri->ki_enable = TRUE; + pri->alpha = 0.25; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + osel_memset((uint8_t *)pri, 0, sizeof(pid_common_increment_t)); + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->deviation = deviation; + pri->out_max = out_max; + pri->out_min = out_min; + pri->ki_enable = TRUE; + pri->alpha = 0.25; + } +} + +static void _set_error_max_min(struct PID_FUZZY *self, float32 mine, float32 maxe) +{ + self->pid_params.mine = mine; + self->pid_params.maxe = maxe; +} + +static void _update_ctrl_prm(struct PID_FUZZY *self, float32 kp, float32 ki, float32 kd, float32 err_dead, + float32 out_min, float32 out_max) +{ + + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; + pri->detach = FALSE; + pri->sm = FALSE; + + if (kd > 0) + { + pri->kd_enable = TRUE; + } + else + { + pri->kd_enable = FALSE; + } + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->kp = kp; + pri->ki = ki; + pri->kd = kd; + pri->err_dead = err_dead; + pri->out_max = out_max; + pri->out_min = out_min; + + if (kd > 0) + { + pri->kd_enable = TRUE; + } + else + { + pri->kd_enable = FALSE; + } + } +} + +/** + * @brief 非0时配置为积分分离+抗积分饱和PID,否则为普通抗积分饱和PID + * @param {PID_FUZZY} *self + * @param {float32} max_err + * @param {BOOL} mode + * @return {*} + */ +static void _set_cfg(struct PID_FUZZY *self, float32 max_err, BOOL mode) +{ + + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->err_limit = max_err; + pri->detach = mode == FALSE ? FALSE : TRUE; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->err_limit = max_err; + pri->detach = mode == FALSE ? FALSE : TRUE; + } +} + +/** + * @brief 判断是否处于死区范围内 + * + * 根据给定的 PID_FUZZY 结构体,判断当前值是否处于死区范围内。 + * + * @param self PID_FUZZY 结构体指针 + * + * @return 如果处于死区范围内,返回 TRUE;否则返回 FALSE + */ +static BOOL _in_dead_zone(struct PID_FUZZY *self) +{ + float32 deviation = 0.0f; + float32 err_dead = 0.0f; + float32 err = 0.0f; + float32 offset = 0.0f; + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + deviation = pri->deviation; + err_dead = pri->err_dead; + err = pri->feedback - pri->ref; + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + deviation = pri->deviation; + err_dead = pri->err_dead; + err = pri->feedback - pri->ref; + } + + offset = err + deviation; + + if (self->deadzone_dir == DEAD_ZONE_POSITIVE) + { + if (offset >= 0 && offset <= ABS(err_dead)) + { + return TRUE; + } + else + { + return FALSE; + } + } + else if (self->deadzone_dir == DEAD_ZONE_NEGATIVE) + { + if (offset <= 0 && offset >= err_dead) + { + return TRUE; + } + else + { + return FALSE; + } + } + else + { + if (ABS(offset) <= ABS(err_dead)) + { + return TRUE; + } + else + { + return FALSE; + } + } +} + +static float32 position_pid(struct PID_FUZZY *self, float32 target, float32 feedback) +{ + float32 error = 0; + float32 ec = 0; + float32 kd = 0; + float32 thisdev = 0; + + pid_common_position_t *pri = &self->pri_u.position; + kd = pri->kd; + /*获取期望值与实际值,进行偏差计算*/ + if (pri->sm == 1) + { + smooth_setpoint(self, target); + } + else + { + pri->ref = target; + } + + pri->feedback = feedback; + error = pri->ref - pri->feedback; + + if (self->in_dead_zone(self) == TRUE) + { + error = 0; + pri->in_dead_zone = TRUE; + } + else + { + pri->in_dead_zone = FALSE; + } + + pri->e_0 = error; + + /* fuzzy control caculate */ + ec = error - pri->e_1; + if (self->open == TRUE) + { + compensate(error, ec, &self->pid_params); + } + + /*根据PID配置的模式,获取积分数据,进行积分累加*/ + if (self->speed_integral_enable == TRUE) + { + pri->iout = (pri->ki + self->pid_params.ki) * error * changing_integral_rate(self); + } + else + { + float32 temp_iterm = 0.0f; + float32 insert = 0; + if (pri->out >= pri->out_max) + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + if (error < 0) + { + temp_iterm = (pri->ki + self->pid_params.ki) * error; + } + } + } + else if (pri->out <= pri->out_min) + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + if (error > 0) + { + temp_iterm = (pri->ki + self->pid_params.ki) * error; + } + } + } + else + { + if (fabs(error) > pri->err_limit && pri->detach) + { + insert = 0; + } + else + { + insert = 1; + temp_iterm = (pri->ki + self->pid_params.ki) * error; + } + } + + pri->iout += temp_iterm; + + /* limt integral */ + if (pri->iout > pri->out_max) + { + pri->iout = pri->out_max; + } + else if (pri->iout < pri->out_min) + { + pri->iout = pri->out_min; + } + pri->iout = pri->iout * insert; + } + +#if INCOMPLETE_DIFFEREN == 1 + /*不完全微分*/ + thisdev = kd * (1.0 - pri->alpha) * (error - pri->e_1) + pri->alpha * pri->lastdev; + /*record last dev result*/ + pri->lastdev = thisdev; +#else + thisdev = (error - pri->e_1) * (kd); +#endif + + if (pri->kd_enable == FALSE) + { + thisdev = 0; + } + + if (pri->ki_enable == FALSE) + { + pri->iout = 0; + } + + pri->out = (pri->kp + self->pid_params.kp) * error + pri->iout + thisdev; + pri->e_1 = error; + /*record last feedback sensor result*/ + pri->pre_feedback = pri->feedback; + /*limt pid output*/ + pri->out = RANGE(pri->out, pri->out_min, pri->out_max); + return pri->out; +} + +static float32 increment_pid(struct PID_FUZZY *self, float32 target, float32 feedback) +{ + float32 ep, ei, ed; + float32 inc_out; + float32 thisdev = 0; + pid_common_increment_t *pri = &self->pri_u.increment; + + pri->feedback = feedback; + pri->e_0 = pri->ref - pri->feedback; + + if (pri->e_0 >= MAXE) + { + return pri->out_max; + } + else if (pri->e_0 <= MINE) + { + return pri->out_min; + } + + if (fabs(pri->e_0) <= pri->err_dead) + { + pri->e_0 = 0; + } + + ep = pri->e_0 - pri->e_1; + ei = pri->e_0; + ed = pri->e_0 - 2 * pri->e_1 + pri->e_2; + if (self->open == TRUE) + { + compensate(pri->e_0, ep, &self->pid_params); + } + + if (pri->sm == 1) + { + smooth_setpoint(self, target); + } + else + { + pri->ref = target; + } + +#if INCOMPLETE_DIFFEREN == 1 + /*不完全微分*/ + thisdev = (1.0 - pri->alpha) * (pri->kd + self->pid_params.kd) * ed + pri->alpha * pri->lastdev; +#else + ed = ed; +#endif + + if (self->speed_integral_enable == TRUE) + { + + if (ABS(pri->e_0) > MAXE) + { + pri->iout = (pri->ki + self->pid_params.ki) * ei; + } + else + { + // 变速积分 + pri->iout = (pri->ki + self->pid_params.ki) * ei * changing_integral_rate(self); + } + } + else + { + pri->iout = (pri->ki + self->pid_params.ki) * ei; + } + + if (pri->kd_enable == FALSE) + { + thisdev = 0; + } + + if (pri->ki_enable == FALSE) + { + pri->iout = 0; + } + + inc_out = (pri->kp + self->pid_params.kp) * ep + pri->iout + thisdev; + pri->e_2 = pri->e_1; + pri->e_1 = pri->e_0; + pri->lastdev = thisdev; + pri->out = pri->out + inc_out; + pri->out = RANGE(pri->out, pri->out_min, pri->out_max); + return pri->out; +} + +static float32 _pid(struct PID_FUZZY *self, float32 target, float32 feedback) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + return position_pid(self, target, feedback); + } + else + { + return increment_pid(self, target, feedback); + } +} + +/** + * @brief 复位PID积分及微分控制数据 + * @param {PID_FUZZY} *self + * @return {*} + */ +static void _restctrl(struct PID_FUZZY *self, float32 out) +{ + if (self->sub_type == PID_SUB_TYPE_POSITION) + { + pid_common_position_t *pri = NULL; + pri = &self->pri_u.position; + pri->e_1 = 0; + pri->iout = 0; + pri->out = out; + pri->iout = out; +#if INCOMPLETE_DIFFEREN == 1 + pri->lastdev = 0; +#endif + } + else + { + pid_common_increment_t *pri = NULL; + pri = &self->pri_u.increment; + pri->e_0 = 0; + pri->e_1 = 0; + pri->e_2 = 0; + pri->lastdev = 0; + pri->out = out; + pri->iout = out; + } +} + +void pid_fuzzy_constructor(struct PID_FUZZY *self) +{ + self->set_ctrl_prm = _set_ctrl_prm; + self->set_error_max_min = _set_error_max_min; + self->update_ctrl_prm = _update_ctrl_prm; + self->set_cfg = _set_cfg; + self->set_smooth_enable = _set_smooth_enable; + self->set_err_dead = _set_err_dead; + self->set_kp = _set_kp; + self->set_ki_enable = _set_ki_enable; + self->set_ki = _set_ki; + self->set_kd_enable = _set_kd_enable; + self->set_kd = _set_kd; + self->set_kd_dev = _set_kd_dev; + self->set_range = _set_range; + self->restctrl = _restctrl; + self->set_iout = _set_iout; + self->in_dead_zone = _in_dead_zone; + self->execute = _pid; +} diff --git a/User/system/lib/control/src/pid_neural.c b/User/system/lib/control/src/pid_neural.c new file mode 100644 index 0000000..93ffc03 --- /dev/null +++ b/User/system/lib/control/src/pid_neural.c @@ -0,0 +1,97 @@ +#include "pid.h" +#include +// 设置控制参数 +static void _set_ctrl_prm(struct PID_NEURAL *self, float32 minimum, float32 maximum) +{ + self->pri.setpoint = minimum; /*设定值*/ + + self->pri.kcoef = 0.12; /*神经元输出比例*/ + self->pri.kp = 0.45; /*比例学习速度*/ + self->pri.ki = 0.05; /*积分学习速度*/ + self->pri.kd = 0; /*微分学习速度*/ + + self->pri.lasterror = 0.0; /*前一拍偏差*/ + self->pri.preerror = 0.0; /*前两拍偏差*/ + self->pri.result = minimum; /*PID控制器结果*/ + self->pri.output = 0.0; /*输出值,百分比*/ + + self->pri.maximum = maximum; /*输出值上限*/ + self->pri.minimum = minimum; /*输出值下限*/ + self->pri.deadband = (maximum - minimum) * 0.0005f; /*死区*/ + + self->pri.wp = 0.10; /*比例加权系数*/ + self->pri.wi = 0.10; /*积分加权系数*/ + self->pri.wd = 0.10; /*微分加权系数*/ +} + +// 设置输出参数 +static void _set_out_prm(struct PID_NEURAL *self, float32 minimum, float32 maximum) +{ + self->pri.maximum = maximum; + self->pri.minimum = minimum; +} + +/*单神经元学习规则函数*/ +static void NeureLearningRules(struct PID_NEURAL *self, float32 zk, float32 uk, float32 *xi) +{ + self->pri.wi = self->pri.wi + self->pri.ki * zk * uk * xi[0]; + self->pri.wp = self->pri.wp + self->pri.kp * zk * uk * xi[1]; + self->pri.wd = self->pri.wd + self->pri.kd * zk * uk * xi[2]; +} + +static float32 _PID(struct PID_NEURAL *self, float32 target, float32 feedback) +{ + float32 x[3]; + float32 w[3]; + float32 sabs; + float32 error; + float32 result; + float32 deltaResult; + self->pri.setpoint = target; + error = self->pri.setpoint - feedback; + result = self->pri.result; + if (fabs(error) > self->pri.deadband) + { + x[0] = error; + x[1] = error - self->pri.lasterror; + x[2] = error - self->pri.lasterror * 2 + self->pri.preerror; + + sabs = fabs(self->pri.wi) + fabs(self->pri.wp) + fabs(self->pri.wd); + w[0] = self->pri.wi / sabs; + w[1] = self->pri.wp / sabs; + w[2] = self->pri.wd / sabs; + + deltaResult = (w[0] * x[0] + w[1] * x[1] + w[2] * x[2]) * self->pri.kcoef; + } + else + { + deltaResult = 0; + } + + result = result + deltaResult; + if (result > self->pri.maximum) + { + result = self->pri.maximum; + } + if (result < self->pri.minimum) + { + result = self->pri.minimum; + } + self->pri.result = result; + self->pri.output = self->pri.result; + + // 单神经元学习 + NeureLearningRules(self, error, result, x); + + self->pri.preerror = self->pri.lasterror; + self->pri.lasterror = error; + + return self->pri.output; +} + +void pid_neural_constructor(struct PID_NEURAL *self) +{ + self->set_ctrl_prm = _set_ctrl_prm; + self->set_out_prm = _set_out_prm; + self->PID = _PID; +} diff --git a/User/system/lib/control/模糊PID控制器设计文档.md b/User/system/lib/control/模糊PID控制器设计文档.md new file mode 100644 index 0000000..c9cf8b3 --- /dev/null +++ b/User/system/lib/control/模糊PID控制器设计文档.md @@ -0,0 +1,111 @@ +# 模糊PID控制器设计文档 + +# 模糊PID控制器详细设计文档 + +## 1. 引言 + +### 1.1 目的 + +本文档旨在详细介绍模糊PID控制器的设计理念、实现方法和使用指南,为开发者提供一套完整的模糊PID控制解决方案。 + +### 1.2 背景 + +PID控制器因其结构简单、稳定性好、易于实现等优点,在工业控制系统中得到了广泛应用。然而,传统PID控制器在面对复杂或非线性系统时,性能表现不佳。模糊PID控制器通过引入模糊逻辑,动态调整PID参数,以适应系统在不同工作状态下的控制需求,从而提高控制性能。 + +## 2. 设计概述 + +### 2.1 设计目标 + +- **适应性**:能够适应不同类型和不同工作状态的控制系统。 +- **稳定性**:保证控制系统在各种工作条件下的稳定运行。 +- **易用性**:提供简单易懂的接口,便于开发者快速实现和调试。 + +### 2.2 功能模块 + +模糊PID控制器主要包括以下几个功能模块: + +1. **模糊控制模块**:负责根据输入的误差和误差变化率,通过模糊逻辑计算出PID参数。 +2. **SV平滑给定模块**:负责平滑控制目标值,减少控制过程中的突变。 +3. **变速积分模块**:根据误差的大小调整积分速率,提高控制效率。 +4. **参数设置模块**:提供接口函数,用于设置和调整PID参数。 + +## 3. 功能模块详细设计 + +### 3.1 模糊控制模块 + +#### 3.1.1 输入处理 + +- **误差处理**:将实时误差 `e`限制在预定的范围内,并进行模糊化处理。 +- **误差变化率处理**:将误差变化率 `ec`进行相同的处理。 + +#### 3.1.2 模糊规则库 + +- **规则定义**:根据系统的具体需求,定义一套模糊规则,用于计算PID参数。 +- **规则应用**:根据输入的误差和误差变化率的模糊化值,通过模糊规则库计算出 `kp`、`ki`、`kd`。 + +### 3.2 SV平滑给定模块 + +- **平滑策略**:根据当前目标值与新目标值之间的差值,动态调整目标值变化的步长,实现平滑过渡。 + +### 3.3 变速积分模块 + +- **积分策略**:根据误差的大小,调整积分速率。误差较小时,使用完整积分;误差较大时,减小或停止积分。 + +### 3.4 参数设置模块 + +- **接口设计**:提供一系列接口函数,用于设置PID控制器的参数,如输出限制、死区误差等。 + +## 4. 使用说明 + +### 4.1 初始化 + +- **控制器初始化**:根据控制对象的特性,初始化模糊PID控制器的相关参数和模糊规则库。 + +### 4.2 实时控制 + +- **参数调整**:在控制循环中,根据实时误差和误差变化率,动态调整PID参数。 +- **控制执行**:根据调整后的PID参数,执行PID控制算法,输出控制信号。 + +### 4.3 参数调整 + +- **动态调整**:根据系统运行情况,通过参数设置模块调整PID参数,优化控制效果。 + +## 5. 结论 + +模糊PID控制器通过动态调整PID参数,提高了控制系统的适应性和稳定性,特别适用于复杂或非线性系统的控制。本文档提供了模糊PID控制器的详细设计方案,旨在帮助开发者更好地理解和应用模糊PID控制技术 + +## 概述 + +本文档旨在详细介绍模糊PID控制器的设计与实现。模糊PID控制器结合了传统PID控制和模糊逻辑控制的优点,通过模糊逻辑对PID参数进行动态调整,以适应控制系统在不同工作状态下的需求。 + +## 功能模块 + +### 1. 模糊控制模块 + +- **功能描述**:根据误差 `e`和误差变化率 `ec`的模糊化值,通过模糊规则库计算出模糊PID控制器的三个参数:比例系数 `kp`、积分系数 `ki`、微分系数 `kd`。 +- **实现方法**:首先将输入的误差 `e`和误差变化率 `ec`限制在预定范围内,然后通过模糊化处理得到其隶属度和模糊位置标号,最后根据模糊规则库计算出 `kp`、`ki`、`kd`的值。 + +### 2. SV平滑给定模块 + +- **功能描述**:平滑控制目标值(Setpoint Value, SV),以减少控制过程中的突变,提高系统的稳定性。 +- **实现方法**:根据当前目标值与新目标值之间的差值,动态调整目标值的变化步长,以实现平滑过渡。 + +### 3. 变速积分模块 + +- **功能描述**:根据误差的大小调整积分速率,以提高控制系统的快速性和稳定性。 +- **实现方法**:当误差较小时,使用完整积分;当误差在一定范围内变化时,通过线性函数调整积分速率;当误差较大时,减小或停止积分,以避免积分饱和。 + +### 4. 参数设置模块 + +- **功能描述**:提供接口函数,用于设置PID控制器的各项参数,包括输出限制范围、死区误差、积分输出值、PID参数等。 +- **实现方法**:根据控制器的子类型(位置型或增量型),分别设置相应参数的值。 + +## 使用说明 + +1. **初始化**:根据控制对象的具体情况,初始化模糊PID控制器的结构体,包括最大误差、最小误差、PID参数的模糊规则库等。 +2. **实时控制**:在控制循环中,根据当前的误差 `e`和误差变化率 `ec`调用模糊控制模块,计算出动态调整的PID参数,然后根据这些参数进行PID控制。 +3. **参数调整**:根据系统运行情况,通过参数设置模块调整PID控制器的参数,以优化控制效果。 + +## 结论 + +模糊PID控制器通过引入模糊逻辑,使得PID参数能够根据控制系统的实时状态动态调整,从而提高了控制系统的适应性和稳定性。通过本文档的设计与实现,开发者可以更好地理解和应用模糊PID控制器。 diff --git a/User/system/lib/control/自整定.md b/User/system/lib/control/自整定.md new file mode 100644 index 0000000..74ed869 --- /dev/null +++ b/User/system/lib/control/自整定.md @@ -0,0 +1 @@ +https://www.cnblogs.com/foxclever/p/16299063.html diff --git a/User/system/lib/examples/Makefile b/User/system/lib/examples/Makefile new file mode 100644 index 0000000..ac0de08 --- /dev/null +++ b/User/system/lib/examples/Makefile @@ -0,0 +1,86 @@ +# 变量BIN: 给定的是我们想要生成的可执行文件的名称 +BIN = run.exe +SO = lib.dll + +# 变量SRC中给的是所有的想要编译的.c源文件,与makefile在同一目录下可直接写(如这里的main.c),否则需要写明相对路径(如这里的其余源文件都在目录src下)。 +# 多文件时,选择用"\"进行分行处理 +SRC = \ + ../src/malloc.c \ + ../src/sqqueue.c \ + ../src/mlist.c \ + ../src/debug.c \ + ../src/data_analysis.c \ + ../src/filter.c \ + ../src/clist.c \ + ../src/aes.c \ + ../src/cmac.c \ + ../src/lib.c + +EXAMPLE = \ + ./simple_clist.c \ + ./simple_data_analysis.c \ + ./simple_sqqueue.c \ + ./simple_aes.c \ + ./simple_cmac.c + +CPLUS_INCLUDE_PATH= -I ../inc + +# 变量CC:给定编译器名gcc +# 变量CFLAGS:传给编译器的某些编译参数,看需求添加 +CC = gcc +CFLAGS = -m32 -std=c99 +# 变量GDB:给定debugger名gdb +# 变量RM:给定删除文件方式,用于后面删除所有编译所得的.o文件,linux下使用rm -rf +GDB = gdb +RM = rm -rf +# 变量OBJS:将变量SRC中所有的.c文件替换成以.o结尾,即将.c源文件编译成.o文件 +OBJS = $(SRC:%.c=%.o) +EXAPMLES = $(EXAMPLE:%.c=%.o) + +$(SO): $(OBJS) $(EXAPMLES) + + +# pull in dependencies for .o files +-include $(OBJS:.o=.d) + +%.o: %.c + $(CC) $(CPLUS_INCLUDE_PATH) $(CFLAGS) -c $< -o $@ + +.PHONY: all clean clist data_analysis + +all: $(SO) + +rm: + $(RM) $(OBJS) + +#简单链表 +clist: $(SO) + $(CC) $(CPLUS_INCLUDE_PATH) $(CFLAGS) $(OBJS) ./simple_clist.o -o $(BIN) + $(RM) $(OBJS) $(EXAPMLES) + +#数据分析器 +data_analysis: $(SO) + $(CC) $(CPLUS_INCLUDE_PATH) $(CFLAGS) $(OBJS) ./simple_data_analysis.o -o $(BIN) + $(RM) $(OBJS) $(EXAPMLES) + +#队列 +sqqueue: $(SO) + $(CC) $(CPLUS_INCLUDE_PATH) $(CFLAGS) $(OBJS) ./simple_sqqueue.o -o $(BIN) + $(RM) $(OBJS) $(EXAPMLES) + +#aes加密 +aes: $(SO) + $(CC) $(CPLUS_INCLUDE_PATH) $(CFLAGS) $(OBJS) ./simple_aes.o -o $(BIN) + $(RM) $(OBJS) $(EXAPMLES) + +#cmac类CRC +cmac: $(SO) + $(CC) $(CPLUS_INCLUDE_PATH) $(CFLAGS) $(OBJS) ./simple_cmac.o -o $(BIN) + $(RM) $(OBJS) $(EXAPMLES) + +#运行程序 +run: + ./run.exe + +clean: + $(RM) $(OBJS) $(EXAPMLES) $(BIN) diff --git a/User/system/lib/examples/simple_aes.c b/User/system/lib/examples/simple_aes.c new file mode 100644 index 0000000..fb4fd5c --- /dev/null +++ b/User/system/lib/examples/simple_aes.c @@ -0,0 +1,40 @@ +#include "../inc/data_type_def.h" +#include "../inc/log.h" +#include "../inc/osel_arch.h" +#include "../inc/aes.h" + +// 全局变量 +static aes_context AesContext; // 密钥表 +static uint8_t aBlock[] = {0x00, 0x00, 0x00, 0xcc, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 数据块 +static uint8_t sBlock[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 存放输出结果 + +int32_t main(void) +{ + uint8_t buf[16] = {0x00}; + uint8_t size = ARRAY_LEN(buf); + uint8_t key[] = { + 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C}; // 密钥 + + // 初始化密文 + for (int i = 0; i < size; i++) + { + buf[i] = i; + } + + // 设置预密钥 + osel_memset(AesContext.ksch, 0, ARRAY_LEN(AesContext.ksch)); + aes_set_key(key, 16, &AesContext); + + // 加密 + osel_memcpy(aBlock, buf, size); + aes_encrypt(aBlock, sBlock, &AesContext); + LOG_HEX(sBlock, ARRAY_LEN(sBlock)); // 打印加密结果:50 fe 67 cc 99 6d 32 b6 da 09 37 e9 9b af ec 60 + + // 解密 + osel_memcpy(aBlock, sBlock, size); + aes_decrypt(aBlock, sBlock, &AesContext); + LOG_HEX(sBlock, ARRAY_LEN(sBlock)); // 打印解密结果:00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +} diff --git a/User/system/lib/examples/simple_clist.c b/User/system/lib/examples/simple_clist.c new file mode 100644 index 0000000..3254b07 --- /dev/null +++ b/User/system/lib/examples/simple_clist.c @@ -0,0 +1,52 @@ +#include "../inc/data_type_def.h" +#include "../inc/clist.h" + +int32_t main(void) +{ + clist_node_t *head = NULL; // 创建头指针,初始化为NULL + clist_init(&head); // 初始化指针(可有可无) + + // 1:添加数据 + for (int32_t i = 0; i < 30; i++) + { + if (i > 10) + clist_push_front(&head, (cnode)i); // 头部插入 + else + clist_push_back(&head, (cnode)i); // 尾部插入 + } + + LOG_PRINT("\n 1: count:%d \n", clist_node_count(head)); // 获取链表节点数,打印 + clist_print(head); // 打印链表 + + // 2:删除数据 + for (int32_t i = 0; i < 10; i++) + { + if (i > 5) + clist_pop_back(&head); // 删除尾部 + else + clist_pop_front(&head); // 头部删除 + } + LOG_PRINT("\n 2: count:%d \n", clist_node_count(head)); + clist_print(head); + + // 3:插入数据 + clist_insert(&head, 5, (cnode)1111); + clist_insert_for_node(&head, head->Next->Next->Next->Next->Next, (cnode)10000); + clist_insert(&head, 1000, (cnode)2222); // 无效插入 + LOG_PRINT("\n 3: count:%d \n", clist_node_count(head)); + clist_print(head); + + // 4:删除指定节点 + clist_remove(&head, (cnode)5); + clist_erase_for_node(&head, head->Next->Next); + clist_remove(&head, (cnode)1000); // 无效删除 + clist_print(head); + LOG_PRINT("\n 4: count:%d \n", clist_node_count(head)); + clist_print(head); + + // 5:删除所有节点 + clist_destroy(&head); + LOG_PRINT("\n 5: count:%d ", clist_node_count(head)); + clist_print(head); + return 0; +} diff --git a/User/system/lib/examples/simple_cmac.c b/User/system/lib/examples/simple_cmac.c new file mode 100644 index 0000000..a96726f --- /dev/null +++ b/User/system/lib/examples/simple_cmac.c @@ -0,0 +1,33 @@ +#include "../inc/data_type_def.h" +#include "../inc/log.h" +#include "../inc/osel_arch.h" +#include "../inc/cmac.h" + +static uint8_t key[] = { + 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C}; // 密钥 +int32_t main(void) +{ + uint8_t *p; + uint8_t buffer[16] = {0x00}; + uint32_t size = ARRAY_LEN(buffer); + // 初始化需要校验的数据 + for (int i = 0; i < size; i++) + { + buffer[i] = i; + } + uint8_t mic[16]; // 存放生成校验数据的数组 + AES_CMAC_CTX AesCmacCtx[1]; // 密钥扩展表 + AES_CMAC_Init(AesCmacCtx); // 完成密钥扩展表的初始化 + + AES_CMAC_SetKey(AesCmacCtx, key); // 完成密钥扩展表数据 + + AES_CMAC_Update(AesCmacCtx, buffer, size & 0xFF); // 完成数据的奇偶校验 + + AES_CMAC_Final(mic, AesCmacCtx); // 生成16个字节的校验表 + + uint32_t xor_vol = (uint32_t)((uint32_t)mic[3] << 24 | (uint32_t)mic[2] << 16 | (uint32_t)mic[1] << 8 | (uint32_t)mic[0]); // 取表4个字节作为校验码 + + p = (uint8_t *)&xor_vol; + LOG_HEX(p, 4); // 打印结果:5c 7e fb 43 +} diff --git a/User/system/lib/examples/simple_cmd.c b/User/system/lib/examples/simple_cmd.c new file mode 100644 index 0000000..563e759 --- /dev/null +++ b/User/system/lib/examples/simple_cmd.c @@ -0,0 +1,26 @@ +#include "../inc/data_type_def.h" +#include "../inc/log.h" +#include "../inc/cmd.h" + +void at_name_req(void) +{ + LOG_PRINT("name:cmd\n"); +} + +void at_version_req(void) +{ + LOG_PRINT("version:1.0\n"); +} + +REGISTER_CMD(NAME, at_name_req, at name); +REGISTER_CMD(VERSION, at_version_req, at version); + +int32_t main(void) +{ + cmd_init(); + + cmd_parsing("TEST"); + cmd_parsing("NAME"); + cmd_parsing("VERSION"); + return 0; +} diff --git a/User/system/lib/examples/simple_data_analysis.c b/User/system/lib/examples/simple_data_analysis.c new file mode 100644 index 0000000..41d38ad --- /dev/null +++ b/User/system/lib/examples/simple_data_analysis.c @@ -0,0 +1,178 @@ +#include "../inc/data_type_def.h" +#include "../inc/log.h" +#include "../inc/osel_arch.h" +#include "../inc/data_analysis.h" +#define UART_RXSIZE (254U) +#define UART_DATA_ANALYSIS_PORT_1 DATA_1 +#define UART_DATA_ANALYSIS_PORT_2 DATA_2 + +static data_interupt_cb_t uart_data_analysis_cb = NULL; // 数据源中断回调函数 + +static void data_analysis_event1(void) +{ + uint8_t frame[UART_RXSIZE]; + uint8_t data_head[3]; + uint8_t crc[2]; + uint16_t frame_len, out_frame_len; + data_read(UART_DATA_ANALYSIS_PORT_1, &data_head[0], 3); + osel_memcpy((uint8_t *)&frame_len, &data_head[1], 2); + + frame_len = B2S_UINT16(frame_len) - 2; // 报文长度包含帧长,这里需要减2 + if (frame_len > UART_RXSIZE) + { + lock_data(UART_DATA_ANALYSIS_PORT_1); + unlock_data(UART_DATA_ANALYSIS_PORT_1); + return; + } + + out_frame_len = data_read(UART_DATA_ANALYSIS_PORT_1, frame, (uint16_t)frame_len); + if (out_frame_len != frame_len) + { + return; + } + out_frame_len = out_frame_len - 1; // 报文中包含帧尾,这里需要减1 + + // 校验CRC_16 + uint16_t crc_16 = 0; + uint16_t crc16 = crc16_compute(&frame[0], out_frame_len - 2); + osel_memcpy(&crc[0], &frame[out_frame_len - 2], 2); + crc_16 = BUILD_UINT16(crc[1], crc[0]); + if (crc16 != crc_16) + { + return; + } + // CRC校验通过后将数据长度-2 + out_frame_len -= 2; + + LOG_PRINT("data_analysis_event1 ok:"); + LOG_HEX(frame, out_frame_len); +} + +static void data_analysis_event2(void) +{ + uint8_t frame[UART_RXSIZE]; + uint8_t data_head[4]; + uint8_t crc[2]; + uint16_t frame_len, out_frame_len; + data_read(UART_DATA_ANALYSIS_PORT_2, &data_head[0], 4); + osel_memcpy((uint8_t *)&frame_len, &data_head[2], 2); + frame_len = B2S_UINT16(frame_len); + if (frame_len > UART_RXSIZE) + { + lock_data(UART_DATA_ANALYSIS_PORT_2); + unlock_data(UART_DATA_ANALYSIS_PORT_2); + return; + } + + out_frame_len = data_read(UART_DATA_ANALYSIS_PORT_2, frame, (uint16_t)frame_len); + if (out_frame_len != frame_len) + { + return; + } + + // 校验CRC_16 + uint16_t crc_16 = 0; + uint16_t crc16 = crc16_compute(&frame[0], out_frame_len - 2); + osel_memcpy(&crc[0], &frame[out_frame_len - 2], 2); + crc_16 = BUILD_UINT16(crc[1], crc[0]); + if (crc16 != crc_16) + { + LOG_PRINT("crc error crc16:%x, crc_16:%x\n"); + return; + } + + out_frame_len -= 2; // 去掉CRC_16 + + LOG_PRINT("data_analysis_event2 ok:"); + LOG_HEX(frame, out_frame_len); +} +/** + * @brief 需要识别帧头和帧尾的数据协议 + * @return {*} + * @note + */ +static void data_register1(void) +{ +/** + * 帧头 帧长度 源地址 目标地址 报文类型 报文体 校验 帧尾 + 1 2 2 2 1 n 2 1 +*/ +#define FRAME_HEAD 0x05 // 帧头 +#define FRAME_TAIL 0x1b // 帧尾 + + // 注册数据解析 + data_reg_t reg; + reg.sd.valid = true; // 数据头部验证有效标志位 + reg.sd.len = 1; // 数据头部长度 + reg.sd.pos = 0; // 数据头部偏移量 + reg.sd.data[0] = FRAME_HEAD; // 数据头部数据 + reg.ld.len = 2; // 数据长度 + reg.ld.pos = 2; // 报文长度包含帧长,这里需要设置偏移2 + reg.ld.valid = true; // 数据长度有效标志位 + reg.ld.little_endian = false; // 数据长度是否小端模式 + reg.argu.len_max = UART_RXSIZE; // 数据最大长度 + reg.argu.len_min = 2; // 数据最小长度 + reg.ed.valid = true; // 数据尾部有效标志位 + reg.ed.len = 1; // 数据尾部长度 + reg.ed.data[0] = FRAME_TAIL; // 数据尾部数据 + reg.echo_en = false; // 是否回显 + reg.func_ptr = data_analysis_event1; // 数据解析回调函数 data_analysis模块处理完数据后,会调用这个函数继续数据协议的处理 + uart_data_analysis_cb = data_fsm_init(UART_DATA_ANALYSIS_PORT_1); // 注册数据处理函数 data_analysis模块会调用这个函数,将数据写入到data_analysis模块 + data_reg(UART_DATA_ANALYSIS_PORT_1, reg); // 注册数据解析 +} + +/** + * @brief 需要识别帧头和没有帧尾的数据协议 + * @return {*} + * @note + */ +static void data_register2(void) +{ +/** + * 帧头 帧长度 源地址 目标地址 报文类型 报文体 校验 + 2 2 2 2 1 n 2 +*/ +#define FRAME_HEAD1 0xD5 // 帧头 +#define FRAME_HEAD2 0xC8 // 帧尾 + + // 注册数据解析 + data_reg_t reg; + reg.sd.valid = true; // 数据头部验证有效标志位 + reg.sd.len = 2; // 数据头部长度 + reg.sd.pos = 0; // 数据头部偏移量 + reg.sd.data[0] = FRAME_HEAD1; // 数据头部数据 + reg.sd.data[1] = FRAME_HEAD2; // 数据头部数据 + reg.ld.len = 2; // 数据长度 + reg.ld.pos = 2; // 报文长度包含帧长,这里需要设置偏移2 + reg.ld.valid = true; // 数据长度有效标志位 + reg.ld.little_endian = false; // 数据长度是否小端模式 + reg.argu.len_max = UART_RXSIZE; // 数据最大长度 + reg.argu.len_min = 2; // 数据最小长度 + reg.ed.valid = false; // 数据尾部有效标志位 + reg.echo_en = false; // 是否回显 + reg.func_ptr = data_analysis_event2; // 数据解析回调函数 data_analysis模块处理完数据后,会调用这个函数继续数据协议的处理 + uart_data_analysis_cb = data_fsm_init(UART_DATA_ANALYSIS_PORT_2); // 注册数据处理函数 data_analysis模块会调用这个函数,将数据写入到data_analysis模块 + data_reg(UART_DATA_ANALYSIS_PORT_2, reg); // 注册数据解析 +} + +int32_t main(void) +{ + data_register1(); + data_register2(); + + // 模拟串口数据 + uint8_t data1[] = {0x05, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x01, 0x00, 0x55, 0x40, 0x1b}; + for (uint16_t i = 0; i < ARRAY_LEN(data1); i++) + { + uart_data_analysis_cb(UART_DATA_ANALYSIS_PORT_1, *(data1 + i)); + } + + // 模拟串口数据 + uint8_t data2[] = {0xD5, 0xC8, 0x00, 0x07, 0xff, 0xff, 0x00, 0x01, 0x00, 0x55, 0x40}; + for (uint16_t i = 0; i < ARRAY_LEN(data2); i++) + { + uart_data_analysis_cb(UART_DATA_ANALYSIS_PORT_2, *(data2 + i)); + } + + return 0; +} diff --git a/User/system/lib/examples/simple_sqqueue.c b/User/system/lib/examples/simple_sqqueue.c new file mode 100644 index 0000000..3ed8c91 --- /dev/null +++ b/User/system/lib/examples/simple_sqqueue.c @@ -0,0 +1,53 @@ +#include "../inc/data_type_def.h" +#include "../inc/log.h" +#include "../inc/osel_arch.h" +#include "../inc/sqqueue.h" + +typedef struct +{ + uint8_t x; + uint8_t y; +} element_t; + +sqqueue_ctrl_t queue; // 创建队列对象 + +void traverse_cb(const void *e) +{ + element_t *p = (element_t *)e; + LOG_PRINT("x = %d, y = %d", p->x, p->y); +} + +int32_t main(void) +{ + int size = 10; + // 初始化队列 + if (FALSE == sqqueue_ctrl_init(&queue, sizeof(element_t), size)) + { + LOG_ERR("queue init failed!"); + return -1; // 创建失败 + } + + // 添加测试元素 + for (int i = 1; i <= 10; i++) + { + element_t element; + element.x = i * 10; + element.y = i * 10; + queue.enter(&queue, &element); // 将成员插入到队列中 + } + LOG_PRINT("add queue len = %d", queue.get_len(&queue)); // 获取队列长度 + + queue.del(&queue); // 移除首元素 + LOG_PRINT("del queue len = %d", queue.get_len(&queue)); // 获取队列长度 + queue.revoke(&queue); // 移除尾元素 + LOG_PRINT("revoke queue len = %d", queue.get_len(&queue)); // 获取队列长度 + queue.remove(&queue, 3); // 删除相对队头指定偏移位置的元素 + LOG_PRINT("remove queue len = %d", queue.get_len(&queue)); // 获取队列长度 + + LOG_PRINT("queue traverse:"); + queue.traverse(&queue, traverse_cb); // 遍历队列 + + queue.clear_sqq(&queue); // 清空队列 + LOG_PRINT("clear queue len = %d", queue.get_len(&queue)); // 获取队列长度 + return 0; +} diff --git a/User/system/lib/flashdb/examples/kvdb_basic_sample.c b/User/system/lib/flashdb/examples/kvdb_basic_sample.c new file mode 100644 index 0000000..01e1c0f --- /dev/null +++ b/User/system/lib/flashdb/examples/kvdb_basic_sample.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief basic KV samples. + * + * basic Key-Value Database KV feature samples + * get and show currnet boot counts + */ + +#include + +#ifdef FDB_USING_KVDB + +#define FDB_LOG_TAG "[sample][kvdb][basic]" + +void kvdb_basic_sample(fdb_kvdb_t kvdb) +{ + struct fdb_blob blob; + int boot_count = 0; + + FDB_INFO("==================== kvdb_basic_sample ====================\n"); + + { /* GET the KV value */ + /* get the "boot_count" KV value */ + fdb_kv_get_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count))); + /* the blob.saved.len is more than 0 when get the value successful */ + if (blob.saved.len > 0) { + FDB_INFO("get the 'boot_count' value is %d\n", boot_count); + } else { + FDB_INFO("get the 'boot_count' failed\n"); + } + } + + { /* CHANGE the KV value */ + /* increase the boot count */ + boot_count ++; + /* change the "boot_count" KV's value */ + fdb_kv_set_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count))); + FDB_INFO("set the 'boot_count' value to %d\n", boot_count); + } + + FDB_INFO("===========================================================\n"); +} + +#endif /* FDB_USING_KVDB */ diff --git a/User/system/lib/flashdb/examples/kvdb_type_blob_sample.c b/User/system/lib/flashdb/examples/kvdb_type_blob_sample.c new file mode 100644 index 0000000..f37983c --- /dev/null +++ b/User/system/lib/flashdb/examples/kvdb_type_blob_sample.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief blob KV samples. + * + * Key-Value Database blob type KV feature samples + */ + +#include + +#ifdef FDB_USING_KVDB + +#define FDB_LOG_TAG "[sample][kvdb][blob]" + +void kvdb_type_blob_sample(fdb_kvdb_t kvdb) +{ + struct fdb_blob blob; + + FDB_INFO("==================== kvdb_type_blob_sample ====================\n"); + + { /* CREATE new Key-Value */ + int temp_data = 36; + + /* It will create new KV node when "temp" KV not in database. + * fdb_blob_make: It's a blob make function, and it will return the blob when make finish. + */ + fdb_kv_set_blob(kvdb, "temp", fdb_blob_make(&blob, &temp_data, sizeof(temp_data))); + FDB_INFO("create the 'temp' blob KV, value is: %d\n", temp_data); + } + + { /* GET the KV value */ + int temp_data = 0; + + /* get the "temp" KV value */ + fdb_kv_get_blob(kvdb, "temp", fdb_blob_make(&blob, &temp_data, sizeof(temp_data))); + /* the blob.saved.len is more than 0 when get the value successful */ + if (blob.saved.len > 0) { + FDB_INFO("get the 'temp' value is: %d\n", temp_data); + } + } + + { /* CHANGE the KV value */ + int temp_data = 38; + + /* change the "temp" KV's value to 38 */ + fdb_kv_set_blob(kvdb, "temp", fdb_blob_make(&blob, &temp_data, sizeof(temp_data))); + FDB_INFO("set 'temp' value to %d\n", temp_data); + } + + { /* DELETE the KV by name */ + fdb_kv_del(kvdb, "temp"); + FDB_INFO("delete the 'temp' finish\n"); + } + + FDB_INFO("===========================================================\n"); +} + +#endif /* FDB_USING_KVDB */ diff --git a/User/system/lib/flashdb/examples/kvdb_type_string_sample.c b/User/system/lib/flashdb/examples/kvdb_type_string_sample.c new file mode 100644 index 0000000..90e6598 --- /dev/null +++ b/User/system/lib/flashdb/examples/kvdb_type_string_sample.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief string KV samples. + * + * Key-Value Database string type KV feature samples source file. + */ + +#include +#include + +#ifdef FDB_USING_KVDB + +#define FDB_LOG_TAG "[sample][kvdb][string]" + +void kvdb_type_string_sample(fdb_kvdb_t kvdb) +{ + FDB_INFO("==================== kvdb_type_string_sample ====================\n"); + + { /* CREATE new Key-Value */ + char temp_data[10] = "36C"; + + /* It will create new KV node when "temp" KV not in database. */ + fdb_kv_set(kvdb, "temp", temp_data); + FDB_INFO("create the 'temp' string KV, value is: %s\n", temp_data); + } + + { /* GET the KV value */ + char *return_value, temp_data[10] = { 0 }; + + /* Get the "temp" KV value. + * NOTE: The return value saved in fdb_kv_get's buffer. Please copy away as soon as possible. + */ + return_value = fdb_kv_get(kvdb, "temp"); + /* the return value is NULL when get the value failed */ + if (return_value != NULL) { + strncpy(temp_data, return_value, sizeof(temp_data)); + FDB_INFO("get the 'temp' value is: %s\n", temp_data); + } + } + + { /* CHANGE the KV value */ + char temp_data[10] = "38C"; + + /* change the "temp" KV's value to "38.1" */ + fdb_kv_set(kvdb, "temp", temp_data); + FDB_INFO("set 'temp' value to %s\n", temp_data); + } + + { /* DELETE the KV by name */ + fdb_kv_del(kvdb, "temp"); + FDB_INFO("delete the 'temp' finish\n"); + } + + FDB_INFO("===========================================================\n"); +} + +#endif /* FDB_USING_KVDB */ diff --git a/User/system/lib/flashdb/examples/tsdb_sample.c b/User/system/lib/flashdb/examples/tsdb_sample.c new file mode 100644 index 0000000..173ceb1 --- /dev/null +++ b/User/system/lib/flashdb/examples/tsdb_sample.c @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief TSDB samples. + * + * Time series log (like TSDB) feature samples source file. + * + * TSL is time series log, the TSDB saved many TSLs. + */ + +#include +#include + +#ifdef FDB_USING_TSDB + +#define FDB_LOG_TAG "[sample][tsdb]" + +#ifdef FDB_USING_TIMESTAMP_64BIT +#define __PRITS "ld" +#else +#define __PRITS "d" +#endif + +struct env_status { + int temp; + int humi; +}; + +static bool query_cb(fdb_tsl_t tsl, void *arg); +static bool query_by_time_cb(fdb_tsl_t tsl, void *arg); +static bool set_status_cb(fdb_tsl_t tsl, void *arg); + +void tsdb_sample(fdb_tsdb_t tsdb) +{ + struct fdb_blob blob; + + FDB_INFO("==================== tsdb_sample ====================\n"); + + { /* APPEND new TSL (time series log) */ + struct env_status status; + + /* append new log to TSDB */ + status.temp = 36; + status.humi = 85; + fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status))); + FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi); + + status.temp = 38; + status.humi = 90; + fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status))); + FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi); + } + + { /* QUERY the TSDB */ + /* query all TSL in TSDB by iterator */ + fdb_tsl_iter(tsdb, query_cb, tsdb); + } + + { /* QUERY the TSDB by time */ + /* prepare query time (from 1970-01-01 00:00:00 to 2020-05-05 00:00:00) */ + struct tm tm_from = { .tm_year = 1970 - 1900, .tm_mon = 0, .tm_mday = 1, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 }; + struct tm tm_to = { .tm_year = 2020 - 1900, .tm_mon = 4, .tm_mday = 5, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 }; + time_t from_time = mktime(&tm_from), to_time = mktime(&tm_to); + size_t count; + /* query all TSL in TSDB by time */ + fdb_tsl_iter_by_time(tsdb, from_time, to_time, query_by_time_cb, tsdb); + /* query all FDB_TSL_WRITE status TSL's count in TSDB by time */ + count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE); + FDB_INFO("query count is: %zu\n", count); + } + + { /* SET the TSL status */ + /* Change the TSL status by iterator or time iterator + * set_status_cb: the change operation will in this callback + * + * NOTE: The actions to modify the state must be in order. + * like: FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED -> FDB_TSL_USER_STATUS2 + * The intermediate states can also be ignored. + * such as: FDB_TSL_WRITE -> FDB_TSL_DELETED + */ + fdb_tsl_iter(tsdb, set_status_cb, tsdb); + } + + FDB_INFO("===========================================================\n"); +} + +static bool query_cb(fdb_tsl_t tsl, void *arg) +{ + struct fdb_blob blob; + struct env_status status; + fdb_tsdb_t db = arg; + + fdb_blob_read((fdb_db_t) db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status)))); + FDB_INFO("[query_cb] queried a TSL: time: %" __PRITS ", temp: %d, humi: %d\n", tsl->time, status.temp, status.humi); + + return false; +} + +static bool query_by_time_cb(fdb_tsl_t tsl, void *arg) +{ + struct fdb_blob blob; + struct env_status status; + fdb_tsdb_t db = arg; + + fdb_blob_read((fdb_db_t) db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status)))); + FDB_INFO("[query_by_time_cb] queried a TSL: time: %" __PRITS ", temp: %d, humi: %d\n", tsl->time, status.temp, status.humi); + + return false; +} + +static bool set_status_cb(fdb_tsl_t tsl, void *arg) +{ + fdb_tsdb_t db = arg; + + FDB_INFO("set the TSL (time %" __PRITS ") status from %d to %d\n", tsl->time, tsl->status, FDB_TSL_USER_STATUS1); + fdb_tsl_set_status(db, tsl, FDB_TSL_USER_STATUS1); + + return false; +} + +#endif /* FDB_USING_TSDB */ diff --git a/User/system/lib/flashdb/fal/fal.c b/User/system/lib/flashdb/fal/fal.c new file mode 100644 index 0000000..85d4660 --- /dev/null +++ b/User/system/lib/flashdb/fal/fal.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#include + +static uint8_t init_ok = 0; + +/** + * FAL (Flash Abstraction Layer) initialization. + * It will initialize all flash device and all flash partition. + * + * @return >= 0: partitions total number + */ +int fal_init(void) +{ + extern int fal_flash_init(void); + extern int fal_partition_init(void); + + int result; + + /* initialize all flash device on FAL flash table */ + result = fal_flash_init(); + + if (result < 0) { + goto __exit; + } + + /* initialize all flash partition on FAL partition table */ + result = fal_partition_init(); + +__exit: + + if ((result > 0) && (!init_ok)) + { + init_ok = 1; + log_i("Flash Abstraction Layer (V%s) initialize success.", FAL_SW_VERSION); + } + else if(result <= 0) + { + init_ok = 0; + log_e("Flash Abstraction Layer (V%s) initialize failed.", FAL_SW_VERSION); + } + + return result; +} + +/** + * Check if the FAL is initialized successfully + * + * @return 0: not init or init failed; 1: init success + */ +int fal_init_check(void) +{ + return init_ok; +} diff --git a/User/system/lib/flashdb/fal/fal.h b/User/system/lib/flashdb/fal/fal.h new file mode 100644 index 0000000..19a996f --- /dev/null +++ b/User/system/lib/flashdb/fal/fal.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#ifndef _FAL_H_ +#define _FAL_H_ + +#include +#include "fal_def.h" + +/** + * FAL (Flash Abstraction Layer) initialization. + * It will initialize all flash device and all flash partition. + * + * @return >= 0: partitions total number + */ +int fal_init(void); + +/* =============== flash device operator API =============== */ +/** + * find flash device by name + * + * @param name flash device name + * + * @return != NULL: flash device + * NULL: not found + */ +const struct fal_flash_dev *fal_flash_device_find(const char *name); + +/* =============== partition operator API =============== */ +/** + * find the partition by name + * + * @param name partition name + * + * @return != NULL: partition + * NULL: not found + */ +const struct fal_partition *fal_partition_find(const char *name); + +/** + * get the partition table + * + * @param len return the partition table length + * + * @return partition table + */ +const struct fal_partition *fal_get_partition_table(size_t *len); + +/** + * set partition table temporarily + * This setting will modify the partition table temporarily, the setting will be lost after restart. + * + * @param table partition table + * @param len partition table length + */ +void fal_set_partition_table_temp(struct fal_partition *table, size_t len); + +/** + * read data from partition + * + * @param part partition + * @param addr relative address for partition + * @param buf read buffer + * @param size read size + * + * @return >= 0: successful read data size + * -1: error + */ +int fal_partition_read(const struct fal_partition *part, uint32_t addr, uint8_t *buf, size_t size); + +/** + * write data to partition + * + * @param part partition + * @param addr relative address for partition + * @param buf write buffer + * @param size write size + * + * @return >= 0: successful write data size + * -1: error + */ +int fal_partition_write(const struct fal_partition *part, uint32_t addr, const uint8_t *buf, size_t size); + +/** + * erase partition data + * + * @param part partition + * @param addr relative address for partition + * @param size erase size + * + * @return >= 0: successful erased data size + * -1: error + */ +int fal_partition_erase(const struct fal_partition *part, uint32_t addr, size_t size); + +/** + * erase partition all data + * + * @param part partition + * + * @return >= 0: successful erased data size + * -1: error + */ +int fal_partition_erase_all(const struct fal_partition *part); + +/** + * print the partition table + */ +void fal_show_part_table(void); + +/* =============== API provided to RT-Thread =============== */ +/** + * create RT-Thread block device by specified partition + * + * @param parition_name partition name + * + * @return != NULL: created block device + * NULL: created failed + */ +struct rt_device *fal_blk_device_create(const char *parition_name); + +#if defined(RT_USING_MTD_NOR) +/** + * create RT-Thread MTD NOR device by specified partition + * + * @param parition_name partition name + * + * @return != NULL: created MTD NOR device + * NULL: created failed + */ +struct rt_device *fal_mtd_nor_device_create(const char *parition_name); +#endif /* defined(RT_USING_MTD_NOR) */ + +/** + * create RT-Thread char device by specified partition + * + * @param parition_name partition name + * + * @return != NULL: created char device + * NULL: created failed + */ +struct rt_device *fal_char_device_create(const char *parition_name); + +#endif /* _FAL_H_ */ diff --git a/User/system/lib/flashdb/fal/fal_cfg.h b/User/system/lib/flashdb/fal/fal_cfg.h new file mode 100644 index 0000000..7a7e53a --- /dev/null +++ b/User/system/lib/flashdb/fal/fal_cfg.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ +#include "eeprom_m95.h" +#include "eeprom_fm24.h" +#include "flash.h" + +#define FAL_PART_HAS_TABLE_CFG +#define FAL_ERASE_SIZE 100 +// 需要块大小为2的N次方 +#define EEPROM_M95_1_BLOCK_SIZE M95_PAGE_SIZE_256 * 32 +#define EEPROM_M95_2_BLOCK_SIZE M95_PAGE_SIZE_256 * 32 +#define EEPROM_FM24_BLOCK_SIZE FM24_PAGE_SIZE * 16 + +#define EEPROM_M95_1_SIZE _M95M02_ +#define EEPROM_M95_2_SIZE _M95M02_ +#define EEPROM_FM24_SIZE FM24_SIZE + +#define EEPROM_M95_1_DEV_NAME "eeprom_m95_1" +#define EEPROM_M95_2_DEV_NAME "eeprom_m95_2" +#define EEPROM_FM24_DEV_NAME "eeprom_fm24" + +/* ===================== Flash device Configuration ========================= */ +extern struct fal_flash_dev eeprom_m95_1; +extern struct fal_flash_dev eeprom_m95_2; +extern struct fal_flash_dev eeprom_fm24; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ + { \ + &eeprom_m95_1, \ + &eeprom_m95_2, \ + } + +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG +/* partition table */ +// issues :https://github.com/armink/FlashDB/issues/40 ;epprom的扇区太小 +#define FAL_PART_TABLE \ + { \ + {FAL_PART_MAGIC_WORD, "KVDB", EEPROM_M95_1_DEV_NAME, 0, EEPROM_M95_1_SIZE, 0}, \ + {FAL_PART_MAGIC_WORD, "TSDB", EEPROM_M95_2_DEV_NAME, 0, EEPROM_M95_2_SIZE, 0}, \ + } + +#endif /* FAL_PART_HAS_TABLE_CFG */ + +#endif /* _FAL_CFG_H_ */ diff --git a/User/system/lib/flashdb/fal/fal_def.h b/User/system/lib/flashdb/fal/fal_def.h new file mode 100644 index 0000000..de8aada --- /dev/null +++ b/User/system/lib/flashdb/fal/fal_def.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#ifndef _FAL_DEF_H_ +#define _FAL_DEF_H_ + +#include +#include +#ifdef FDB_USING_NATIVE_ASSERT +#include +#endif + +#define FAL_SW_VERSION "0.5.99" + +#ifdef __RTTHREAD__ /* for RT-Thread platform */ +#include +#define FAL_PRINTF rt_kprintf +#define FAL_MALLOC rt_malloc +#define FAL_CALLOC rt_calloc +#define FAL_REALLOC rt_realloc +#define FAL_FREE rt_free +#endif + +#ifndef FAL_MALLOC +#define FAL_MALLOC malloc +#endif + +#ifndef FAL_CALLOC +#define FAL_CALLOC calloc +#endif + +#ifndef FAL_REALLOC +#define FAL_REALLOC realloc +#endif + +#ifndef FAL_FREE +#define FAL_FREE free +#endif + +#ifndef FAL_PRINTF +#define FAL_PRINTF printf +#endif + +#ifndef FAL_DEBUG +#define FAL_DEBUG 0 +#endif + +#if FAL_DEBUG +#ifndef FDB_USING_NATIVE_ASSERT +#ifdef assert +#undef assert +#endif +#define assert(EXPR) \ +if (!(EXPR)) \ +{ \ + FAL_PRINTF("(%s) has assert failed at %s.\n", #EXPR, __func__ ); \ + while (1); \ +} +#endif + +/* debug level log */ +#ifdef log_d +#undef log_d +#endif +#include +#define log_d(...) FAL_PRINTF("[D/FAL] (%s:%" PRIdLEAST16 ") ", __func__, __LINE__); FAL_PRINTF(__VA_ARGS__);FAL_PRINTF("\n") + +#else + +#ifndef FDB_USING_NATIVE_ASSERT +#ifdef assert +#undef assert +#endif +#define assert(EXPR) ((void)0); +#endif + +/* debug level log */ +#ifdef log_d +#undef log_d +#endif +#define log_d(...) +#endif /* FAL_DEBUG */ + +/* error level log */ +#ifdef log_e +#undef log_e +#endif +#define log_e(...) FAL_PRINTF("\033[31;22m[E/FAL] (%s:%d) ", __func__, __LINE__);FAL_PRINTF(__VA_ARGS__);FAL_PRINTF("\033[0m\n") + +/* info level log */ +#ifdef log_i +#undef log_i +#endif +#define log_i(...) FAL_PRINTF("\033[32;22m[I/FAL] "); FAL_PRINTF(__VA_ARGS__);FAL_PRINTF("\033[0m\n") + +/* FAL flash and partition device name max length */ +#ifndef FAL_DEV_NAME_MAX +#define FAL_DEV_NAME_MAX 24 +#endif + +struct fal_flash_dev +{ + char name[FAL_DEV_NAME_MAX]; + + /* flash device start address and len */ + uint32_t addr; + size_t len; + /* the block size in the flash for erase minimum granularity */ + size_t blk_size; + + struct + { + int (*init)(void); + int (*read)(long offset, uint8_t *buf, size_t size); + int (*write)(long offset, const uint8_t *buf, size_t size); + int (*erase)(long offset, size_t size); + } ops; + + /* write minimum granularity, unit: bit. + 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1)/ 64(stm32l4) + 0 will not take effect. */ + size_t write_gran; +}; +typedef struct fal_flash_dev *fal_flash_dev_t; + +/** + * FAL partition + */ +struct fal_partition +{ + uint32_t magic_word; + + /* partition name */ + char name[FAL_DEV_NAME_MAX]; + /* flash device name for partition */ + char flash_name[FAL_DEV_NAME_MAX]; + + /* partition offset address on flash device */ + long offset; + size_t len; + + uint32_t reserved; +}; +typedef struct fal_partition *fal_partition_t; + +#endif /* _FAL_DEF_H_ */ diff --git a/User/system/lib/flashdb/fal/fal_flash.c b/User/system/lib/flashdb/fal/fal_flash.c new file mode 100644 index 0000000..8cef82c --- /dev/null +++ b/User/system/lib/flashdb/fal/fal_flash.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#include +#include + +/* flash device table, must defined by user */ +#if !defined(FAL_FLASH_DEV_TABLE) +#error "You must defined flash device table (FAL_FLASH_DEV_TABLE) on 'fal_cfg.h'" +#endif + +static const struct fal_flash_dev * const device_table[] = FAL_FLASH_DEV_TABLE; +static const size_t device_table_len = sizeof(device_table) / sizeof(device_table[0]); +static uint8_t init_ok = 0; + +/** + * Initialize all flash device on FAL flash table + * + * @return result + */ +int fal_flash_init(void) +{ + size_t i; + + if (init_ok) + { + return 0; + } + + for (i = 0; i < device_table_len; i++) + { + assert(device_table[i]->ops.read); + assert(device_table[i]->ops.write); + assert(device_table[i]->ops.erase); + /* init flash device on flash table */ + if (device_table[i]->ops.init) + { + device_table[i]->ops.init(); + } + log_d("Flash device | %*.*s | addr: 0x%08lx | len: 0x%08x | blk_size: 0x%08x |initialized finish.", + FAL_DEV_NAME_MAX, FAL_DEV_NAME_MAX, device_table[i]->name, device_table[i]->addr, device_table[i]->len, + device_table[i]->blk_size); + } + + init_ok = 1; + return 0; +} + +/** + * find flash device by name + * + * @param name flash device name + * + * @return != NULL: flash device + * NULL: not found + */ +const struct fal_flash_dev *fal_flash_device_find(const char *name) +{ + assert(init_ok); + assert(name); + + size_t i; + + for (i = 0; i < device_table_len; i++) + { + if (!strncmp(name, device_table[i]->name, FAL_DEV_NAME_MAX)) { + return device_table[i]; + } + } + + return NULL; +} diff --git a/User/system/lib/flashdb/fal/fal_partition.c b/User/system/lib/flashdb/fal/fal_partition.c new file mode 100644 index 0000000..a24e631 --- /dev/null +++ b/User/system/lib/flashdb/fal/fal_partition.c @@ -0,0 +1,525 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#include +#include +#include + +/* partition magic word */ +#define FAL_PART_MAGIC_WORD 0x45503130 +#define FAL_PART_MAGIC_WORD_H 0x4550L +#define FAL_PART_MAGIC_WORD_L 0x3130L + +struct part_flash_info +{ + const struct fal_flash_dev *flash_dev; +}; + +/** + * FAL partition table config has defined on 'fal_cfg.h'. + * When this option is disable, it will auto find the partition table on a specified location in flash partition. + */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* check partition table definition */ +#if !defined(FAL_PART_TABLE) +#error "You must defined FAL_PART_TABLE on 'fal_cfg.h'" +#endif + +#ifdef __CC_ARM /* ARM Compiler */ + #define SECTION(x) __attribute__((section(x))) + #define USED __attribute__((used)) +#elif defined (__IAR_SYSTEMS_ICC__) /* for IAR Compiler */ + #define SECTION(x) @ x + #define USED __root +#elif defined (__GNUC__) /* GNU GCC Compiler */ + #define SECTION(x) __attribute__((section(x))) + #define USED __attribute__((used)) +#else + #error not supported tool chain +#endif /* __CC_ARM */ +//USED static const struct fal_partition partition_table_def[] SECTION("FalPartTable") = FAL_PART_TABLE; +static const struct fal_partition partition_table_def[] = FAL_PART_TABLE; +static const struct fal_partition *partition_table = NULL; +/* partition and flash object information cache table */ +static struct part_flash_info part_flash_cache[sizeof(partition_table_def) / sizeof(partition_table_def[0])] = { 0 }; + +#else /* FAL_PART_HAS_TABLE_CFG */ + +#if !defined(FAL_PART_TABLE_FLASH_DEV_NAME) +#error "You must defined FAL_PART_TABLE_FLASH_DEV_NAME on 'fal_cfg.h'" +#endif + +/* check partition table end offset address definition */ +#if !defined(FAL_PART_TABLE_END_OFFSET) +#error "You must defined FAL_PART_TABLE_END_OFFSET on 'fal_cfg.h'" +#endif + +static struct fal_partition *partition_table = NULL; +static struct part_flash_info *part_flash_cache = NULL; +#endif /* FAL_PART_HAS_TABLE_CFG */ + +static uint8_t init_ok = 0; +static size_t partition_table_len = 0; + +/** + * print the partition table + */ +void fal_show_part_table(void) +{ + char *item1 = "name", *item2 = "flash_dev"; + size_t i, part_name_max = strlen(item1), flash_dev_name_max = strlen(item2); + const struct fal_partition *part; + + if (partition_table_len) + { + for (i = 0; i < partition_table_len; i++) + { + part = &partition_table[i]; + if (strlen(part->name) > part_name_max) + { + part_name_max = strlen(part->name); + } + if (strlen(part->flash_name) > flash_dev_name_max) + { + flash_dev_name_max = strlen(part->flash_name); + } + } + } + log_i("==================== FAL partition table ===================="); + log_i("| %-*.*s | %-*.*s | offset | length |", part_name_max, FAL_DEV_NAME_MAX, item1, flash_dev_name_max, + FAL_DEV_NAME_MAX, item2); + log_i("-------------------------------------------------------------"); + for (i = 0; i < partition_table_len; i++) + { + +#ifdef FAL_PART_HAS_TABLE_CFG + part = &partition_table[i]; +#else + part = &partition_table[partition_table_len - i - 1]; +#endif + + log_i("| %-*.*s | %-*.*s | 0x%08lx | 0x%08x |", part_name_max, FAL_DEV_NAME_MAX, part->name, flash_dev_name_max, + FAL_DEV_NAME_MAX, part->flash_name, part->offset, part->len); + } + log_i("============================================================="); +} + +static int check_and_update_part_cache(const struct fal_partition *table, size_t len) +{ + const struct fal_flash_dev *flash_dev = NULL; + size_t i; + +#ifndef FAL_PART_HAS_TABLE_CFG + if (part_flash_cache) + { + FAL_FREE(part_flash_cache); + } + part_flash_cache = FAL_MALLOC(len * sizeof(struct part_flash_info)); + if (part_flash_cache == NULL) + { + log_e("Initialize failed! No memory for partition table cache"); + return -2; + } +#endif + + for (i = 0; i < len; i++) + { + flash_dev = fal_flash_device_find(table[i].flash_name); + if (flash_dev == NULL) + { + log_d("Warning: Do NOT found the flash device(%s).", table[i].flash_name); + continue; + } + + if (table[i].offset >= (long)flash_dev->len) + { + log_e("Initialize failed! Partition(%s) offset address(%ld) out of flash bound(<%d).", + table[i].name, table[i].offset, flash_dev->len); + partition_table_len = 0; + + return -1; + } + + part_flash_cache[i].flash_dev = flash_dev; + } + + return 0; +} + +/** + * Initialize all flash partition on FAL partition table + * + * @return partitions total number + */ +int fal_partition_init(void) +{ + + if (init_ok) + { + return partition_table_len; + } + +#ifdef FAL_PART_HAS_TABLE_CFG + partition_table = &partition_table_def[0]; + partition_table_len = sizeof(partition_table_def) / sizeof(partition_table_def[0]); +#else + /* load partition table from the end address FAL_PART_TABLE_END_OFFSET, error return 0 */ + long part_table_offset = FAL_PART_TABLE_END_OFFSET; + size_t table_num = 0, table_item_size = 0; + uint8_t part_table_find_ok = 0; + uint32_t read_magic_word; + fal_partition_t new_part = NULL; + size_t i; + const struct fal_flash_dev *flash_dev = NULL; + + flash_dev = fal_flash_device_find(FAL_PART_TABLE_FLASH_DEV_NAME); + if (flash_dev == NULL) + { + log_e("Initialize failed! Flash device (%s) NOT found.", FAL_PART_TABLE_FLASH_DEV_NAME); + goto _exit; + } + + /* check partition table offset address */ + if (part_table_offset < 0 || part_table_offset >= (long) flash_dev->len) + { + log_e("Setting partition table end offset address(%ld) out of flash bound(<%d).", part_table_offset, flash_dev->len); + goto _exit; + } + + table_item_size = sizeof(struct fal_partition); + new_part = (fal_partition_t)FAL_MALLOC(table_item_size); + if (new_part == NULL) + { + log_e("Initialize failed! No memory for table buffer."); + goto _exit; + } + + /* find partition table location */ + { + uint8_t read_buf[64]; + + part_table_offset -= sizeof(read_buf); + while (part_table_offset >= 0) + { + if (flash_dev->ops.read(part_table_offset, read_buf, sizeof(read_buf)) > 0) + { + /* find magic word in read buf */ + for (i = 0; i < sizeof(read_buf) - sizeof(read_magic_word) + 1; i++) + { + read_magic_word = read_buf[0 + i] + (read_buf[1 + i] << 8) + (read_buf[2 + i] << 16) + (read_buf[3 + i] << 24); + if (read_magic_word == ((FAL_PART_MAGIC_WORD_H << 16) + FAL_PART_MAGIC_WORD_L)) + { + part_table_find_ok = 1; + part_table_offset += i; + log_d("Find the partition table on '%s' offset @0x%08lx.", FAL_PART_TABLE_FLASH_DEV_NAME, + part_table_offset); + break; + } + } + } + else + { + /* read failed */ + break; + } + + if (part_table_find_ok) + { + break; + } + else + { + /* calculate next read buf position */ + if (part_table_offset >= (long)sizeof(read_buf)) + { + part_table_offset -= sizeof(read_buf); + part_table_offset += (sizeof(read_magic_word) - 1); + } + else if (part_table_offset != 0) + { + part_table_offset = 0; + } + else + { + /* find failed */ + break; + } + } + } + } + + /* load partition table */ + while (part_table_find_ok) + { + memset(new_part, 0x00, table_num); + if (flash_dev->ops.read(part_table_offset - table_item_size * (table_num), (uint8_t *) new_part, + table_item_size) < 0) + { + log_e("Initialize failed! Flash device (%s) read error!", flash_dev->name); + table_num = 0; + break; + } + + if (new_part->magic_word != ((FAL_PART_MAGIC_WORD_H << 16) + FAL_PART_MAGIC_WORD_L)) + { + break; + } + + partition_table = (fal_partition_t) FAL_REALLOC(partition_table, table_item_size * (table_num + 1)); + if (partition_table == NULL) + { + log_e("Initialize failed! No memory for partition table"); + table_num = 0; + break; + } + + memcpy(partition_table + table_num, new_part, table_item_size); + + table_num++; + }; + + if (table_num == 0) + { + log_e("Partition table NOT found on flash: %s (len: %d) from offset: 0x%08x.", FAL_PART_TABLE_FLASH_DEV_NAME, + FAL_DEV_NAME_MAX, FAL_PART_TABLE_END_OFFSET); + goto _exit; + } + else + { + partition_table_len = table_num; + } +#endif /* FAL_PART_HAS_TABLE_CFG */ + + /* check the partition table device exists */ + if (check_and_update_part_cache(partition_table, partition_table_len) != 0) + { + goto _exit; + } + + init_ok = 1; + +_exit: + +#if FAL_DEBUG + fal_show_part_table(); +#endif + +#ifndef FAL_PART_HAS_TABLE_CFG + if (new_part) + { + FAL_FREE(new_part); + } +#endif /* !FAL_PART_HAS_TABLE_CFG */ + + return partition_table_len; +} + +/** + * find the partition by name + * + * @param name partition name + * + * @return != NULL: partition + * NULL: not found + */ +const struct fal_partition *fal_partition_find(const char *name) +{ + assert(init_ok); + + size_t i; + + for (i = 0; i < partition_table_len; i++) + { + if (!strcmp(name, partition_table[i].name)) + { + return &partition_table[i]; + } + } + + return NULL; +} + +static const struct fal_flash_dev *flash_device_find_by_part(const struct fal_partition *part) +{ + assert(part >= partition_table); + assert(part <= &partition_table[partition_table_len - 1]); + + return part_flash_cache[part - partition_table].flash_dev; +} + +/** + * get the partition table + * + * @param len return the partition table length + * + * @return partition table + */ +const struct fal_partition *fal_get_partition_table(size_t *len) +{ + assert(init_ok); + assert(len); + + *len = partition_table_len; + + return partition_table; +} + +/** + * set partition table temporarily + * This setting will modify the partition table temporarily, the setting will be lost after restart. + * + * @param table partition table + * @param len partition table length + */ +void fal_set_partition_table_temp(struct fal_partition *table, size_t len) +{ + assert(init_ok); + assert(table); + + check_and_update_part_cache(table, len); + + partition_table_len = len; + partition_table = table; +} + +/** + * read data from partition + * + * @param part partition + * @param addr relative address for partition + * @param buf read buffer + * @param size read size + * + * @return >= 0: successful read data size + * -1: error + */ +int fal_partition_read(const struct fal_partition *part, uint32_t addr, uint8_t *buf, size_t size) +{ + int ret = 0; + const struct fal_flash_dev *flash_dev = NULL; + + assert(part); + assert(buf); + + if (addr + size > part->len) + { + log_e("Partition read error! Partition address out of bound."); + return -1; + } + + flash_dev = flash_device_find_by_part(part); + if (flash_dev == NULL) + { + log_e("Partition read error! Don't found flash device(%s) of the partition(%s).", part->flash_name, part->name); + return -1; + } + + ret = flash_dev->ops.read(part->offset + addr, buf, size); + if (ret < 0) + { + log_e("Partition read error! Flash device(%s) read error!", part->flash_name); + } + + return ret; +} + +/** + * write data to partition + * + * @param part partition + * @param addr relative address for partition + * @param buf write buffer + * @param size write size + * + * @return >= 0: successful write data size + * -1: error + */ +int fal_partition_write(const struct fal_partition *part, uint32_t addr, const uint8_t *buf, size_t size) +{ + int ret = 0; + const struct fal_flash_dev *flash_dev = NULL; + + assert(part); + assert(buf); + + if (addr + size > part->len) + { + log_e("Partition write error! Partition address out of bound."); + return -1; + } + + flash_dev = flash_device_find_by_part(part); + if (flash_dev == NULL) + { + log_e("Partition write error! Don't found flash device(%s) of the partition(%s).", part->flash_name, part->name); + return -1; + } + + ret = flash_dev->ops.write(part->offset + addr, buf, size); + if (ret < 0) + { + log_e("Partition write error! Flash device(%s) write error!", part->flash_name); + } + + return ret; +} + +/** + * erase partition data + * + * @param part partition + * @param addr relative address for partition + * @param size erase size + * + * @return >= 0: successful erased data size + * -1: error + */ +int fal_partition_erase(const struct fal_partition *part, uint32_t addr, size_t size) +{ + int ret = 0; + const struct fal_flash_dev *flash_dev = NULL; + + assert(part); + + if (addr + size > part->len) + { + log_e("Partition erase error! Partition address out of bound."); + return -1; + } + + flash_dev = flash_device_find_by_part(part); + if (flash_dev == NULL) + { + log_e("Partition erase error! Don't found flash device(%s) of the partition(%s).", part->flash_name, part->name); + return -1; + } + + ret = flash_dev->ops.erase(part->offset + addr, size); + if (ret < 0) + { + log_e("Partition erase error! Flash device(%s) erase error!", part->flash_name); + } + + return ret; +} + +/** + * erase partition all data + * + * @param part partition + * + * @return >= 0: successful erased data size + * -1: error + */ +int fal_partition_erase_all(const struct fal_partition *part) +{ + return fal_partition_erase(part, 0, part->len); +} diff --git a/User/system/lib/flashdb/fal/fal_rtt.c b/User/system/lib/flashdb/fal/fal_rtt.c new file mode 100644 index 0000000..3b699da --- /dev/null +++ b/User/system/lib/flashdb/fal/fal_rtt.c @@ -0,0 +1,934 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-06-23 armink the first version + * 2019-08-22 MurphyZhao adapt to none rt-thread case + */ + +#include + +#ifdef RT_VER_NUM +#include +#include +#include + +/* ========================== block device ======================== */ +struct fal_blk_device +{ + struct rt_device parent; + struct rt_device_blk_geometry geometry; + const struct fal_partition *fal_part; +}; + +/* RT-Thread device interface */ +#if RTTHREAD_VERSION >= 30000 +static rt_err_t blk_dev_control(rt_device_t dev, int cmd, void *args) +#else +static rt_err_t blk_dev_control(rt_device_t dev, rt_uint8_t cmd, void *args) +#endif +{ + struct fal_blk_device *part = (struct fal_blk_device*) dev; + + assert(part != RT_NULL); + + if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) + { + struct rt_device_blk_geometry *geometry; + + geometry = (struct rt_device_blk_geometry *) args; + if (geometry == RT_NULL) + { + return -RT_ERROR; + } + + memcpy(geometry, &part->geometry, sizeof(struct rt_device_blk_geometry)); + } + else if (cmd == RT_DEVICE_CTRL_BLK_ERASE) + { + rt_uint32_t *addrs = (rt_uint32_t *) args, start_addr = addrs[0], end_addr = addrs[1], phy_start_addr; + rt_size_t phy_size; + + if (addrs == RT_NULL || start_addr > end_addr) + { + return -RT_ERROR; + } + + if (end_addr == start_addr) + { + end_addr++; + } + + phy_start_addr = start_addr * part->geometry.bytes_per_sector; + phy_size = (end_addr - start_addr) * part->geometry.bytes_per_sector; + + if (fal_partition_erase(part->fal_part, phy_start_addr, phy_size) < 0) + { + return -RT_ERROR; + } + } + + return RT_EOK; +} + +static rt_size_t blk_dev_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) +{ + int ret = 0; + struct fal_blk_device *part = (struct fal_blk_device*) dev; + + assert(part != RT_NULL); + + ret = fal_partition_read(part->fal_part, pos * part->geometry.block_size, buffer, size * part->geometry.block_size); + + if (ret != (int)(size * part->geometry.block_size)) + { + ret = 0; + } + else + { + ret = size; + } + + return ret; +} + +static rt_size_t blk_dev_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) +{ + int ret = 0; + struct fal_blk_device *part; + rt_off_t phy_pos; + rt_size_t phy_size; + + part = (struct fal_blk_device*) dev; + assert(part != RT_NULL); + + /* change the block device's logic address to physical address */ + phy_pos = pos * part->geometry.bytes_per_sector; + phy_size = size * part->geometry.bytes_per_sector; + + ret = fal_partition_erase(part->fal_part, phy_pos, phy_size); + + if (ret == (int) phy_size) + { + ret = fal_partition_write(part->fal_part, phy_pos, buffer, phy_size); + } + + if (ret != (int) phy_size) + { + ret = 0; + } + else + { + ret = size; + } + + return ret; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops blk_dev_ops = +{ + RT_NULL, + RT_NULL, + RT_NULL, + blk_dev_read, + blk_dev_write, + blk_dev_control +}; +#endif + +/** + * create RT-Thread block device by specified partition + * + * @param parition_name partition name + * + * @return != NULL: created block device + * NULL: created failed + */ +struct rt_device *fal_blk_device_create(const char *parition_name) +{ + struct fal_blk_device *blk_dev; + const struct fal_partition *fal_part = fal_partition_find(parition_name); + const struct fal_flash_dev *fal_flash = NULL; + + if (!fal_part) + { + log_e("Error: the partition name (%s) is not found.", parition_name); + return NULL; + } + + if ((fal_flash = fal_flash_device_find(fal_part->flash_name)) == NULL) + { + log_e("Error: the flash device name (%s) is not found.", fal_part->flash_name); + return NULL; + } + + blk_dev = (struct fal_blk_device*) rt_malloc(sizeof(struct fal_blk_device)); + if (blk_dev) + { + blk_dev->fal_part = fal_part; + blk_dev->geometry.bytes_per_sector = fal_flash->blk_size; + blk_dev->geometry.block_size = fal_flash->blk_size; + blk_dev->geometry.sector_count = fal_part->len / fal_flash->blk_size; + + /* register device */ + blk_dev->parent.type = RT_Device_Class_Block; + +#ifdef RT_USING_DEVICE_OPS + blk_dev->parent.ops = &blk_dev_ops; +#else + blk_dev->parent.init = NULL; + blk_dev->parent.open = NULL; + blk_dev->parent.close = NULL; + blk_dev->parent.read = blk_dev_read; + blk_dev->parent.write = blk_dev_write; + blk_dev->parent.control = blk_dev_control; +#endif + + /* no private */ + blk_dev->parent.user_data = RT_NULL; + + log_i("The FAL block device (%s) created successfully", fal_part->name); + rt_device_register(RT_DEVICE(blk_dev), fal_part->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); + } + else + { + log_e("Error: no memory for create FAL block device"); + } + + return RT_DEVICE(blk_dev); +} + +/* ========================== MTD nor device ======================== */ +#if defined(RT_USING_MTD_NOR) + +struct fal_mtd_nor_device +{ + struct rt_mtd_nor_device parent; + const struct fal_partition *fal_part; +}; + +static rt_size_t mtd_nor_dev_read(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_uint32_t length) +{ + int ret = 0; + struct fal_mtd_nor_device *part = (struct fal_mtd_nor_device*) device; + + assert(part != RT_NULL); + + ret = fal_partition_read(part->fal_part, offset, data, length); + + if (ret != (int)length) + { + ret = 0; + } + else + { + ret = length; + } + + return ret; +} + +static rt_size_t mtd_nor_dev_write(struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_uint32_t length) +{ + int ret = 0; + struct fal_mtd_nor_device *part; + + part = (struct fal_mtd_nor_device*) device; + assert(part != RT_NULL); + + ret = fal_partition_write(part->fal_part, offset, data, length); + + if (ret != (int) length) + { + ret = 0; + } + else + { + ret = length; + } + + return ret; +} + +static rt_err_t mtd_nor_dev_erase(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint32_t length) +{ + int ret = 0; + struct fal_mtd_nor_device *part; + + part = (struct fal_mtd_nor_device*) device; + assert(part != RT_NULL); + + ret = fal_partition_erase(part->fal_part, offset, length); + + if (ret != length) + { + return -RT_ERROR; + } + else + { + return RT_EOK; + } +} + +static const struct rt_mtd_nor_driver_ops _ops = +{ + RT_NULL, + mtd_nor_dev_read, + mtd_nor_dev_write, + mtd_nor_dev_erase, +}; + +/** + * create RT-Thread MTD NOR device by specified partition + * + * @param parition_name partition name + * + * @return != NULL: created MTD NOR device + * NULL: created failed + */ +struct rt_device *fal_mtd_nor_device_create(const char *parition_name) +{ + struct fal_mtd_nor_device *mtd_nor_dev; + const struct fal_partition *fal_part = fal_partition_find(parition_name); + const struct fal_flash_dev *fal_flash = NULL; + + if (!fal_part) + { + log_e("Error: the partition name (%s) is not found.", parition_name); + return NULL; + } + + if ((fal_flash = fal_flash_device_find(fal_part->flash_name)) == NULL) + { + log_e("Error: the flash device name (%s) is not found.", fal_part->flash_name); + return NULL; + } + + mtd_nor_dev = (struct fal_mtd_nor_device*) rt_malloc(sizeof(struct fal_mtd_nor_device)); + if (mtd_nor_dev) + { + mtd_nor_dev->fal_part = fal_part; + + mtd_nor_dev->parent.block_start = 0; + mtd_nor_dev->parent.block_end = fal_part->len / fal_flash->blk_size; + mtd_nor_dev->parent.block_size = fal_flash->blk_size; + + /* set ops */ + mtd_nor_dev->parent.ops = &_ops; + + log_i("The FAL MTD NOR device (%s) created successfully", fal_part->name); + rt_mtd_nor_register_device(fal_part->name, &mtd_nor_dev->parent); + } + else + { + log_e("Error: no memory for create FAL MTD NOR device"); + } + + return RT_DEVICE(&mtd_nor_dev->parent); +} + +#endif /* defined(RT_USING_MTD_NOR) */ + + +/* ========================== char device ======================== */ +struct fal_char_device +{ + struct rt_device parent; + const struct fal_partition *fal_part; +}; + +/* RT-Thread device interface */ +static rt_size_t char_dev_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + int ret = 0; + struct fal_char_device *part = (struct fal_char_device *) dev; + + assert(part != RT_NULL); + + if (pos + size > part->fal_part->len) + size = part->fal_part->len - pos; + + ret = fal_partition_read(part->fal_part, pos, buffer, size); + + if (ret != (int)(size)) + ret = 0; + + return ret; +} + +static rt_size_t char_dev_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + int ret = 0; + struct fal_char_device *part; + + part = (struct fal_char_device *) dev; + assert(part != RT_NULL); + + if (pos == 0) + { + fal_partition_erase_all(part->fal_part); + } + else if (pos + size > part->fal_part->len) + { + size = part->fal_part->len - pos; + } + + ret = fal_partition_write(part->fal_part, pos, buffer, size); + + if (ret != (int) size) + ret = 0; + + return ret; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops char_dev_ops = +{ + RT_NULL, + RT_NULL, + RT_NULL, + char_dev_read, + char_dev_write, + RT_NULL +}; +#endif + +#ifdef RT_USING_POSIX +#include + +/* RT-Thread device filesystem interface */ +static int char_dev_fopen(struct dfs_fd *fd) +{ + struct fal_char_device *part = (struct fal_char_device *) fd->data; + + assert(part != RT_NULL); + + switch (fd->flags & O_ACCMODE) + { + case O_RDONLY: + break; + case O_WRONLY: + case O_RDWR: + /* erase partition when device file open */ + fal_partition_erase_all(part->fal_part); + break; + default: + break; + } + fd->pos = 0; + + return RT_EOK; +} + +static int char_dev_fread(struct dfs_fd *fd, void *buf, size_t count) +{ + int ret = 0; + struct fal_char_device *part = (struct fal_char_device *) fd->data; + + assert(part != RT_NULL); + + if (fd->pos + count > part->fal_part->len) + count = part->fal_part->len - fd->pos; + + ret = fal_partition_read(part->fal_part, fd->pos, buf, count); + + if (ret != (int)(count)) + return 0; + + fd->pos += ret; + + return ret; +} + +static int char_dev_fwrite(struct dfs_fd *fd, const void *buf, size_t count) +{ + int ret = 0; + struct fal_char_device *part = (struct fal_char_device *) fd->data; + + assert(part != RT_NULL); + + if (fd->pos + count > part->fal_part->len) + count = part->fal_part->len - fd->pos; + + ret = fal_partition_write(part->fal_part, fd->pos, buf, count); + + if (ret != (int) count) + return 0; + + fd->pos += ret; + + return ret; +} + +static const struct dfs_file_ops char_dev_fops = +{ + char_dev_fopen, + RT_NULL, + RT_NULL, + char_dev_fread, + char_dev_fwrite, + RT_NULL, /* flush */ + RT_NULL, /* lseek */ + RT_NULL, /* getdents */ + RT_NULL, +}; +#endif /* defined(RT_USING_POSIX) */ + +/** + * create RT-Thread char device by specified partition + * + * @param parition_name partition name + * + * @return != NULL: created char device + * NULL: created failed + */ +struct rt_device *fal_char_device_create(const char *parition_name) +{ + struct fal_char_device *char_dev; + const struct fal_partition *fal_part = fal_partition_find(parition_name); + + if (!fal_part) + { + log_e("Error: the partition name (%s) is not found.", parition_name); + return NULL; + } + + if ((fal_flash_device_find(fal_part->flash_name)) == NULL) + { + log_e("Error: the flash device name (%s) is not found.", fal_part->flash_name); + return NULL; + } + + char_dev = (struct fal_char_device *) rt_malloc(sizeof(struct fal_char_device)); + if (char_dev) + { + char_dev->fal_part = fal_part; + + /* register device */ + char_dev->parent.type = RT_Device_Class_Char; + +#ifdef RT_USING_DEVICE_OPS + char_dev->parent.ops = &char_dev_ops; +#else + char_dev->parent.init = NULL; + char_dev->parent.open = NULL; + char_dev->parent.close = NULL; + char_dev->parent.read = char_dev_read; + char_dev->parent.write = char_dev_write; + char_dev->parent.control = NULL; + /* no private */ + char_dev->parent.user_data = NULL; +#endif + + rt_device_register(RT_DEVICE(char_dev), fal_part->name, RT_DEVICE_FLAG_RDWR); + log_i("The FAL char device (%s) created successfully", fal_part->name); + +#ifdef RT_USING_POSIX + /* set fops */ + char_dev->parent.fops = &char_dev_fops; +#endif + + } + else + { + log_e("Error: no memory for create FAL char device"); + } + + return RT_DEVICE(char_dev); +} + +#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) + +#include +extern int fal_init_check(void); + +static void fal(uint8_t argc, char **argv) { + +#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') +#define HEXDUMP_WIDTH 16 +#define CMD_PROBE_INDEX 0 +#define CMD_READ_INDEX 1 +#define CMD_WRITE_INDEX 2 +#define CMD_ERASE_INDEX 3 +#define CMD_BENCH_INDEX 4 + + int result; + static const struct fal_flash_dev *flash_dev = NULL; + static const struct fal_partition *part_dev = NULL; + size_t i = 0, j = 0; + + const char* help_info[] = + { + [CMD_PROBE_INDEX] = "fal probe [dev_name|part_name] - probe flash device or partition by given name", + [CMD_READ_INDEX] = "fal read addr size - read 'size' bytes starting at 'addr'", + [CMD_WRITE_INDEX] = "fal write addr data1 ... dataN - write some bytes 'data' starting at 'addr'", + [CMD_ERASE_INDEX] = "fal erase addr size - erase 'size' bytes starting at 'addr'", + [CMD_BENCH_INDEX] = "fal bench - benchmark test with per block size", + }; + + if (fal_init_check() != 1) + { + rt_kprintf("\n[Warning] FAL is not initialized or failed to initialize!\n\n"); + return; + } + + if (argc < 2) + { + rt_kprintf("Usage:\n"); + for (i = 0; i < sizeof(help_info) / sizeof(char*); i++) + { + rt_kprintf("%s\n", help_info[i]); + } + rt_kprintf("\n"); + } + else + { + const char *operator = argv[1]; + uint32_t addr, size; + + if (!strcmp(operator, "probe")) + { + if (argc >= 3) + { + char *dev_name = argv[2]; + if ((flash_dev = fal_flash_device_find(dev_name)) != NULL) + { + part_dev = NULL; + } + else if ((part_dev = fal_partition_find(dev_name)) != NULL) + { + flash_dev = NULL; + } + else + { + rt_kprintf("Device %s NOT found. Probe failed.\n", dev_name); + flash_dev = NULL; + part_dev = NULL; + } + } + + if (flash_dev) + { + rt_kprintf("Probed a flash device | %s | addr: %ld | len: %d |.\n", flash_dev->name, + flash_dev->addr, flash_dev->len); + } + else if (part_dev) + { + rt_kprintf("Probed a flash partition | %s | flash_dev: %s | offset: %ld | len: %d |.\n", + part_dev->name, part_dev->flash_name, part_dev->offset, part_dev->len); + } + else + { + rt_kprintf("No flash device or partition was probed.\n"); + rt_kprintf("Usage: %s.\n", help_info[CMD_PROBE_INDEX]); + fal_show_part_table(); + } + } + else + { + if (!flash_dev && !part_dev) + { + rt_kprintf("No flash device or partition was probed. Please run 'fal probe'.\n"); + return; + } + if (!rt_strcmp(operator, "read")) + { + if (argc < 4) + { + rt_kprintf("Usage: %s.\n", help_info[CMD_READ_INDEX]); + return; + } + else + { + addr = strtol(argv[2], NULL, 0); + size = strtol(argv[3], NULL, 0); + uint8_t *data = rt_malloc(size); + if (data) + { + if (flash_dev) + { + result = flash_dev->ops.read(addr, data, size); + } + else if (part_dev) + { + result = fal_partition_read(part_dev, addr, data, size); + } + if (result >= 0) + { + rt_kprintf("Read data success. Start from 0x%08X, size is %ld. The data is:\n", addr, + size); + rt_kprintf("Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n"); + for (i = 0; i < size; i += HEXDUMP_WIDTH) + { + rt_kprintf("[%08X] ", addr + i); + /* dump hex */ + for (j = 0; j < HEXDUMP_WIDTH; j++) + { + if (i + j < size) + { + rt_kprintf("%02X ", data[i + j]); + } + else + { + rt_kprintf(" "); + } + } + /* dump char for hex */ + for (j = 0; j < HEXDUMP_WIDTH; j++) + { + if (i + j < size) + { + rt_kprintf("%c", __is_print(data[i + j]) ? data[i + j] : '.'); + } + } + rt_kprintf("\n"); + } + rt_kprintf("\n"); + } + rt_free(data); + } + else + { + rt_kprintf("Low memory!\n"); + } + } + } + else if (!strcmp(operator, "write")) + { + if (argc < 4) + { + rt_kprintf("Usage: %s.\n", help_info[CMD_WRITE_INDEX]); + return; + } + else + { + addr = strtol(argv[2], NULL, 0); + size = argc - 3; + uint8_t *data = rt_malloc(size); + if (data) + { + for (i = 0; i < size; i++) + { + data[i] = strtol(argv[3 + i], NULL, 0); + } + if (flash_dev) + { + result = flash_dev->ops.write(addr, data, size); + } + else if (part_dev) + { + result = fal_partition_write(part_dev, addr, data, size); + } + if (result >= 0) + { + rt_kprintf("Write data success. Start from 0x%08X, size is %ld.\n", addr, size); + rt_kprintf("Write data: "); + for (i = 0; i < size; i++) + { + rt_kprintf("%d ", data[i]); + } + rt_kprintf(".\n"); + } + rt_free(data); + } + else + { + rt_kprintf("Low memory!\n"); + } + } + } + else if (!rt_strcmp(operator, "erase")) + { + if (argc < 4) + { + rt_kprintf("Usage: %s.\n", help_info[CMD_ERASE_INDEX]); + return; + } + else + { + addr = strtol(argv[2], NULL, 0); + size = strtol(argv[3], NULL, 0); + if (flash_dev) + { + result = flash_dev->ops.erase(addr, size); + } + else if (part_dev) + { + result = fal_partition_erase(part_dev, addr, size); + } + if (result >= 0) + { + rt_kprintf("Erase data success. Start from 0x%08X, size is %ld.\n", addr, size); + } + } + } + else if (!strcmp(operator, "bench")) + { + if (argc < 3) + { + rt_kprintf("Usage: %s.\n", help_info[CMD_BENCH_INDEX]); + return; + } + else if ((argc > 3 && strcmp(argv[3], "yes")) || argc < 4) + { + rt_kprintf("DANGER: It will erase full chip or partition! Please run 'fal bench %d yes'.\n", strtol(argv[2], NULL, 0)); + return; + } + /* full chip benchmark test */ + uint32_t start_time, time_cast; + size_t write_size = strtol(argv[2], NULL, 0), read_size = strtol(argv[2], NULL, 0), cur_op_size; + uint8_t *write_data = (uint8_t *)rt_malloc(write_size), *read_data = (uint8_t *)rt_malloc(read_size); + + if (write_data && read_data) + { + for (i = 0; i < write_size; i ++) { + write_data[i] = i & 0xFF; + } + if (flash_dev) + { + size = flash_dev->len; + } + else if (part_dev) + { + size = part_dev->len; + } + /* benchmark testing */ + rt_kprintf("Erasing %ld bytes data, waiting...\n", size); + start_time = rt_tick_get(); + if (flash_dev) + { + result = flash_dev->ops.erase(0, size); + } + else if (part_dev) + { + result = fal_partition_erase(part_dev, 0, size); + } + if (result >= 0) + { + time_cast = rt_tick_get() - start_time; + rt_kprintf("Erase benchmark success, total time: %d.%03dS.\n", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + } + else + { + rt_kprintf("Erase benchmark has an error. Error code: %d.\n", result); + } + /* write test */ + rt_kprintf("Writing %ld bytes data, waiting...\n", size); + start_time = rt_tick_get(); + for (i = 0; i < size; i += write_size) + { + if (i + write_size <= size) + { + cur_op_size = write_size; + } + else + { + cur_op_size = size - i; + } + if (flash_dev) + { + result = flash_dev->ops.write(i, write_data, cur_op_size); + } + else if (part_dev) + { + result = fal_partition_write(part_dev, i, write_data, cur_op_size); + } + if (result < 0) + { + break; + } + } + if (result >= 0) + { + time_cast = rt_tick_get() - start_time; + rt_kprintf("Write benchmark success, total time: %d.%03dS.\n", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + } + else + { + rt_kprintf("Write benchmark has an error. Error code: %d.\n", result); + } + /* read test */ + rt_kprintf("Reading %ld bytes data, waiting...\n", size); + start_time = rt_tick_get(); + for (i = 0; i < size; i += read_size) + { + if (i + read_size <= size) + { + cur_op_size = read_size; + } + else + { + cur_op_size = size - i; + } + if (flash_dev) + { + result = flash_dev->ops.read(i, read_data, cur_op_size); + } + else if (part_dev) + { + result = fal_partition_read(part_dev, i, read_data, cur_op_size); + } + /* data check */ + for (int index = 0; index < cur_op_size; index ++) + { + if (write_data[index] != read_data[index]) + { + rt_kprintf("%d %d %02x %02x.\n", i, index, write_data[index], read_data[index]); + } + } + + if (memcmp(write_data, read_data, cur_op_size)) + { + result = -RT_ERROR; + rt_kprintf("Data check ERROR! Please check you flash by other command.\n"); + } + /* has an error */ + if (result < 0) + { + break; + } + } + if (result >= 0) + { + time_cast = rt_tick_get() - start_time; + rt_kprintf("Read benchmark success, total time: %d.%03dS.\n", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + } + else + { + rt_kprintf("Read benchmark has an error. Error code: %d.\n", result); + } + } + else + { + rt_kprintf("Low memory!\n"); + } + rt_free(write_data); + rt_free(read_data); + } + else + { + rt_kprintf("Usage:\n"); + for (i = 0; i < sizeof(help_info) / sizeof(char*); i++) + { + rt_kprintf("%s\n", help_info[i]); + } + rt_kprintf("\n"); + return; + } + if (result < 0) { + rt_kprintf("This operate has an error. Error code: %d.\n", result); + } + } + } +} +MSH_CMD_EXPORT(fal, FAL (Flash Abstraction Layer) operate.); + +#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */ +#endif /* RT_VER_NUM */ diff --git a/User/system/lib/flashdb/fal_eeprom24_port.c b/User/system/lib/flashdb/fal_eeprom24_port.c new file mode 100644 index 0000000..9047925 --- /dev/null +++ b/User/system/lib/flashdb/fal_eeprom24_port.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-26 armink the first version + */ +#include "eeprom_fm24.h" +#include + +static int init(void); +static int erase(long offset, size_t size); + +static int read(long offset, uint8_t *buf, size_t size); +static int write(long offset, const uint8_t *buf, size_t size); + +// 1.定义 flash 设备 +struct fal_flash_dev eeprom_fm24 = + { + .name = EEPROM_FM24_DEV_NAME, + .addr = 0, + .len = FM24_PAGE_SIZE, + .blk_size = EEPROM_FM24_BLOCK_SIZE, + .ops = {init, read, write, erase}, + .write_gran = 1}; + +static int init(void) +{ + return 1; +} + +static int erase(long offset, size_t size) +{ + // uint8_t erase_size = size > FAL_ERASE_SIZE ? FAL_ERASE_SIZE : size; + // uint8_t buf[FAL_ERASE_SIZE]; + // osel_memset(buf, 0xFF, FAL_ERASE_SIZE); + + // for (uint8_t i = 0; i < (size / FM24_PAGE_SIZE); i++) + // { + // uint32_t addr = eeprom_fm24.addr + offset + i * FM24_PAGE_SIZE; + // eeprom_fm24_write(addr, (uint8_t *)buf, erase_size); + // } + return size; +} + +static int read(long offset, uint8_t *buf, size_t size) +{ + /* You can add your code under here. */ + if (size == 0) + { + return 0; + } + uint32_t addr = eeprom_fm24.addr + offset; + BOOL res = eeprom_fm24_read(addr, buf, size); + return res == TRUE ? size : 0; +} + +static int write(long offset, const uint8_t *buf, size_t size) +{ + if (size == 0) + { + return 0; + } + uint32_t addr = eeprom_fm24.addr + offset; + BOOL res = eeprom_fm24_write(addr, (uint8_t *)buf, size); + return res == TRUE ? (int)size : -1; +} diff --git a/User/system/lib/flashdb/fal_eeprom95_port.c b/User/system/lib/flashdb/fal_eeprom95_port.c new file mode 100644 index 0000000..142cf78 --- /dev/null +++ b/User/system/lib/flashdb/fal_eeprom95_port.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-26 armink the first version + */ +#include "eeprom_m95.h" +#include + +static int init(void); +static int erase(long offset, size_t size); + +static int read1(long offset, uint8_t *buf, size_t size); +static int read2(long offset, uint8_t *buf, size_t size); +static int write1(long offset, const uint8_t *buf, size_t size); +static int write2(long offset, const uint8_t *buf, size_t size); + +// 1.定义 flash 设备 +struct fal_flash_dev eeprom_m95_1 = + { + .name = EEPROM_M95_1_DEV_NAME, + .addr = 10 * M95_PAGE_SIZE_256, + .len = EEPROM_M95_1_SIZE - 10 * M95_PAGE_SIZE_256, + .blk_size = EEPROM_M95_1_BLOCK_SIZE, + .ops = {init, read1, write1, erase}, + .write_gran = 1}; // 设置写粒度,单位 bit,EPPROM写粒度为1bit + +struct fal_flash_dev eeprom_m95_2 = + { + .name = EEPROM_M95_2_DEV_NAME, + .addr = 0x000000, + .len = EEPROM_M95_2_SIZE, + .blk_size = EEPROM_M95_2_BLOCK_SIZE, + .ops = {init, read2, write2, erase}, + .write_gran = 1}; + +static int init(void) +{ + return 1; +} + +static int erase(long offset, size_t size) +{ + // uint8_t erase_size = size > FAL_ERASE_SIZE ? FAL_ERASE_SIZE : size; + // uint8_t buf[FAL_ERASE_SIZE]; + // osel_memset(buf, 0xFF, FAL_ERASE_SIZE); + + // for (uint8_t i = 0; i < (size / M95_PAGE_SIZE_256); i++) + // { + // uint32_t addr = eeprom_m95_1.addr + offset + i * M95_PAGE_SIZE_256; + // eeprom_m95_write(M95_1, addr, (uint8_t *)buf, erase_size); + // } + return size; +} + +static int read1(long offset, uint8_t *buf, size_t size) +{ + /* You can add your code under here. */ + uint32_t addr = eeprom_m95_1.addr + offset; + BOOL res = eeprom_m95_read(M95_1, addr, buf, size); + return res == TRUE ? size : 0; +} + +static int write1(long offset, const uint8_t *buf, size_t size) +{ + uint32_t addr = eeprom_m95_1.addr + offset; + BOOL res = eeprom_m95_write(M95_1, addr, (uint8_t *)buf, size); + return res == TRUE ? (int)size : -1; +} + +static int read2(long offset, uint8_t *buf, size_t size) +{ + /* You can add your code under here. */ + uint32_t addr = eeprom_m95_2.addr + offset; + BOOL res = eeprom_m95_read(M95_2, addr, buf, size); + return res == TRUE ? size : 0; +} + +static int write2(long offset, const uint8_t *buf, size_t size) +{ + uint32_t addr = eeprom_m95_2.addr + offset; + BOOL res = eeprom_m95_write(M95_2, addr, (uint8_t *)buf, size); + return res == TRUE ? (int)size : -1; +} diff --git a/User/system/lib/flashdb/fdb.c b/User/system/lib/flashdb/fdb.c new file mode 100644 index 0000000..8de2b2a --- /dev/null +++ b/User/system/lib/flashdb/fdb.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Initialize interface. + * + * Some initialize interface for this library. + */ + +#include +#include +#include +#include + +#ifdef FDB_USING_FILE_POSIX_MODE +#if !defined(_MSC_VER) +#include +#endif +#endif /* FDB_USING_FILE_POSIX_MODE */ + +#define FDB_LOG_TAG "" + +#if !defined(FDB_USING_FAL_MODE) && !defined(FDB_USING_FILE_MODE) +#error "Please defined the FDB_USING_FAL_MODE or FDB_USING_FILE_MODE macro" +#endif + +fdb_err_t _fdb_init_ex(fdb_db_t db, const char *name, const char *path, fdb_db_type type, void *user_data) +{ + FDB_ASSERT(db); + FDB_ASSERT(name); + FDB_ASSERT(path); + + if (db->init_ok) { + return FDB_NO_ERR; + } + + db->name = name; + db->type = type; + db->user_data = user_data; + + if (db->file_mode) { +#ifdef FDB_USING_FILE_MODE + memset(db->cur_file_sec, FDB_FAILED_ADDR, FDB_FILE_CACHE_TABLE_SIZE * sizeof(db->cur_file_sec[0])); + /* must set when using file mode */ + FDB_ASSERT(db->sec_size != 0); + FDB_ASSERT(db->max_size != 0); +#ifdef FDB_USING_FILE_POSIX_MODE + memset(db->cur_file, -1, FDB_FILE_CACHE_TABLE_SIZE * sizeof(db->cur_file[0])); +#else + memset(db->cur_file, 0, FDB_FILE_CACHE_TABLE_SIZE * sizeof(db->cur_file[0])); +#endif + db->storage.dir = path; + FDB_ASSERT(strlen(path) != 0) +#endif + } else { +#ifdef FDB_USING_FAL_MODE + size_t block_size; + + /* FAL (Flash Abstraction Layer) initialization */ + fal_init(); + /* check the flash partition */ + if ((db->storage.part = fal_partition_find(path)) == NULL) { + FDB_INFO("Error: Partition (%s) not found.\n", path); + return FDB_PART_NOT_FOUND; + } + + block_size = fal_flash_device_find(db->storage.part->flash_name)->blk_size; + if (db->sec_size == 0) { + db->sec_size = block_size; + } else { + /* must be aligned with block size */ + if (db->sec_size % block_size != 0) { + FDB_INFO("Error: db sector size (%" PRIu32 ") MUST align with block size (%zu).\n", db->sec_size, block_size); + return FDB_INIT_FAILED; + } + } + + db->max_size = db->storage.part->len; +#endif /* FDB_USING_FAL_MODE */ + } + + /* the block size MUST to be the Nth power of 2 */ + FDB_ASSERT((db->sec_size & (db->sec_size - 1)) == 0); + /* must align with sector size */ + if (db->max_size % db->sec_size != 0) { + FDB_INFO("Error: db total size (%" PRIu32 ") MUST align with sector size (%" PRIu32 ").\n", db->max_size, db->sec_size); + return FDB_INIT_FAILED; + } + /* must has more than or equal 2 sectors */ + if (db->max_size / db->sec_size < 2) { + FDB_INFO("Error: db MUST has more than or equal 2 sectors, current has %" PRIu32 " sector(s)\n", db->max_size / db->sec_size); + return FDB_INIT_FAILED; + } + + return FDB_NO_ERR; +} + +void _fdb_init_finish(fdb_db_t db, fdb_err_t result) +{ + static bool log_is_show = false; + if (result == FDB_NO_ERR) { + db->init_ok = true; + if (!log_is_show) { + FDB_INFO("FlashDB V%s is initialize success.\n", FDB_SW_VERSION); + FDB_INFO("You can get the latest version on https://github.com/armink/FlashDB .\n"); + log_is_show = true; + } + } else if (!db->not_formatable) { + FDB_INFO("Error: %s (%s@%s) is initialize fail (%d).\n", db->type == FDB_DB_TYPE_KV ? "KVDB" : "TSDB", + db->name, _fdb_db_path(db), (int)result); + } +} + +void _fdb_deinit(fdb_db_t db) +{ + FDB_ASSERT(db); + + if (db->init_ok) { +#ifdef FDB_USING_FILE_MODE + for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) { +#ifdef FDB_USING_FILE_POSIX_MODE + if (db->cur_file[i] > 0) { + close(db->cur_file[i]); + } +#else + if (db->cur_file[i] != 0) { + fclose(db->cur_file[i]); + } +#endif /* FDB_USING_FILE_POSIX_MODE */ + } +#endif /* FDB_USING_FILE_MODE */ + } + + db->init_ok = false; +} + +const char *_fdb_db_path(fdb_db_t db) +{ + if (db->file_mode) { +#ifdef FDB_USING_FILE_MODE + return db->storage.dir; +#else + return NULL; +#endif + } + else { +#ifdef FDB_USING_FAL_MODE + return db->storage.part->name; +#else + return NULL; +#endif + } +} diff --git a/User/system/lib/flashdb/fdb_cfg.h b/User/system/lib/flashdb/fdb_cfg.h new file mode 100644 index 0000000..239d9a2 --- /dev/null +++ b/User/system/lib/flashdb/fdb_cfg.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief configuration file + */ + +#ifndef _FDB_CFG_H_ +#define _FDB_CFG_H_ + +/* using KVDB feature */ +#define FDB_USING_KVDB + +#ifdef FDB_USING_KVDB +/* Auto update KV to latest default when current KVDB version number is changed. @see fdb_kvdb.ver_num */ +#define FDB_KV_AUTO_UPDATE +#endif + +/* using TSDB (Time series database) feature */ +#define FDB_USING_TSDB + +/* Using FAL storage mode */ +#define FDB_USING_FAL_MODE + +#ifdef FDB_USING_FAL_MODE +/* the flash write granularity, unit: bit + * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1)/ 64(stm32f7)/ 128(stm32h5) */ +#define FDB_WRITE_GRAN 1 /* @note you must define it for a value */ +#endif + +/* Using file storage mode by LIBC file API, like fopen/fread/fwrte/fclose */ +/* #define FDB_USING_FILE_LIBC_MODE */ + +/* Using file storage mode by POSIX file API, like open/read/write/close */ +/* #define FDB_USING_FILE_POSIX_MODE */ + +/* MCU Endian Configuration, default is Little Endian Order. */ +/* #define FDB_BIG_ENDIAN */ + +/* log print macro. default EF_PRINT macro is printf() */ +/* #define FDB_PRINT(...) my_printf(__VA_ARGS__) */ + +/* print debug information */ +// #define FDB_DEBUG_ENABLE + +#endif /* _FDB_CFG_H_ */ diff --git a/User/system/lib/flashdb/fdb_def.h b/User/system/lib/flashdb/fdb_def.h new file mode 100644 index 0000000..acba9e0 --- /dev/null +++ b/User/system/lib/flashdb/fdb_def.h @@ -0,0 +1,385 @@ +/* + * Copyright (c) 2020-2023, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Public definition. + */ + +#ifndef _FDB_DEF_H_ +#define _FDB_DEF_H_ + +#ifdef FDB_USING_NATIVE_ASSERT +#include +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* software version number */ +#define FDB_SW_VERSION "2.1.1" +#define FDB_SW_VERSION_NUM 0x20101 + +/* the KV max name length must less then it */ +#ifndef FDB_KV_NAME_MAX +#define FDB_KV_NAME_MAX 64 +#endif + +/* the KV cache table size, it will improve KV search speed when using cache */ +#ifndef FDB_KV_CACHE_TABLE_SIZE +#define FDB_KV_CACHE_TABLE_SIZE 64 +#endif + +/* the sector cache table size, it will improve KV save speed when using cache */ +#ifndef FDB_SECTOR_CACHE_TABLE_SIZE +#define FDB_SECTOR_CACHE_TABLE_SIZE 8 +#endif + +#if (FDB_KV_CACHE_TABLE_SIZE > 0) && (FDB_SECTOR_CACHE_TABLE_SIZE > 0) +#define FDB_KV_USING_CACHE +#endif + +#if defined(FDB_USING_FILE_LIBC_MODE) || defined(FDB_USING_FILE_POSIX_MODE) +#define FDB_USING_FILE_MODE +#endif + +/* the file cache table size, it will improve GC speed in file mode when using cache */ +#ifndef FDB_FILE_CACHE_TABLE_SIZE +#define FDB_FILE_CACHE_TABLE_SIZE 4 +#endif + +#ifndef FDB_WRITE_GRAN +#define FDB_WRITE_GRAN 1 +#endif + +/* log function. default FDB_PRINT macro is printf() */ +// #ifndef FDB_PRINT +// #define FDB_PRINT(...) printf(__VA_ARGS__) +// #endif +#ifndef FDB_PRINT +#define FDB_PRINT(...) +#endif +#define FDB_LOG_PREFIX1() FDB_PRINT("[FlashDB]" FDB_LOG_TAG) +#define FDB_LOG_PREFIX2() FDB_PRINT(" ") +#define FDB_LOG_PREFIX() \ + FDB_LOG_PREFIX1(); \ + FDB_LOG_PREFIX2() +#ifdef FDB_DEBUG_ENABLE +#define FDB_DEBUG(...) \ + FDB_LOG_PREFIX(); \ + FDB_PRINT("(%s:%d) ", __FILE__, __LINE__); \ + FDB_PRINT(__VA_ARGS__) +#else +#define FDB_DEBUG(...) +#endif +/* routine print function. Must be implement by user. */ +#define FDB_INFO(...) \ + FDB_LOG_PREFIX(); \ + FDB_PRINT(__VA_ARGS__) +/* assert for developer. */ +#ifdef FDB_USING_NATIVE_ASSERT +#define FDB_ASSERT(EXPR) assert(EXPR); +#else +#ifndef FDB_ASSERT +#define FDB_ASSERT(EXPR) \ + if (!(EXPR)) \ + { \ + FDB_INFO("(%s) has assert failed at %s.\n", #EXPR, __func__); \ + while (1) \ + ; \ + } +#endif /* FDB_ASSERT */ +#endif /* FDB_USING_NATIVE_ASSERT */ + +#define FDB_KVDB_CTRL_SET_SEC_SIZE 0x00 /**< set sector size control command, this change MUST before database initialization */ +#define FDB_KVDB_CTRL_GET_SEC_SIZE 0x01 /**< get sector size control command */ +#define FDB_KVDB_CTRL_SET_LOCK 0x02 /**< set lock function control command */ +#define FDB_KVDB_CTRL_SET_UNLOCK 0x03 /**< set unlock function control command */ +#define FDB_KVDB_CTRL_SET_FILE_MODE 0x09 /**< set file mode control command, this change MUST before database initialization */ +#define FDB_KVDB_CTRL_SET_MAX_SIZE 0x0A /**< set database max size in file mode control command, this change MUST before database initialization */ +#define FDB_KVDB_CTRL_SET_NOT_FORMAT 0x0B /**< set database NOT format mode control command, this change MUST before database initialization */ + +#define FDB_TSDB_CTRL_SET_SEC_SIZE 0x00 /**< set sector size control command, this change MUST before database initialization */ +#define FDB_TSDB_CTRL_GET_SEC_SIZE 0x01 /**< get sector size control command */ +#define FDB_TSDB_CTRL_SET_LOCK 0x02 /**< set lock function control command */ +#define FDB_TSDB_CTRL_SET_UNLOCK 0x03 /**< set unlock function control command */ +#define FDB_TSDB_CTRL_SET_ROLLOVER 0x04 /**< set rollover control command, this change MUST after database initialization */ +#define FDB_TSDB_CTRL_GET_ROLLOVER 0x05 /**< get rollover control command */ +#define FDB_TSDB_CTRL_GET_LAST_TIME 0x06 /**< get last save time control command */ +#define FDB_TSDB_CTRL_SET_FILE_MODE 0x09 /**< set file mode control command, this change MUST before database initialization */ +#define FDB_TSDB_CTRL_SET_MAX_SIZE 0x0A /**< set database max size in file mode control command, this change MUST before database initialization */ +#define FDB_TSDB_CTRL_SET_NOT_FORMAT 0x0B /**< set database NOT formatable mode control command, this change MUST before database initialization */ + +#ifdef FDB_USING_TIMESTAMP_64BIT + typedef int64_t fdb_time_t; +#else +typedef int32_t fdb_time_t; +#endif /* FDB_USING_TIMESTAMP_64BIT */ + + typedef fdb_time_t (*fdb_get_time)(void); + + struct fdb_default_kv_node + { + char *key; + void *value; + size_t value_len; + }; + + struct fdb_default_kv + { + struct fdb_default_kv_node *kvs; + size_t num; + }; + + /* error code */ + typedef enum + { + FDB_NO_ERR, + FDB_ERASE_ERR, + FDB_READ_ERR, + FDB_WRITE_ERR, + FDB_PART_NOT_FOUND, + FDB_KV_NAME_ERR, + FDB_KV_NAME_EXIST, + FDB_SAVED_FULL, + FDB_INIT_FAILED, + } fdb_err_t; + + enum fdb_kv_status + { + FDB_KV_UNUSED, + FDB_KV_PRE_WRITE, + FDB_KV_WRITE, + FDB_KV_PRE_DELETE, + FDB_KV_DELETED, + FDB_KV_ERR_HDR, +#define FDB_KV_STATUS_NUM 6 + }; + typedef enum fdb_kv_status fdb_kv_status_t; + + enum fdb_tsl_status + { + FDB_TSL_UNUSED, + FDB_TSL_PRE_WRITE, + FDB_TSL_WRITE, + FDB_TSL_USER_STATUS1, + FDB_TSL_DELETED, + FDB_TSL_USER_STATUS2, +#define FDB_TSL_STATUS_NUM 6 + }; + typedef enum fdb_tsl_status fdb_tsl_status_t; + + /* key-value node object */ + struct fdb_kv + { + fdb_kv_status_t status; /**< node status, @see fdb_kv_status_t */ + bool crc_is_ok; /**< node CRC32 check is OK */ + uint8_t name_len; /**< name length */ + uint32_t magic; /**< magic word(`K`, `V`, `4`, `0`) */ + uint32_t len; /**< node total length (header + name + value), must align by FDB_WRITE_GRAN */ + uint32_t value_len; /**< value length */ + char name[FDB_KV_NAME_MAX]; /**< name */ + struct + { + uint32_t start; /**< node start address */ + uint32_t value; /**< value start address */ + } addr; + }; + typedef struct fdb_kv *fdb_kv_t; + + struct fdb_kv_iterator + { + struct fdb_kv curr_kv; /**< Current KV we get from the iterator */ + uint32_t iterated_cnt; /**< How many KVs have we iterated already */ + size_t iterated_obj_bytes; /**< Total storage size of KVs we have iterated. */ + size_t iterated_value_bytes; /**< Total value size of KVs we have iterated. */ + uint32_t sector_addr; /**< Current sector address we're iterating. DO NOT touch it. */ + uint32_t traversed_len; /**< Traversed sector total length. */ + }; + typedef struct fdb_kv_iterator *fdb_kv_iterator_t; + + /* time series log node object */ + struct fdb_tsl + { + fdb_tsl_status_t status; /**< node status, @see fdb_log_status_t */ + fdb_time_t time; /**< node timestamp */ + uint32_t log_len; /**< log length, must align by FDB_WRITE_GRAN */ + struct + { + uint32_t index; /**< node index address */ + uint32_t log; /**< log data address */ + } addr; + }; + typedef struct fdb_tsl *fdb_tsl_t; + typedef bool (*fdb_tsl_cb)(fdb_tsl_t tsl, void *arg); + + typedef enum + { + FDB_DB_TYPE_KV, + FDB_DB_TYPE_TS, + } fdb_db_type; + + /* the flash sector store status */ + enum fdb_sector_store_status + { + FDB_SECTOR_STORE_UNUSED, + FDB_SECTOR_STORE_EMPTY, + FDB_SECTOR_STORE_USING, + FDB_SECTOR_STORE_FULL, +#define FDB_SECTOR_STORE_STATUS_NUM 4 + }; + typedef enum fdb_sector_store_status fdb_sector_store_status_t; + + /* the flash sector dirty status */ + enum fdb_sector_dirty_status + { + FDB_SECTOR_DIRTY_UNUSED, + FDB_SECTOR_DIRTY_FALSE, + FDB_SECTOR_DIRTY_TRUE, + FDB_SECTOR_DIRTY_GC, +#define FDB_SECTOR_DIRTY_STATUS_NUM 4 + }; + typedef enum fdb_sector_dirty_status fdb_sector_dirty_status_t; + + /* KVDB section information */ + struct kvdb_sec_info + { + bool check_ok; /**< sector header check is OK */ + struct + { + fdb_sector_store_status_t store; /**< sector store status @see fdb_sector_store_status_t */ + fdb_sector_dirty_status_t dirty; /**< sector dirty status @see sector_dirty_status_t */ + } status; + uint32_t addr; /**< sector start address */ + uint32_t magic; /**< magic word(`E`, `F`, `4`, `0`) */ + uint32_t combined; /**< the combined next sector number, 0xFFFFFFFF: not combined */ + size_t remain; /**< remain size */ + uint32_t empty_kv; /**< the next empty KV node start address */ + }; + typedef struct kvdb_sec_info *kv_sec_info_t; + + /* TSDB section information */ + struct tsdb_sec_info + { + bool check_ok; /**< sector header check is OK */ + fdb_sector_store_status_t status; /**< sector store status @see fdb_sector_store_status_t */ + uint32_t addr; /**< sector start address */ + uint32_t magic; /**< magic word(`T`, `S`, `L`, `0`) */ + fdb_time_t start_time; /**< the first start node's timestamp, 0xFFFFFFFF: unused */ + fdb_time_t end_time; /**< the last end node's timestamp, 0xFFFFFFFF: unused */ + uint32_t end_idx; /**< the last end node's index, 0xFFFFFFFF: unused */ + fdb_tsl_status_t end_info_stat[2]; /**< the last end node's info status */ + size_t remain; /**< remain size */ + uint32_t empty_idx; /**< the next empty node index address */ + uint32_t empty_data; /**< the next empty node's data end address */ + }; + typedef struct tsdb_sec_info *tsdb_sec_info_t; + + struct kv_cache_node + { + uint16_t name_crc; /**< KV name's CRC32 low 16bit value */ + uint16_t active; /**< KV node access active degree */ + uint32_t addr; /**< KV node address */ + }; + typedef struct kv_cache_node *kv_cache_node_t; + + /* database structure */ + typedef struct fdb_db *fdb_db_t; + struct fdb_db + { + const char *name; /**< database name */ + fdb_db_type type; /**< database type */ + union + { +#ifdef FDB_USING_FAL_MODE + const struct fal_partition *part; /**< flash partition for saving database */ +#endif +#ifdef FDB_USING_FILE_MODE + const char *dir; /**< directory path for saving database */ +#endif + } storage; + uint32_t sec_size; /**< flash section size. It's a multiple of block size */ + uint32_t max_size; /**< database max size. It's a multiple of section size */ + uint32_t oldest_addr; /**< the oldest sector start address */ + bool init_ok; /**< initialized successfully */ + bool file_mode; /**< is file mode, default is false */ + bool not_formatable; /**< is can NOT be formated mode, default is false */ +#ifdef FDB_USING_FILE_MODE + uint32_t cur_file_sec[FDB_FILE_CACHE_TABLE_SIZE]; /**< last operate sector address */ +#if defined(FDB_USING_FILE_POSIX_MODE) + int cur_file[FDB_FILE_CACHE_TABLE_SIZE]; /**< current file object */ +#elif defined(FDB_USING_FILE_LIBC_MODE) + FILE *cur_file[FDB_FILE_CACHE_TABLE_SIZE]; /**< current file object */ +#endif /* FDB_USING_FILE_MODE */ + uint32_t cur_sec; /**< current operate sector address */ +#endif + void (*lock)(fdb_db_t db); /**< lock the database operate */ + void (*unlock)(fdb_db_t db); /**< unlock the database operate */ + + void *user_data; + }; + + /* KVDB structure */ + struct fdb_kvdb + { + struct fdb_db parent; /**< inherit from fdb_db */ + struct fdb_default_kv default_kvs; /**< default KV */ + bool gc_request; /**< request a GC check */ + bool in_recovery_check; /**< is in recovery check status when first reboot */ + struct fdb_kv cur_kv; + struct kvdb_sec_info cur_sector; + bool last_is_complete_del; + +#ifdef FDB_KV_USING_CACHE + /* KV cache table */ + struct kv_cache_node kv_cache_table[FDB_KV_CACHE_TABLE_SIZE]; + /* sector cache table, it caching the sector info which status is current using */ + struct kvdb_sec_info sector_cache_table[FDB_SECTOR_CACHE_TABLE_SIZE]; +#endif /* FDB_KV_USING_CACHE */ + +#ifdef FDB_KV_AUTO_UPDATE + uint32_t ver_num; /**< setting version number for update */ +#endif + + void *user_data; + }; + typedef struct fdb_kvdb *fdb_kvdb_t; + + /* TSDB structure */ + struct fdb_tsdb + { + struct fdb_db parent; /**< inherit from fdb_db */ + struct tsdb_sec_info cur_sec; /**< current using sector */ + fdb_time_t last_time; /**< last TSL timestamp */ + fdb_get_time get_time; /**< the current timestamp get function */ + size_t max_len; /**< the maximum length of each log */ + bool rollover; /**< the oldest data will rollover by newest data, default is true */ + + void *user_data; + }; + typedef struct fdb_tsdb *fdb_tsdb_t; + + /* blob structure */ + struct fdb_blob + { + void *buf; /**< blob data buffer */ + size_t size; /**< blob data buffer size */ + struct + { + uint32_t meta_addr; /**< saved KV or TSL index address */ + uint32_t addr; /**< blob data saved address */ + size_t len; /**< blob data saved length */ + } saved; + }; + typedef struct fdb_blob *fdb_blob_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _FDB_DEF_H_ */ diff --git a/User/system/lib/flashdb/fdb_file.c b/User/system/lib/flashdb/fdb_file.c new file mode 100644 index 0000000..0226122 --- /dev/null +++ b/User/system/lib/flashdb/fdb_file.c @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2020, Armink, + * Copyright (c) 2020, enkiller, <462747508@qq.com> + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +#define FDB_LOG_TAG "[file]" + +#ifdef FDB_USING_FILE_MODE + +#define DB_PATH_MAX 256 + +static void get_db_file_path(fdb_db_t db, uint32_t addr, char *path, size_t size) +{ +#define DB_NAME_MAX 8 + + /* from db_name.fdb.0 to db_name.fdb.n */ + char file_name[DB_NAME_MAX + 4 + 10]; + uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size); + int index = sec_addr / db->sec_size; + + snprintf(file_name, sizeof(file_name), "%.*s.fdb.%d", DB_NAME_MAX, db->name, index); + if (strlen(db->storage.dir) + 1 + strlen(file_name) >= size) { + /* path is too long */ + FDB_INFO("Error: db (%s) file path (%s) is too log.\n", file_name, db->storage.dir); + FDB_ASSERT(0) + } + snprintf(path, size, "%s/%s", db->storage.dir, file_name); +} + +#if defined(FDB_USING_FILE_POSIX_MODE) +#include +#include +#include +#if !defined(_MSC_VER) +#include +#endif + +static int get_file_from_cache(fdb_db_t db, uint32_t sec_addr) +{ + for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) { + if (db->cur_file_sec[i] == sec_addr) + return db->cur_file[i]; + } + + return -1; +} + +static void update_file_cache(fdb_db_t db, uint32_t sec_addr, int fd) +{ + int free_index = FDB_FILE_CACHE_TABLE_SIZE; + + for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) { + if (db->cur_file_sec[i] == sec_addr) { + db->cur_file[i] = fd; + return; + } else if (db->cur_file[i] == -1) { + free_index = i; + } + } + + if (fd > 0) { + if (free_index < FDB_FILE_CACHE_TABLE_SIZE) { + db->cur_file[free_index] = fd; + db->cur_file_sec[free_index] = sec_addr; + } else { + /* cache is full, move to end */ + for (int i = FDB_FILE_CACHE_TABLE_SIZE - 1; i > 0; i--) { + close(db->cur_file[i]); + memcpy(&db->cur_file[i], &db->cur_file[i - 1], sizeof(db->cur_file[0])); + memcpy(&db->cur_file_sec[i], &db->cur_file_sec[i - 1], sizeof(db->cur_file_sec[0])); + } + /* add to head */ + db->cur_file[0] = fd; + db->cur_file_sec[0] = sec_addr; + } + } +} + +static int open_db_file(fdb_db_t db, uint32_t addr, bool clean) +{ + uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size); + int fd = get_file_from_cache(db, sec_addr); + char path[DB_PATH_MAX]; + + if (fd <= 0 || clean) { + get_db_file_path(db, addr, path, DB_PATH_MAX); + + if (fd > 0) { + close(fd); + fd = -1; + update_file_cache(db, sec_addr, fd); + } + if (clean) { + /* clean the old file */ + int clean_fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0777); + if (clean_fd <= 0) { + FDB_INFO("Error: open (%s) file failed.\n", path); + } + else { + close(clean_fd); + clean_fd = -1; + } + } + if (get_file_from_cache(db, sec_addr) < 0) { + /* open the database file */ + fd = open(path, O_RDWR, 0777); + update_file_cache(db, sec_addr, fd); + } + db->cur_sec = sec_addr; + } + + return fd; +} + +fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + int fd = open_db_file(db, addr, false); + if (fd > 0) { + /* get the offset address is relative to the start of the current file */ + addr = addr % db->sec_size; + + if ((lseek(fd, addr, SEEK_SET) != (int32_t)addr) || (read(fd, buf, size) != (ssize_t)size)) + result = FDB_READ_ERR; + } else { + result = FDB_READ_ERR; + } + return result; +} + +fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync) +{ + fdb_err_t result = FDB_NO_ERR; + int fd = open_db_file(db, addr, false); + if (fd > 0) { + /* get the offset address is relative to the start of the current file */ + addr = addr % db->sec_size; + + if ((lseek(fd, addr, SEEK_SET) != (int32_t)addr) || (write(fd, buf, size) != (ssize_t)size)) + result = FDB_WRITE_ERR; + if(sync) { + fsync(fd); + } + } else { + result = FDB_WRITE_ERR; + } + return result; +} + +fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + int fd = open_db_file(db, addr, true); + if (fd > 0) { +#define BUF_SIZE 32 + uint8_t buf[BUF_SIZE]; + size_t i; + lseek(fd, 0, SEEK_SET); + for (i = 0; i * BUF_SIZE < size; i++) + { + memset(buf, 0xFF, BUF_SIZE); + write(fd, buf, BUF_SIZE); + } + memset(buf, 0xFF, BUF_SIZE); + write(fd, buf, size - i * BUF_SIZE); + fsync(fd); + } else { + result = FDB_ERASE_ERR; + } + return result; +} +#elif defined(FDB_USING_FILE_LIBC_MODE) + +static FILE *get_file_from_cache(fdb_db_t db, uint32_t sec_addr) +{ + for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) { + if (db->cur_file_sec[i] == sec_addr) + return db->cur_file[i]; + } + + return NULL; +} + +static void update_file_cache(fdb_db_t db, uint32_t sec_addr, FILE *fd) +{ + int free_index = FDB_FILE_CACHE_TABLE_SIZE; + + for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) { + if (db->cur_file_sec[i] == sec_addr) { + db->cur_file[i] = fd; + return; + } + else if (db->cur_file[i] == 0) { + free_index = i; + } + } + + if (fd) { + if (free_index < FDB_FILE_CACHE_TABLE_SIZE) { + db->cur_file[free_index] = fd; + db->cur_file_sec[free_index] = sec_addr; + } + else { + /* cache is full, move to end */ + for (int i = FDB_FILE_CACHE_TABLE_SIZE - 1; i > 0; i--) { + fclose(db->cur_file[i]); + memcpy(&db->cur_file[i], &db->cur_file[i - 1], sizeof(db->cur_file[0])); + memcpy(&db->cur_file_sec[i], &db->cur_file_sec[i - 1], sizeof(db->cur_file_sec[0])); + } + /* add to head */ + db->cur_file[0] = fd; + db->cur_file_sec[0] = sec_addr; + } + } +} + +static FILE *open_db_file(fdb_db_t db, uint32_t addr, bool clean) +{ + uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size); + FILE *fd = get_file_from_cache(db, sec_addr); + char path[DB_PATH_MAX]; + + if (fd == NULL || clean) { + get_db_file_path(db, addr, path, DB_PATH_MAX); + + if (fd) { + fclose(fd); + fd = NULL; + update_file_cache(db, sec_addr, fd); + } + + if (clean) { + /* clean the old file */ + FILE *clean_fd = fopen(path, "wb+"); + if (clean_fd == NULL) { + FDB_INFO("Error: open (%s) file failed.\n", path); + } else { + fclose(clean_fd); + clean_fd = NULL; + } + } + if (get_file_from_cache(db, sec_addr) == NULL) { + /* open the database file */ + fd = fopen(path, "rb+"); + update_file_cache(db, sec_addr, fd); + } + db->cur_sec = sec_addr; + } + + return fd; +} + +fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + FILE *fp = open_db_file(db, addr, false); + if (fp) { + addr = addr % db->sec_size; + if ((fseek(fp, addr, SEEK_SET) != 0) || (fread(buf, size, 1, fp) != size)) + result = FDB_READ_ERR; + } else { + result = FDB_READ_ERR; + } + return result; +} + +fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync) +{ + fdb_err_t result = FDB_NO_ERR; + FILE *fp = open_db_file(db, addr, false); + if (fp) { + addr = addr % db->sec_size; + if ((fseek(fp, addr, SEEK_SET) != 0) || (fwrite(buf, size, 1, fp) != size)) + result = FDB_READ_ERR; + if(sync) { + fflush(fp); + } + } else { + result = FDB_READ_ERR; + } + + return result; +} + +fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + + FILE *fp = open_db_file(db, addr, true); + if (fp != NULL) { +#define BUF_SIZE 32 + uint8_t buf[BUF_SIZE]; + size_t i; + fseek(fp, 0, SEEK_SET); + for (i = 0; i * BUF_SIZE < size; i++) + { + memset(buf, 0xFF, BUF_SIZE); + fwrite(buf, BUF_SIZE, 1, fp); + } + memset(buf, 0xFF, BUF_SIZE); + fwrite(buf, size - i * BUF_SIZE, 1, fp); + fflush(fp); + } else { + result = FDB_ERASE_ERR; + } + return result; +} +#endif /* defined(FDB_USING_FILE_LIBC_MODE) */ + +#endif /* FDB_USING_FILE_MODE */ + diff --git a/User/system/lib/flashdb/fdb_kvdb.c b/User/system/lib/flashdb/fdb_kvdb.c new file mode 100644 index 0000000..2bf2375 --- /dev/null +++ b/User/system/lib/flashdb/fdb_kvdb.c @@ -0,0 +1,1967 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief KVDB feature. + * + * Key-Value Database feature implement source file. + */ + +#include +#include +#include +#include + +#define FDB_LOG_TAG "[kv]" +/* rewrite log prefix */ +#undef FDB_LOG_PREFIX2 +#define FDB_LOG_PREFIX2() FDB_PRINT("[%s][%s] ", db_name(db), _fdb_db_path((fdb_db_t)db)) + +#if defined(FDB_USING_KVDB) + +#ifndef FDB_WRITE_GRAN +#error "Please configure flash write granularity (in fdb_cfg.h)" +#endif + +#if FDB_WRITE_GRAN != 1 && FDB_WRITE_GRAN != 8 && FDB_WRITE_GRAN != 32 && FDB_WRITE_GRAN != 64 && FDB_WRITE_GRAN != 128 +#error "the write gran can be only setting as 1, 8, 32, 64 and 128" +#endif + +/* magic word(`F`, `D`, `B`, `1`) */ +#define SECTOR_MAGIC_WORD 0x30424446 +/* magic word(`K`, `V`, `0`, `0`) */ +#define KV_MAGIC_WORD 0x3030564B +/* GC minimum number of empty sectors. GC will using at least 1 empty sector. */ +#define GC_MIN_EMPTY_SEC_NUM 1 + +/* the sector remain threshold before full status */ +#ifndef FDB_SEC_REMAIN_THRESHOLD +#define FDB_SEC_REMAIN_THRESHOLD (KV_HDR_DATA_SIZE + FDB_KV_NAME_MAX) +#endif + +/* the total remain empty sector threshold before GC */ +#ifndef FDB_GC_EMPTY_SEC_THRESHOLD +#define FDB_GC_EMPTY_SEC_THRESHOLD 1 +#endif + +/* the string KV value buffer size for legacy fdb_get_kv(db, ) function */ +#ifndef FDB_STR_KV_VALUE_MAX_SIZE +#define FDB_STR_KV_VALUE_MAX_SIZE 128 +#endif + +#if FDB_KV_CACHE_TABLE_SIZE > 0xFFFF +#error "The KV cache table size must less than 0xFFFF" +#endif + +/* the sector is not combined value */ +#if (FDB_BYTE_ERASED == 0xFF) +#define SECTOR_NOT_COMBINED 0xFFFFFFFF +#define SECTOR_COMBINED 0x00000000 +#else +#define SECTOR_NOT_COMBINED 0x00000000 +#define SECTOR_COMBINED 0xFFFFFFFF +#endif +/* the next address is get failed */ +#define FAILED_ADDR 0xFFFFFFFF + +#define KV_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_KV_STATUS_NUM) + +#define SECTOR_NUM (db_max_size(db) / db_sec_size(db)) + +#define SECTOR_HDR_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct sector_hdr_data))) +#define SECTOR_STORE_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->status_table.store)) +#define SECTOR_DIRTY_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->status_table.dirty)) +#define SECTOR_MAGIC_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->magic)) +#define KV_HDR_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct kv_hdr_data))) +#define KV_MAGIC_OFFSET ((unsigned long)(&((struct kv_hdr_data *)0)->magic)) +#define KV_LEN_OFFSET ((unsigned long)(&((struct kv_hdr_data *)0)->len)) +#define KV_NAME_LEN_OFFSET ((unsigned long)(&((struct kv_hdr_data *)0)->name_len)) + +#define db_name(db) (((fdb_db_t)db)->name) +#define db_init_ok(db) (((fdb_db_t)db)->init_ok) +#define db_sec_size(db) (((fdb_db_t)db)->sec_size) +#define db_max_size(db) (((fdb_db_t)db)->max_size) +#define db_oldest_addr(db) (((fdb_db_t)db)->oldest_addr) + +#define db_lock(db) \ + do { \ + if (((fdb_db_t)db)->lock) ((fdb_db_t)db)->lock((fdb_db_t)db); \ + } while(0); + +#define db_unlock(db) \ + do { \ + if (((fdb_db_t)db)->unlock) ((fdb_db_t)db)->unlock((fdb_db_t)db); \ + } while(0); + +#define VER_NUM_KV_NAME "__ver_num__" + +struct sector_hdr_data { + struct { + uint8_t store[FDB_STORE_STATUS_TABLE_SIZE]; /**< sector store status @see fdb_sector_store_status_t */ + uint8_t dirty[FDB_DIRTY_STATUS_TABLE_SIZE]; /**< sector dirty status @see fdb_sector_dirty_status_t */ + } status_table; + uint32_t magic; /**< magic word(`E`, `F`, `4`, `0`) */ + uint32_t combined; /**< the combined next sector number, default: not combined */ + uint32_t reserved; +#if (FDB_WRITE_GRAN == 64) || (FDB_WRITE_GRAN == 128) + uint8_t padding[4]; /**< align padding for 64bit and 128bit write granularity */ +#endif +}; +typedef struct sector_hdr_data *sector_hdr_data_t; + +struct kv_hdr_data { + uint8_t status_table[KV_STATUS_TABLE_SIZE]; /**< KV node status, @see fdb_kv_status_t */ + uint32_t magic; /**< magic word(`K`, `V`, `0`, `0`) */ + uint32_t len; /**< KV node total length (header + name + value), must align by FDB_WRITE_GRAN */ + uint32_t crc32; /**< KV node crc32(name_len + data_len + name + value) */ + uint8_t name_len; /**< name length */ + uint32_t value_len; /**< value length */ +#if (FDB_WRITE_GRAN == 64) + uint8_t padding[4]; /**< align padding for 64bit write granularity */ +#endif +#if (FDB_WRITE_GRAN == 128) + uint8_t padding[12]; /**< align padding for 128bit write granularity */ +#endif +}; +typedef struct kv_hdr_data *kv_hdr_data_t; + +struct alloc_kv_cb_args { + fdb_kvdb_t db; + size_t kv_size; + uint32_t *empty_kv; +}; + +struct gc_cb_args { + fdb_kvdb_t db; + size_t setting_free_size; + size_t last_gc_sec_addr; +}; + +static void gc_collect(fdb_kvdb_t db); +static void gc_collect_by_free_size(fdb_kvdb_t db, size_t free_size); + +#ifdef FDB_KV_USING_CACHE +static void update_sector_cache(fdb_kvdb_t db, kv_sec_info_t sector) +{ + size_t i, empty_index = FDB_SECTOR_CACHE_TABLE_SIZE; + + for (i = 0; i < FDB_SECTOR_CACHE_TABLE_SIZE; i++) { + /* update the sector empty_addr in cache */ + if (db->sector_cache_table[i].addr == sector->addr) { + if (sector->check_ok) { + memcpy(&db->sector_cache_table[i], sector, sizeof(struct kvdb_sec_info)); + } else { + db->sector_cache_table[i].addr = FDB_DATA_UNUSED; + } + return; + } else if (db->sector_cache_table[i].addr == FDB_DATA_UNUSED) { + empty_index = i; + } + } + /* add the sector empty_addr to cache */ + if (sector->check_ok && empty_index < FDB_SECTOR_CACHE_TABLE_SIZE) { + memcpy(&db->sector_cache_table[empty_index], sector, sizeof(struct kvdb_sec_info)); + } +} + +/* + * Get sector info from cache. It's return true when cache is hit. + */ +static kv_sec_info_t get_sector_from_cache(fdb_kvdb_t db, uint32_t sec_addr) +{ + size_t i; + + for (i = 0; i < FDB_SECTOR_CACHE_TABLE_SIZE; i++) { + if (db->sector_cache_table[i].addr == sec_addr) { + return &db->sector_cache_table[i]; + } + } + + return NULL; +} + +static void update_sector_empty_addr_cache(fdb_kvdb_t db, uint32_t sec_addr, uint32_t empty_addr) +{ + kv_sec_info_t sector = get_sector_from_cache(db, sec_addr); + if (sector) { + sector->empty_kv = empty_addr; + sector->remain = db_sec_size(db) - (sector->empty_kv - sector->addr); + } +} + +static void update_sector_status_store_cache(fdb_kvdb_t db, uint32_t sec_addr, fdb_sector_store_status_t stauts) +{ + kv_sec_info_t sector = get_sector_from_cache(db, sec_addr); + if (sector) { + sector->status.store = stauts; + } +} + +static void update_kv_cache(fdb_kvdb_t db, const char *name, size_t name_len, uint32_t addr) +{ + size_t i, empty_index = FDB_KV_CACHE_TABLE_SIZE, min_activity_index = FDB_KV_CACHE_TABLE_SIZE; + uint16_t name_crc = (uint16_t) (fdb_calc_crc32(0, name, name_len) >> 16), min_activity = 0xFFFF; + + for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) { + if (addr != FDB_DATA_UNUSED) { + /* update the KV address in cache */ + if (db->kv_cache_table[i].name_crc == name_crc) { + db->kv_cache_table[i].addr = addr; + return; + } else if ((db->kv_cache_table[i].addr == FDB_DATA_UNUSED) && (empty_index == FDB_KV_CACHE_TABLE_SIZE)) { + empty_index = i; + } else if (db->kv_cache_table[i].addr != FDB_DATA_UNUSED) { + if (db->kv_cache_table[i].active > 0) { + db->kv_cache_table[i].active--; + } + if (db->kv_cache_table[i].active < min_activity) { + min_activity_index = i; + min_activity = db->kv_cache_table[i].active; + } + } + } else if (db->kv_cache_table[i].name_crc == name_crc) { + /* delete the KV */ + db->kv_cache_table[i].addr = FDB_DATA_UNUSED; + db->kv_cache_table[i].active = 0; + return; + } + } + /* add the KV to cache, using LRU (Least Recently Used) like algorithm */ + if (empty_index < FDB_KV_CACHE_TABLE_SIZE) { + db->kv_cache_table[empty_index].addr = addr; + db->kv_cache_table[empty_index].name_crc = name_crc; + db->kv_cache_table[empty_index].active = FDB_KV_CACHE_TABLE_SIZE; + } else if (min_activity_index < FDB_KV_CACHE_TABLE_SIZE) { + db->kv_cache_table[min_activity_index].addr = addr; + db->kv_cache_table[min_activity_index].name_crc = name_crc; + db->kv_cache_table[min_activity_index].active = FDB_KV_CACHE_TABLE_SIZE; + } +} + +/* + * Get KV info from cache. It's return true when cache is hit. + */ +static bool get_kv_from_cache(fdb_kvdb_t db, const char *name, size_t name_len, uint32_t *addr) +{ + size_t i; + uint16_t name_crc = (uint16_t) (fdb_calc_crc32(0, name, name_len) >> 16); + + for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) { + if ((db->kv_cache_table[i].addr != FDB_DATA_UNUSED) && (db->kv_cache_table[i].name_crc == name_crc)) { + char saved_name[FDB_KV_NAME_MAX] = { 0 }; + /* read the KV name in flash */ + _fdb_flash_read((fdb_db_t)db, db->kv_cache_table[i].addr + KV_HDR_DATA_SIZE, (uint32_t *) saved_name, FDB_KV_NAME_MAX); + if (!strncmp(name, saved_name, name_len)) { + *addr = db->kv_cache_table[i].addr; + if (db->kv_cache_table[i].active >= 0xFFFF - FDB_KV_CACHE_TABLE_SIZE) { + db->kv_cache_table[i].active = 0xFFFF; + } else { + db->kv_cache_table[i].active += FDB_KV_CACHE_TABLE_SIZE; + } + return true; + } + } + } + + return false; +} +#endif /* FDB_KV_USING_CACHE */ + +/* + * find the next KV address by magic word on the flash + */ +static uint32_t find_next_kv_addr(fdb_kvdb_t db, uint32_t start, uint32_t end) +{ + uint8_t buf[32]; + uint32_t start_bak = start, i; + uint32_t magic; + +#ifdef FDB_KV_USING_CACHE + kv_sec_info_t sector; + sector = get_sector_from_cache(db, FDB_ALIGN_DOWN(start, db_sec_size(db))); + if (sector && start == sector->empty_kv) { + return FAILED_ADDR; + } +#endif /* FDB_KV_USING_CACHE */ + + for (; start < end && start + sizeof(buf) < end; start += (sizeof(buf) - sizeof(uint32_t))) { + if (_fdb_flash_read((fdb_db_t)db, start, (uint32_t *) buf, sizeof(buf)) != FDB_NO_ERR) + return FAILED_ADDR; + for (i = 0; i < sizeof(buf) - sizeof(uint32_t) && start + i < end; i++) { +#ifndef FDB_BIG_ENDIAN /* Little Endian Order */ + magic = buf[i] + ((uint32_t)buf[i + 1] << 8) + ((uint32_t)buf[i + 2] << 16) + ((uint32_t)buf[i + 3] << 24); +#else /* Big Endian Order */ + magic = buf[i + 3] + ((uint32_t)buf[i + 2] << 8) + ((uint32_t)buf[i + 1] << 16) + ((uint32_t)buf[i] << 24); +#endif + if (magic == KV_MAGIC_WORD && (start + i - KV_MAGIC_OFFSET) >= start_bak) { + return start + i - KV_MAGIC_OFFSET; + } + } + } + + return FAILED_ADDR; +} + +static uint32_t get_next_kv_addr(fdb_kvdb_t db, kv_sec_info_t sector, fdb_kv_t pre_kv) +{ + uint32_t addr = FAILED_ADDR; + + if (sector->status.store == FDB_SECTOR_STORE_EMPTY) { + return FAILED_ADDR; + } + + if (pre_kv->addr.start == FAILED_ADDR) { + /* the first KV address */ + addr = sector->addr + SECTOR_HDR_DATA_SIZE; + } else { + if (pre_kv->addr.start <= sector->addr + db_sec_size(db)) { + if (pre_kv->crc_is_ok) { + addr = pre_kv->addr.start + pre_kv->len; + } else { + /* when pre_kv CRC check failed, maybe the flash has error data + * find_next_kv_addr after pre_kv address */ + addr = pre_kv->addr.start + FDB_WG_ALIGN(1); + } + /* check and find next KV address */ + addr = find_next_kv_addr(db, addr, sector->addr + db_sec_size(db) - SECTOR_HDR_DATA_SIZE); + + if (addr == FAILED_ADDR || addr > sector->addr + db_sec_size(db) || pre_kv->len == 0) { + //TODO Sector continuous mode + return FAILED_ADDR; + } + } else { + /* no KV */ + return FAILED_ADDR; + } + } + + return addr; +} + +static fdb_err_t read_kv(fdb_kvdb_t db, fdb_kv_t kv) +{ + struct kv_hdr_data kv_hdr; + uint8_t buf[32]; + uint32_t calc_crc32 = 0, crc_data_len, kv_name_addr; + fdb_err_t result = FDB_NO_ERR; + size_t len, size; + /* read KV header raw data */ + _fdb_flash_read((fdb_db_t)db, kv->addr.start, (uint32_t *)&kv_hdr, sizeof(struct kv_hdr_data)); + kv->status = (fdb_kv_status_t) _fdb_get_status(kv_hdr.status_table, FDB_KV_STATUS_NUM); + kv->len = kv_hdr.len; + + if (kv->len == UINT32_MAX || kv->len > db_max_size(db) || kv->len < KV_HDR_DATA_SIZE) { + /* the KV length was not write, so reserved the info for current KV */ + kv->len = KV_HDR_DATA_SIZE; + if (kv->status != FDB_KV_ERR_HDR) { + kv->status = FDB_KV_ERR_HDR; + FDB_INFO("Error: The KV @0x%08" PRIX32 " length has an error.\n", kv->addr.start); + _fdb_write_status((fdb_db_t)db, kv->addr.start, kv_hdr.status_table, FDB_KV_STATUS_NUM, FDB_KV_ERR_HDR, true); + } + kv->crc_is_ok = false; + return FDB_READ_ERR; + } else if (kv->len > db_sec_size(db) - SECTOR_HDR_DATA_SIZE && kv->len < db_max_size(db)) { + //TODO Sector continuous mode, or the write length is not written completely + } + + /* CRC32 data len(header.name_len + header.value_len + name + value), using sizeof(uint32_t) for compatible V1.x */ + calc_crc32 = fdb_calc_crc32(calc_crc32, &kv_hdr.name_len, sizeof(uint32_t)); + calc_crc32 = fdb_calc_crc32(calc_crc32, &kv_hdr.value_len, sizeof(uint32_t)); + crc_data_len = kv->len - KV_HDR_DATA_SIZE; + /* calculate the CRC32 value */ + for (len = 0, size = 0; len < crc_data_len; len += size) { + if (len + sizeof(buf) < crc_data_len) { + size = sizeof(buf); + } else { + size = crc_data_len - len; + } + + _fdb_flash_read((fdb_db_t)db, kv->addr.start + KV_HDR_DATA_SIZE + len, (uint32_t *) buf, FDB_WG_ALIGN(size)); + calc_crc32 = fdb_calc_crc32(calc_crc32, buf, size); + } + /* check CRC32 */ + if (calc_crc32 != kv_hdr.crc32) { + size_t name_len = kv_hdr.name_len > FDB_KV_NAME_MAX ? FDB_KV_NAME_MAX : kv_hdr.name_len; + kv->crc_is_ok = false; + result = FDB_READ_ERR; + /* try read the KV name, maybe read name has error */ + kv_name_addr = kv->addr.start + KV_HDR_DATA_SIZE; + _fdb_flash_read((fdb_db_t)db, kv_name_addr, (uint32_t *)kv->name, FDB_WG_ALIGN(name_len)); + FDB_INFO("Error: Read the KV (%.*s@0x%08" PRIX32 ") CRC32 check failed!\n", name_len, kv->name, kv->addr.start); + } else { + kv->crc_is_ok = true; + /* the name is behind aligned KV header */ + kv_name_addr = kv->addr.start + KV_HDR_DATA_SIZE; + _fdb_flash_read((fdb_db_t)db, kv_name_addr, (uint32_t *) kv->name, FDB_WG_ALIGN(kv_hdr.name_len)); + /* the value is behind aligned name */ + kv->addr.value = kv_name_addr + FDB_WG_ALIGN(kv_hdr.name_len); + kv->value_len = kv_hdr.value_len; + kv->name_len = kv_hdr.name_len; + if (kv_hdr.name_len >= sizeof(kv->name) / sizeof(kv->name[0])) { + kv_hdr.name_len = sizeof(kv->name) / sizeof(kv->name[0]) - 1; + } + kv->name[kv_hdr.name_len] = '\0'; + } + + return result; +} + +static fdb_err_t read_sector_info(fdb_kvdb_t db, uint32_t addr, kv_sec_info_t sector, bool traversal) +{ + fdb_err_t result = FDB_NO_ERR; + struct sector_hdr_data sec_hdr = { 0 }; + + FDB_ASSERT(addr % db_sec_size(db) == 0); + FDB_ASSERT(sector); + +#ifdef FDB_KV_USING_CACHE + kv_sec_info_t sector_cache = get_sector_from_cache(db, addr); + if (sector_cache && ((!traversal) || (traversal && sector_cache->empty_kv != FAILED_ADDR))) { + memcpy(sector, sector_cache, sizeof(struct kvdb_sec_info)); + return result; + } +#endif /* FDB_KV_USING_CACHE */ + + /* read sector header raw data */ + _fdb_flash_read((fdb_db_t)db, addr, (uint32_t *)&sec_hdr, sizeof(struct sector_hdr_data)); + + sector->status.store = FDB_SECTOR_STORE_UNUSED; + sector->status.dirty = FDB_SECTOR_DIRTY_UNUSED; + sector->addr = addr; + sector->magic = sec_hdr.magic; + /* check magic word and combined value */ + if (sector->magic != SECTOR_MAGIC_WORD || + (sec_hdr.combined != SECTOR_NOT_COMBINED && sec_hdr.combined != SECTOR_COMBINED)) { + sector->check_ok = false; + sector->combined = SECTOR_NOT_COMBINED; + return FDB_INIT_FAILED; + } + sector->check_ok = true; + /* get other sector info */ + sector->combined = sec_hdr.combined; + sector->status.store = (fdb_sector_store_status_t) _fdb_get_status(sec_hdr.status_table.store, FDB_SECTOR_STORE_STATUS_NUM); + sector->status.dirty = (fdb_sector_dirty_status_t) _fdb_get_status(sec_hdr.status_table.dirty, FDB_SECTOR_DIRTY_STATUS_NUM); + /* traversal all KV and calculate the remain space size */ + if (traversal) { + sector->remain = 0; + sector->empty_kv = sector->addr + SECTOR_HDR_DATA_SIZE; + if (sector->status.store == FDB_SECTOR_STORE_EMPTY) { + sector->remain = db_sec_size(db) - SECTOR_HDR_DATA_SIZE; + } + else if (sector->status.store == FDB_SECTOR_STORE_USING) { + struct fdb_kv kv_obj; + + sector->remain = db_sec_size(db) - SECTOR_HDR_DATA_SIZE; + kv_obj.addr.start = sector->addr + SECTOR_HDR_DATA_SIZE; + do { + read_kv(db, &kv_obj); + if (!kv_obj.crc_is_ok) { + if (kv_obj.status != FDB_KV_PRE_WRITE && kv_obj.status != FDB_KV_ERR_HDR) { + sector->remain = 0; + result = FDB_READ_ERR; + break; + } + } + sector->empty_kv += kv_obj.len; + sector->remain -= kv_obj.len; + } while ((kv_obj.addr.start = get_next_kv_addr(db, sector, &kv_obj)) != FAILED_ADDR); + /* check the empty KV address by read continue 0xFF on flash */ + { + uint32_t ff_addr; + + ff_addr = _fdb_continue_ff_addr((fdb_db_t)db, sector->empty_kv, sector->addr + db_sec_size(db)); + /* check the flash data is clean */ + if (sector->empty_kv != ff_addr) { + /* update the sector information */ + sector->empty_kv = ff_addr; + sector->remain = db_sec_size(db) - (ff_addr - sector->addr); + } + } + + } +#ifdef FDB_KV_USING_CACHE + update_sector_cache(db, sector); + } else { + kv_sec_info_t sec_cache = get_sector_from_cache(db, sector->addr); + if (!sec_cache) { + sector->empty_kv = FAILED_ADDR; + sector->remain = 0; + update_sector_cache(db, sector); + } +#endif + } + + return result; +} + +static uint32_t get_next_sector_addr(fdb_kvdb_t db, kv_sec_info_t pre_sec, uint32_t traversed_len) +{ + uint32_t cur_block_size; + + if (pre_sec->combined == SECTOR_NOT_COMBINED) { + cur_block_size = db_sec_size(db); + } else { + cur_block_size = pre_sec->combined * db_sec_size(db); + } + + if (traversed_len + cur_block_size <= db_max_size(db)) { + /* if reach to the end, roll back to the first sector */ + if (pre_sec->addr + cur_block_size < db_max_size(db)) { + return pre_sec->addr + cur_block_size; + } else { + /* the next sector is on the top of the database */ + return 0; + } + } else { + /* finished */ + return FAILED_ADDR; + } +} + +static void kv_iterator(fdb_kvdb_t db, fdb_kv_t kv, void *arg1, void *arg2, + bool (*callback)(fdb_kv_t kv, void *arg1, void *arg2)) +{ + struct kvdb_sec_info sector; + uint32_t sec_addr, traversed_len = 0; + + sec_addr = db_oldest_addr(db); + /* search all sectors */ + do { + traversed_len += db_sec_size(db); + if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) { + continue; + } + if (callback == NULL) { + continue; + } + /* sector has KV */ + if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) { + kv->addr.start = sector.addr + SECTOR_HDR_DATA_SIZE; + /* search all KV */ + do { + read_kv(db, kv); + /* iterator is interrupted when callback return true */ + if (callback(kv, arg1, arg2)) { + return; + } + } while ((kv->addr.start = get_next_kv_addr(db, §or, kv)) != FAILED_ADDR); + } + } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR); +} + +static bool find_kv_cb(fdb_kv_t kv, void *arg1, void *arg2) +{ + const char *key = arg1; + bool *find_ok = arg2; + size_t key_len = strlen(key); + + if (key_len != kv->name_len) { + return false; + } + /* check KV */ + if (kv->crc_is_ok && kv->status == FDB_KV_WRITE && !strncmp(kv->name, key, key_len)) { + *find_ok = true; + return true; + } + return false; +} + +static bool find_kv_no_cache(fdb_kvdb_t db, const char *key, fdb_kv_t kv) +{ + bool find_ok = false; + + kv_iterator(db, kv, (void *)key, &find_ok, find_kv_cb); + + return find_ok; +} + +static bool find_kv(fdb_kvdb_t db, const char *key, fdb_kv_t kv) +{ + bool find_ok = false; + +#ifdef FDB_KV_USING_CACHE + size_t key_len = strlen(key); + + if (get_kv_from_cache(db, key, key_len, &kv->addr.start)) { + read_kv(db, kv); + return true; + } +#endif /* FDB_KV_USING_CACHE */ + + find_ok = find_kv_no_cache(db, key, kv); + +#ifdef FDB_KV_USING_CACHE + if (find_ok) { + update_kv_cache(db, key, key_len, kv->addr.start); + } +#endif /* FDB_KV_USING_CACHE */ + + return find_ok; +} + +static bool fdb_is_str(uint8_t *value, size_t len) +{ +#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') + size_t i; + + for (i = 0; i < len; i++) { + if (!__is_print(value[i])) { + return false; + } + } + return true; +} + +static size_t get_kv(fdb_kvdb_t db, const char *key, void *value_buf, size_t buf_len, size_t *value_len) +{ + struct fdb_kv kv; + size_t read_len = 0; + + if (find_kv(db, key, &kv)) { + if (value_len) { + *value_len = kv.value_len; + } + if (buf_len > kv.value_len) { + read_len = kv.value_len; + } else { + read_len = buf_len; + } + if (value_buf){ + _fdb_flash_read((fdb_db_t)db, kv.addr.value, (uint32_t *) value_buf, read_len); + } + } else if (value_len) { + *value_len = 0; + } + + return read_len; +} + +/** + * Get a KV object by key name + * + * @param db database object + * @param key KV name + * @param kv KV object + * + * @return KV object when is not NULL + */ +fdb_kv_t fdb_kv_get_obj(fdb_kvdb_t db, const char *key, fdb_kv_t kv) +{ + bool find_ok = false; + + if (!db_init_ok(db)) { + FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db)); + return 0; + } + + /* lock the KV cache */ + db_lock(db); + + find_ok = find_kv(db, key, kv); + + /* unlock the KV cache */ + db_unlock(db); + + return find_ok ? kv : NULL; +} + +/** + * Convert the KV object to blob object + * + * @param kv KV object + * @param blob blob object + * + * @return new blob object + */ +fdb_blob_t fdb_kv_to_blob(fdb_kv_t kv, fdb_blob_t blob) +{ + blob->saved.meta_addr = kv->addr.start; + blob->saved.addr = kv->addr.value; + blob->saved.len = kv->value_len; + + return blob; +} + +/** + * Get a blob KV value by key name. + * + * @param db database object + * @param key KV name + * @param blob blob object + * + * @return the actually get size on successful + */ +size_t fdb_kv_get_blob(fdb_kvdb_t db, const char *key, fdb_blob_t blob) +{ + size_t read_len = 0; + + if (!db_init_ok(db)) { + FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db)); + return 0; + } + + /* lock the KV cache */ + db_lock(db); + + read_len = get_kv(db, key, blob->buf, blob->size, &blob->saved.len); + + /* unlock the KV cache */ + db_unlock(db); + + return read_len; +} + +/** + * Get an KV value by key name. + * + * @note this function is NOT supported reentrant + * @note this function is DEPRECATED + * + * @param db database object + * @param key KV name + * + * @return value + */ +char *fdb_kv_get(fdb_kvdb_t db, const char *key) +{ + static char value[FDB_STR_KV_VALUE_MAX_SIZE + 1]; + size_t get_size; + struct fdb_blob blob; + + if ((get_size = fdb_kv_get_blob(db, key, fdb_blob_make(&blob, value, FDB_STR_KV_VALUE_MAX_SIZE))) > 0) { + /* the return value must be string */ + if (fdb_is_str((uint8_t *)value, get_size)) { + value[get_size] = '\0'; + return value; + } else if (blob.saved.len > FDB_STR_KV_VALUE_MAX_SIZE) { + FDB_INFO("Warning: The default string KV value buffer length (%" PRIdLEAST16 ") is too less (%" PRIu32 ").\n", FDB_STR_KV_VALUE_MAX_SIZE, + (uint32_t)blob.saved.len); + } else { + FDB_INFO("Warning: The KV value isn't string. Could not be returned\n"); + return NULL; + } + } + + return NULL; +} + +static fdb_err_t write_kv_hdr(fdb_kvdb_t db, uint32_t addr, kv_hdr_data_t kv_hdr) +{ + fdb_err_t result = FDB_NO_ERR; + /* write the status will by write granularity */ + result = _fdb_write_status((fdb_db_t)db, addr, kv_hdr->status_table, FDB_KV_STATUS_NUM, FDB_KV_PRE_WRITE, false); + if (result != FDB_NO_ERR) { + return result; + } + /* write other header data */ + result = _fdb_flash_write((fdb_db_t)db, addr + KV_MAGIC_OFFSET, &kv_hdr->magic, sizeof(struct kv_hdr_data) - KV_MAGIC_OFFSET, false); + + return result; +} + +static fdb_err_t format_sector(fdb_kvdb_t db, uint32_t addr, uint32_t combined_value) +{ + fdb_err_t result = FDB_NO_ERR; + struct sector_hdr_data sec_hdr = { 0 }; + + FDB_ASSERT(addr % db_sec_size(db) == 0); + + result = _fdb_flash_erase((fdb_db_t)db, addr, db_sec_size(db)); + if (result == FDB_NO_ERR) { + /* initialize the header data */ + memset(&sec_hdr, FDB_BYTE_ERASED, sizeof(struct sector_hdr_data)); +#if (FDB_WRITE_GRAN == 1) + _fdb_set_status(sec_hdr.status_table.store, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_EMPTY); + _fdb_set_status(sec_hdr.status_table.dirty, FDB_SECTOR_DIRTY_STATUS_NUM, FDB_SECTOR_DIRTY_FALSE); + sec_hdr.magic = SECTOR_MAGIC_WORD; + sec_hdr.combined = combined_value; + sec_hdr.reserved = FDB_DATA_UNUSED; + /* save the header */ + result = _fdb_flash_write((fdb_db_t)db, addr, (uint32_t *)&sec_hdr, SECTOR_HDR_DATA_SIZE, true); +#else // seperate the whole "sec_hdr" program to serval sinle program operation to prevent re-program issue on STM32L4xx or + // other MCU internal flash + /* write the sector store status */ + _fdb_write_status((fdb_db_t)db, + addr + SECTOR_STORE_OFFSET, + sec_hdr.status_table.store, + FDB_SECTOR_STORE_STATUS_NUM, + FDB_SECTOR_STORE_EMPTY, + true); + + /* write the sector dirty status */ + _fdb_write_status((fdb_db_t)db, + addr + SECTOR_DIRTY_OFFSET, + sec_hdr.status_table.dirty, + FDB_SECTOR_DIRTY_STATUS_NUM, + FDB_SECTOR_DIRTY_FALSE, + true); + + /* write the magic word and combined next sector number */ + sec_hdr.magic = SECTOR_MAGIC_WORD; + sec_hdr.combined = combined_value; + sec_hdr.reserved = FDB_DATA_UNUSED; + result = _fdb_flash_write((fdb_db_t)db, + addr + SECTOR_MAGIC_OFFSET, + (void *)(&(sec_hdr.magic)), + (sizeof(struct sector_hdr_data) - SECTOR_MAGIC_OFFSET), + true); +#endif + +#ifdef FDB_KV_USING_CACHE + { + struct kvdb_sec_info sector = {.addr = addr, .check_ok = false, .empty_kv = FAILED_ADDR }; + /* delete the sector cache */ + update_sector_cache(db, §or); + } +#endif /* FDB_KV_USING_CACHE */ + } + + return result; +} + +static fdb_err_t update_sec_status(fdb_kvdb_t db, kv_sec_info_t sector, size_t new_kv_len, bool *is_full) +{ + uint8_t status_table[FDB_STORE_STATUS_TABLE_SIZE]; + fdb_err_t result = FDB_NO_ERR; + /* change the current sector status */ + if (sector->status.store == FDB_SECTOR_STORE_EMPTY) { + /* change the sector status to using */ + result = _fdb_write_status((fdb_db_t)db, sector->addr, status_table, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_USING, true); + +#ifdef FDB_KV_USING_CACHE + update_sector_status_store_cache(db, sector->addr, FDB_SECTOR_STORE_USING); +#endif /* FDB_KV_USING_CACHE */ + + } else if (sector->status.store == FDB_SECTOR_STORE_USING) { + /* check remain size */ + if (sector->remain < FDB_SEC_REMAIN_THRESHOLD || sector->remain - new_kv_len < FDB_SEC_REMAIN_THRESHOLD) { + /* change the sector status to full */ + result = _fdb_write_status((fdb_db_t)db, sector->addr, status_table, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_FULL, true); + +#ifdef FDB_KV_USING_CACHE + update_sector_status_store_cache(db, sector->addr, FDB_SECTOR_STORE_FULL); +#endif /* FDB_KV_USING_CACHE */ + + if (is_full) { + *is_full = true; + } + } else if (is_full) { + *is_full = false; + } + } + + return result; +} + +static void sector_iterator(fdb_kvdb_t db, kv_sec_info_t sector, fdb_sector_store_status_t status, void *arg1, void *arg2, + bool (*callback)(kv_sec_info_t sector, void *arg1, void *arg2), bool traversal_kv) +{ + uint32_t sec_addr, traversed_len = 0; + + /* search all sectors */ + sec_addr = db_oldest_addr(db); + do { + traversed_len += db_sec_size(db); + read_sector_info(db, sec_addr, sector, false); + if (status == FDB_SECTOR_STORE_UNUSED || status == sector->status.store) { + if (traversal_kv) { + read_sector_info(db, sec_addr, sector, true); + } + /* iterator is interrupted when callback return true */ + if (callback && callback(sector, arg1, arg2)) { + return; + } + } + } while ((sec_addr = get_next_sector_addr(db, sector, traversed_len)) != FAILED_ADDR); +} + +static bool sector_statistics_cb(kv_sec_info_t sector, void *arg1, void *arg2) +{ + size_t *empty_sector = arg1, *using_sector = arg2; + + if (sector->check_ok && sector->status.store == FDB_SECTOR_STORE_EMPTY) { + (*empty_sector)++; + } else if (sector->check_ok && sector->status.store == FDB_SECTOR_STORE_USING) { + (*using_sector)++; + } + + return false; +} + +static bool alloc_kv_cb(kv_sec_info_t sector, void *arg1, void *arg2) +{ + struct alloc_kv_cb_args *arg = arg1; + + /* 1. sector has space + * 2. the NO dirty sector + * 3. the dirty sector only when the gc_request is false */ + if (sector->check_ok && sector->remain > arg->kv_size + FDB_SEC_REMAIN_THRESHOLD + && ((sector->status.dirty == FDB_SECTOR_DIRTY_FALSE) + || (sector->status.dirty == FDB_SECTOR_DIRTY_TRUE && !arg->db->gc_request))) { + *(arg->empty_kv) = sector->empty_kv; + return true; + } + + return false; +} + +static uint32_t alloc_kv(fdb_kvdb_t db, kv_sec_info_t sector, size_t kv_size) +{ + uint32_t empty_kv = FAILED_ADDR; + size_t empty_sector = 0, using_sector = 0; + struct alloc_kv_cb_args arg = {db, kv_size, &empty_kv}; + + /* sector status statistics */ + sector_iterator(db, sector, FDB_SECTOR_STORE_UNUSED, &empty_sector, &using_sector, sector_statistics_cb, false); + if (using_sector > 0) { + /* alloc the KV from the using status sector first */ + sector_iterator(db, sector, FDB_SECTOR_STORE_USING, &arg, NULL, alloc_kv_cb, true); + } + if (empty_sector > 0 && empty_kv == FAILED_ADDR) { + if (empty_sector > FDB_GC_EMPTY_SEC_THRESHOLD || db->gc_request) { + sector_iterator(db, sector, FDB_SECTOR_STORE_EMPTY, &arg, NULL, alloc_kv_cb, true); + } else { + /* no space for new KV now will GC and retry */ + FDB_DEBUG("Trigger a GC check after alloc KV failed.\n"); + db->gc_request = true; + } + } + + return empty_kv; +} + +static fdb_err_t del_kv(fdb_kvdb_t db, const char *key, fdb_kv_t old_kv, bool complete_del) +{ + fdb_err_t result = FDB_NO_ERR; + uint32_t dirty_status_addr; + struct fdb_kv kv = { .status = FDB_KV_UNUSED }; + +#if (KV_STATUS_TABLE_SIZE >= FDB_DIRTY_STATUS_TABLE_SIZE) + uint8_t status_table[KV_STATUS_TABLE_SIZE]; +#else + uint8_t status_table[DIRTY_STATUS_TABLE_SIZE]; +#endif + + /* need find KV */ + if (!old_kv) { + /* find KV */ + if (find_kv(db, key, &kv)) { + old_kv = &kv; + } else { + FDB_DEBUG("Not found '%s' in KV.\n", key); + return FDB_KV_NAME_ERR; + } + } + /* change and save the new status */ + if (!complete_del) { + result = _fdb_write_status((fdb_db_t)db, old_kv->addr.start, status_table, FDB_KV_STATUS_NUM, FDB_KV_PRE_DELETE, false); + db->last_is_complete_del = true; + } else { + result = _fdb_write_status((fdb_db_t)db, old_kv->addr.start, status_table, FDB_KV_STATUS_NUM, FDB_KV_DELETED, true); + + if (!db->last_is_complete_del && result == FDB_NO_ERR) { +#ifdef FDB_KV_USING_CACHE + /* delete the KV in flash and cache */ + if (key != NULL) { + /* when using del_kv(db, key, NULL, true) or del_kv(db, key, kv, true) in fdb_del_kv(db, ) and set_kv(db, ) */ + update_kv_cache(db, key, strlen(key), FDB_DATA_UNUSED); + } else if (old_kv != NULL) { + /* when using del_kv(db, NULL, kv, true) in move_kv(db, ) */ + update_kv_cache(db, old_kv->name, old_kv->name_len, FDB_DATA_UNUSED); + } +#endif /* FDB_KV_USING_CACHE */ + } + + db->last_is_complete_del = false; + } + + dirty_status_addr = FDB_ALIGN_DOWN(old_kv->addr.start, db_sec_size(db)) + SECTOR_DIRTY_OFFSET; + /* read and change the sector dirty status */ + if (result == FDB_NO_ERR + && _fdb_read_status((fdb_db_t)db, dirty_status_addr, status_table, FDB_SECTOR_DIRTY_STATUS_NUM) == FDB_SECTOR_DIRTY_FALSE) { + result = _fdb_write_status((fdb_db_t)db, dirty_status_addr, status_table, FDB_SECTOR_DIRTY_STATUS_NUM, FDB_SECTOR_DIRTY_TRUE, true); +#ifdef FDB_KV_USING_CACHE + { + kv_sec_info_t sector_cache = get_sector_from_cache(db, FDB_ALIGN_DOWN(old_kv->addr.start, db_sec_size(db))); + if (sector_cache) { + sector_cache->status.dirty = FDB_SECTOR_DIRTY_TRUE; + } + } +#endif /* FDB_KV_USING_CACHE */ + } + + return result; +} + +/* + * move the KV to new space + */ +static fdb_err_t move_kv(fdb_kvdb_t db, fdb_kv_t kv) +{ + fdb_err_t result = FDB_NO_ERR; + uint8_t status_table[KV_STATUS_TABLE_SIZE]; + uint32_t kv_addr; + struct kvdb_sec_info sector; + + /* prepare to delete the current KV */ + if (kv->status == FDB_KV_WRITE) { + del_kv(db, NULL, kv, false); + } + + if ((kv_addr = alloc_kv(db, §or, kv->len)) != FAILED_ADDR) { + if (db->in_recovery_check && kv->status == FDB_KV_PRE_DELETE) { + struct fdb_kv kv_bak; + char name[FDB_KV_NAME_MAX + 1] = { 0 }; + strncpy(name, kv->name, kv->name_len); + /* check the KV in flash is already create success */ + if (find_kv_no_cache(db, name, &kv_bak)) { + /* already create success, don't need to duplicate */ + result = FDB_NO_ERR; + goto __exit; + } + } + } else { + return FDB_SAVED_FULL; + } + /* start move the KV */ + { + uint8_t buf[32]; + size_t len, size, kv_len = kv->len; + + /* update the new KV sector status first */ + update_sec_status(db, §or, kv->len, NULL); + + _fdb_write_status((fdb_db_t)db, kv_addr, status_table, FDB_KV_STATUS_NUM, FDB_KV_PRE_WRITE, false); + kv_len -= KV_MAGIC_OFFSET; + for (len = 0, size = 0; len < kv_len; len += size) { + if (len + sizeof(buf) < kv_len) { + size = sizeof(buf); + } else { + size = kv_len - len; + } + _fdb_flash_read((fdb_db_t)db, kv->addr.start + KV_MAGIC_OFFSET + len, (uint32_t *) buf, FDB_WG_ALIGN(size)); + result = _fdb_flash_write((fdb_db_t)db, kv_addr + KV_MAGIC_OFFSET + len, (uint32_t *) buf, size, true); + } + _fdb_write_status((fdb_db_t)db, kv_addr, status_table, FDB_KV_STATUS_NUM, FDB_KV_WRITE, true); + +#ifdef FDB_KV_USING_CACHE + update_sector_empty_addr_cache(db, FDB_ALIGN_DOWN(kv_addr, db_sec_size(db)), + kv_addr + KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv->name_len) + FDB_WG_ALIGN(kv->value_len)); + update_kv_cache(db, kv->name, kv->name_len, kv_addr); +#endif /* FDB_KV_USING_CACHE */ + } + + FDB_DEBUG("Moved the KV (%.*s) from 0x%08" PRIX32 " to 0x%08" PRIX32 ".\n", kv->name_len, kv->name, kv->addr.start, kv_addr); + +__exit: + del_kv(db, NULL, kv, true); + + return result; +} + +static uint32_t new_kv(fdb_kvdb_t db, kv_sec_info_t sector, size_t kv_size) +{ + bool already_gc = false; + uint32_t empty_kv = FAILED_ADDR; + +__retry: + + if ((empty_kv = alloc_kv(db, sector, kv_size)) == FAILED_ADDR) { + if (db->gc_request && !already_gc) { + FDB_DEBUG("Alloc an KV (size %" PRIu32 ") failed when new KV. Now will GC then retry.\n", (uint32_t)kv_size); + gc_collect_by_free_size(db, kv_size); + already_gc = true; + goto __retry; + } else if (already_gc) { + FDB_INFO("Error: Alloc an KV (size %" PRIuLEAST16 ") failed after GC. KV full.\n", kv_size); + db->gc_request = false; + } + } + + return empty_kv; +} + +static uint32_t new_kv_ex(fdb_kvdb_t db, kv_sec_info_t sector, size_t key_len, size_t buf_len) +{ + size_t kv_len = KV_HDR_DATA_SIZE + FDB_WG_ALIGN(key_len) + FDB_WG_ALIGN(buf_len); + + return new_kv(db, sector, kv_len); +} + +static bool gc_check_cb(kv_sec_info_t sector, void *arg1, void *arg2) +{ + size_t *empty_sec_num = arg1; + uint32_t *empty_sec_addr = arg2; + + if (sector->check_ok) { + *empty_sec_num = *empty_sec_num + 1; + *empty_sec_addr = sector->addr; + } + + return false; + +} + +static bool do_gc(kv_sec_info_t sector, void *arg1, void *arg2) +{ + struct fdb_kv kv; + struct gc_cb_args *gc = (struct gc_cb_args *)arg1; + fdb_kvdb_t db = gc->db; + uint32_t last_gc_sec_addr = 0; + + if (sector->check_ok && (sector->status.dirty == FDB_SECTOR_DIRTY_TRUE || sector->status.dirty == FDB_SECTOR_DIRTY_GC)) { + uint8_t status_table[FDB_DIRTY_STATUS_TABLE_SIZE]; + /* change the sector status to GC */ + _fdb_write_status((fdb_db_t)db, sector->addr + SECTOR_DIRTY_OFFSET, status_table, FDB_SECTOR_DIRTY_STATUS_NUM, FDB_SECTOR_DIRTY_GC, true); + /* search all KV */ + kv.addr.start = sector->addr + SECTOR_HDR_DATA_SIZE; + do { + read_kv(db, &kv); + if (kv.crc_is_ok && (kv.status == FDB_KV_WRITE || kv.status == FDB_KV_PRE_DELETE)) { + /* move the KV to new space */ + if (move_kv(db, &kv) != FDB_NO_ERR) { + FDB_INFO("Error: Moved the KV (%.*s) for GC failed.\n", kv.name_len, kv.name); + } + } else { + FDB_DEBUG("KV (%.*s) is garbage NOT need move, collect it.\n", kv.name_len, kv.name); + } + } while ((kv.addr.start = get_next_kv_addr(db, sector, &kv)) != FAILED_ADDR); + format_sector(db, sector->addr, SECTOR_NOT_COMBINED); + last_gc_sec_addr = gc->last_gc_sec_addr; + gc->last_gc_sec_addr = sector->addr; + /* update oldest_addr for next GC sector format */ + db_oldest_addr(db) = get_next_sector_addr(db, sector, 0); + FDB_DEBUG("Collect a sector @0x%08" PRIX32 "\n", sector->addr); + /* the collect new space is in last GC sector */ + struct kvdb_sec_info last_gc_sector; + if (read_sector_info(db, last_gc_sec_addr, &last_gc_sector, true) == FDB_NO_ERR) { + if (last_gc_sector.remain > gc->setting_free_size) + return true; + } + } + + return false; +} + +static void gc_collect_by_free_size(fdb_kvdb_t db, size_t free_size) +{ + struct kvdb_sec_info sector; + size_t empty_sec_num = 0; + /* an empty sector address */ + uint32_t empty_sec_addr = 0; + + /* GC check the empty sector number */ + sector_iterator(db, §or, FDB_SECTOR_STORE_EMPTY, &empty_sec_num, &empty_sec_addr, gc_check_cb, false); + + /* do GC collect */ + FDB_DEBUG("The remain empty sector is %" PRIu32 ", GC threshold is %" PRIdLEAST16 ".\n", (uint32_t)empty_sec_num, FDB_GC_EMPTY_SEC_THRESHOLD); + if (empty_sec_num <= FDB_GC_EMPTY_SEC_THRESHOLD) { + struct gc_cb_args arg = { db, free_size, empty_sec_addr }; + sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &arg, NULL, do_gc, false); + } + + db->gc_request = false; +} + +/* + * The GC will be triggered on the following scene: + * 1. alloc an KV when the flash not has enough space + * 2. write an KV then the flash not has enough space + */ +static void gc_collect(fdb_kvdb_t db) +{ + gc_collect_by_free_size(db, db_max_size(db)); +} + +static fdb_err_t align_write(fdb_kvdb_t db, uint32_t addr, const uint32_t *buf, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + size_t align_remain; + +#if (FDB_WRITE_GRAN / 8 > 0) + uint8_t align_data[FDB_WRITE_GRAN / 8]; + size_t align_data_size = sizeof(align_data); +#else + /* For compatibility with C89 */ + uint8_t align_data_u8, *align_data = &align_data_u8; + size_t align_data_size = 1; +#endif + + memset(align_data, FDB_BYTE_ERASED, align_data_size); + result = _fdb_flash_write((fdb_db_t) db, addr, buf, FDB_WG_ALIGN_DOWN(size), false); + + align_remain = size - FDB_WG_ALIGN_DOWN(size); + if (result == FDB_NO_ERR && align_remain) { + memcpy(align_data, (uint8_t *) buf + FDB_WG_ALIGN_DOWN(size), align_remain); + result = _fdb_flash_write((fdb_db_t) db, addr + FDB_WG_ALIGN_DOWN(size), (uint32_t *) align_data, + align_data_size, false); + } + + return result; +} + +static fdb_err_t create_kv_blob(fdb_kvdb_t db, kv_sec_info_t sector, const char *key, const void *value, size_t len) +{ + fdb_err_t result = FDB_NO_ERR; + struct kv_hdr_data kv_hdr; + bool is_full = false; + uint32_t kv_addr = sector->empty_kv; + + if (strlen(key) > FDB_KV_NAME_MAX) { + FDB_INFO("Error: The KV name length is more than %d\n", FDB_KV_NAME_MAX); + return FDB_KV_NAME_ERR; + } + + memset(&kv_hdr, FDB_BYTE_ERASED, sizeof(struct kv_hdr_data)); + kv_hdr.magic = KV_MAGIC_WORD; + kv_hdr.name_len = strlen(key); + kv_hdr.value_len = len; + kv_hdr.len = KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv_hdr.name_len) + FDB_WG_ALIGN(kv_hdr.value_len); + + if (kv_hdr.len > db_sec_size(db) - SECTOR_HDR_DATA_SIZE) { + FDB_INFO("Error: The KV size is too big\n"); + return FDB_SAVED_FULL; + } + + if (kv_addr != FAILED_ADDR || (kv_addr = new_kv(db, sector, kv_hdr.len)) != FAILED_ADDR) { + size_t align_remain; + /* update the sector status */ + if (result == FDB_NO_ERR) { + result = update_sec_status(db, sector, kv_hdr.len, &is_full); + } + if (result == FDB_NO_ERR) { + uint8_t ff = FDB_BYTE_ERASED; + /* start calculate CRC32 */ + kv_hdr.crc32 = 0; + /* CRC32(header.name_len + header.value_len + name + value), using sizeof(uint32_t) for compatible V1.x */ + kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &kv_hdr.name_len, sizeof(uint32_t)); + kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &kv_hdr.value_len, sizeof(uint32_t)); + kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, key, kv_hdr.name_len); + align_remain = FDB_WG_ALIGN(kv_hdr.name_len) - kv_hdr.name_len; + while (align_remain--) { + kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &ff, 1); + } + kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, value, kv_hdr.value_len); + align_remain = FDB_WG_ALIGN(kv_hdr.value_len) - kv_hdr.value_len; + while (align_remain--) { + kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &ff, 1); + } + /* write KV header data */ + result = write_kv_hdr(db, kv_addr, &kv_hdr); + } + /* write key name */ + if (result == FDB_NO_ERR) { + result = align_write(db, kv_addr + KV_HDR_DATA_SIZE, (uint32_t *) key, kv_hdr.name_len); + +#ifdef FDB_KV_USING_CACHE + if (!is_full) { + update_sector_empty_addr_cache(db, sector->addr, + kv_addr + KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv_hdr.name_len) + FDB_WG_ALIGN(kv_hdr.value_len)); + } + update_kv_cache(db, key, kv_hdr.name_len, kv_addr); +#endif /* FDB_KV_USING_CACHE */ + } + /* write value */ + if (result == FDB_NO_ERR) { + result = align_write(db, kv_addr + KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv_hdr.name_len), value, + kv_hdr.value_len); + } + /* change the KV status to KV_WRITE */ + if (result == FDB_NO_ERR) { + result = _fdb_write_status((fdb_db_t) db, kv_addr, kv_hdr.status_table, FDB_KV_STATUS_NUM, FDB_KV_WRITE, + true); + } + /* trigger GC collect when current sector is full */ + if (result == FDB_NO_ERR && is_full) { + FDB_DEBUG("Trigger a GC check after created KV.\n"); + db->gc_request = true; + } + } else { + result = FDB_SAVED_FULL; + } + + return result; +} + +/** + * Delete an KV. + * + * @param db database object + * @param key KV name + * + * @return result + */ +fdb_err_t fdb_kv_del(fdb_kvdb_t db, const char *key) +{ + fdb_err_t result = FDB_NO_ERR; + + if (!db_init_ok(db)) { + FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db)); + return FDB_INIT_FAILED; + } + + /* lock the KV cache */ + db_lock(db); + + result = del_kv(db, key, NULL, true); + + /* unlock the KV cache */ + db_unlock(db); + + return result; +} + +static fdb_err_t set_kv(fdb_kvdb_t db, const char *key, const void *value_buf, size_t buf_len) +{ + fdb_err_t result = FDB_NO_ERR; + bool kv_is_found = false; + + if (value_buf == NULL) { + result = del_kv(db, key, NULL, true); + } else { + /* make sure the flash has enough space */ + if (new_kv_ex(db, &db->cur_sector, strlen(key), buf_len) == FAILED_ADDR) { + return FDB_SAVED_FULL; + } + kv_is_found = find_kv(db, key, &db->cur_kv); + /* prepare to delete the old KV */ + if (kv_is_found) { + result = del_kv(db, key, &db->cur_kv, false); + } + /* create the new KV */ + if (result == FDB_NO_ERR) { + result = create_kv_blob(db, &db->cur_sector, key, value_buf, buf_len); + } + /* delete the old KV */ + if (kv_is_found && result == FDB_NO_ERR) { + result = del_kv(db, key, &db->cur_kv, true); + } + /* process the GC after set KV */ + if (db->gc_request) { + gc_collect_by_free_size(db, KV_HDR_DATA_SIZE + FDB_WG_ALIGN(strlen(key)) + FDB_WG_ALIGN(buf_len)); + } + } + + return result; +} + +/** + * Set a blob KV. If it blob value is NULL, delete it. + * If not find it in flash, then create it. + * + * @param db database object + * @param key KV name + * @param blob blob object + * + * @return result + */ +fdb_err_t fdb_kv_set_blob(fdb_kvdb_t db, const char *key, fdb_blob_t blob) +{ + fdb_err_t result = FDB_NO_ERR; + + if (!db_init_ok(db)) { + FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db)); + return FDB_INIT_FAILED; + } + + /* lock the KV cache */ + db_lock(db); + + result = set_kv(db, key, blob->buf, blob->size); + + /* unlock the KV cache */ + db_unlock(db); + + return result; +} + +/** + * Set a string KV. If it value is NULL, delete it. + * If not find it in flash, then create it. + * + * @param db database object + * @param key KV name + * @param value KV value + * + * @return result + */ +fdb_err_t fdb_kv_set(fdb_kvdb_t db, const char *key, const char *value) +{ + struct fdb_blob blob; + + if (value) { + return fdb_kv_set_blob(db, key, fdb_blob_make(&blob, value, strlen(value))); + } else { + return fdb_kv_del(db, key); + } +} + +/** + * recovery all KV to default. + * + * @param db database object + * @return result + */ +fdb_err_t fdb_kv_set_default(fdb_kvdb_t db) +{ + fdb_err_t result = FDB_NO_ERR; + uint32_t addr, i, value_len; + struct kvdb_sec_info sector; + + /* lock the KV cache */ + db_lock(db); + +#ifdef FDB_KV_USING_CACHE + for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) { + db->kv_cache_table[i].addr = FDB_DATA_UNUSED; + } +#endif /* FDB_KV_USING_CACHE */ + + /* format all sectors */ + for (addr = 0; addr < db_max_size(db); addr += db_sec_size(db)) { + result = format_sector(db, addr, SECTOR_NOT_COMBINED); + if (result != FDB_NO_ERR) { + goto __exit; + } + } + /* create default KV */ + for (i = 0; i < db->default_kvs.num; i++) { + /* It seems to be a string when value length is 0. + * This mechanism is for compatibility with older versions (less then V4.0). */ + if (db->default_kvs.kvs[i].value_len == 0) { + value_len = strlen(db->default_kvs.kvs[i].value); + } else { + value_len = db->default_kvs.kvs[i].value_len; + } + sector.empty_kv = FAILED_ADDR; + create_kv_blob(db, §or, db->default_kvs.kvs[i].key, db->default_kvs.kvs[i].value, value_len); + if (result != FDB_NO_ERR) { + goto __exit; + } + } + +__exit: + db_oldest_addr(db) = 0; + /* unlock the KV cache */ + db_unlock(db); + + return result; +} + +static bool print_kv_cb(fdb_kv_t kv, void *arg1, void *arg2) +{ + bool value_is_str = true, print_value = false; + size_t *using_size = arg1; + fdb_kvdb_t db = arg2; + + if (kv->crc_is_ok) { + /* calculate the total using flash size */ + *using_size += kv->len; + /* check KV */ + if (kv->status == FDB_KV_WRITE) { + FDB_PRINT("%.*s=", kv->name_len, kv->name); + + if (kv->value_len < FDB_STR_KV_VALUE_MAX_SIZE ) { + uint8_t buf[32]; + size_t len, size; +__reload: + /* check the value is string */ + for (len = 0, size = 0; len < kv->value_len; len += size) { + if (len + sizeof(buf) < kv->value_len) { + size = sizeof(buf); + } else { + size = kv->value_len - len; + } + _fdb_flash_read((fdb_db_t)db, kv->addr.value + len, (uint32_t *) buf, FDB_WG_ALIGN(size)); + if (print_value) { + FDB_PRINT("%.*s", (int)size, buf); + } else if (!fdb_is_str(buf, size)) { + value_is_str = false; + break; + } + } + } else { + value_is_str = false; + } + if (value_is_str && !print_value) { + print_value = true; + goto __reload; + } else if (!value_is_str) { + FDB_PRINT("blob @0x%08" PRIX32 " %" PRIu32 "bytes", kv->addr.value, kv->value_len); + } + FDB_PRINT("\n"); + } + } + + return false; +} + + +/** + * Print all KV. + * + * @param db database object + */ +void fdb_kv_print(fdb_kvdb_t db) +{ + struct fdb_kv kv; + size_t using_size = 0; + + if (!db_init_ok(db)) { + FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db)); + return; + } + + /* lock the KV cache */ + db_lock(db); + + kv_iterator(db, &kv, &using_size, db, print_kv_cb); + + FDB_PRINT("\nmode: next generation\n"); + FDB_PRINT("size: %" PRIu32 "/%" PRIu32 " bytes.\n", (uint32_t)using_size + ((SECTOR_NUM - FDB_GC_EMPTY_SEC_THRESHOLD) * SECTOR_HDR_DATA_SIZE), + db_max_size(db) - db_sec_size(db) * FDB_GC_EMPTY_SEC_THRESHOLD); + + /* unlock the KV cache */ + db_unlock(db); +} + +#ifdef FDB_KV_AUTO_UPDATE +/* + * Auto update KV to latest default when current setting version number is changed. + */ +static void kv_auto_update(fdb_kvdb_t db) +{ + size_t saved_ver_num, setting_ver_num = db->ver_num; + + if (get_kv(db, VER_NUM_KV_NAME, &saved_ver_num, sizeof(size_t), NULL) > 0) { + /* check version number */ + if (saved_ver_num != setting_ver_num) { + size_t i, value_len; + FDB_DEBUG("Update the KV from version %zu to %zu.\n", saved_ver_num, setting_ver_num); + for (i = 0; i < db->default_kvs.num; i++) { + /* add a new KV when it's not found */ + if (!find_kv(db, db->default_kvs.kvs[i].key, &db->cur_kv)) { + /* It seems to be a string when value length is 0. + * This mechanism is for compatibility with older versions (less then V4.0). */ + if (db->default_kvs.kvs[i].value_len == 0) { + value_len = strlen(db->default_kvs.kvs[i].value); + } else { + value_len = db->default_kvs.kvs[i].value_len; + } + db->cur_sector.empty_kv = FAILED_ADDR; + create_kv_blob(db, &db->cur_sector, db->default_kvs.kvs[i].key, db->default_kvs.kvs[i].value, value_len); + } + } + } else { + /* version number not changed now return */ + return; + } + } + + set_kv(db, VER_NUM_KV_NAME, &setting_ver_num, sizeof(size_t)); +} +#endif /* FDB_KV_AUTO_UPDATE */ + +static bool check_oldest_addr_cb(kv_sec_info_t sector, void *arg1, void *arg2) +{ + uint32_t *sector_oldest_addr = (uint32_t *) arg1; + fdb_sector_store_status_t *last_sector_status = (fdb_sector_store_status_t *)arg2; + + /* The oldest address is 0 by default. + * The new oldest sector is found when sector status change from empty to full or using. + */ + if (*last_sector_status == FDB_SECTOR_STORE_EMPTY + && (sector->status.store == FDB_SECTOR_STORE_FULL || sector->status.store == FDB_SECTOR_STORE_USING)) { + *sector_oldest_addr = sector->addr; + } + + *last_sector_status = sector->status.store; + return false; +} + +static bool check_sec_hdr_cb(kv_sec_info_t sector, void *arg1, void *arg2) +{ + if (!sector->check_ok) { + size_t *failed_count = arg1; + fdb_kvdb_t db = arg2; + + (*failed_count) ++; + if (db->parent.not_formatable) { + return true; + } else { + FDB_DEBUG("Sector header info is incorrect. Auto format this sector (0x%08" PRIX32 ").\n", sector->addr); + format_sector(db, sector->addr, SECTOR_NOT_COMBINED); + } + } + + return false; +} + +static bool check_and_recovery_gc_cb(kv_sec_info_t sector, void *arg1, void *arg2) +{ + fdb_kvdb_t db = arg1; + + if (sector->check_ok && sector->status.dirty == FDB_SECTOR_DIRTY_GC) { + /* make sure the GC request flag to true */ + db->gc_request = true; + /* resume the GC operate */ + gc_collect(db); + } + + return false; +} + +static bool check_and_recovery_kv_cb(fdb_kv_t kv, void *arg1, void *arg2) +{ + fdb_kvdb_t db = arg1; + + /* recovery the prepare deleted KV */ + if (kv->crc_is_ok && kv->status == FDB_KV_PRE_DELETE) { + FDB_INFO("Found an KV (%.*s) which has changed value failed. Now will recovery it.\n", kv->name_len, kv->name); + /* recovery the old KV */ + if (move_kv(db, kv) == FDB_NO_ERR) { + FDB_DEBUG("Recovery the KV successful.\n"); + } else { + FDB_DEBUG("Warning: Moved an KV (size %" PRIu32 ") failed when recovery. Now will GC then retry.\n", kv->len); + return true; + } + } else if (kv->status == FDB_KV_PRE_WRITE) { + uint8_t status_table[KV_STATUS_TABLE_SIZE]; + /* the KV has not write finish, change the status to error */ + //TODO Draw the state replacement diagram of exception handling + _fdb_write_status((fdb_db_t)db, kv->addr.start, status_table, FDB_KV_STATUS_NUM, FDB_KV_ERR_HDR, true); + return true; + } else if (kv->crc_is_ok && kv->status == FDB_KV_WRITE) { +#ifdef FDB_KV_USING_CACHE + /* update the cache when first load. If caching is disabled, this step is not performed */ + update_kv_cache(db, kv->name, kv->name_len, kv->addr.start); +#endif + } + + return false; +} + +/** + * Check and load the flash KV. + * + * @return result + */ +static fdb_err_t _fdb_kv_load(fdb_kvdb_t db) +{ + fdb_err_t result = FDB_NO_ERR; + struct fdb_kv kv; + struct kvdb_sec_info sector; + size_t check_failed_count = 0; + + db->in_recovery_check = true; + /* check all sector header */ + sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &check_failed_count, db, check_sec_hdr_cb, false); + if (db->parent.not_formatable && check_failed_count > 0) { + return FDB_READ_ERR; + } + /* all sector header check failed */ + if (check_failed_count == SECTOR_NUM) { + FDB_INFO("All sector header is incorrect. Set it to default.\n"); + fdb_kv_set_default(db); + } + + /* check all sector header for recovery GC */ + sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, db, NULL, check_and_recovery_gc_cb, false); + +__retry: + /* check all KV for recovery */ + kv_iterator(db, &kv, db, NULL, check_and_recovery_kv_cb); + if (db->gc_request) { + gc_collect(db); + goto __retry; + } + + db->in_recovery_check = false; + + return result; +} + +/** + * This function will get or set some options of the database + * + * @param db database object + * @param cmd the control command + * @param arg the argument + */ +void fdb_kvdb_control(fdb_kvdb_t db, int cmd, void *arg) +{ + FDB_ASSERT(db); + + switch (cmd) { + case FDB_KVDB_CTRL_SET_SEC_SIZE: + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.sec_size = *(uint32_t *) arg; + break; + case FDB_KVDB_CTRL_GET_SEC_SIZE: + *(uint32_t *) arg = db->parent.sec_size; + break; + case FDB_KVDB_CTRL_SET_LOCK: +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif + db->parent.lock = (void (*)(fdb_db_t db)) arg; +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + break; + case FDB_KVDB_CTRL_SET_UNLOCK: +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif + db->parent.unlock = (void (*)(fdb_db_t db)) arg; +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + break; + case FDB_KVDB_CTRL_SET_FILE_MODE: +#ifdef FDB_USING_FILE_MODE + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.file_mode = *(bool *) arg; +#else + FDB_INFO("Error: set file mode Failed. Please defined the FDB_USING_FILE_MODE macro."); +#endif + break; + case FDB_KVDB_CTRL_SET_MAX_SIZE: +#ifdef FDB_USING_FILE_MODE + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.max_size = *(uint32_t *)arg; +#endif + break; + case FDB_KVDB_CTRL_SET_NOT_FORMAT: + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.not_formatable = *(bool *)arg; + break; + } +} + +/** + * The KV database initialization. + * + * @param db database object + * @param name database name + * @param path FAL mode: partition name, file mode: database saved directory path + * @param default_kv the default KV set @see fdb_default_kv + * @param user_data user data + * + * @return result + */ +fdb_err_t fdb_kvdb_init(fdb_kvdb_t db, const char *name, const char *path, struct fdb_default_kv *default_kv, + void *user_data) +{ + fdb_err_t result = FDB_NO_ERR; + struct kvdb_sec_info sector; + +#ifdef FDB_KV_USING_CACHE + size_t i; +#endif + + /* must be aligned with write granularity */ + FDB_ASSERT((FDB_STR_KV_VALUE_MAX_SIZE * 8) % FDB_WRITE_GRAN == 0); + + result = _fdb_init_ex((fdb_db_t) db, name, path, FDB_DB_TYPE_KV, user_data); + if (result != FDB_NO_ERR) { + goto __exit; + } + + /* lock the KVDB */ + db_lock(db); + + db->gc_request = false; + db->in_recovery_check = false; + if (default_kv) { + db->default_kvs = *default_kv; + } else { + db->default_kvs.num = 0; + db->default_kvs.kvs = NULL; + } + + { /* find the oldest sector address */ + uint32_t sector_oldest_addr = 0; + fdb_sector_store_status_t last_sector_status = FDB_SECTOR_STORE_UNUSED; + + db_oldest_addr(db) = 0; + sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, §or_oldest_addr, &last_sector_status, + check_oldest_addr_cb, false); + db_oldest_addr(db) = sector_oldest_addr; + FDB_DEBUG("The oldest addr is @0x%08" PRIX32 "\n", db_oldest_addr(db)); + } + /* there is at least one empty sector for GC. */ + FDB_ASSERT((FDB_GC_EMPTY_SEC_THRESHOLD > 0 && FDB_GC_EMPTY_SEC_THRESHOLD < SECTOR_NUM)) + +#ifdef FDB_KV_USING_CACHE + for (i = 0; i < FDB_SECTOR_CACHE_TABLE_SIZE; i++) { + db->sector_cache_table[i].check_ok = false; + db->sector_cache_table[i].empty_kv = FAILED_ADDR; + db->sector_cache_table[i].addr = FDB_DATA_UNUSED; + } + for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) { + db->kv_cache_table[i].addr = FDB_DATA_UNUSED; + } +#endif /* FDB_KV_USING_CACHE */ + + FDB_DEBUG("KVDB size is %" PRIu32 " bytes.\n", db_max_size(db)); + db_unlock(db); + + result = _fdb_kv_load(db); + + db_lock(db); +#ifdef FDB_KV_AUTO_UPDATE + if (result == FDB_NO_ERR) { + kv_auto_update(db); + } +#endif + + /* unlock the KVDB */ + db_unlock(db); + +__exit: + + _fdb_init_finish((fdb_db_t)db, result); + + return result; +} + +/** + * The KV database initialization. + * + * @param db database object + * + * @return result + */ +fdb_err_t fdb_kvdb_deinit(fdb_kvdb_t db) +{ + _fdb_deinit((fdb_db_t) db); + + return FDB_NO_ERR; +} + +/** + * The KV database initialization. + * + * @param db database object + * @param itr iterator structure to be initialized + * + * @return pointer to the iterator initialized. + */ +fdb_kv_iterator_t fdb_kv_iterator_init(fdb_kvdb_t db, fdb_kv_iterator_t itr) +{ + itr->curr_kv.addr.start = 0; + + /* If iterator statistics is needed */ + itr->iterated_cnt = 0; + itr->iterated_obj_bytes = 0; + itr->iterated_value_bytes = 0; + itr->traversed_len = 0; + /* Start from sector head */ + itr->sector_addr = db_oldest_addr(db); + return itr; +} + +/** + * The KV database iterator. + * + * @param db database object + * @param itr the iterator structure + * + * @return false if iteration is ended, true if iteration is not ended. + */ +bool fdb_kv_iterate(fdb_kvdb_t db, fdb_kv_iterator_t itr) +{ + struct kvdb_sec_info sector; + fdb_kv_t kv = &(itr->curr_kv); + + do { + if (read_sector_info(db, itr->sector_addr, §or, false) == FDB_NO_ERR) { + if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) { + if (kv->addr.start == 0) { + kv->addr.start = sector.addr + SECTOR_HDR_DATA_SIZE; + } else if ((kv->addr.start = get_next_kv_addr(db, §or, kv)) == FAILED_ADDR) { + kv->addr.start = 0; + itr->traversed_len += db_sec_size(db); + continue; + } + do { + read_kv(db, kv); + if (kv->status == FDB_KV_WRITE && kv->crc_is_ok == true) { + /* We got a valid kv here. */ + /* If iterator statistics is needed */ + itr->iterated_cnt++; + itr->iterated_obj_bytes += kv->len; + itr->iterated_value_bytes += kv->value_len; + return true; + } + } while ((kv->addr.start = get_next_kv_addr(db, §or, kv)) != FAILED_ADDR); + } + } + /** Set kv->addr.start to 0 when we get into a new sector so that if we successfully get the next sector info, + * the kv->addr.start is set to the new sector.addr + SECTOR_HDR_DATA_SIZE. + */ + kv->addr.start = 0; + itr->traversed_len += db_sec_size(db); + } while ((itr->sector_addr = get_next_sector_addr(db, §or, itr->traversed_len)) != FAILED_ADDR); + /* Finally we have iterated all the KVs. */ + return false; +} + +/** + * The database inergrity check + * + * @param db database object + * + * @return result, FDB_NO_ERR: check OK + */ +fdb_err_t fdb_kvdb_check(fdb_kvdb_t db) +{ + fdb_err_t result = FDB_NO_ERR; + uint32_t sec_addr, traversed_len = 0; + struct kvdb_sec_info sector; + struct fdb_kv kv; + + if (!db_init_ok(db)) { + FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db)); + return FDB_INIT_FAILED; + } + + /* lock the KV cache */ + db_lock(db); + + sec_addr = db_oldest_addr(db); + /* search all sectors */ + do { + traversed_len += db_sec_size(db); + result = read_sector_info(db, sec_addr, §or, false); + if (result == FDB_NO_ERR) + { + /* sector has KV */ + if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) { + kv.addr.start = sector.addr + SECTOR_HDR_DATA_SIZE; + /* search all KV */ + do { + result = read_kv(db, &kv); + } while ((kv.addr.start = get_next_kv_addr(db, §or, &kv)) != FAILED_ADDR && result == FDB_NO_ERR); + } + } + } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR && result == FDB_NO_ERR); + + /* unlock the KV cache */ + db_unlock(db); + + return result; +} + +#endif /* defined(FDB_USING_KVDB) */ diff --git a/User/system/lib/flashdb/fdb_low_lvl.h b/User/system/lib/flashdb/fdb_low_lvl.h new file mode 100644 index 0000000..c252dca --- /dev/null +++ b/User/system/lib/flashdb/fdb_low_lvl.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief low level API and definition + */ + +#ifndef _FDB_LOW_LVL_H_ +#define _FDB_LOW_LVL_H_ + +#include +#include + +#if (FDB_WRITE_GRAN == 1) +#define FDB_STATUS_TABLE_SIZE(status_number) ((status_number * FDB_WRITE_GRAN + 7)/8) +#else +#define FDB_STATUS_TABLE_SIZE(status_number) (((status_number - 1) * FDB_WRITE_GRAN + 7)/8) +#endif + +/* the data is erased */ +#define FDB_BYTE_ERASED 0xFF +/* the data is written */ +#define FDB_BYTE_WRITTEN 0x00 + +/* Return the most contiguous size aligned at specified width. RT_ALIGN(13, 4) + * would return 16. + */ +#define FDB_ALIGN(size, align) (((size) + (align) - 1) - (((size) + (align) -1) % (align))) +/* align by write granularity */ +#define FDB_WG_ALIGN(size) (FDB_ALIGN(size, ((FDB_WRITE_GRAN + 7)/8))) +/** + * Return the down number of aligned at specified width. RT_ALIGN_DOWN(13, 4) + * would return 12. + */ +#define FDB_ALIGN_DOWN(size, align) (((size) / (align)) * (align)) +/* align down by write granularity */ +#define FDB_WG_ALIGN_DOWN(size) (FDB_ALIGN_DOWN(size, (FDB_WRITE_GRAN + 7)/8)) + +#define FDB_STORE_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_SECTOR_STORE_STATUS_NUM) +#define FDB_DIRTY_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_SECTOR_DIRTY_STATUS_NUM) + +/* the data is unused */ +#if (FDB_BYTE_ERASED == 0xFF) +#define FDB_DATA_UNUSED 0xFFFFFFFF +#else +#define FDB_DATA_UNUSED 0x00000000 +#endif + +/* invalid address */ +#define FDB_FAILED_ADDR 0xFFFFFFFF + +size_t _fdb_set_status(uint8_t status_table[], size_t status_num, size_t status_index); +size_t _fdb_get_status(uint8_t status_table[], size_t status_num); +uint32_t _fdb_continue_ff_addr(fdb_db_t db, uint32_t start, uint32_t end); +fdb_err_t _fdb_init_ex(fdb_db_t db, const char *name, const char *part_name, fdb_db_type type, void *user_data); +void _fdb_init_finish(fdb_db_t db, fdb_err_t result); +void _fdb_deinit(fdb_db_t db); +const char *_fdb_db_path(fdb_db_t db); +fdb_err_t _fdb_write_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t status_num, size_t status_index, bool sync); +size_t _fdb_read_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t total_num); +fdb_err_t _fdb_flash_read(fdb_db_t db, uint32_t addr, void *buf, size_t size); +fdb_err_t _fdb_flash_erase(fdb_db_t db, uint32_t addr, size_t size); +fdb_err_t _fdb_flash_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync); + +#endif /* _FDB_LOW_LVL_H_ */ diff --git a/User/system/lib/flashdb/fdb_tsdb.c b/User/system/lib/flashdb/fdb_tsdb.c new file mode 100644 index 0000000..2d66c92 --- /dev/null +++ b/User/system/lib/flashdb/fdb_tsdb.c @@ -0,0 +1,1024 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief TSDB feature. + * + * Time series log (like TSDB) feature implement source file. + * + * TSL is time series log, the TSDB saved many TSLs. + */ + +#include +#include +#include +#include + +#define FDB_LOG_TAG "[tsl]" +/* rewrite log prefix */ +#undef FDB_LOG_PREFIX2 +#define FDB_LOG_PREFIX2() FDB_PRINT("[%s][%s] ", db_name(db), _fdb_db_path((fdb_db_t)db)) + +#if defined(FDB_USING_TSDB) + +#if (FDB_WRITE_GRAN == 64) || (FDB_WRITE_GRAN == 128) +#error "Flash 64 or 128 bits write granularity is not supported in TSDB yet!" +#endif + +/* magic word(`T`, `S`, `L`, `0`) */ +#define SECTOR_MAGIC_WORD 0x304C5354 + +#define TSL_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_TSL_STATUS_NUM) + +#define SECTOR_HDR_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct sector_hdr_data))) +#define LOG_IDX_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct log_idx_data))) +#define LOG_IDX_TS_OFFSET ((unsigned long)(&((struct log_idx_data *)0)->time)) +#define SECTOR_MAGIC_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->magic)) +#define SECTOR_START_TIME_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->start_time)) +#define SECTOR_END0_TIME_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[0].time)) +#define SECTOR_END0_IDX_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[0].index)) +#define SECTOR_END0_STATUS_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[0].status)) +#define SECTOR_END1_TIME_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[1].time)) +#define SECTOR_END1_IDX_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[1].index)) +#define SECTOR_END1_STATUS_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[1].status)) + +/* the next address is get failed */ +#define FAILED_ADDR 0xFFFFFFFF + +#define db_name(db) (((fdb_db_t)db)->name) +#define db_init_ok(db) (((fdb_db_t)db)->init_ok) +#define db_sec_size(db) (((fdb_db_t)db)->sec_size) +#define db_max_size(db) (((fdb_db_t)db)->max_size) +#define db_oldest_addr(db) (((fdb_db_t)db)->oldest_addr) + +#define db_lock(db) \ + do { \ + if (((fdb_db_t)db)->lock) ((fdb_db_t)db)->lock((fdb_db_t)db); \ + } while(0); + +#define db_unlock(db) \ + do { \ + if (((fdb_db_t)db)->unlock) ((fdb_db_t)db)->unlock((fdb_db_t)db); \ + } while(0); + +#define _FDB_WRITE_STATUS(db, addr, status_table, status_num, status_index, sync) \ + do { \ + result = _fdb_write_status((fdb_db_t)db, addr, status_table, status_num, status_index, sync);\ + if (result != FDB_NO_ERR) return result; \ + } while(0); + +#define FLASH_WRITE(db, addr, buf, size, sync) \ + do { \ + result = _fdb_flash_write((fdb_db_t)db, addr, buf, size, sync); \ + if (result != FDB_NO_ERR) return result; \ + } while(0); + +struct sector_hdr_data { + uint8_t status[FDB_STORE_STATUS_TABLE_SIZE]; /**< sector store status @see fdb_sector_store_status_t */ + uint32_t magic; /**< magic word(`T`, `S`, `L`, `0`) */ + fdb_time_t start_time; /**< the first start node's timestamp */ + struct { + fdb_time_t time; /**< the last end node's timestamp */ + uint32_t index; /**< the last end node's index */ + uint8_t status[TSL_STATUS_TABLE_SIZE]; /**< end node status, @see fdb_tsl_status_t */ + } end_info[2]; + uint32_t reserved; +}; +typedef struct sector_hdr_data *sector_hdr_data_t; + +/* time series log node index data */ +struct log_idx_data { + uint8_t status_table[TSL_STATUS_TABLE_SIZE]; /**< node status, @see fdb_tsl_status_t */ + fdb_time_t time; /**< node timestamp */ + uint32_t log_len; /**< node total length (header + name + value), must align by FDB_WRITE_GRAN */ + uint32_t log_addr; /**< node address */ +}; +typedef struct log_idx_data *log_idx_data_t; + +struct query_count_args { + fdb_tsl_status_t status; + size_t count; +}; + +struct check_sec_hdr_cb_args { + fdb_tsdb_t db; + bool check_failed; + size_t empty_num; + uint32_t empty_addr; +}; + +static fdb_err_t read_tsl(fdb_tsdb_t db, fdb_tsl_t tsl) +{ + struct log_idx_data idx; + /* read TSL index raw data */ + _fdb_flash_read((fdb_db_t)db, tsl->addr.index, (uint32_t *) &idx, sizeof(struct log_idx_data)); + tsl->status = (fdb_tsl_status_t) _fdb_get_status(idx.status_table, FDB_TSL_STATUS_NUM); + if ((tsl->status == FDB_TSL_PRE_WRITE) || (tsl->status == FDB_TSL_UNUSED)) { + tsl->log_len = db->max_len; + tsl->addr.log = FDB_DATA_UNUSED; + tsl->time = 0; + } else { + tsl->log_len = idx.log_len; + tsl->addr.log = idx.log_addr; + tsl->time = idx.time; + } + + return FDB_NO_ERR; +} + +static uint32_t get_next_sector_addr(fdb_tsdb_t db, tsdb_sec_info_t pre_sec, uint32_t traversed_len) +{ + if (traversed_len + db_sec_size(db) <= db_max_size(db)) { + if (pre_sec->addr + db_sec_size(db) < db_max_size(db)) { + return pre_sec->addr + db_sec_size(db); + } else { + /* the next sector is on the top of the database */ + return 0; + } + } else { + /* finished */ + return FAILED_ADDR; + } +} + +static uint32_t get_next_tsl_addr(tsdb_sec_info_t sector, fdb_tsl_t pre_tsl) +{ + uint32_t addr = FAILED_ADDR; + + if (sector->status == FDB_SECTOR_STORE_EMPTY) { + return FAILED_ADDR; + } + + if (pre_tsl->addr.index + LOG_IDX_DATA_SIZE <= sector->end_idx) { + addr = pre_tsl->addr.index + LOG_IDX_DATA_SIZE; + } else { + /* no TSL */ + return FAILED_ADDR; + } + + return addr; +} + +static uint32_t get_last_tsl_addr(tsdb_sec_info_t sector, fdb_tsl_t pre_tsl) +{ + uint32_t addr = FAILED_ADDR; + + if (sector->status == FDB_SECTOR_STORE_EMPTY) { + return FAILED_ADDR; + } + + if (pre_tsl->addr.index >= (sector->addr + SECTOR_HDR_DATA_SIZE + LOG_IDX_DATA_SIZE)) { + addr = pre_tsl->addr.index - LOG_IDX_DATA_SIZE; + } else { + return FAILED_ADDR; + } + + return addr; +} + +static uint32_t get_last_sector_addr(fdb_tsdb_t db, tsdb_sec_info_t pre_sec, uint32_t traversed_len) +{ + if (traversed_len + db_sec_size(db) <= db_max_size(db)) { + if (pre_sec->addr >= db_sec_size(db)) { + /* the next sector is previous sector */ + return pre_sec->addr - db_sec_size(db); + } else { + /* the next sector is the last sector */ + return db_max_size(db) - db_sec_size(db); + } + } else { + return FAILED_ADDR; + } +} + +static fdb_err_t read_sector_info(fdb_tsdb_t db, uint32_t addr, tsdb_sec_info_t sector, bool traversal) +{ + fdb_err_t result = FDB_NO_ERR; + struct sector_hdr_data sec_hdr; + + FDB_ASSERT(sector); + + /* read sector header raw data */ + _fdb_flash_read((fdb_db_t)db, addr, (uint32_t *)&sec_hdr, sizeof(struct sector_hdr_data)); + + sector->addr = addr; + sector->magic = sec_hdr.magic; + + /* check magic word */ + if (sector->magic != SECTOR_MAGIC_WORD) { + sector->check_ok = false; + return FDB_INIT_FAILED; + } + sector->check_ok = true; + sector->status = (fdb_sector_store_status_t) _fdb_get_status(sec_hdr.status, FDB_SECTOR_STORE_STATUS_NUM); + sector->start_time = sec_hdr.start_time; + sector->end_info_stat[0] = (fdb_tsl_status_t) _fdb_get_status(sec_hdr.end_info[0].status, FDB_TSL_STATUS_NUM); + sector->end_info_stat[1] = (fdb_tsl_status_t) _fdb_get_status(sec_hdr.end_info[1].status, FDB_TSL_STATUS_NUM); + if (sector->end_info_stat[0] == FDB_TSL_WRITE) { + sector->end_time = sec_hdr.end_info[0].time; + sector->end_idx = sec_hdr.end_info[0].index; + } else if (sector->end_info_stat[1] == FDB_TSL_WRITE) { + sector->end_time = sec_hdr.end_info[1].time; + sector->end_idx = sec_hdr.end_info[1].index; + } else if (sector->end_info_stat[0] == FDB_TSL_PRE_WRITE && sector->end_info_stat[1] == FDB_TSL_PRE_WRITE) { + //TODO There is no valid end node info on this sector, need impl fast query this sector by fdb_tsl_iter_by_time + FDB_ASSERT(0); + } + /* traversal all TSL and calculate the remain space size */ + sector->empty_idx = sector->addr + SECTOR_HDR_DATA_SIZE; + sector->empty_data = sector->addr + db_sec_size(db); + /* the TSL's data is saved from sector bottom, and the TSL's index saved from the sector top */ + sector->remain = sector->empty_data - sector->empty_idx; + if (sector->status == FDB_SECTOR_STORE_USING && traversal) { + struct fdb_tsl tsl; + + tsl.addr.index = sector->empty_idx; + while (read_tsl(db, &tsl) == FDB_NO_ERR) { + if (tsl.status == FDB_TSL_UNUSED) { + break; + } + if (tsl.status != FDB_TSL_PRE_WRITE) { + sector->end_time = tsl.time; + } + sector->end_idx = tsl.addr.index; + sector->empty_idx += LOG_IDX_DATA_SIZE; + sector->empty_data -= FDB_WG_ALIGN(tsl.log_len); + tsl.addr.index += LOG_IDX_DATA_SIZE; + if (sector->remain > LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(tsl.log_len)) { + sector->remain -= (LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(tsl.log_len)); + } else { + FDB_INFO("Error: this TSL (0x%08" PRIX32 ") size (%" PRIu32 ") is out of bound.\n", tsl.addr.index, tsl.log_len); + sector->remain = 0; + result = FDB_READ_ERR; + break; + } + } + } + + return result; +} + +static fdb_err_t format_sector(fdb_tsdb_t db, uint32_t addr) +{ + fdb_err_t result = FDB_NO_ERR; + struct sector_hdr_data sec_hdr; + + FDB_ASSERT(addr % db_sec_size(db) == 0); + + result = _fdb_flash_erase((fdb_db_t)db, addr, db_sec_size(db)); + if (result == FDB_NO_ERR) { + _FDB_WRITE_STATUS(db, addr, sec_hdr.status, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_EMPTY, true); + /* set the magic */ + sec_hdr.magic = SECTOR_MAGIC_WORD; + FLASH_WRITE(db, addr + SECTOR_MAGIC_OFFSET, &sec_hdr.magic, sizeof(sec_hdr.magic), true); + } + + return result; +} + +static void sector_iterator(fdb_tsdb_t db, tsdb_sec_info_t sector, fdb_sector_store_status_t status, void *arg1, + void *arg2, bool (*callback)(tsdb_sec_info_t sector, void *arg1, void *arg2), bool traversal) +{ + uint32_t sec_addr = sector->addr, traversed_len = 0; + + /* search all sectors */ + do { + read_sector_info(db, sec_addr, sector, false); + if (status == FDB_SECTOR_STORE_UNUSED || status == sector->status) { + if (traversal) { + read_sector_info(db, sec_addr, sector, true); + } + /* iterator is interrupted when callback return true */ + if (callback && callback(sector, arg1, arg2)) { + return; + } + } + traversed_len += db_sec_size(db); + } while ((sec_addr = get_next_sector_addr(db, sector, traversed_len)) != FAILED_ADDR); +} + +static fdb_err_t write_tsl(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t time) +{ + fdb_err_t result = FDB_NO_ERR; + struct log_idx_data idx; + uint32_t idx_addr = db->cur_sec.empty_idx; + + idx.log_len = blob->size; + idx.time = time; + idx.log_addr = db->cur_sec.empty_data - FDB_WG_ALIGN(idx.log_len); + /* write the status will by write granularity */ + _FDB_WRITE_STATUS(db, idx_addr, idx.status_table, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false); + /* write other index info */ + FLASH_WRITE(db, idx_addr + LOG_IDX_TS_OFFSET, &idx.time, sizeof(struct log_idx_data) - LOG_IDX_TS_OFFSET, false); + /* write blob data */ + FLASH_WRITE(db, idx.log_addr, blob->buf, blob->size, false); + /* write the status will by write granularity */ + _FDB_WRITE_STATUS(db, idx_addr, idx.status_table, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true); + + return result; +} + +static fdb_err_t update_sec_status(fdb_tsdb_t db, tsdb_sec_info_t sector, fdb_blob_t blob, fdb_time_t cur_time) +{ + fdb_err_t result = FDB_NO_ERR; + uint8_t status[FDB_STORE_STATUS_TABLE_SIZE]; + + if (sector->status == FDB_SECTOR_STORE_USING && sector->remain < LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(blob->size)) { + uint8_t end_status[TSL_STATUS_TABLE_SIZE]; + uint32_t end_index = sector->empty_idx - LOG_IDX_DATA_SIZE, new_sec_addr, cur_sec_addr = sector->addr; + /* save the end node index and timestamp */ + if (sector->end_info_stat[0] == FDB_TSL_UNUSED) { + _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END0_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false); + FLASH_WRITE(db, cur_sec_addr + SECTOR_END0_TIME_OFFSET, (uint32_t * )&db->last_time, sizeof(fdb_time_t), false); + FLASH_WRITE(db, cur_sec_addr + SECTOR_END0_IDX_OFFSET, &end_index, sizeof(end_index), false); + _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END0_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true); + } else if (sector->end_info_stat[1] == FDB_TSL_UNUSED) { + _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END1_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false); + FLASH_WRITE(db, cur_sec_addr + SECTOR_END1_TIME_OFFSET, (uint32_t * )&db->last_time, sizeof(fdb_time_t), false); + FLASH_WRITE(db, cur_sec_addr + SECTOR_END1_IDX_OFFSET, &end_index, sizeof(end_index), false); + _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END1_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true); + } + /* change current sector to full */ + _FDB_WRITE_STATUS(db, cur_sec_addr, status, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_FULL, true); + sector->status = FDB_SECTOR_STORE_FULL; + /* calculate next sector address */ + if (sector->addr + db_sec_size(db) < db_max_size(db)) { + new_sec_addr = sector->addr + db_sec_size(db); + } + else if (db->rollover) { + new_sec_addr = 0; + } else { + /* not rollover */ + return FDB_SAVED_FULL; + } + read_sector_info(db, new_sec_addr, &db->cur_sec, false); + if (sector->status != FDB_SECTOR_STORE_EMPTY) { + /* calculate the oldest sector address */ + if (new_sec_addr + db_sec_size(db) < db_max_size(db)) { + db_oldest_addr(db) = new_sec_addr + db_sec_size(db); + } else { + db_oldest_addr(db) = 0; + } + format_sector(db, new_sec_addr); + read_sector_info(db, new_sec_addr, &db->cur_sec, false); + } + } else if (sector->status == FDB_SECTOR_STORE_FULL) { + /* database full */ + return FDB_SAVED_FULL; + } + + if (sector->status == FDB_SECTOR_STORE_EMPTY) { + /* change the sector to using */ + sector->status = FDB_SECTOR_STORE_USING; + sector->start_time = cur_time; + _FDB_WRITE_STATUS(db, sector->addr, status, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_USING, true); + /* save the start timestamp */ + FLASH_WRITE(db, sector->addr + SECTOR_START_TIME_OFFSET, (uint32_t *)&cur_time, sizeof(fdb_time_t), true); + } + + return result; +} + +static fdb_err_t tsl_append(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t *timestamp) +{ + fdb_err_t result = FDB_NO_ERR; + fdb_time_t cur_time = timestamp == NULL ? db->get_time() : *timestamp; + + /* check the append length, MUST less than the db->max_len */ + if(blob->size > db->max_len) + { + FDB_INFO("Warning: append length (%" PRIdMAX ") is more than the db->max_len (%" PRIdMAX "). This tsl will be dropped.\n", + (intmax_t)blob->size, (intmax_t)(db->max_len)); + return FDB_WRITE_ERR; + } + + /* check the current timestamp, MUST more than the last save timestamp */ + if (cur_time <= db->last_time) { + FDB_INFO("Warning: current timestamp (%" PRIdMAX ") is less than or equal to the last save timestamp (%" PRIdMAX "). This tsl will be dropped.\n", + (intmax_t )cur_time, (intmax_t )(db->last_time)); + return FDB_WRITE_ERR; + } + + result = update_sec_status(db, &db->cur_sec, blob, cur_time); + if (result != FDB_NO_ERR) { + FDB_INFO("Error: update the sector status failed (%d)", result); + return result; + } + /* write the TSL node */ + result = write_tsl(db, blob, cur_time); + if (result != FDB_NO_ERR) { + FDB_INFO("Error: write tsl failed (%d)", result); + return result; + } + + /* recalculate the current using sector info */ + db->cur_sec.end_idx = db->cur_sec.empty_idx; + db->cur_sec.end_time = cur_time; + db->cur_sec.empty_idx += LOG_IDX_DATA_SIZE; + db->cur_sec.empty_data -= FDB_WG_ALIGN(blob->size); + db->cur_sec.remain -= LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(blob->size); + db->last_time = cur_time; + + return result; +} + +/** + * Append a new log to TSDB. + * + * @param db database object + * @param blob log blob data + * + * @return result + */ +fdb_err_t fdb_tsl_append(fdb_tsdb_t db, fdb_blob_t blob) +{ + fdb_err_t result = FDB_NO_ERR; + + if (!db_init_ok(db)) { + FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); + return FDB_INIT_FAILED; + } + + db_lock(db); + result = tsl_append(db, blob, NULL); + db_unlock(db); + + return result; +} + +/** + * Append a new log to TSDB with specific timestamp. + * + * @param db database object + * @param blob log blob data + * + * @return result + */ +fdb_err_t fdb_tsl_append_with_ts(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t timestamp) +{ + fdb_err_t result = FDB_NO_ERR; + + if (!db_init_ok(db)) { + FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); + return FDB_INIT_FAILED; + } + + db_lock(db); + result = tsl_append(db, blob, ×tamp); + db_unlock(db); + + return result; +} + +/** + * The TSDB iterator for each TSL. + * + * @param db database object + * @param cb callback + * @param arg callback argument + */ +void fdb_tsl_iter(fdb_tsdb_t db, fdb_tsl_cb cb, void *arg) +{ + struct tsdb_sec_info sector; + uint32_t sec_addr, traversed_len = 0; + struct fdb_tsl tsl; + + if (!db_init_ok(db)) { + FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); + } + + if (cb == NULL) { + return; + } + + sec_addr = db_oldest_addr(db); + db_lock(db); + /* search all sectors */ + do { + traversed_len += db_sec_size(db); + if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) { + continue; + } + /* sector has TSL */ + if (sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL) { + if (sector.status == FDB_SECTOR_STORE_USING) { + /* copy the current using sector status */ + sector = db->cur_sec; + } + tsl.addr.index = sector.addr + SECTOR_HDR_DATA_SIZE; + /* search all TSL */ + do { + read_tsl(db, &tsl); + /* iterator is interrupted when callback return true */ + if (cb(&tsl, arg)) { + db_unlock(db); + return; + } + } while ((tsl.addr.index = get_next_tsl_addr(§or, &tsl)) != FAILED_ADDR); + } + } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR); + db_unlock(db); +} + +/** + * The TSDB iterator for each TSL. + * + * @param db database object + * @param cb callback + * @param arg callback argument + */ +void fdb_tsl_iter_reverse(fdb_tsdb_t db, fdb_tsl_cb cb, void *cb_arg) +{ + struct tsdb_sec_info sector; + uint32_t sec_addr, traversed_len = 0; + struct fdb_tsl tsl; + + if (!db_init_ok(db)) { + FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); + } + + if (cb == NULL) { + return; + } + + sec_addr = db->cur_sec.addr; + db_lock(db); + /* search all sectors */ + do { + traversed_len += db_sec_size(db); + if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) { + continue; + } + /* sector has TSL */ + if (sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL) { + if (sector.status == FDB_SECTOR_STORE_USING) { + /* copy the current using sector status */ + sector = db->cur_sec; + } + tsl.addr.index = sector.end_idx; + /* search all TSL */ + do { + read_tsl(db, &tsl); + /* iterator is interrupted when callback return true */ + if (cb(&tsl, cb_arg)) { + goto __exit; + } + } while ((tsl.addr.index = get_last_tsl_addr(§or, &tsl)) != FAILED_ADDR); + } else if (sector.status == FDB_SECTOR_STORE_EMPTY || sector.status == FDB_SECTOR_STORE_UNUSED) + goto __exit; + } while ((sec_addr = get_last_sector_addr(db, §or, traversed_len)) != FAILED_ADDR); + +__exit: + db_unlock(db); +} + +/* + * Found the matched TSL address. + */ +static int search_start_tsl_addr(fdb_tsdb_t db, int start, int end, fdb_time_t from, fdb_time_t to) +{ + struct fdb_tsl tsl; + while (true) { + tsl.addr.index = start + FDB_ALIGN((end - start) / 2, LOG_IDX_DATA_SIZE); + read_tsl(db, &tsl); + if (tsl.time < from) { + start = tsl.addr.index + LOG_IDX_DATA_SIZE; + } else if (tsl.time > from) { + end = tsl.addr.index - LOG_IDX_DATA_SIZE; + } else { + return tsl.addr.index; + } + + if (start > end) { + if (from > to) { + tsl.addr.index = start; + read_tsl(db, &tsl); + if (tsl.time > from) { + start -= LOG_IDX_DATA_SIZE; + } + } + break; + } + } + return start; +} + +/** + * The TSDB iterator for each TSL by timestamp. + * + * @param db database object + * @param from starting timestamp. It will be a reverse iterator when ending timestamp less than starting timestamp + * @param to ending timestamp + * @param cb callback + * @param arg callback argument + */ +void fdb_tsl_iter_by_time(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_cb cb, void *cb_arg) +{ + struct tsdb_sec_info sector; + uint32_t sec_addr, start_addr, traversed_len = 0; + struct fdb_tsl tsl; + bool found_start_tsl = false; + + uint32_t (*get_sector_addr)(fdb_tsdb_t , tsdb_sec_info_t , uint32_t); + uint32_t (*get_tsl_addr)(tsdb_sec_info_t , fdb_tsl_t); + + if (!db_init_ok(db)) { + FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); + } + + if(from <= to) { + start_addr = db_oldest_addr(db); + get_sector_addr = get_next_sector_addr; + get_tsl_addr = get_next_tsl_addr; + } else { + start_addr = db->cur_sec.addr; + get_sector_addr = get_last_sector_addr; + get_tsl_addr = get_last_tsl_addr; + } + +// FDB_INFO("from %s", ctime((const time_t * )&from)); +// FDB_INFO("to %s", ctime((const time_t * )&to)); + + if (cb == NULL) { + return; + } + + sec_addr = start_addr; + db_lock(db); + /* search all sectors */ + do { + traversed_len += db_sec_size(db); + if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) { + continue; + } + /* sector has TSL */ + if ((sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL)) { + if (sector.status == FDB_SECTOR_STORE_USING) { + /* copy the current using sector status */ + sector = db->cur_sec; + } + if ((found_start_tsl) + || (!found_start_tsl && + ((from <= to && ((sec_addr == start_addr && from <= sector.start_time) || from <= sector.end_time)) || + (from > to && ((sec_addr == start_addr && from >= sector.end_time) || from >= sector.start_time))) + )) { + uint32_t start = sector.addr + SECTOR_HDR_DATA_SIZE, end = sector.end_idx; + + found_start_tsl = true; + /* search the first start TSL address */ + tsl.addr.index = search_start_tsl_addr(db, start, end, from, to); + /* search all TSL */ + do { + read_tsl(db, &tsl); + if (tsl.status != FDB_TSL_UNUSED) { + if ((from <= to && tsl.time >= from && tsl.time <= to) + || (from > to && tsl.time <= from && tsl.time >= to)) { + /* iterator is interrupted when callback return true */ + if (cb(&tsl, cb_arg)) { + goto __exit; + } + } else { + goto __exit; + } + } + } while ((tsl.addr.index = get_tsl_addr(§or, &tsl)) != FAILED_ADDR); + } + } else if (sector.status == FDB_SECTOR_STORE_EMPTY) { + goto __exit; + } + } while ((sec_addr = get_sector_addr(db, §or, traversed_len)) != FAILED_ADDR); + +__exit: + db_unlock(db); +} + +static bool query_count_cb(fdb_tsl_t tsl, void *arg) +{ + struct query_count_args *args = arg; + + if (tsl->status == args->status) { + args->count++; + } + + return false; +} + +/** + * Query some TSL's count by timestamp and status. + * + * @param db database object + * @param from starting timestamp + * @param to ending timestamp + * @param status status + */ +size_t fdb_tsl_query_count(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_status_t status) +{ + struct query_count_args arg = { FDB_TSL_UNUSED, 0 }; + + arg.status = status; + + if (!db_init_ok(db)) { + FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); + return 0; + } + + fdb_tsl_iter_by_time(db, from, to, query_count_cb, &arg); + + return arg.count; + +} + +/** + * Set the TSL status. + * + * @param db database object + * @param tsl TSL object + * @param status status + * + * @return result + */ +fdb_err_t fdb_tsl_set_status(fdb_tsdb_t db, fdb_tsl_t tsl, fdb_tsl_status_t status) +{ + fdb_err_t result = FDB_NO_ERR; + uint8_t status_table[TSL_STATUS_TABLE_SIZE]; + + /* write the status will by write granularity */ + _FDB_WRITE_STATUS(db, tsl->addr.index, status_table, FDB_TSL_STATUS_NUM, status, true); + + return result; +} + +/** + * Convert the TSL object to blob object + * + * @param tsl TSL object + * @param blob blob object + * + * @return new blob object + */ +fdb_blob_t fdb_tsl_to_blob(fdb_tsl_t tsl, fdb_blob_t blob) +{ + blob->saved.addr = tsl->addr.log; + blob->saved.meta_addr = tsl->addr.index; + blob->saved.len = tsl->log_len; + + return blob; +} + +static bool check_sec_hdr_cb(tsdb_sec_info_t sector, void *arg1, void *arg2) +{ + struct check_sec_hdr_cb_args *arg = arg1; + fdb_tsdb_t db = arg->db; + + if (!sector->check_ok) { + FDB_INFO("Sector (0x%08" PRIX32 ") header info is incorrect.\n", sector->addr); + (arg->check_failed) = true; + return true; + } else if (sector->status == FDB_SECTOR_STORE_USING) { + if (db->cur_sec.addr == FDB_DATA_UNUSED) { + memcpy(&db->cur_sec, sector, sizeof(struct tsdb_sec_info)); + } else { + FDB_INFO("Warning: Sector status is wrong, there are multiple sectors in use.\n"); + (arg->check_failed) = true; + return true; + } + } else if (sector->status == FDB_SECTOR_STORE_EMPTY) { + (arg->empty_num) += 1; + arg->empty_addr = sector->addr; + if ((arg->empty_num) == 1 && db->cur_sec.addr == FDB_DATA_UNUSED) { + memcpy(&db->cur_sec, sector, sizeof(struct tsdb_sec_info)); + } + } + + return false; +} +static bool format_all_cb(tsdb_sec_info_t sector, void *arg1, void *arg2) +{ + fdb_tsdb_t db = arg1; + + format_sector(db, sector->addr); + + return false; +} + +static void tsl_format_all(fdb_tsdb_t db) +{ + struct tsdb_sec_info sector; + + sector.addr = 0; + sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, db, NULL, format_all_cb, false); + db_oldest_addr(db) = 0; + db->cur_sec.addr = 0; + db->last_time = 0; + /* read the current using sector info */ + read_sector_info(db, db->cur_sec.addr, &db->cur_sec, false); + + FDB_INFO("All sector format finished.\n"); +} + +/** + * Clean all the data in the TSDB. + * + * @note It's DANGEROUS. This operation is not reversible. + * + * @param db database object + */ +void fdb_tsl_clean(fdb_tsdb_t db) +{ + db_lock(db); + tsl_format_all(db); + db_unlock(db); +} + +/** + * This function will get or set some options of the database + * + * @param db database object + * @param cmd the control command + * @param arg the argument + */ +void fdb_tsdb_control(fdb_tsdb_t db, int cmd, void *arg) +{ + FDB_ASSERT(db); + + switch (cmd) { + case FDB_TSDB_CTRL_SET_SEC_SIZE: + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.sec_size = *(uint32_t *)arg; + break; + case FDB_TSDB_CTRL_GET_SEC_SIZE: + *(uint32_t *)arg = db->parent.sec_size; + break; + case FDB_TSDB_CTRL_SET_LOCK: +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif + db->parent.lock = (void (*)(fdb_db_t db))arg; +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + break; + case FDB_TSDB_CTRL_SET_UNLOCK: +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif + db->parent.unlock = (void (*)(fdb_db_t db))arg; +#if !defined(__ARMCC_VERSION) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + break; + case FDB_TSDB_CTRL_SET_ROLLOVER: + /* this change MUST after database initialized */ + FDB_ASSERT(db->parent.init_ok == true); + db->rollover = *(bool *)arg; + break; + case FDB_TSDB_CTRL_GET_ROLLOVER: + *(bool *)arg = db->rollover; + break; + case FDB_TSDB_CTRL_GET_LAST_TIME: + *(fdb_time_t *)arg = db->last_time; + break; + case FDB_TSDB_CTRL_SET_FILE_MODE: +#ifdef FDB_USING_FILE_MODE + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.file_mode = *(bool *)arg; +#else + FDB_INFO("Error: set file mode Failed. Please defined the FDB_USING_FILE_MODE macro."); +#endif + break; + case FDB_TSDB_CTRL_SET_MAX_SIZE: +#ifdef FDB_USING_FILE_MODE + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.max_size = *(uint32_t *)arg; +#endif + break; + case FDB_TSDB_CTRL_SET_NOT_FORMAT: + /* this change MUST before database initialization */ + FDB_ASSERT(db->parent.init_ok == false); + db->parent.not_formatable = *(bool *)arg; + break; + } +} + +/** + * The time series database initialization. + * + * @param db database object + * @param name database name + * @param path FAL mode: partition name, file mode: database saved directory path + * @param get_time get current time function + * @param max_len maximum length of each log + * @param user_data user data + * + * @return result + */ +fdb_err_t fdb_tsdb_init(fdb_tsdb_t db, const char *name, const char *path, fdb_get_time get_time, size_t max_len, void *user_data) +{ + fdb_err_t result = FDB_NO_ERR; + struct tsdb_sec_info sector; + struct check_sec_hdr_cb_args check_sec_arg = { db, false, 0, 0}; + + FDB_ASSERT(get_time); + + result = _fdb_init_ex((fdb_db_t)db, name, path, FDB_DB_TYPE_TS, user_data); + if (result != FDB_NO_ERR) { + goto __exit; + } + + /* lock the TSDB */ + db_lock(db); + + db->get_time = get_time; + db->max_len = max_len; + /* default rollover flag is true */ + db->rollover = true; + db_oldest_addr(db) = FDB_DATA_UNUSED; + db->cur_sec.addr = FDB_DATA_UNUSED; + /* must less than sector size */ + FDB_ASSERT(max_len < db_sec_size(db)); + + /* check all sector header */ + sector.addr = 0; + sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &check_sec_arg, NULL, check_sec_hdr_cb, true); + /* format all sector when check failed */ + if (check_sec_arg.check_failed) { + if (db->parent.not_formatable) { + result = FDB_READ_ERR; + goto __exit; + } else { + tsl_format_all(db); + } + } else { + uint32_t latest_addr; + if (check_sec_arg.empty_num > 0) { + latest_addr = check_sec_arg.empty_addr; + } else { + if (db->rollover) { + latest_addr = db->cur_sec.addr; + } else { + /* There is no empty sector. */ + latest_addr = db->cur_sec.addr = db_max_size(db) - db_sec_size(db); + } + } + /* db->cur_sec is the latest sector, and the next is the oldest sector */ + if (latest_addr + db_sec_size(db) >= db_max_size(db)) { + /* db->cur_sec is the the bottom of the database */ + db_oldest_addr(db) = 0; + } else { + db_oldest_addr(db) = latest_addr + db_sec_size(db); + } + } + FDB_DEBUG("TSDB (%s) oldest sectors is 0x%08" PRIX32 ", current using sector is 0x%08" PRIX32 ".\n", db_name(db), db_oldest_addr(db), + db->cur_sec.addr); + /* read the current using sector info */ + read_sector_info(db, db->cur_sec.addr, &db->cur_sec, true); + /* get last save time */ + if (db->cur_sec.status == FDB_SECTOR_STORE_USING) { + db->last_time = db->cur_sec.end_time; + } else if (db->cur_sec.status == FDB_SECTOR_STORE_EMPTY && db_oldest_addr(db) != db->cur_sec.addr) { + struct tsdb_sec_info sec; + uint32_t addr = db->cur_sec.addr; + + if (addr == 0) { + addr = db_max_size(db) - db_sec_size(db); + } else { + addr -= db_sec_size(db); + } + read_sector_info(db, addr, &sec, false); + db->last_time = sec.end_time; + } + + /* unlock the TSDB */ + db_unlock(db); + +__exit: + + _fdb_init_finish((fdb_db_t)db, result); + + return result; +} + +/** + * The time series database deinitialization. + * + * @param db database object + * + * @return result + */ +fdb_err_t fdb_tsdb_deinit(fdb_tsdb_t db) +{ + _fdb_deinit((fdb_db_t) db); + + return FDB_NO_ERR; +} + +#endif /* defined(FDB_USING_TSDB) */ diff --git a/User/system/lib/flashdb/fdb_utils.c b/User/system/lib/flashdb/fdb_utils.c new file mode 100644 index 0000000..0776f13 --- /dev/null +++ b/User/system/lib/flashdb/fdb_utils.c @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief utils + * + * Some utils for this library. + */ + +#include +#include +#include +#include + +#define FDB_LOG_TAG "[utils]" + +static const uint32_t crc32_table[] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +/** + * Calculate the CRC32 value of a memory buffer. + * + * @param crc accumulated CRC32 value, must be 0 on first call + * @param buf buffer to calculate CRC32 value for + * @param size bytes in buffer + * + * @return calculated CRC32 value + */ +uint32_t fdb_calc_crc32(uint32_t crc, const void *buf, size_t size) +{ + const uint8_t *p; + + p = (const uint8_t *)buf; + crc = crc ^ ~0U; + + while (size--) { + crc = crc32_table[(crc ^ *p++) & 0xFF] ^ (crc >> 8); + } + + return crc ^ ~0U; +} + +size_t _fdb_set_status(uint8_t status_table[], size_t status_num, size_t status_index) +{ + size_t byte_index = SIZE_MAX; + /* + * | write garn | status0 | status1 | status2 | status3 | + * ------------------------------------------------------------------------------------------------------ + * | 1bit | 0xFF | 0x7F | 0x3F | 0x1F + * ------------------------------------------------------------------------------------------------------ + * | 8bit | 0xFF FF FF | 0x00 FF FF | 0x00 00 FF | 0x00 00 00 + * ------------------------------------------------------------------------------------------------------ + * | 32bit | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF 00FFFFFF | 0x00FFFFFF 00FFFFFF + * | | 0xFFFFFFFF | 0xFFFFFFFF | 0xFFFFFFFF | 0x00FFFFFF + * ------------------------------------------------------------------------------------------------------ + * | | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF + * | 64bit | 0xFFFFFFFF FFFFFFFF | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF + * | | 0xFFFFFFFF FFFFFFFF | 0xFFFFFFFF FFFFFFFF | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF + */ + memset(status_table, FDB_BYTE_ERASED, FDB_STATUS_TABLE_SIZE(status_num)); + if (status_index > 0) { +#if (FDB_WRITE_GRAN == 1) + byte_index = (status_index - 1) / 8; +#if (FDB_BYTE_ERASED == 0xFF) + status_table[byte_index] &= (0x00ff >> (status_index % 8)); +#else + status_table[byte_index] |= (0x00ff >> (status_index % 8)); +#endif +#else + byte_index = (status_index - 1) * (FDB_WRITE_GRAN / 8); + status_table[byte_index] = FDB_BYTE_WRITTEN; +#endif /* FDB_WRITE_GRAN == 1 */ + } + + return byte_index; +} + +size_t _fdb_get_status(uint8_t status_table[], size_t status_num) +{ + size_t i = 0, status_num_bak = --status_num; + + while (status_num --) { + /* get the first 0 position from end address to start address */ +#if (FDB_WRITE_GRAN == 1) + if ((status_table[status_num / 8] & (0x80 >> (status_num % 8))) == 0x00) { + break; + } +#else /* (FDB_WRITE_GRAN == 8) || (FDB_WRITE_GRAN == 32) || (FDB_WRITE_GRAN == 64) */ + if (status_table[status_num * FDB_WRITE_GRAN / 8] == FDB_BYTE_WRITTEN) { + break; + } +#endif /* FDB_WRITE_GRAN == 1 */ + i++; + } + + return status_num_bak - i; +} + +fdb_err_t _fdb_write_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t status_num, size_t status_index, bool sync) +{ + fdb_err_t result = FDB_NO_ERR; + size_t byte_index; + + FDB_ASSERT(status_index < status_num); + FDB_ASSERT(status_table); + + /* set the status first */ + byte_index = _fdb_set_status(status_table, status_num, status_index); + + /* the first status table value is all 1, so no need to write flash */ + if (byte_index == SIZE_MAX) { + return FDB_NO_ERR; + } +#if (FDB_WRITE_GRAN == 1) + result = _fdb_flash_write(db, addr + byte_index, (uint32_t *)&status_table[byte_index], 1, sync); +#else /* (FDB_WRITE_GRAN == 8) || (FDB_WRITE_GRAN == 32) || (FDB_WRITE_GRAN == 64) */ + /* write the status by write granularity + * some flash (like stm32 onchip) NOT supported repeated write before erase */ + result = _fdb_flash_write(db, addr + byte_index, (uint32_t *) &status_table[byte_index], FDB_WRITE_GRAN / 8, sync); +#endif /* FDB_WRITE_GRAN == 1 */ + + return result; +} + +size_t _fdb_read_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t total_num) +{ + FDB_ASSERT(status_table); + + _fdb_flash_read(db, addr, (uint32_t *) status_table, FDB_STATUS_TABLE_SIZE(total_num)); + + return _fdb_get_status(status_table, total_num); +} + +/* + * find the continue 0xFF flash address to end address + */ +uint32_t _fdb_continue_ff_addr(fdb_db_t db, uint32_t start, uint32_t end) +{ + uint8_t buf[32], last_data = FDB_BYTE_WRITTEN; + size_t i, addr = start, read_size; + + for (; start < end; start += sizeof(buf)) { + if (start + sizeof(buf) < end) { + read_size = sizeof(buf); + } else { + read_size = end - start; + } + _fdb_flash_read(db, start, (uint32_t *) buf, read_size); + for (i = 0; i < read_size; i++) { + if (last_data != FDB_BYTE_ERASED && buf[i] == FDB_BYTE_ERASED) { + addr = start + i; + } + last_data = buf[i]; + } + } + + if (last_data == FDB_BYTE_ERASED) { + return FDB_WG_ALIGN(addr); + } else { + return end; + } +} + +/** + * Make a blob object. + * + * @param blob blob object + * @param value_buf value buffer + * @param buf_len buffer length + * + * @return new blob object + */ +fdb_blob_t fdb_blob_make(fdb_blob_t blob, const void *value_buf, size_t buf_len) +{ + blob->buf = (void *)value_buf; + blob->size = buf_len; + + return blob; +} + +/** + * Read the blob object in database. + * + * @param db database object + * @param blob blob object + * + * @return read length + */ +size_t fdb_blob_read(fdb_db_t db, fdb_blob_t blob) +{ + size_t read_len = blob->size; + + if (read_len > blob->saved.len) { + read_len = blob->saved.len; + } + if (_fdb_flash_read(db, blob->saved.addr, blob->buf, read_len) != FDB_NO_ERR) { + read_len = 0; + } + + return read_len; +} + +#ifdef FDB_USING_FILE_MODE +extern fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size); +extern fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync); +extern fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size); +#endif /* FDB_USING_FILE_LIBC */ + +fdb_err_t _fdb_flash_read(fdb_db_t db, uint32_t addr, void *buf, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + + if (db->file_mode) { +#ifdef FDB_USING_FILE_MODE + return _fdb_file_read(db, addr, buf, size); +#else + return FDB_READ_ERR; +#endif + } else { +#ifdef FDB_USING_FAL_MODE + if (fal_partition_read(db->storage.part, addr, (uint8_t *) buf, size) < 0) { + result = FDB_READ_ERR; + } +#endif + } + + return result; +} + +fdb_err_t _fdb_flash_erase(fdb_db_t db, uint32_t addr, size_t size) +{ + fdb_err_t result = FDB_NO_ERR; + + if (db->file_mode) { +#ifdef FDB_USING_FILE_MODE + return _fdb_file_erase(db, addr, size); +#else + return FDB_ERASE_ERR; +#endif /* FDB_USING_FILE_MODE */ + } else { +#ifdef FDB_USING_FAL_MODE + if (fal_partition_erase(db->storage.part, addr, size) < 0) { + result = FDB_ERASE_ERR; + } +#endif + } + + return result; +} + +fdb_err_t _fdb_flash_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync) +{ + fdb_err_t result = FDB_NO_ERR; + + if (db->file_mode) { +#ifdef FDB_USING_FILE_MODE + return _fdb_file_write(db, addr, buf, size, sync); +#else + return FDB_WRITE_ERR; +#endif /* FDB_USING_FILE_MODE */ + } else { +#ifdef FDB_USING_FAL_MODE + if (fal_partition_write(db->storage.part, addr, (uint8_t *)buf, size) < 0) + { + result = FDB_WRITE_ERR; + } +#endif + } + + return result; + +} diff --git a/User/system/lib/flashdb/flashdb.h b/User/system/lib/flashdb/flashdb.h new file mode 100644 index 0000000..61634fd --- /dev/null +++ b/User/system/lib/flashdb/flashdb.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020, Armink, + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Public APIs. + */ + +#ifndef _FLASHDB_H_ +#define _FLASHDB_H_ + +#include +#include +#include +#include +#include +#include + +#ifdef FDB_USING_FAL_MODE +#include +#endif + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +/* FlashDB database API */ +fdb_err_t fdb_kvdb_init (fdb_kvdb_t db, const char *name, const char *path, struct fdb_default_kv *default_kv, + void *user_data); +void fdb_kvdb_control(fdb_kvdb_t db, int cmd, void *arg); +fdb_err_t fdb_kvdb_check(fdb_kvdb_t db); +fdb_err_t fdb_kvdb_deinit(fdb_kvdb_t db); +fdb_err_t fdb_tsdb_init (fdb_tsdb_t db, const char *name, const char *path, fdb_get_time get_time, size_t max_len, + void *user_data); +void fdb_tsdb_control(fdb_tsdb_t db, int cmd, void *arg); +fdb_err_t fdb_tsdb_deinit(fdb_tsdb_t db); + +/* blob API */ +fdb_blob_t fdb_blob_make (fdb_blob_t blob, const void *value_buf, size_t buf_len); +size_t fdb_blob_read (fdb_db_t db, fdb_blob_t blob); + +/* Key-Value API like a KV DB */ +fdb_err_t fdb_kv_set (fdb_kvdb_t db, const char *key, const char *value); +char *fdb_kv_get (fdb_kvdb_t db, const char *key); +fdb_err_t fdb_kv_set_blob (fdb_kvdb_t db, const char *key, fdb_blob_t blob); +size_t fdb_kv_get_blob (fdb_kvdb_t db, const char *key, fdb_blob_t blob); +fdb_err_t fdb_kv_del (fdb_kvdb_t db, const char *key); +fdb_kv_t fdb_kv_get_obj (fdb_kvdb_t db, const char *key, fdb_kv_t kv); +fdb_blob_t fdb_kv_to_blob (fdb_kv_t kv, fdb_blob_t blob); +fdb_err_t fdb_kv_set_default (fdb_kvdb_t db); +void fdb_kv_print (fdb_kvdb_t db); +fdb_kv_iterator_t fdb_kv_iterator_init(fdb_kvdb_t db, fdb_kv_iterator_t itr); +bool fdb_kv_iterate (fdb_kvdb_t db, fdb_kv_iterator_t itr); + +/* Time series log API like a TSDB */ +fdb_err_t fdb_tsl_append (fdb_tsdb_t db, fdb_blob_t blob); +fdb_err_t fdb_tsl_append_with_ts(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t timestamp); +void fdb_tsl_iter (fdb_tsdb_t db, fdb_tsl_cb cb, void *cb_arg); +void fdb_tsl_iter_reverse(fdb_tsdb_t db, fdb_tsl_cb cb, void *cb_arg); +void fdb_tsl_iter_by_time(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_cb cb, void *cb_arg); +size_t fdb_tsl_query_count (fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_status_t status); +fdb_err_t fdb_tsl_set_status (fdb_tsdb_t db, fdb_tsl_t tsl, fdb_tsl_status_t status); +void fdb_tsl_clean (fdb_tsdb_t db); +fdb_blob_t fdb_tsl_to_blob (fdb_tsl_t tsl, fdb_blob_t blob); + +/* fdb_utils.c */ +uint32_t fdb_calc_crc32(uint32_t crc, const void *buf, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _FLASHDB_H_ */ diff --git a/User/system/lib/flashdb/readme.md b/User/system/lib/flashdb/readme.md new file mode 100644 index 0000000..2f5acd3 --- /dev/null +++ b/User/system/lib/flashdb/readme.md @@ -0,0 +1,38 @@ +# 移植说明 + +## 简介 + +[FlashDB](http://armink.gitee.io/flashdb/#/zh-cn/) 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。FlashDB 不仅支持传统的基于文件系统的数据库模式,而且结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。 + + +## 使用场景 + +如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景: + +* **键值数据库** : + * 产品参数存储 + * 用户配置信息存储 + * 小文件管理 +* **时序数据库** : + * 存储动态产生的结构化数据:如 温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等 + * 记录运行日志:存储产品历史的运行日志,异常告警的记录等 + +本项目使用3块EPPROM + + +## 文件移植 + +项目地址 https://github.com/armink/FlashDB + +引入目录中的文件 + +.\FlashDB\src + +.\FlashDB\inc + +.\FlashDB\port\fal\src + +.\FlashDB\port\fal\inc + + +> fal_cfg.h 这个文件为用户自定义升级的时候不要覆盖 diff --git a/User/system/lib/flow/README.md b/User/system/lib/flow/README.md new file mode 100644 index 0000000..f9fbfd2 --- /dev/null +++ b/User/system/lib/flow/README.md @@ -0,0 +1,244 @@ +# flow_lib + +#### 介绍 +适用于嵌入式单片机的裸机程序微库,只占用你的rom 6个字节,是的,6个字节。颠覆式的设计思维,让你写代码的时候像flow(流水)一样丝滑,让你永远不用在为delay时cpu空转而烦恼,附加的超轻便的软件定时器让你轻松实现各种定时需求,另还有信号量的配方,让你任务间的同步像诗一样写意,并且能让你裸机程序效率提升百倍以上。 + +#### 移植说明 +移植特别简单,flow_def.h有一个全局变量: +``` +extern unsigned long flow_tick; +``` + +把这个变量放在你的某个硬件中断里去,这个硬件中断一定要是一直运行的,推荐RTC半秒中断,或者systick中断都可以。 + +然后在flow.h里的第一行有个宏 +``` +#define FL_HARD_TICK (500) /* 系统硬件中断一次所需要的时间,单位ms */ +``` + +把这里的值改成你的硬件中断一次所需的时间,单位是毫秒,比如你的flow_tick放在了一个500ms中断一次的rtc里,那么这里的宏FL_HARD_TICK的值就是500,具体中断设为多少取决于你的系统最短一次的延时的时间。 + +假如我的最短延时需求是100ms,那么我就得给个100ms中断一次的硬件中断源,宏FL_HARD_TICK的值就是100,我就可以这样使用: +``` +FL_LOCK_DELAY(fl, FL_CLOCK_SEC /10); +``` +来延时100ms。 + +#### 使用说明 +核心文件时flow.h,看这里的注释基本就会使用大部分功能。 + +``` +#ifndef __FLOW_ +#define __FLOW_ + +#include +#include +#include + +#define FL_HARD_TICK (500) /* 系统硬件中断一次所需要的时间,单位ms */ +#define FL_CLOCK_SEC (1000/FL_HARD_TICK) /* 一秒钟需要的tick,可以除也可以自行添加其它宏 */ + +/** + * 初始化一个flow进程 + */ +#define FL_INIT(fl) FLOW_INIT(fl) + +/** + * flow头,必须放在函数内的最前面 + */ +#define FL_HEAD(fl) FLOW_HEAD(fl) + +/** + * flow尾,必须放在函数内的最后面 + */ +#define FL_TAIL(fl) FLOW_TAIL(fl) + +/** + * 给进程加锁,直到judge为真,加锁期间一直放开cpu给其他进程使用 + */ +#define FL_LOCK_WAIT(fl, judge) FLOW_LOCK_WAIT(fl, judge) + +/** + * 如果judge为真,就一直给进程加锁,加锁期间一直放开cpu给其他进程使用 + */ +#define FL_LOCK_WHILE(fl, judge) FLOW_LOCK_WHILE(fl, judge) + +/** + * 退出该进程 + */ +#define FL_EXIT(fl) FLOW_EXIT(fl) + +/** + * 无条件锁住进程一次,下次进来再接着往下运行 + */ +#define FL_LOCK_ONCE(fl) FLOW_LOCK_ONCE(fl) + +/** + * 等待一个flow进程结束 + */ +#define FL_WAIT_PROCESS_END(fl, process) FLOW_WAIT_PROCESS_END(fl, process) + +/** + * 等待一个flow子进程结束 + */ +#define FL_WAIT_CHILD(fl, cfl, process) FLOW_WAIT_CHILD_PROCESS_END(fl, cfl, process) + +/** + * 给进程加锁,时长为time,加锁期间一直放开cpu给其他进程使用,time如果用FL_CLOCK_SEC来乘,那么time的单位就是s + * 此处time必须是常数 + */ +#define FL_LOCK_DELAY(fl,time) FLOW_LOCK_DELAY(fl,time) + +/** + * 给进程加锁,时长为time,延时期间如果judge为真,就直接解锁进程 + * 此处time必须是常数 + */ +#define FL_LOCK_DELAY_OR_WAIT(fl,judge,time) FLOW_LOCK_DELAY_OR_WAIT(fl,judge,time) + +/** + * 初始化一个信号量 + */ +#define FL_SEM_INIT(sem, count) FLOW_SEM_INIT(sem, count) + +/** + * 给进程加锁,直到有信号释放 + */ +#define FL_LOCK_WAIT_SEM(f, sem) FLOW_LOCK_WAIT_SEM(f, sem) + +/** + * 给进程加锁,直到有信号或者超时,此处time可以为变量,其他的接口处time必须是常数 + */ +#define FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, sem, time) FLOW_LOCK_WAIT_SEM_OR_TIMEOUT(fl, sem, time) + +/** + * 释放一个信号量 + */ +#define FL_SEM_RELEASE(sem) FLOW_SEM_RELEASE(sem) + +/** + * 初始化一个软件定时器 + */ +void fl_timer_set(struct flow_timer *t, unsigned long interval); + +/** + * 复位一个软件定时器 + */ +void fl_timer_reset(struct flow_timer *t); + +/** + * 重启一个软件定时器 + */ +void fl_timer_restart(struct flow_timer *t); + +/** + * 检测一个软件定时器是否超时,0为不超时,1为超时 + */ +char fl_timer_timeout(struct flow_timer *t); + +/** + * 检测一个软件定时器还剩多少时间超时,单位为硬件tick,比如硬件tick 500ms中断一次,那么 + * 返回的时间单位就是500ms + */ +unsigned long fl_hour_much_time(struct flow_timer *t); + +#endif /* __FLOW_ */ +``` + + +简单举个例子,先从需求说起,假如说你现在需要一个函数,这个函数的功能是每隔1s让你的led亮一次,正常设计的要么起个软件定时器或者硬件定时器,甚至状态机可以实现需求,但是都太low了,让我们看一下如何用flow库来实现这个函数。 + +该函数格式如下: + +``` +char led_flash(struct flow *fl) +{} +``` +其中char、struct flow *fl是必备的。 + +再来看看函数里面的内容格式: + +``` +char led_flash(struct flow *fl) +{ + FL_HEAD(fl); + FL_TAIL(fl); +} +``` +函数里面的FL_HEAD和FL_TAIL是使用flow库的所必须的宏,FL_HEAD(fl)放到函数的最前面,如果你的函数内部有变量定义的话放在变量定义的后面。而FL_TAIL(fl)是放在函数最后面一行的。 + +基本格式有了,再来看下如何实现延时一秒呢?其实只用一个语句就OK。 + +``` +char led_flash(struct flow *fl) +{ + FL_HEAD(fl); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); + led_open(); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); + led_close(); + FL_TAIL(fl); +} +``` + +是的,你没看错,仅仅只需要FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1)这一个语句就OK,当执行到这个语句的时候该函数就会让出CPU权限,当延时时间到了之后,就会回来接着执行FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1)下面的语句。一直到FL_TAIL(fl),该函数就会结束任务,再也不会执行了,那么如果我们想让它一直循环执行呢?看下面: + +``` +char led_flash(struct flow *fl) +{ + FL_HEAD(fl); + while(1) + { + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); + led_open(); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); + led_close(); + } + FL_TAIL(fl); +} +``` +看起来像不像个进程?其实也有点操作系统的样子了。。。 + +光有这个函数也不行,还得进行一些额外的操作 + +比如: + +``` +static struct flow fl_led; /* 1,定义一个struct flow变量给这个函数使用 */ + +static char led_flash(struct flow *fl) +{ + FL_HEAD(fl); + led_init(); /* 这里还能解决你的初始化问题,这里的函数只会在开机时或者说进程第一次进来时运行一次,以后将永远不会运行。注意:如果放在 + FL_HEAD(fl)前面,那么就是每次轮到这个进程运行的时侯就会运行一次,总之很灵活 */ + while(1) + { + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); + led_open(); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); + led_close(); + } + FL_TAIL(fl); +} + +int main(void) +{ + FL_INIT(&fl_led); /* 2,初始化struct flow变量 */ + while(1) + { + led_flash(&fl_led); /* 3,把led_flash进程放在main函数的while循环里 */ + ... + } + return 0; +} +``` +经过以上3步,就可以实现进程之间的切换啦。然后想根据某个条件来锁住线程释放CPU的话,可以把里面的 +``` +FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1); +``` +换成 +``` +FL_LOCK_WAIT(fl, judge); +``` +当里面的judge为假时线程就一直锁住在这一行语句,当judge为真时就可以往下执行啦。同理可以完成很多其他的神奇功能,让你的cpu再也不空转啦,具体请看flow.h文件。。。。 + +这个版本暂时先写这么多,先看看example.c。 diff --git a/User/system/lib/flow/example.c b/User/system/lib/flow/example.c new file mode 100644 index 0000000..ef0ecc4 --- /dev/null +++ b/User/system/lib/flow/example.c @@ -0,0 +1,28 @@ +#include "flow.h" + +/* 1,初始化一个struct flow变量 */ +static struct flow fl_led; + +static char led_flash(struct flow *fl) +{ + FL_HEAD(fl); + for (;;) + { + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1U); /* 延时一秒 */ + led_open(); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC * 1U); /* 延时一秒 */ + led_close(); + } + FL_TAIL(fl); +} + +int main(void) +{ + FL_INIT(&fl_led); + for (;;) + { + led_flash(&fl_led); + // other_process(); + } + return 0; +} diff --git a/User/system/lib/flow/flow.h b/User/system/lib/flow/flow.h new file mode 100644 index 0000000..30e6401 --- /dev/null +++ b/User/system/lib/flow/flow.h @@ -0,0 +1,129 @@ +/** + * @file flow.h + * @author: xxx + * @date: 2023-07-21 17:00:15 + * @brief + * @copyright: Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __FLOW_ +#define __FLOW_ + +#include "flow_def.h" +#include "flow_core.h" +#include "flow_sem.h" + +#define FL_HARD_TICK (10U) /* 系统硬件中断一次所需要的时间,单位ms */ +#define FL_CLOCK_SEC (1000U / FL_HARD_TICK) /* 一秒钟需要的tick,可以根据需求添加其他时间更短的宏 */ +#define FL_CLOCK_100MSEC (100U / FL_HARD_TICK) +#define FL_CLOCK_10MSEC (FL_CLOCK_100MSEC / 10U) + +/** + * 初始化一个flow进程 + */ +#define FL_INIT(fl) FLOW_INIT((fl)) + +/** + * flow头,必须放在函数内的最前面 + */ +#define FL_HEAD(fl) FLOW_HEAD((fl)) + +/** + * flow尾,必须放在函数内的最后面 + */ +#define FL_TAIL(fl) FLOW_TAIL((fl)) + +/** + * 给进程加锁,直到judge为真,加锁期间一直放开cpu给其他进程使用 + */ +#define FL_LOCK_WAIT(fl, judge) FLOW_LOCK_WAIT((fl), (judge)) + +/** + * 如果judge为真,就一直给进程加锁,加锁期间一直放开cpu给其他进程使用 + */ +#define FL_LOCK_WHILE(fl, judge) FLOW_LOCK_WHILE((fl), (judge)) + +/** + * 退出该进程 + */ +#define FL_EXIT(fl) FLOW_EXIT((fl)) + +/** + * 无条件锁住进程一次,下次进来再接着往下运行 + */ +#define FL_LOCK_ONCE(fl) FLOW_LOCK_ONCE((fl)) + +/** + * 等待一个flow进程结束 + */ +#define FL_WAIT_PROCESS_END(fl, process) FLOW_WAIT_PROCESS_END((fl), (process)) + +/** + * 等待一个flow子进程结束 + */ +#define FL_WAIT_CHILD(fl, cfl, process) FLOW_WAIT_CHILD_PROCESS_END((fl), (cfl), (process)) + +/** + * 给进程加锁,时长为time,加锁期间一直放开cpu给其他进程使用,time如果用FL_CLOCK_SEC来乘,那么time的单位就是s + * 此处time必须是常数 + */ +#define FL_LOCK_DELAY(fl, time) FLOW_LOCK_DELAY((fl), (time)) + +/** + * 给进程加锁,时长为time,延时期间如果judge为真,就直接解锁进程 + * 此处time必须是常数 + */ +#define FL_LOCK_DELAY_OR_WAIT(fl, judge, time) FLOW_LOCK_DELAY_OR_WAIT((fl), (judge), (time)) + +/** + * 初始化一个信号量 + */ +#define FL_SEM_INIT(sem, count) FLOW_SEM_INIT((sem), (count)) + +/** + * 给进程加锁,直到有信号释放 + */ +#define FL_LOCK_WAIT_SEM(fl, sem) FLOW_LOCK_WAIT_SEM((fl), (sem)) + +/** + * 给进程加锁,直到有信号或者超时,此处time可以为常数或者变量,其他的接口处time必须是常数 + */ +#define FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, sem, time) FLOW_LOCK_WAIT_SEM_OR_TIMEOUT((fl), (sem), (time)) + +/** + * 释放一个信号量 + */ +#define FL_SEM_RELEASE(sem) FLOW_SEM_RELEASE((sem)) + +/** + * 检测一个信号量是否被释放 + */ +#define FL_SEM_IS_RELEASE(fl, sem) FLOW_SEM_IS_RELEASE((fl), (sem)) + +/** + * 初始化一个软件定时器 + */ +void fl_timer_set(struct flow_timer *t, unsigned long interval); + +/** + * 复位一个软件定时器 + */ +void fl_timer_reset(struct flow_timer *t); + +/** + * 重启一个软件定时器 + */ +void fl_timer_restart(struct flow_timer *t); + +/** + * 检测一个软件定时器是否超时,0为不超时,1为超时 + */ +unsigned char fl_timer_timeout(struct flow_timer *t); + +/** + * 检测一个软件定时器还剩多少时间超时,单位为硬件tick,比如硬件tick 500ms中断一次,那么 + * 返回的剩余时间就是500ms*n + */ +unsigned long fl_hour_much_time(struct flow_timer *t); + +#endif /* __FLOW_ */ diff --git a/User/system/lib/flow/flow_core.c b/User/system/lib/flow/flow_core.c new file mode 100644 index 0000000..87bb5bd --- /dev/null +++ b/User/system/lib/flow/flow_core.c @@ -0,0 +1,83 @@ +/** + * @file + * @author xxx + * @date 2023-07-21 17:00:15 + * @brief + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "flow.h" + +unsigned long flow_tick; + +/** + * @brief 设置流量计器的间隔时间。 + * @param t 要设置的流量计器。 + * @param interval 要设置的间隔时间值。 + * @return 如果间隔时间无效或无法设置,则返回NULL。 + * @note 此函数设置间隔时间并重置计时器,因此它将在下一个间隔时间 occurs时开始。 + */ +void fl_timer_set(struct flow_timer *t, unsigned long interval) +{ + if (interval == 0) + { + // 如果间隔时间为零,返回错误 + return; + } + + t->interval = interval; + t->start = flow_tick; +} + +/** + * @brief 重置流量计器。 + * @param t 要重置的流量计器。 + * @return 如果无法重置计时器,则返回NULL。 + * @note 此函数将计时器的开始时间加上间隔时间,因此它将在下一个间隔时间 occurs时开始。 + */ +void fl_timer_reset(struct flow_timer *t) +{ + t->start += t->interval; +} + +/** + * @brief 重新启动流量计器。 + * @param t 要重新启动的流量计器。 + * @return 如果无法重新启动计时器,则返回NULL。 + * @note 此函数将计时器的开始时间设置为当前flow_tick,因此它将在重新开始时从基本开始。 + */ +void fl_timer_restart(struct flow_timer *t) +{ + t->start = flow_tick; +} + +/** + * @brief 检查给定的flow_timer结构体的超时状态 + * @param {flow_timer} *t 指向flow_timer结构体的指针 + * @return {unsigned char} 超时返回1,否则返回0 + * @note 检查当前时间与flow_timer结构体中的start时间之差是否大于或等于interval + */ +unsigned char fl_timer_timeout(struct flow_timer *t) +{ + return ((flow_tick - t->start) >= t->interval) ? 1U : 0U; +} + +/** + * @brief 计算给定flow_timer结构体中的时间长度 + * @param {flow_timer} *t 指向flow_timer结构体的指针 + * @return {unsigned long} 返回时间长度 + * @note 计算start时间加上interval与当前时间flow_tick之差,如果大于等于flow_tick,则返回time_len - flow_tick,否则返回0 + */ +unsigned long fl_hour_much_time(struct flow_timer *t) +{ + unsigned long time_len = t->start + t->interval; + + if (time_len >= flow_tick) + { + return (time_len - flow_tick); + } + else + { + return 0U; + } +} diff --git a/User/system/lib/flow/flow_core.h b/User/system/lib/flow/flow_core.h new file mode 100644 index 0000000..b6857a3 --- /dev/null +++ b/User/system/lib/flow/flow_core.h @@ -0,0 +1,106 @@ +/** + * @file flow_core.h + * @author: xxx + * @date: 2023-07-21 17:00:15 + * @brief + * @copyright: Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __FLOW_CORE_ +#define __FLOW_CORE_ + +#include "flow_def.h" + +// 在定时器中断中调用 +#define FLOW_TICK_UPDATE() \ + do \ + { \ + flow_tick++; \ + } while (0); + +// 初始化一个flow进程 +#define FLOW_INIT(f) ((f)->line = 0) + +// flow头,必须放在函数内的最前面 +#define FLOW_HEAD(f) \ + { \ + volatile char lock_once_flag = 0; \ + switch ((f)->line) \ + { \ + case 0: +// flow尾,必须放在函数内的最后面 +#define FLOW_TAIL(f) \ + } \ + ; \ + lock_once_flag = (f)->line = 0; \ + return FLOW_END; \ + } \ + ; + +// 给进程加锁,直到judge为真,加锁期间一直放开cpu给其他进程使用 +#define FLOW_LOCK_WAIT(f, judge) \ + do \ + { \ + (f)->line = __LINE__; \ + case __LINE__:; \ + if (!(judge)) \ + return FLOW_WAIT; \ + } while (0) + +// 如果judge为真,就一直给进程加锁,加锁期间一直放开cpu给其他进程使用 +#define FLOW_LOCK_WHILE(f, judge) \ + do \ + { \ + (f)->line = __LINE__; \ + case __LINE__:; \ + if (judge) \ + return FLOW_WAIT; \ + } while (0) + +// 退出该进程 +#define FLOW_EXIT(f) \ + do \ + { \ + (f)->line = 0; \ + return FLOW_FINISH; \ + } while (0) + +// 无条件锁住进程一次,下次进来再接着往下运行 +#define FLOW_LOCK_ONCE(f) \ + do \ + { \ + lock_once_flag = 1; \ + (f)->line = __LINE__; \ + case __LINE__:; \ + if (lock_once_flag) \ + return FLOW_LOCK; \ + } while (0) + +// 等待一个flow进程结束 +#define FLOW_WAIT_PROCESS_END(f, process) FLOW_LOCK_WHILE(f, (process) < FLOW_FINISH) + +// 等待一个flow子进程结束 +#define FLOW_WAIT_CHILD_PROCESS_END(f, cf, process) \ + do \ + { \ + FLOW_INIT((cf)); \ + FLOW_WAIT_PROCESS_END((f), (process)); \ + } while (0) + +// 给进程加锁,时长为time,加锁期间一直放开cpu给其他进程使用,time如果用FL_CLOCK_SEC来乘,那么time的单位就是s +#define FLOW_LOCK_DELAY(f, t) \ + do \ + { \ + (f)->time = flow_tick; \ + FLOW_LOCK_WAIT((f), ((flow_tick - (f)->time) >= (t))); \ + } while (0) + +// 给进程加锁,时长为time,延时期间如果judge为真,就直接解锁进程 +#define FLOW_LOCK_DELAY_OR_WAIT(f, judge, t) \ + do \ + { \ + (f)->time = flow_tick; \ + FLOW_LOCK_WAIT((f), ((judge) || ((flow_tick - (f)->time) >= (t)))); \ + } while (0) + +#endif /* __FLOW_CORE_ */ diff --git a/User/system/lib/flow/flow_def.h b/User/system/lib/flow/flow_def.h new file mode 100644 index 0000000..1537877 --- /dev/null +++ b/User/system/lib/flow/flow_def.h @@ -0,0 +1,37 @@ +/** + * @file flow_def.h + * @author: xxx + * @date: 2023-07-21 17:00:15 + * @brief + * @copyright: Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __FLOW_DEF_ +#define __FLOW_DEF_ + +#define FLOW_WAIT (0) +#define FLOW_LOCK (1) +#define FLOW_FINISH (2) +#define FLOW_END (3) + +struct flow +{ + unsigned long line; + unsigned long time; +}; + +struct flow_timer +{ + unsigned long start; + unsigned long interval; +}; + +struct flow_sem +{ + unsigned long count; + unsigned long time; +}; + +extern unsigned long flow_tick; + +#endif /* __FLOW_DEF_ */ diff --git a/User/system/lib/flow/flow_sem.h b/User/system/lib/flow/flow_sem.h new file mode 100644 index 0000000..b524683 --- /dev/null +++ b/User/system/lib/flow/flow_sem.h @@ -0,0 +1,40 @@ +/*** + * @file: + * @author: xxx + * @date: 2023-07-21 17:00:15 + * @brief + * @copyright: Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __FLOW_SEM_H__ +#define __FLOW_SEM_H__ + +#include "flow_def.h" +#include "flow_core.h" + +#define FLOW_SEM_INIT(s, c) ((s)->count = c) // 初始化信号量s的计数值为c + +// 等待信号量s的计数值大于0 +#define FLOW_LOCK_WAIT_SEM(f, s) \ + do \ + { \ + FLOW_LOCK_WAIT(f, (s)->count > 0); \ + --(s)->count; \ + } while (0) + +// 等待信号量s的计数值大于0,或者当前时间与锁f的时间之差大于等于t +#define FLOW_LOCK_WAIT_SEM_OR_TIMEOUT(f, s, t) \ + do \ + { \ + (f)->time = flow_tick; \ + (s)->time = (t); \ + FLOW_LOCK_WAIT(f, (((s)->count > 0) || ((flow_tick - (f)->time) >= ((s)->time)))); \ + if (((s)->count > 0) && ((flow_tick - (f)->time) < ((s)->time))) \ + --(s)->count; \ + } while (0) + +#define FLOW_SEM_RELEASE(s) (++(s)->count) + +#define FLOW_SEM_IS_RELEASE(f, s) (flow_tick - (f)->time) < ((s)->time) + +#endif /* __FLOW_SEM_H__ */ diff --git a/User/system/lib/inc/aes.h b/User/system/lib/inc/aes.h new file mode 100644 index 0000000..7c2a92c --- /dev/null +++ b/User/system/lib/inc/aes.h @@ -0,0 +1,161 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue 09/09/2006 + + This is an AES implementation that uses only 8-bit byte operations on the + cipher state. + */ + +#ifndef AES_H +#define AES_H + +#if 1 +#define AES_ENC_PREKEYED /* AES encryption with a precomputed key schedule */ +#endif +#if 1 +#define AES_DEC_PREKEYED /* AES decryption with a precomputed key schedule */ +#endif +#if 0 +#define AES_ENC_128_OTFK /* AES encryption with 'on the fly' 128 bit keying */ +#endif +#if 0 +#define AES_DEC_128_OTFK /* AES decryption with 'on the fly' 128 bit keying */ +#endif +#if 0 +#define AES_ENC_256_OTFK /* AES encryption with 'on the fly' 256 bit keying */ +#endif +#if 0 +#define AES_DEC_256_OTFK /* AES decryption with 'on the fly' 256 bit keying */ +#endif + +#define N_ROW 4 +#define N_COL 4 +#define N_BLOCK (N_ROW * N_COL) +#define N_MAX_ROUNDS 14 + +typedef uint8_t return_type; + +/* Warning: The key length for 256 bit keys overflows a byte + (see comment below) +*/ + +typedef uint8_t length_type; + +typedef struct +{ + uint8_t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; + uint8_t rnd; +} aes_context; + +/* The following calls are for a precomputed key schedule + + NOTE: If the length_type used for the key length is an + unsigned 8-bit character, a key length of 256 bits must + be entered as a length in bytes (valid inputs are hence + 128, 192, 16, 24 and 32). +*/ + +#if defined(AES_ENC_PREKEYED) || defined(AES_DEC_PREKEYED) + +return_type aes_set_key(const uint8_t key[], + length_type keylen, + aes_context ctx[1]); +#endif + +#if defined(AES_ENC_PREKEYED) + +return_type aes_encrypt(const uint8_t in[N_BLOCK], + uint8_t out[N_BLOCK], + const aes_context ctx[1]); + +return_type aes_cbc_encrypt(const uint8_t *in, + uint8_t *out, + int32_t n_block, + uint8_t iv[N_BLOCK], + const aes_context ctx[1]); +#endif + +#if defined(AES_DEC_PREKEYED) + +return_type aes_decrypt(const uint8_t in[N_BLOCK], + uint8_t out[N_BLOCK], + const aes_context ctx[1]); + +return_type aes_cbc_decrypt(const uint8_t *in, + uint8_t *out, + int32_t n_block, + uint8_t iv[N_BLOCK], + const aes_context ctx[1]); +#endif + +/* The following calls are for 'on the fly' keying. In this case the + encryption and decryption keys are different. + + The encryption subroutines take a key in an array of bytes in + key[L] where L is 16, 24 or 32 bytes for key lengths of 128, + 192, and 256 bits respectively. They then encrypts the input + data, in[] with this key and put the reult in the output array + out[]. In addition, the second key array, o_key[L], is used + to output the key that is needed by the decryption subroutine + to reverse the encryption operation. The two key arrays can + be the same array but in this case the original key will be + overwritten. + + In the same way, the decryption subroutines output keys that + can be used to reverse their effect when used for encryption. + + Only 128 and 256 bit keys are supported in these 'on the fly' + modes. +*/ + +#if defined(AES_ENC_128_OTFK) +void aes_encrypt_128(const uint8_t in[N_BLOCK], + uint8_t out[N_BLOCK], + const uint8_t key[N_BLOCK], + uint8_t o_key[N_BLOCK]); +#endif + +#if defined(AES_DEC_128_OTFK) +void aes_decrypt_128(const uint8_t in[N_BLOCK], + uint8_t out[N_BLOCK], + const uint8_t key[N_BLOCK], + uint8_t o_key[N_BLOCK]); +#endif + +#if defined(AES_ENC_256_OTFK) +void aes_encrypt_256(const uint8_t in[N_BLOCK], + uint8_t out[N_BLOCK], + const uint8_t key[2 * N_BLOCK], + uint8_t o_key[2 * N_BLOCK]); +#endif + +#if defined(AES_DEC_256_OTFK) +void aes_decrypt_256(const uint8_t in[N_BLOCK], + uint8_t out[N_BLOCK], + const uint8_t key[2 * N_BLOCK], + uint8_t o_key[2 * N_BLOCK]); +#endif + +#endif diff --git a/User/system/lib/inc/clist.h b/User/system/lib/inc/clist.h new file mode 100644 index 0000000..d04158a --- /dev/null +++ b/User/system/lib/inc/clist.h @@ -0,0 +1,49 @@ +/** + * @file clist.h + * @author xxx + * @date 2023-08-08 23:18:15 + * @brief 简单链表 使用方法 lib\examples\simple_clist.c + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __CLIST_H +#define __CLIST_H +#include "lib.h" +typedef void *cnode; + +/// 链表中一个节点的结构体 +typedef struct CLIST_NODE +{ + cnode data; /// 值 + struct CLIST_NODE *Next; /// 指向下一个结点 +} clist_node_t; + +void clist_init(clist_node_t **ppFirst); ///< 初始化 ,构造一条空的链表 + +void clist_print(clist_node_t *First); ///< 打印链表 + +uint32_t clist_node_count(clist_node_t *First); ///< 获取链表节点数 + +void clist_push_back(clist_node_t **ppFirst, cnode data); ///< 尾部插入 + +void clist_push_front(clist_node_t **ppFirst, cnode data); ///< 头部插入 + +void clist_pop_back(clist_node_t **ppFirst); ///< 尾部删除 + +void clist_pop_front(clist_node_t **ppFirst); ///< 头部删除 + +void clist_insert_for_node(clist_node_t **ppFirst, clist_node_t *pPos, cnode data); ///< 给定结点插入,插入到结点前 + +int32_t clist_insert(clist_node_t **ppFirst, int32_t Pos, cnode data); ///< 按位置插入 + +void clist_erase_for_node(clist_node_t **ppFirst, clist_node_t *pPos); ///< 给定结点删除 + +void clist_remove(clist_node_t **ppFirst, cnode data); ///< 按值删除,只删遇到的第一个 + +void clist_remove_all(clist_node_t **ppFirst, cnode data); ///< 按值删除,删除所有的 + +void clist_destroy(clist_node_t **ppFirst); ///< 销毁 ,需要销毁每一个节点 + +clist_node_t *clist_find(clist_node_t *pFirst, cnode data); ///< 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL + +#endif //__CLIST_H diff --git a/User/system/lib/inc/cmac.h b/User/system/lib/inc/cmac.h new file mode 100644 index 0000000..7ff5585 --- /dev/null +++ b/User/system/lib/inc/cmac.h @@ -0,0 +1,63 @@ +/************************************************************************** +Copyright (C) 2009 Lander Casado, Philippas Tsigas + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files +(the "Software"), to deal with the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimers. Redistributions in +binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimers in the documentation and/or +other materials provided with the distribution. + +In no event shall the authors or copyright holders be liable for any special, +incidental, indirect or consequential damages of any kind, or any damages +whatsoever resulting from loss of use, data or profits, whether or not +advised of the possibility of damage, and on any theory of liability, +arising out of or in connection with the use or performance of this software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS WITH THE SOFTWARE + +*****************************************************************************/ + +#ifndef _CMAC_H_ +#define _CMAC_H_ + +#include "aes.h" + +#define AES_CMAC_KEY_LENGTH 16 +#define AES_CMAC_DIGEST_LENGTH 16 + +typedef struct _AES_CMAC_CTX +{ + aes_context rijndael; + uint8_t X[16]; + uint8_t M_last[16]; + uint32_t M_n; +} AES_CMAC_CTX; + +// #include + +//__BEGIN_DECLS +void AES_CMAC_Init(AES_CMAC_CTX *ctx); +void AES_CMAC_SetKey(AES_CMAC_CTX *ctx, const uint8_t key[AES_CMAC_KEY_LENGTH]); +void AES_CMAC_Update(AES_CMAC_CTX *ctx, const uint8_t *data, uint32_t len); +// __attribute__((__bounded__(__string__,2,3))); +void AES_CMAC_Final(uint8_t digest[AES_CMAC_DIGEST_LENGTH], AES_CMAC_CTX *ctx); +// __attribute__((__bounded__(__minbytes__,1,AES_CMAC_DIGEST_LENGTH))); +//__END_DECLS + +#endif /* _CMAC_H_ */ diff --git a/User/system/lib/inc/cmd.h b/User/system/lib/inc/cmd.h new file mode 100644 index 0000000..735776a --- /dev/null +++ b/User/system/lib/inc/cmd.h @@ -0,0 +1,49 @@ +/** + * @file cmd.h + * @author xxx + * @date 2023-06-25 13:07:02 + * @brief 命令解析器 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef _CMD_H_ +#define _CMD_H_ + +#define CMD_HASH 0xb433e5c6 + +#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */ +#define SECTION(x) __attribute__((section(x))) +#define CMD_USED __attribute__((used)) + +#elif defined(__IAR_SYSTEMS_ICC__) /* IAR Compiler */ +#define SECTION(x) @x +#define CMD_USED __root +#else +#error "not supported tool chain..." +#endif + +typedef void (*cmd_handler)(void); + +typedef struct cmd +{ + const char *cmd; + const char *cmd_mess; + unsigned int hash; + cmd_handler handler; +} cmd_t; + +/// 注册命令 +#define REGISTER_CMD(cmd, handler, desc) \ + const char _register_##cmd##_cmd[] = #cmd; \ + const char _register_##cmd##_desc[] = #desc; \ + CMD_USED cmd_t _register_##cmd SECTION("CMDS") = \ + { \ + _register_##cmd##_cmd, \ + _register_##cmd##_desc, \ + (unsigned int)CMD_HASH, \ + (cmd_handler)&handler}; + +void cmd_init(void); ///< 初始化命令 +void cmd_parsing(char *str); ///< 命令解析 + +#endif diff --git a/User/system/lib/inc/data_analysis.h b/User/system/lib/inc/data_analysis.h new file mode 100644 index 0000000..4ac52fe --- /dev/null +++ b/User/system/lib/inc/data_analysis.h @@ -0,0 +1,79 @@ +/** + * @file data_analysis.h + * @author xxx + * @date 2023-06-25 13:07:02 + * @brief 处理传输层的数据 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef COMPONENTS_COMMON_INCLUDE_DATA_ANALYSIS_H_ +#define COMPONENTS_COMMON_INCLUDE_DATA_ANALYSIS_H_ +#include "data_type_def.h" + +typedef enum +{ + DATA_1, + DATA_2, + DATA_MAX, +} DataId_t; // 处理数据模块的个数,请根据实际情况修改 + +#define DATA_NUM (DATA_MAX) + +#define DATA_BUF_RECV_SQQ_LEN 650u +#define DATA_BUF_SEND_SQQ_LEN 0u + +#define DATA_SD_LEN_MAX 2 +#define DATA_LD_LEN_MAX 2 +#define DATA_ED_LEN_MAX 1 + +typedef struct _data_reg_t_ +{ + struct + { + uint8_t len; + uint8_t pos; + uint8_t data[DATA_SD_LEN_MAX]; + BOOL valid; // 是否有效 + } sd; // start delimiter + + struct + { + uint8_t len; + uint8_t pos; // 偏移量,在wait_end_state中根据帧长去掉固定长度来判断是否是结束符 + uint8_t little_endian; + BOOL valid; // 是否有效 + } ld; // length describe + + struct + { + uint16_t len_max; + uint16_t len_min; + } argu; + + struct + { + uint8_t len; + uint8_t data[DATA_ED_LEN_MAX]; + BOOL valid; + } ed; + + BOOL echo_en; + void (*func_ptr)(void); +} data_reg_t; + +typedef void (*data_interupt_cb_t)(uint8_t id, uint8_t ch); ///< 中断回调函数,数据从这里写入 + +extern uint8_t data_read(uint8_t id, void *buffer, uint16_t len); ///< 读取数据 + +extern void data_write(uint8_t id, uint8_t *const string, uint16_t len); ///< TODO 写入数据 + +extern void lock_data(uint8_t data_id); ///< 锁定数据,防止中断写入数据 + +extern void unlock_data(uint8_t data_id); ///< 解锁数据 + +extern data_interupt_cb_t data_fsm_init(uint8_t data_id); ///< 初始化数据状态机 + +extern BOOL data_reg(uint8_t id, data_reg_t reg); ///< 注册数据 + +extern void data_unreg(uint8_t id); ///< 注销数据 +#endif /* COMPONENTS_COMMON_INCLUDE_DATA_ANALYSIS_H_ */ diff --git a/User/system/lib/inc/data_type_def.h b/User/system/lib/inc/data_type_def.h new file mode 100644 index 0000000..90de350 --- /dev/null +++ b/User/system/lib/inc/data_type_def.h @@ -0,0 +1,290 @@ +/*** + * @Author: + * @Date: 2023-03-29 13:16:28 + * @LastEditors: xxx + * @LastEditTime: 2023-03-30 00:34:11 + * @Description:数据类型定义 + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __DATA_TYPE_DEF_H_ +#define __DATA_TYPE_DEF_H_ +#include +#ifndef PI +#define PI (3.14159265358979323846f) +#endif + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#ifndef OK +typedef enum +{ + OK = 0, + FAIL = !OK, +} state_e; +#endif + +#ifndef __IO +#define __IO volatile +#endif + +typedef unsigned char BOOL; /* boolean data */ +typedef unsigned char bool_t; /* boolean data */ + +#if !defined(__stdint_h) && !defined(_GCC_WRAP_STDINT_H) +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned long int uint32_t; +typedef unsigned long long uint64_t; + +typedef signed char int8_t; +typedef signed short int int16_t; +typedef signed long int int32_t; +typedef long long int64_t; +#endif + +typedef float float32; +typedef double float64; + +#ifndef float32_t +typedef float float32_t; +#endif + +#ifndef float64_t +typedef double float64_t; +#endif + +#pragma pack(1) +typedef struct +{ + uint8_t bs[3]; +} uint24_t; +typedef struct +{ + uint8_t bs[5]; +} uint40_t; + +typedef union +{ + float32 f; + int32_t c; +} float32_u; + +#pragma pack() + +typedef enum +{ + DATA_TYPE_INT8 = 0, // 8-bit signed integer + DATA_TYPE_UINT8, // 8-bit unsigned integer + DATA_TYPE_INT16, // 16-bit signed integer + DATA_TYPE_UINT16, // 16-bit unsigned integer + DATA_TYPE_INT32, // 32-bit signed integer + DATA_TYPE_UINT32, // 32-bit unsigned integer + DATA_TYPE_INT64, // 64-bit signed integer + DATA_TYPE_UINT64, // 64-bit unsigned integer + DATA_TYPE_FLOAT, // 32-bit floating point number + DATA_TYPE_DOUBLE, // 64-bit floating point number + DATA_TYPE_STRING, // string + DATA_TYPE_ARRAY, // array + DATA_TYPE_STRUCT, // structure + DATA_TYPE_UNION, // union + DATA_TYPE_ENUM, // enumeration + DATA_TYPE_POINTER, // pointer + DATA_TYPE_FUNCTION, // function + DATA_TYPE_VOID, // void + DATA_TYPE_MAX, +} data_type_e; + +typedef uint16_t nwk_id_t; + +/** + * STANDARD BITS + */ +#ifndef BIT0 +#define BIT0 (0x01u) +#define BIT1 (0x02u) +#define BIT2 (0x04u) +#define BIT3 (0x08u) +#define BIT4 (0x10u) +#define BIT5 (0x20u) +#define BIT6 (0x40u) +#define BIT7 (0x80u) +#define BIT8 (0x0100u) +#define BIT9 (0x0200u) +#define BIT10 (0x0400u) +#define BIT11 (0x0800u) +#define BIT12 (0x1000u) +#define BIT13 (0x2000u) +#define BIT14 (0x4000u) +#define BIT15 (0x8000u) +#define BIT16 (0x00010000u) +#define BIT17 (0x00020000u) +#define BIT18 (0x00040000u) +#define BIT19 (0x00080000u) +#define BIT20 (0x00100000u) +#define BIT21 (0x00200000u) +#define BIT22 (0x00400000u) +#define BIT23 (0x00800000u) +#define BIT24 (0x01000000u) +#define BIT25 (0x02000000u) +#define BIT26 (0x04000000u) +#define BIT27 (0x08000000u) +#define BIT28 (0x10000000u) +#define BIT29 (0x20000000u) +#define BIT30 (0x40000000u) +#define BIT31 (0x80000000u) + +#define BIT_SET(x, b) x |= b // 置位 +#define BIT_CLR(x, b) x &= ~b // 清零 +#define BIT_GET(x, y) ((x) >> (y) & 1) // 获取某一位 +#define BIT_REVERSE(x, y) (x) ^= (1 << y) // 某位取反 +#define BIT_IS_SET(x, b) ((x) & (b)) // 判断某一位是否为1 +#define BIT_IS_CLR(x, b) (!((x) & (b))) // 判断某一位是否为0 + +#endif + +#ifndef BF +/** + * @brief 从一个字节中提取指定位的值 + * @return {*} + * @note + *> uint8_t num = 0x12; 二进制表示为00010010

+ *> uint8_t bit = 2; 提取第2位(从0开始计数)

+ *> uint8_t width = 1; 提取1位

+ *> uint8_t result = BF(num, bit, width); 结果为1

+ */ +#define BF(x, b, s) (((x) & (b)) >> (s)) +#endif + +#ifndef MIN +/** + * @brief + * @return {*} + * @note + *> int num1 = 10;

+ *> int num2 = 20;

+ *> int result = MIN(num1, num2); // 结果为10

+ */ +#define MIN(n, m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX +/** + * @brief + * @return {*} + * @note + *> int num1 = 10;

+ *> int num2 = 20;

+ *> int result = MAX(num1, num2); // 结果为20

+ */ +#define MAX(n, m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS +/** + * @brief + * @return {*} + * @note + *> int num = -10; + *> int result = ABS(num); // 结果为10 + */ +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + +#ifndef RANGE +#define RANGE(x, a, b) (MIN(MAX(x, a), b)) +#endif + +/** + * @brief Macro to check if a value is between a minimum and maximum value (inclusive). + * @param x The value to check. + * @param min The minimum value. + * @param max The maximum value. + * @return Returns 1 if the value is between the minimum and maximum values (inclusive), 0 otherwise. + */ +#define IS_BETWEEN(x, min, max) ((x) >= min && (x) <= max) + +#define ARRAY_LEN(arr) (sizeof(arr)) / (sizeof(arr[0])) + +#define HI_UINT16(a) (((uint16_t)(a) >> 8) & 0xFF) +#define LO_UINT16(a) ((uint16_t)(a) & 0xFF) + +#define HI_1_UINT32(a) (((uint32_t)(a) >> 24) & 0xFF) +#define HI_2_UINT32(a) (((uint32_t)(a) >> 16) & 0xFF) +#define HI_3_UINT32(a) (((uint32_t)(a) >> 8) & 0xFF) +#define HI_4_UINT32(a) ((uint32_t)(a) & 0xFF) + +#define LO_1_UINT8(a) (uint8_t)((a) & 0xFF) +#define LO_2_UINT8(a) (uint8_t)(((a) & 0xFF00) >> 8) +#define LO_3_UINT8(a) (uint8_t)(((a) & 0xFF0000) >> 16) +#define LO_4_UINT8(a) (uint8_t)(((a) & 0xFF000000) >> 24) + +// uint32小端转大端 +#define S2B_UINT32(a) \ + (((uint32_t)(a) & 0xFF000000) >> 24) + (((uint32_t)(a) & 0x00FF0000) >> 8) + (((uint32_t)(a) & 0x0000FF00) << 8) + (((uint32_t)(a) & 0x000000FF) << 24) + +// uint32大端转小端 +#define B2S_UINT32(a) S2B_UINT32(a) + +// uint16小端转大端 +#define S2B_UINT16(a) ((((uint16_t)(a) & 0xFF00) >> 8) + (((uint16_t)(a) & 0x00FF) << 8)) + +// uint16大端转小端 +#define B2S_UINT16(a) S2B_UINT16(a) + +#define BUILD_UINT16(loByte, hiByte) \ + ((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +// float32小端转大端 +static inline float32 S2B_FLOAT32(float fv) +{ + float32_u _f; + _f.f = fv; + _f.c = S2B_UINT32(_f.c); + return _f.f; +} + +// float32大端转小端 +#define B2S_FLOAT32(a) S2B_FLOAT32(a) + +// 反序数组 +#define REVERSE_ARRAY(arr, len) \ + do \ + { \ + uint8_t _tmp; \ + uint16_t _i; \ + for (_i = 0; _i < len / 2; _i++) \ + { \ + _tmp = arr[_i]; \ + arr[_i] = arr[len - _i - 1]; \ + arr[len - _i - 1] = _tmp; \ + } \ + } while (0); + +// 比较2个数组是否相等 +#define IsEqual(arr1, arr2, n) ({ \ + int _equal = 1; \ + for (int _i = 0; _i < n; _i++) \ + { \ + if (arr1[_i] != arr2[_i]) \ + { \ + _equal = 0; \ + break; \ + } \ + } \ + _equal; \ +}) + +// ASSIC码转换为数字 +#define ASCII_TO_NUM(c) ((c) >= '0' && (c) <= '9' ? (c) - '0' : (c) - 'A' + 10) + +// 数字转换为ASSIC码 +#define NUM_TO_ASCII(x) ((x) < 10 ? (x) + '0' : (x) - 10 + 'A') + +#define FLOAT_TO_UINT16(x) (x * 8192 / 100 + 2048) ///> 浮点压缩uint16_t +#define UINT16_TO_FLOAT(x) (100 * (x - 2048) / 8192) ///> uint16转浮点 +#endif /* __DATA_TYPE_DEF_H_ */ diff --git a/User/system/lib/inc/debug.h b/User/system/lib/inc/debug.h new file mode 100644 index 0000000..e1745f0 --- /dev/null +++ b/User/system/lib/inc/debug.h @@ -0,0 +1,21 @@ +/*** + * @Author: + * @Date: 2023-04-04 08:13:11 + * @LastEditors: xxx + * @LastEditTime: 2023-04-04 13:21:46 + * @Description: + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ +#ifndef __DEBUG_H +#define __DEBUG_H +#include "lib.h" + +/*形参*/ +#define _DBG_LINE_ , uint16_t line +/*实参*/ +#define __DBG_LINE , __LINE__ + +extern BOOL DBG_ASSERT(uint8_t cond _DBG_LINE_); + +#endif //__DEBUG_H diff --git a/User/system/lib/inc/filter.h b/User/system/lib/inc/filter.h new file mode 100644 index 0000000..de165d9 --- /dev/null +++ b/User/system/lib/inc/filter.h @@ -0,0 +1,53 @@ +/** + * @file filter.h + * @author xxx + * @date 2023-08-08 22:59:46 + * @brief + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __FILTER_H__ +#define __FILTER_H__ +#include "lib.h" + +typedef struct +{ + float32 x; // 卡尔曼滤波器的估计值 + float32 a; // 状态转移矩阵(1,表示没有动态变化) + float32 h; // 观测矩阵(1,表示直接观测) + float32 q; // 过程噪声协方差 + float32 r; // 观测噪声协方差 + float32 p; // 估计误差协方差 + float32 gain; // 卡尔曼增益 + + float32 change_max; // 允许的最大变化量,用于判断观测值是否异常 +} kalman_t; // 卡尔曼滤波器结构 + +typedef struct +{ + BOOL fisrt_flag; // 第一次标志位 + float32 alpha; // 滤波系数 0~1 + float32 last_value; // 上次滤波结果 +} lpf_t; // 一阶低通滤波器 + +typedef struct +{ + uint16_t size; // 滑动窗口大小 + float32 *window; // 滑动窗口 + volatile float32 sum; // 滑动窗口和 + volatile float32 out; // 滤波结果 + uint16_t index; // 滑动窗口索引 +} lpf_window_t; // 滑动窗口滤波器 + +void kalman_init(kalman_t *cfg, float32 change_max); +float32 kalman_update(kalman_t *cfg, float32 input); + +void lpf_init(lpf_t *cfg); +float32 lpf_update(lpf_t *cfg, float32 input); +void lpf_reset(lpf_t *cfg); + +void lpf_window_init(lpf_window_t *cfg, uint16_t size); +void lpf_window_dinit(lpf_window_t *cfg); +float32 lpf_window_update(lpf_window_t *cfg, float32 input); +void lpf_window_reset(lpf_window_t *cfg); +#endif // __FILTER_H__ diff --git a/User/system/lib/inc/fsm.h b/User/system/lib/inc/fsm.h new file mode 100644 index 0000000..4bdb7b6 --- /dev/null +++ b/User/system/lib/inc/fsm.h @@ -0,0 +1,307 @@ +#ifndef __FSM_H__ +#define __FSM_H__ +#include +/* ----------------------- Defines ------------------------------------------*/ +// 用于快速识别出 STATE与STEP +#define FSM_STATE(name) state_##name +#define FSM_FUNCT(name) funct_##name + +// 数据类型定义区 +typedef signed char state; +typedef long long step_ret; +typedef void *AS_STEP_RETVAL; + +/*! + * @brief 状态机过程实现原型函数 + * 设计状态机时需要按照这个模式写 + * + * @param[in] void* 你所需要的任何参数 + * + * @return 返回值 代表下一个状态 + */ +typedef void *(*Procedure)(void *); + +typedef struct +{ + state ds; // 默认状态 + state cs; // 当前状态 + state ns; // 下个状态 +} SM_STATE; + +// 状态机 属性 定义 +typedef struct +{ + // 状态管理 + SM_STATE st; + + // 状态机跳转表 + Procedure *procedures; + + // 状态机数据区域 + void *data; + + // 错误处理(用于存放 状态 执行 的结果) + step_ret ret_ptr; // 状态 执行结果 + void *err_ptr; + state err_flag; +} FSM; + +/* ----------------------- Start function declaration -----------------------------*/ + +/*! + * @brief 设置状态机的错误容器 + * + * @param[in] fsm 状态机实例 + * + * @param[in] err_var 容器 + * + * @return 是/否 + */ +static inline void set_err_var(FSM *fsm, void *err_var) +{ + if (!fsm) + return; + fsm->err_ptr = err_var; +} + +/*! + * @brief 获取错误值容器(用于读取其中的内容) + * + * @param[in] fsm 状态机实例 + * + * @return 是/否 + */ +static inline void *get_err_var(FSM *fsm) +{ + return fsm->err_ptr; +} + +/*! + * @brief 获取状态机 在 步进中是否遇到了错误。 + * + * @param[in] fsm 状态机实例 + * + * @return 是/否 + */ +static inline state is_fsm_error(FSM *fsm) +{ + return fsm->err_flag; +} + +/*! + * @brief 置 状态机 错误位 + * + * @param[in] fsm 状态机实例 + * + * @return 是/否 + */ +static inline state set_fsm_error_flag(FSM *fsm) +{ + if (!fsm) + return -1; + fsm->err_flag = 1; + return 0; +} + +/*! + * @brief 置 状态机 错误位 + * + * @param[in] fsm 状态机实例 + * + * @return 是/否 + */ +static inline state clr_fsm_error_flag(FSM *fsm) +{ + if (!fsm) + return -1; + fsm->err_flag = 0; + return 0; +} + +/*! + * @brief 为状态机添加 过程方法 序列 + * + * @param[in] fsm 状态机实例 + * + * @param[in] procedures 状态机的所有过程方法 + * + */ +static inline void set_procedures(FSM *fsm, Procedure *procedures) +{ + if (fsm) + { + fsm->procedures = procedures; + fsm->st.cs = -1; // 执行run之前,当前状态是未定的 + } +} + +/*! + * @brief 配置状态机的数据域 + * + * @param[in] fsm 状态机实例 + * + * @param[in] data 状态机需要的数据域 + * + */ +static inline void set_data_entry(FSM *fsm, void *data) +{ + if (fsm) + fsm->data = data; +} + +/*! + * @brief 配置状态机的数据域 + * + * @param[in] fsm 状态机实例 + * + * @return 返回 状态机 数据域 + * + */ +static inline void *get_data_entry(FSM *fsm) +{ + return fsm->data; +} + +/*! + * @brief 让 状态机 步进一次 + * + * @param[in] fsm 状态机实例 + * + * @return 非负数 :代表 所成功执行的状态 + * -1 : 失败 + */ +static inline state run_state_machine_once(FSM *fsm) +{ + if (!fsm) + return -1; + + // 切换到新状态 + fsm->st.cs = fsm->st.ns; + + // 跳转到下一个状态(状态 执行 结果 保存在 ret_ptr 中 ) + fsm->ret_ptr = (step_ret)fsm->procedures[fsm->st.cs](fsm); + + return fsm->st.cs; +} + +/*! + * @brief 获取步进执行结果 + * + * @param[in] fsm 状态机实例 + * + * @return 是/否 + */ +static inline step_ret *get_step_retval(FSM *fsm) +{ + return &fsm->ret_ptr; +} + +/*! + * @brief 获取状态机的当前状态 + * + * @param[in] fsm 状态机实例 + * + * @return 当前状态 + */ +static inline state get_curr_state(FSM *fsm) +{ + return fsm->st.cs; +} + +/*! + * @brief 设置状态机默认状态 + * + * @param[in] fsm 状态机实例 + * + * @param[in] st 状态值 + * + */ +static inline void set_default_state(FSM *fsm, state st) +{ + if (!fsm) + return; + fsm->st.ds = st; + fsm->st.ns = st; +} + +/*! + * @brief 设置状态机的下次状态 + * + * @param[in] fsm 状态机实例 + * + * @param[in] st 状态值 + * + */ +static inline void set_next_state(FSM *fsm, state st) +{ + if (fsm) + fsm->st.ns = st; +} + +/*! + * @brief 获取状态机的下次状态 + * + * @param[in] fsm 状态机实例 + * + * @return 下一个状态 + */ +static inline state get_next_state(FSM *fsm) +{ + return fsm->st.ns; +} + +/*! + * @brief 将状态机设为默认状态 + * + * @param[in] fsm 状态机实例 + * + */ +static inline void init_state_machine(FSM *p) +{ + set_next_state(p, p->st.ds); + p->st.cs = -1; // 执行run之前,当前状态是未定的 +} + +/*! + * @brief 将状态机设为默认状态,同时清除错误状态 + * + * @param[in] fsm 状态机实例 + * + */ +static inline void reset_state_machine(FSM *p) +{ + if (!p) + return; + clr_fsm_error_flag(p); + init_state_machine(p); +} + +/*! + * @brief 判断状态机是否在某个状态 + * + * @param[in] fsm 状态机实例 + * + * @param[in] st 状态值 + * + * @return 是/否 + */ +static inline state is_curr_state(FSM *fsm, state st) +{ + return fsm->st.cs == st; +} + +/*! + * @brief 判断状态机是否即将进行某个状态 + * + * @param[in] fsm 状态机实例 + * + * @param[in] st 状态值 + * + * @return 是/否 + */ +static inline state is_next_state(FSM *fsm, state st) +{ + return fsm->st.ns == st; +} + +#endif // __FSM_H__ diff --git a/User/system/lib/inc/lib.h b/User/system/lib/inc/lib.h new file mode 100644 index 0000000..724bfaa --- /dev/null +++ b/User/system/lib/inc/lib.h @@ -0,0 +1,140 @@ +/*** + * @Author: + * @Date: 2023-04-04 08:13:11 + * @LastEditors: xxx + * @LastEditTime: 2023-04-04 10:13:21 + * @Description: + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __LIB_H +#define __LIB_H +#include +#include +#include +#include "data_type_def.h" +#include "malloc.h" +#include "data_analysis.h" +#include "osel_arch.h" +#include "debug.h" +#include "sqqueue.h" +#include "clist.h" + +#define INTERNAL_EXTERN extern + +#ifndef STM32 +#include "log.h" +#else +#define LOG_PRINT(fmt, ...) \ + do \ + { \ + } while (0); +#define LOG_ERR(fmt, ...) \ + do \ + { \ + } while (0); +#define LOG_HEX(data, len) \ + do \ + { \ + } while (0); + +#endif + +#define EXIT(x) \ + do \ + { \ + DBG_ASSERT(FALSE, __DBG_LINE); \ + } while (0); + +////< 时间结构 +typedef union +{ + uint8_t data[6]; + struct + { + uint8_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + } date; +} date_time_t; + +typedef struct +{ + uint16_t year; + uint8_t month; + uint8_t day; +} rtc_date_t; + +typedef struct +{ + uint8_t hour; + uint8_t minute; + uint8_t second; +} rtc_time_t; + +typedef struct +{ + float32 x; + float32 y; +} point_t; + +typedef struct +{ + float32 a; + float32 b; +} linear_func_param_t; + +#define S_CURVE_POINTS 70 +typedef struct +{ + float32 start; + float32 end; + float32 current; + float32 t[S_CURVE_POINTS]; + uint16_t index; +} s_curve_generator_t; + +extern void assic_to_str(uint8_t *assic, uint8_t len, uint8_t *str); // ASCII码转字符串 +extern void get_cpu_id(uint32_t *id); // 获取CPU ID +extern uint32_t cpu_encrypt(void); // CPU加密 +extern BOOL cpu_judge_encrypt(uint32_t cupid_encrypt); // CPU判断加密 +extern void version_split(uint8_t *version, uint8_t *hi, uint8_t *lo); // 版本号1.0拆解成1和0 +extern void reverse(uint8_t *buf, uint16_t len); // 反序数组 +extern BOOL is_in_array(uint16_t *arr, uint16_t len, uint16_t val); // 判断val是否在数组arr中 +extern BOOL is_same_value(uint8_t *buf, uint16_t len, uint8_t value); // 判断数组中的值是否都相等 +extern uint16_t crc16_compute(const uint8_t *const data, uint16_t length); // CRC16校验 +extern uint32_t crc32_compute(const uint8_t *const data, uint16_t length); // CRC32校验 +extern uint64_t crc64_compute(const uint8_t *const data, const uint16_t length); // CRC64校验 +extern uint8_t xor_compute(const uint8_t *const data, uint16_t length); // 异或校验 +extern uint8_t get_bit_num(uint8_t bit); // 获取bit位的值 +extern BOOL is_bit_set(int x, int k); // 判断x的第k位是否为1 +extern uint8_t is_leap_year(uint16_t year); // 检查是否是闰年 +extern BOOL is_valid_date(uint8_t year, uint8_t month, uint8_t day); // 检查日期是否有效 +extern BOOL is_valid_time(uint8_t hour, uint8_t minute, uint8_t second); // 检查时间是否有效 +extern BOOL is_valid_datetime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second); // 检查日期和时间是否有效 +extern uint32_t days_since_1970(uint16_t year, uint8_t month, uint8_t day); // 计算从1970年1月1日到给定年月日的天数 +extern uint32_t date_to_seconds(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second); // 将日期转换为秒数 +extern void seconds_to_date(uint32_t total_seconds, rtc_date_t *date, rtc_time_t *time); // 将秒数转换为日期 +extern uint16_t dayOfyear(uint16_t year, uint8_t month, uint8_t day); // 计算一年中的第几天 +extern uint16_t weekOfyear(uint16_t year, uint8_t month, uint8_t day); // 计算一年中的第几周 +extern uint8_t get_weekday(uint16_t year, uint8_t month, uint8_t day); // 获取今天星期几 +extern uint8_t hex_format_dec(uint8_t hex); // 十六进制转十进制 +extern uint8_t dec_format_hex(uint8_t dec); // 十进制转十六进制 +extern void quicksort(uint16_t arr[], int low, int high); // 快速排序 +extern void insertion_sort(uint16_t arr[], uint16_t n); // 插入排序 + +extern uint32_t time2stamp(const rtc_date_t *const date, const rtc_time_t *const time); // 日期时间转时间戳 +extern void stamp2time(uint32_t stamp, rtc_date_t *date, rtc_time_t *time); // 时间戳转北京时间 +extern void convert_seconds(uint32_t total_seconds, char *date); // 秒数转换成时分秒 +extern void add_commas(uint32_t num, char *result); // 数字添加逗号 + +extern linear_func_param_t calculate_linear_regression(const point_t *points, int32_t count); // 计算线性回归 +extern float32 get_linearity_value(const point_t *points, int32_t count, linear_func_param_t param); // 获取线性度 + +void s_curve_generator_init(s_curve_generator_t *gen, float32 start); +float32 s_curve_generate_point(s_curve_generator_t *gen, float32 target); +#endif //__LIB_H diff --git a/User/system/lib/inc/log.h b/User/system/lib/inc/log.h new file mode 100644 index 0000000..802ba9f --- /dev/null +++ b/User/system/lib/inc/log.h @@ -0,0 +1,45 @@ +/*** + * @Author: + * @Date: 2023-03-20 19:27:47 + * @LastEditors: xxx + * @LastEditTime: 2023-03-30 00:34:41 + * @Description:日志打印模块PC端调试使用 + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __LOG_H_ +#define __LOG_H_ +#include +#include + +#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1) : __FILE__) + +/*调试日志宏定义*/ + +#define LOG_PRINT(fmt, ...) \ + do \ + { \ + printf("[DEBUG:%s][%s:%d] " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ + } while (0); + +/*错误日志打印(在日志打印模块还未启动时使用)*/ +#define LOG_ERR(fmt, ...) \ + do \ + { \ + printf("[ERROR:%s][%s:%d] " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ + } while (0); + +// 打印十六进制字符串 +#define LOG_HEX(data, len) \ + do \ + { \ + printf("[DEBUG:%s][%s:%d] ", __FILENAME__, __FUNCTION__, __LINE__); \ + for (int i = 0; i < len; i++) \ + { \ + printf("%02x ", data[i]); \ + } \ + printf("\n"); \ + } while (0); + +#endif //__LOG_H_ diff --git a/User/system/lib/inc/malloc.h b/User/system/lib/inc/malloc.h new file mode 100644 index 0000000..5fc5468 --- /dev/null +++ b/User/system/lib/inc/malloc.h @@ -0,0 +1,45 @@ +#ifndef _MOLLOC_H +#define _MOLLOC_H + +#include "../inc/data_type_def.h" + +#ifndef NULL +#define NULL 0 +#endif + +// 定义两个内存池 +#define SRAMIN 0 // 内部内存池 +#define SRAMEX 1 // 外部内存池(精英STM32开发板不支持外部内存) +// 我们又多少个SRAM可管理 +#define SRAMBANK 2 // 定义支持的SRAM块数. 精英版实际上只支持1个内存区域,即内部内存. + +// mem1内存参数设定.mem1完全处于内部SRAM里面.(设置内部SARM的内存池和内存表的参数) +#define MEM1_BLOCK_SIZE 8 // 一个内存块大小为32字节 +#define MEM1_MAX_SIZE 8 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小) +#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE // 内存表大小(有多少块内存块) + +// mem2内存参数设定.mem2的内存池处于外部SRAM里面 +#define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节 +#define MEM2_MAX_SIZE 0 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值 +#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小 + +// 内存管理控制器结构体 +// 注意:内存管理由内存池和内存列表组成 +// SRAMBANK:SARM块数,一般有内部SRAM和外部SRAM、CCM +struct _m_mallco_dev +{ + void (*init)(uint8_t); // 初始化 + uint8_t (*perused)(uint8_t); // 内存使用率 + uint8_t *membase[SRAMBANK]; // 内存池 管理SRAMBANK个区域的内存 + uint16_t *memmap[SRAMBANK]; // 内存管理状态表 + uint8_t memrdy[SRAMBANK]; // 内存管理是否就绪 +}; + +void my_mem_init(uint8_t memx); +uint8_t my_mem_perused(uint8_t memx); + +void *mymalloc(uint8_t memx, uint32_t size); +void myfree(uint8_t memx, void *ptr); +void *myrealloc(uint8_t memx, void *ptr, uint32_t size); + +#endif diff --git a/User/system/lib/inc/mlist.h b/User/system/lib/inc/mlist.h new file mode 100644 index 0000000..ebc043f --- /dev/null +++ b/User/system/lib/inc/mlist.h @@ -0,0 +1,268 @@ +/*** + * @Author: + * @Date: 2023-04-04 08:39:32 + * @LastEditors: xxx + * @LastEditTime: 2023-04-04 08:46:20 + * @Description:双向链表操作接口 该双向链表的操作,请参照Linux内核 (include/linux/list.h) + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __LIST_H +#define __LIST_H +#include +#include "data_type_def.h" +typedef struct list_head +{ + struct list_head *next; + struct list_head *prev; +} list_head_t; + +/** + * 获得链表元素所在实体的地址, 该实体在链表中保存 + * + * @param ptr: 链表的入口指针 + * @param type: 结构类型 + * @param member: 元素结构中链表变量的名字 + * + * @return 指向该元素所在实体的指针 + */ +#define list_entry_addr_find(ptr, type, member) \ + ((type *)((char *)(ptr) - (char *)(&((type *)NULL)->member))) + +/** + * 移除并返回链表中首元素所在的实体,该实体在链表中不保存 + * + * @param head: 链表的入口指针 + * @param type: 结构类型 + * @param member: 指向该链表的第一个元素的指针 + * + * @return 表首元素所在实体的指针,链表为空则返回空指针 + */ +#define list_entry_decap(head, type, member) \ + ( \ + (list_empty(head)) ? (type *)NULL \ + : (list_entry_addr_find(list_next_elem_get(head), type, member))) + +#define list_entry_get_head(head, type, member) \ + ((list_empty(head)) ? (type *)NULL : (list_entry_addr_find((head)->next, type, member))) +/** + * 移除并返回链表尾部所在实体,该实体在链表中不保存 + * + * @param head: 链表入口指针 + * @param type: 链表所在结构体的名称 + * @param member: 结构体中,链表变量的名称 + * + * @return 表尾部所在实体指针,链表为空则返回空指针 + */ +#define list_entry_curtail(head, type, member) \ + ((list_empty(head)) ? (type *)NULL \ + : (list_entry_addr_find(list_curtail(head), type, member))) + +/** + * 正向遍历链表,在该遍历中不能对链表做删除操作 -- list_for_each + * + * @param pos: 链表元素计数器 + * @param head: 链表的入口指针 + */ +#define list_for_each_forwards(pos, head) \ + for ((pos) = (head)->next; (pos) != (head); (pos) = (pos)->next) + +/** + * 反向遍历链表,在该遍历中不能对链表做删除操作 + * + * @param pos: 链表元素计数器 + * @param head: 链表的入口指针 + */ +#define list_for_each_backwards(pos, head) \ + for ((pos) = (head)->prev; (pos) != (head); (pos) = (pos)->prev) + +/** + * 链表遍历,支持删除操作 + * + * @param pos: 链表元素计数器 + * @param n: 临时链表元素 + * @param head: 链表入口指针 + */ +#define list_for_each_safe(pos, n, head) \ + for ((pos) = (head)->next, n = (pos)->next; (pos) != (head); \ + (pos) = n, n = (pos)->next) + +/** + * 遍历链表所在实体,不可删除实体 + * + * @param pos: 链表元素计数器 + * @param head: 链表入口指针 + * @param type: 链表所在结构体的名称 + * @param member: 结构体中,链表变量的名称 + */ +#define list_entry_for_each(pos, head, type, member) \ + for ((pos) = list_entry_addr_find((head)->next, type, member); \ + &(pos)->member != (head); \ + (pos) = list_entry_addr_find((pos)->member.next, type, member)) + +/** + * 遍历链表所在实体, 支持删除操作 + * + * @param pos: 链表元素计数器 + * @param n: 临时链表元素 + * @param head: 链表入口指针 + * @param type: 链表所在结构体的名称 + * @param member: 结构体中,链表变量的名称 + */ +#define list_entry_for_each_safe(pos, n, head, type, member) \ + for ((pos) = list_entry_addr_find((head)->next, type, member), \ + n = list_entry_addr_find((pos)->member.next, type, member); \ + &(pos)->member != (head); \ + (pos) = n, n = list_entry_addr_find(n->member.next, type, member)) + +/** + * 计算链表中元素的个数 + */ +#define list_count(head, count) \ + do \ + { \ + count = 0; \ + for (list_head_t *pos = (head)->next; pos != (head); pos = pos->next) \ + { \ + count++; \ + } \ + } while (0) + +/** + * 将实体按顺序插入到链表中合适的地方,顺序由函数funcCompare来决定 -- list_sorted_add + * + * @param new_entry: 所要插入的实体 + * @param head: 链表头 + * @param type: 链表所在结构体的名称 + * @param member: 结构体中,链表变量的名称 + * @param func_compare: 顺序比较函数,声明:bool func_compare(Node* A, Node* B) + * 如果 A < B, 返回 true, 否则返回 false + * @param pos: 链表元素计数器 + */ +#define list_entry_sorted_add(new_entry, head, type, member, func_compare, pos) \ + do \ + { \ + type *entry_a = NULL; \ + type *entry_b = NULL; \ + for ((pos) = (head)->next; (pos) != (head); (pos) = (pos)->next) \ + { \ + entry_a = list_entry_addr_find((new_entry), type, member); \ + entry_b = list_entry_addr_find((pos), type, member); \ + if (func_compare(entry_a, entry_b)) \ + { \ + break; \ + } \ + } \ + if ((pos) != (head)) \ + { \ + list_insert_forwards((new_entry), (pos)); \ + } \ + else \ + { \ + list_add_to_tail((new_entry), (head)); \ + } \ + } while (__LINE__ == -1) + +/** + * 链表头初始化 + * + * @param ptr: 需要被初始化的链表头指针 + */ +void list_init(list_head_t *const ptr); + +/** + * 在指定位置之前插入新的元素 + * + * @param new_entry: 需要放入链表中的新元素 + * @param pos: 链表中放入新元素的位置指针 + */ +void list_insert_forwards(list_head_t *const new_entry, list_head_t *const pos); + +/** + * 在指定位置之后插入新的元素 + * + * @param new_entry: 需要放入链表中的新元素 + * @param pos: 链表中放入新元素的位置指针 + */ +void list_insert_backwards(list_head_t *const new_entry, list_head_t *const pos); + +/** + * 在链表尾部之后插入新的元素 -- list_append + * + * @param new_entry: 需要放入链表尾部的新元素 + * @param list: 链表头指针 + */ +void list_add_to_tail(list_head_t *const new_entry, list_head_t *const list); + +/** + * 在链表头部之后插入新的元素 + * + * @param new_entry: 需要放入链表尾部的新元素 + * @param list: 链表头指针 + */ +void list_add_to_head(list_head_t *const new_entry, list_head_t *const list); + +/** + * 将指定元素从链表中删除 + * + * @param elem: 需要删除的链表元素 + */ +void list_del(list_head_t *const elem); + +/** + * 将链表的尾元素删除并返回 + * + * @param head: 链表指针 + * + * @return 链表尾元素 + */ +list_head_t *list_curtail(const list_head_t *const head); + +/** + * 判断链表是否为空 + * + * @param head: 链表头指针 + * + * @return 为空时返回TRUE,否则为FALSE + */ +bool list_empty(const list_head_t *const head); + +/** + * 获取链表中第一个元素的地址 -- list_get_head + * + * @param head: 链表头指针 + * + * @return 首元素的地址 + */ +list_head_t *list_first_elem_look(const list_head_t *const head); + +/** + * 取出给定位置的下一个元素 + * + * @param pos: 链表元素地址 + * + * @return 下一个链表元素地址 + */ +list_head_t *list_next_elem_get(const list_head_t *const pos); + +/** + * 将一个元素从一个链表中移除,然后再插入另外一个链表中的头部 + * + * @param elem: 被移除的链表元素 + * @param head: 新链表头 + */ +void list_move_to_another_head(list_head_t *const elem, list_head_t *const head); + +/** + * 将一个元素从一个链表中移除,然后再放入另外一个链表中的尾部 + * + * @param elem: 被移除的链表元素 + * @param head: 新链表头 + */ +void list_move_to_another_tail(list_head_t *const elem, list_head_t *const head); + +#endif +/** + * @} + */ diff --git a/User/system/lib/inc/osel_arch.h b/User/system/lib/inc/osel_arch.h new file mode 100644 index 0000000..d310e23 --- /dev/null +++ b/User/system/lib/inc/osel_arch.h @@ -0,0 +1,181 @@ +/*** + * @Author: + * @Date: 2023-04-04 08:13:11 + * @LastEditors: xxx + * @LastEditTime: 2023-04-04 08:16:58 + * @Description: + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __OSEL_ARCH_H__ +#define __OSEL_ARCH_H__ + +#include "lib.h" +#define hal_int_state_t char +#ifdef STM32 +#include "main.h" +#define HAL_ENTER_CRITICAL(__HANDLE__) \ + do \ + { \ + if ((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + } while (0U) + +#define HAL_EXIT_CRITICAL(__HANDLE__) \ + do \ + { \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + } while (0U) +#else +#define HAL_ENTER_CRITICAL(__HANDLE__) + +#define HAL_EXIT_CRITICAL(__HANDLE__) + +#endif + +#define osel_memset _memset +#define osel_memcmp _memcmp +#define osel_memcpy _memcpyL +#define osel_memcpyr _memcpyR +#define osel_reverse _reverse +#define osel_mem_alloc _malloc +#define osel_mem_free _free +#define osel_mem_alloc2 _malloc2 +#define osel_mem_free2 _free2 +#define osel_mstrlen _mstrlen + +static inline void *_malloc(uint32_t size) +{ + return mymalloc(SRAMIN, size); +} + +static inline void _free(void *ptr) +{ + myfree(SRAMIN, ptr); +} + +static inline void *_malloc2(uint32_t size) +{ + return mymalloc(SRAMEX, size); +} + +static inline void _free2(void *ptr) +{ + myfree(SRAMEX, ptr); +} + +/** + * @brief Fills a block of memory with a given value. + * + * @param dst The destination block of memory. + * @param value The value to fill the memory with. + * @param size The size of the memory block, in bytes. + */ +static inline void _memset(uint8_t *dst, uint8_t value, uint16_t size) +{ + while (size--) + { + *dst++ = value; + } +} + +/** + * @brief Compares two blocks of memory for equality. + * + * @param[in] dst The first block of memory to compare. + * @param[in] src The second block of memory to compare. + * @param[in] size The number of bytes to compare. + * + * @return 0 if the blocks of memory are equal, -1 otherwise. + */ +static inline int8_t _memcmp(const uint8_t *dst, const uint8_t *src, uint16_t size) +{ + while (size--) + { + if (*dst++ != *src++) + { + return -1; + } + } + return 0; +} + +/** + * @brief Copies data from a source buffer to a destination buffer in a forward direction. + * + * @param dst The destination buffer. + * @param src The source buffer. + * @param size The number of bytes to copy. + */ +static inline void _memcpyL(uint8_t *dst, const uint8_t *src, uint16_t size) +{ + while (size--) + { + *dst++ = *src++; + } +} + +/** + * @brief Copies data from a source buffer to a destination buffer in reverse order. + * + * @param dst The destination buffer. + * @param src The source buffer. + * @param size The number of bytes to copy. + */ +static inline void _memcpyR(uint8_t *dst, const uint8_t *src, uint16_t size) +{ + // dst is a pointer to the last byte of the destination buffer + // src is a pointer to the first byte of the source buffer + // size is the number of bytes to copy + + // decrement the destination pointer by the size, since we want to write to the last byte of the buffer + dst = dst + (size - 1); + + // loop through each byte in the buffer, copying from the source to the destination in reverse order + while (size--) + { + // write the next byte from the source to the destination + *dst-- = *src++; + } +} + +/** + * @brief Reverses the order of bytes in a buffer + * + * @param buf The buffer to reverse + * @param len The length of the buffer, in bytes + */ +static inline void _reverse(uint8_t *buf, uint16_t len) +{ + uint8_t temp = 0; + uint16_t i; + for (i = 0; i < len / 2; i++) + { + temp = buf[i]; + buf[i] = buf[len - i - 1]; + buf[len - i - 1] = temp; + } +} +/** + * @brief Returns the length of a null-terminated string + * + * @param s The string to measure + * @return The length of the string, not including the null terminator + */ +static inline unsigned int _mstrlen(const unsigned char *s) +{ + const unsigned char *ss = s; + while (*ss) + ss++; + + return ss - s; +} + +#endif // __OSEL_ARCH_H__ diff --git a/User/system/lib/inc/pbuf.h b/User/system/lib/inc/pbuf.h new file mode 100644 index 0000000..ee3a6ce --- /dev/null +++ b/User/system/lib/inc/pbuf.h @@ -0,0 +1,169 @@ +/*** + * @Author: + * @Date: 2023-04-04 10:06:40 + * @LastEditors: xxx + * @LastEditTime: 2023-04-04 13:21:27 + * @Description: + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef COMPONENTS_COMMON_INCLUDE_PBUF_H_ +#define COMPONENTS_COMMON_INCLUDE_PBUF_H_ +#include "../inc/data_type_def.h" +#include "../inc/mlist.h" +#include "../inc/malloc.h" + +#define PBUF_DBG_EN (1u) +#define PBUF_TYPE_MAX_NUM (3u) + +#define PBUF_NUM_MAX (10u) + +// 如果size>254,并使用data_analysis接收数据,需要修改data_analysis.c中的DATA_BUF_RECV_SQQ_LEN +#define SMALL_PBUF_BUFFER_SIZE (32) +#define MEDIUM_PBUF_BUFFER_SIZE (32 * 2) +#define LARGE_PBUF_BUFFER_SIZE (32 * 4) + +#define SMALL_PBUF_NUM (4u) // 各种PBUF最大个数 +#define MEDIUM_PBUF_NUM (4u) +#define LARGE_PBUF_NUM (4u) + +#if PBUF_DBG_EN > 0 + +/*形参*/ +#define _PLINE1_ , uint16_t line +#define _PLINE2_ , uint16_t line +/*实参*/ +#define __PLINE1 , __LINE__ +#define __PLINE2 , __LINE__ + +#else + +#define _PLINE1_ +#define _PLINE2_ +#define __PLINE1 +#define __PLINE2 + +#endif + +enum _PBUF_TYPE +{ + SMALL_PBUF, + MEDIUM_PBUF, + LARGE_PBUF, + PBUF_TYPE_INVALID +}; + +typedef struct __send_times_t +{ + uint8_t app_send_times; + uint8_t mac_send_times; +} send_times_t; + +typedef struct +{ + int8_t rssi_dbm; + uint8_t seq; + + nwk_id_t src_id; // 接收到数据帧时,为同步模块提供同步对象信息; + nwk_id_t dst_id; // 填写帧的目的节点网络地址 + + uint8_t send_mode : 2, + is_ack : 1, + need_ack : 1, + crc_ok : 1, + is_pending : 1, + debug_info : 1, + reserved : 1; + + send_times_t already_send_times; +} pkt_attri_t; + +typedef struct +{ + struct list_head list; + uint8_t *data_p; // 指向数据区 + uint8_t *head; // 指向数据区的第一个字节 + uint8_t *end; // 指向数据区的最后一个字节 + uint16_t data_len; // 该pbuf的实际数据长度 + pkt_attri_t attri; + bool used; +#if PBUF_DBG_EN > 0 + uint16_t alloc_line; + uint16_t free_line; +#endif +} pbuf_t; + +/** + * pbuf_initz: 为pbuf申请一块内存区域,需要配置各种pbuf的大小和数量等 + */ +void pbuf_initz(void); + +/** + * 申请一个pbuf,用来存放用户数据 + * + * @param size: 用户的数据长度 + * @param _PLINE1_: pbuf_allocz()位置的行号,调用时传入实参形式__PLINE1 + * + * @return: 申请成功则返回pbuf的指针,失败则进入断言 + */ +extern pbuf_t *pbuf_allocz(uint16_t size _PLINE1_); + +/** + * 释放已经使用完的pbuf + * + * @param pbuf: 需要操作的pbuf的指针的指针 + * @param _PLINE2_: 调用pbuf_freez()位置的行号,调用时传入实参形式__PLINE2 + * + * @return: 无 + */ +void pbuf_freez(pbuf_t **const pbuf _PLINE2_); + +/** + * 向pbuf->end方向移动pbuf->data_p指针,移动距离为len + * + * @param pbuf: 需要操作的pbuf的指针 + * @param len: data_p需要移动的距离 + * + * @return: 成功则返回data_p指针,失败返回NULL + */ +extern uint8_t *pbuf_skip_datap_forward(pbuf_t *const pbuf, + uint8_t len); + +/** + * 向pbuf->head方向移动pbuf->data_p指针,移动距离为len + * + * @param pbuf: 需要操作的pbuf的指针 + * @param len: data_p需要移动的距离 + * + * @return: 成功则返回data_p指针,失败返回NULL + */ +extern uint8_t *pbuf_skip_datap_backward(pbuf_t *const pbuf, + uint8_t len); + +/** + * 向pbuf的数据区拷贝数据,并移动data_p指针,改变data_len + * + * @param pbuf: 目的地址pbuf的指针(从pbuf->data_p开始拷贝) + * @param src: 源地址的指针 + * @param len: 需要拷贝的数据长度 + * + * @return: 成功则返回TRUE, 失败则返回FALSE + */ +extern bool pbuf_copy_data_in(pbuf_t *const pbuf, + const uint8_t *const src, + uint8_t len); + +/** + * 从pbuf的数据区拷贝数据,并移动data_p指针,不改变data_len + * + * @param dst: 目的地址的指针 + * @param pbuf: 源地址pbuf的指针(从pbuf->data_p开始拷贝) + * @param len: 需要拷贝的数据长度 + * + * @return: 成功则返回TRUE, 失败则返回 + */ +extern bool pbuf_copy_data_out(uint8_t *const dst, + pbuf_t *const pbuf, + uint8_t len); +#endif /* COMPONENTS_COMMON_INCLUDE_PBUF_H_ */ diff --git a/User/system/lib/inc/sqqueue.h b/User/system/lib/inc/sqqueue.h new file mode 100644 index 0000000..aac846c --- /dev/null +++ b/User/system/lib/inc/sqqueue.h @@ -0,0 +1,52 @@ +/** + * @file sqqueue.h + * @author xxx + * @date 2023-06-25 13:07:02 + * @brief 提供循环队列功能 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef __SQQUEUE_H +#define __SQQUEUE_H +#include "data_type_def.h" + +typedef struct _sqqueue_t +{ + uint8_t *base; // 队列存储元素的首地址 + uint8_t entry_size; // 队列元素的宽度 + uint16_t sqq_len; // 队列总长 + uint16_t front; // 队列头下标 + uint16_t rear; // 队列尾下标 +} sqqueue_t; + +/** + * 通用循环队列伪类 + * 该队列有九个操作,分别为单元素入队列、多元素入队列、出队列, + * 单元素撤销入队列(队尾删除)、取队列长度、判空、清空队列、遍历和删除指定位置 + */ +typedef struct _sqqueue_ctrl_t +{ + sqqueue_t sqq; + BOOL(*enter) + (struct _sqqueue_ctrl_t *const p_this, const void *const e); // 单元素入队列 + BOOL(*string_enter) + (struct _sqqueue_ctrl_t *const p_this, const void *const string, uint16_t len); // 多元素入队列 + void *(*del)(struct _sqqueue_ctrl_t *const p_this); // 出队列 + void *(*revoke)(struct _sqqueue_ctrl_t *const p_this); // 撤销入队列 + uint16_t (*get_len)(const struct _sqqueue_ctrl_t *const p_this); // 取队列长度 + BOOL(*full) + (const struct _sqqueue_ctrl_t *const p_this); // 判满 + void (*clear_sqq)(struct _sqqueue_ctrl_t *const p_this); // 清空队列 + void (*traverse)(struct _sqqueue_ctrl_t *const p_this, void (*vi)(const void *e)); // 遍历 + void (*remove)(struct _sqqueue_ctrl_t *const p_this, uint16_t location); // 删除指定位置 +} sqqueue_ctrl_t; + +BOOL sqqueue_ctrl_init(sqqueue_ctrl_t *const p_this, + uint8_t entry_size, + uint16_t sqq_len); ///< 初始化 + +void sqqueue_ctrl_dinit(sqqueue_ctrl_t *const p_this); ///< 销毁 +#endif +/** + * @} + */ diff --git a/User/system/lib/inc/storage.h b/User/system/lib/inc/storage.h new file mode 100644 index 0000000..1d53951 --- /dev/null +++ b/User/system/lib/inc/storage.h @@ -0,0 +1,52 @@ +/** + * @file storage.h + * @author xushenghao + * @date 2024-11-15 15:57:02 + * @brief 一个存储库,不支持平衡擦写 + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#ifndef __STORAGE_H__ +#define __STORAGE_H__ +#include "sys.h" +#include "lib.h" + +typedef struct +{ + uint16_t index; + uint16_t size; + uint32_t address; +} storage_node_t; + +typedef struct +{ + clist_node_t *head; + struct + { + uint32_t base_addr; ///< 存储器基地址 + uint16_t page_size; ///< 存储器页大小 + uint16_t variable_count; ///< 存储器变量数量 + uint16_t variable_size; ///< 存储器变量占用大小,如果变量大小不够一页剩余部分则写入下一页,上一页剩余字节计入变量占用大小 + uint16_t page_count; ///< 变量占用存储器页数 + } params; + + struct + { + BOOL(*read) + (uint32_t addr, uint8_t *buf, uint16_t size); + BOOL(*write) + (uint32_t addr, uint8_t *buf, uint16_t size); + BOOL(*erase_page) + (uint32_t page); + } ops; +} storage_t; + +storage_t *storage_init(uint32_t base_addr, uint16_t page_size); ///< 初始化存储器 +void storage_destroy(storage_t *storage); ///< 销毁存储器 +void storage_add_node(storage_t *storage, uint16_t index, uint16_t size); ///< 添加存储节点 +BOOL storage_write(storage_t *storage, uint16_t index, const uint8_t *buf); ///< 存储数据 +BOOL storage_read(storage_t *storage, uint16_t index, uint8_t *buf); ///< 读取数据 +BOOL storage_write_all(storage_t *storage, const uint8_t *buf); ///< 存储所有数据 +BOOL storage_read_all(storage_t *storage, uint8_t *buf); ///< 读取所有数据 +BOOL storage_check(storage_t *storage, uint16_t index, uint8_t *buf); ///< 检查存储数据 +BOOL storage_check_all(storage_t *storage, uint8_t *buf); ///< 检查所有存储数据 +#endif // __STORAGE_H__ diff --git a/User/system/lib/inc/wl_flash.h b/User/system/lib/inc/wl_flash.h new file mode 100644 index 0000000..694fac9 --- /dev/null +++ b/User/system/lib/inc/wl_flash.h @@ -0,0 +1,108 @@ +/** + * @file wl_flash.h + * @author xushenghao + * @date 2024-07-22 13:57:02 + * @brief + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +/** + * @brief 磨损平衡算法 + * + * 1. 初始化block_page大小和当前写入地址 + * 2. 写入数据前,检查剩余空间是否足够 + * a. 如果足够,直接写入数据 + * b. 如果不足够,执行以下步骤: + * i. 检查是否有已擦除但未使用的block_page,如果有,移动到该block_page继续写入 + * ii. 如果没有已擦除的block_page,检查当前block_page是否已满 + * - 如果已满,移动到下一个block_page + * - 在移动前,检查该block_page是否有有效数据需要迁移,如果有,则先迁移数据 + * 3. 在决定擦除新的block_page前,采用Wear Leveling算法选择最佳的block_page进行擦除 + * 4. 数据写入后,更新剩余空间大小和当前写入地址 + */ + +/** + * 使用方法 + * + #define LL_FLASH_PAGE_SIZE (2 * 1024) + #define PVD_RESET_STORAGE_START_ADDRESS (256 * LL_FLASH_PAGE_SIZE) + static void test_wl_flash(void) + { + uint32_t address = 0; + wl_flash_t wf = { + .wl_flag = TRUE, + .addr = PVD_RESET_STORAGE_START_ADDRESS, + .len = 2 * LL_FLASH_PAGE_SIZE, + .page_size = LL_FLASH_PAGE_SIZE, + .data_size = sizeof(device_reset_t), + .write_gran = 8, + + .ops.srand = board_srand, + .ops.read = flash_read, + .ops.write = flash_write, + .ops.erase_page = flash_erase_page, + }; + wl_flash_init(&wf); + wl_flash_erase(&wf); + address = wl_flash_get_current_address(&wf); + + device_reset_t power_on; + power_on.flag = PVD_RESET_FLAG; + + // 一页2048/16 = 128个数据,2页 = 256个数据,i=255时数据从头开始 + for (uint16_t i = 0; i < 1000; i++) + { + wl_flash_write(&wf, (uint8_t *)&power_on, sizeof(device_reset_t)); + wl_flash_set_next_address(&wf); + address = wl_flash_get_current_address(&wf); + if (address == wf.addr) + { + __NOP(); + } + } + } + */ + +#ifndef __WL_FLASH_H__ +#define __WL_FLASH_H__ +#include "lib.h" + +typedef struct +{ + BOOL wl_flag; // 开启平衡擦写标志 + uint32_t addr; // Flash 起始地址 + uint32_t len; // Flash 长度 + uint16_t page_size; // Flash 页大小 2^N + uint16_t data_size; // 数据大小 + /* write minimum granularity, unit: byte. + 1(stm32f2/f4)/ 4(stm32f1)/ 8(stm32l4) + 0 will not take effect. */ + uint8_t write_gran; + struct + { + void (*srand)(void); // 随机数种子 + BOOL(*read) + (uint32_t addr, uint8_t *buf, uint16_t size); + BOOL(*write) + (uint32_t addr, const uint8_t *buf, uint16_t size); + BOOL(*erase_page) + (uint32_t page); + } ops; + + struct + { + uint32_t current_address; // 当前准备写入的地址 + uint16_t residue_size; // 剩余可写大小 + uint16_t start_page; // 起始页 + uint16_t page_total; // 总页数 + uint16_t block_page; // 擦除块大小 + } private; +} wl_flash_t; + +extern void wl_flash_init(wl_flash_t *cfg); ///< 初始化 Flash 磨损平衡算法 +extern uint32_t wl_flash_get_current_address(wl_flash_t *cfg); ///< 获取当前写入地址 +extern void wl_flash_set_next_address(wl_flash_t *cfg); ///< 设置下一个写入地址,下一个写入区域会被擦除 +extern void wl_flash_set_current_address(wl_flash_t *cfg, uint32_t address); ///< 设置当前写入地址 +extern void wl_flash_erase(wl_flash_t *cfg); ///< 擦除 Flash, 如果开启了平衡擦写标志, 则会随机分配写入地址 +extern BOOL wl_flash_write(wl_flash_t *cfg, const uint8_t *buf, uint16_t size); ///< 写入 Flash +extern BOOL wl_flash_read(wl_flash_t *cfg, uint8_t *buf, uint16_t size); ///< 读取 Flash +#endif // __WL_FLASH_H__ diff --git a/User/system/lib/lcd/font/HZ16x16.c b/User/system/lib/lcd/font/HZ16x16.c new file mode 100644 index 0000000..5949899 --- /dev/null +++ b/User/system/lib/lcd/font/HZ16x16.c @@ -0,0 +1,9511 @@ +/* +********************************************************************** +* UcGUI Font +* Chinese GB2312 library +* (c) Copyright 19xx-20xx, company name +* +* +* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967) +* 字体:宋体,字形:粗体,大小:11,宽:16,高:16,水平偏移:0,垂直偏移:0 +* +********************************************************************** +*/ + +#include "GUI.H" + + +/* char: code:0x0020 */ +static GUI_CONST_STORAGE unsigned char ac0020[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ! code:0x0021 */ +static GUI_CONST_STORAGE unsigned char ac0021[32] = { + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: " code:0x0022 */ +static GUI_CONST_STORAGE unsigned char ac0022[32] = { + ________,________, + ___XXXX_,________, + __XXXX__,________, + __XXXX__,________, + _XXXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: # code:0x0023 */ +static GUI_CONST_STORAGE unsigned char ac0023[32] = { + ________,________, + ________,________, + ________,________, + ___XX_XX,________, + ___XX_XX,________, + _XXXXXXX,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XXXXXXX,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: $ code:0x0024 */ +static GUI_CONST_STORAGE unsigned char ac0024[32] = { + ________,________, + ________,________, + ____XX__,________, + __XXXXX_,________, + _XX_XXXX,________, + _XX_XXXX,________, + __XXXX__,________, + ___XXX__,________, + ____XXX_,________, + ____XXXX,________, + _XX_XXXX,________, + _XX_XXXX,________, + __XXXXX_,________, + ____XX__,________, + ____XX__,________, + ________,________ +}; + +/* char: % code:0x0025 */ +static GUI_CONST_STORAGE unsigned char ac0025[32] = { + ________,________, + ________,________, + ________,________, + _XX__XX_,________, + XXXX_XX_,________, + XXXXXX__,________, + XXXXXX__,________, + XXXXXXX_,________, + _XXXXXXX,________, + __XXXXXX,________, + __XXXXXX,________, + _XX_XXXX,________, + _XX__XX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: & code:0x0026 */ +static GUI_CONST_STORAGE unsigned char ac0026[32] = { + ________,________, + ________,________, + ________,________, + __XXX___,________, + _XX_XX__,________, + _XX_XX__,________, + _XXXX___,________, + _XXX_XXX,________, + XXXX_XX_,________, + XXXX_XX_,________, + XX_XXXX_,________, + XX__XX_X,X_______, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ' code:0x0027 */ +static GUI_CONST_STORAGE unsigned char ac0027[32] = { + ________,________, + _XXX____,________, + __XX____,________, + __XX____,________, + _XX_____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ( code:0x0028 */ +static GUI_CONST_STORAGE unsigned char ac0028[32] = { + ________,________, + ______XX,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + ______XX,________, + ________,________, + ________,________ +}; + +/* char: ) code:0x0029 */ +static GUI_CONST_STORAGE unsigned char ac0029[32] = { + ________,________, + XX______,________, + _XX_____,________, + __XX____,________, + __XX____,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________, + _XX_____,________, + XX______,________, + ________,________, + ________,________ +}; + +/* char: * code:0x002A */ +static GUI_CONST_STORAGE unsigned char ac002A[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + __XXXX__,________, + __XXXX__,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: + code:0x002B */ +static GUI_CONST_STORAGE unsigned char ac002B[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + _XXXXXXX,X_______, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: , code:0x002C */ +static GUI_CONST_STORAGE unsigned char ac002C[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + __XX____,________, + __XX____,________, + _XX_____,________, + ________,________ +}; + +/* char: - code:0x002D */ +static GUI_CONST_STORAGE unsigned char ac002D[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: . code:0x002E */ +static GUI_CONST_STORAGE unsigned char ac002E[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXX____,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: / code:0x002F */ +static GUI_CONST_STORAGE unsigned char ac002F[32] = { + ________,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________, + _XX_____,________, + _XX_____,________, + ________,________, + ________,________ +}; + +/* char: 0 code:0x0030 */ +static GUI_CONST_STORAGE unsigned char ac0030[32] = { + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XX_XX_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 1 code:0x0031 */ +static GUI_CONST_STORAGE unsigned char ac0031[32] = { + ________,________, + ________,________, + ________,________, + ___XX___,________, + _XXXX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 2 code:0x0032 */ +static GUI_CONST_STORAGE unsigned char ac0032[32] = { + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX___XX,________, + _XX___XX,________, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XX___XX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 3 code:0x0033 */ +static GUI_CONST_STORAGE unsigned char ac0033[32] = { + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _____XX_,________, + ___XXX__,________, + _____XX_,________, + ______XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 4 code:0x0034 */ +static GUI_CONST_STORAGE unsigned char ac0034[32] = { + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + __XX_XX_,________, + _XX__XX_,________, + _XXXXXXX,X_______, + _____XX_,________, + _____XX_,________, + ___XXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 5 code:0x0035 */ +static GUI_CONST_STORAGE unsigned char ac0035[32] = { + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XXXXXX_,________, + _XX___XX,________, + ______XX,________, + ______XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 6 code:0x0036 */ +static GUI_CONST_STORAGE unsigned char ac0036[32] = { + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __XX_XX_,________, + _XX_____,________, + _XXXXXX_,________, + _XXX__XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 7 code:0x0037 */ +static GUI_CONST_STORAGE unsigned char ac0037[32] = { + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XX___XX,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 8 code:0x0038 */ +static GUI_CONST_STORAGE unsigned char ac0038[32] = { + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 9 code:0x0039 */ +static GUI_CONST_STORAGE unsigned char ac0039[32] = { + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX__XXX,________, + __XXXXXX,________, + ______XX,________, + ______XX,________, + __XX_XX_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: : code:0x003A */ +static GUI_CONST_STORAGE unsigned char ac003A[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ; code:0x003B */ +static GUI_CONST_STORAGE unsigned char ac003B[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________ +}; + +/* char: < code:0x003C */ +static GUI_CONST_STORAGE unsigned char ac003C[32] = { + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XX_____,________, + _XX_____,________, + __XX____,________, + ___XX___,________, + ____XX__,________, + _____XX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: = code:0x003D */ +static GUI_CONST_STORAGE unsigned char ac003D[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + ________,________, + ________,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: > code:0x003E */ +static GUI_CONST_STORAGE unsigned char ac003E[32] = { + ________,________, + ________,________, + ________,________, + __XX____,________, + ___XX___,________, + ____XX__,________, + _____XX_,________, + ______XX,________, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ? code:0x003F */ +static GUI_CONST_STORAGE unsigned char ac003F[32] = { + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: @ code:0x0040 */ +static GUI_CONST_STORAGE unsigned char ac0040[32] = { + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XX__XX_,________, + XX_XXXXX,________, + XXXXXXXX,________, + XXXXXXXX,________, + XXXXXXXX,________, + XXXXXXXX,________, + XX_XXXX_,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: A code:0x0041 */ +static GUI_CONST_STORAGE unsigned char ac0041[32] = { + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + _XXXXXX_,________, + _XX__XX_,________, + _XX__XX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: B code:0x0042 */ +static GUI_CONST_STORAGE unsigned char ac0042[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX__XX_,________, + _XXXXX__,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + XXXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: C code:0x0043 */ +static GUI_CONST_STORAGE unsigned char ac0043[32] = { + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XX___XX,________, + XX____XX,________, + XX______,________, + XX______,________, + XX______,________, + XX______,________, + XX____XX,________, + _XX__XX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: D code:0x0044 */ +static GUI_CONST_STORAGE unsigned char ac0044[32] = { + ________,________, + ________,________, + ________,________, + XXXXXX__,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XX_,________, + XXXXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: E code:0x0045 */ +static GUI_CONST_STORAGE unsigned char ac0045[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + _XX___XX,________, + _XX_XX__,________, + _XX_XX__,________, + _XXXXX__,________, + _XX_XX__,________, + _XX_XX__,________, + _XX_____,________, + _XX___XX,________, + XXXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: F code:0x0046 */ +static GUI_CONST_STORAGE unsigned char ac0046[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + _XX___XX,________, + _XX_XX__,________, + _XX_XX__,________, + _XXXXX__,________, + _XX_XX__,________, + _XX_XX__,________, + _XX_____,________, + _XX_____,________, + XXXX____,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: G code:0x0047 */ +static GUI_CONST_STORAGE unsigned char ac0047[32] = { + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX__XX_,________, + XX___XX_,________, + XX______,________, + XX______,________, + XX______,________, + XX__XXXX,________, + XX___XX_,________, + _XX__XX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: H code:0x0048 */ +static GUI_CONST_STORAGE unsigned char ac0048[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XXXXXX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: I code:0x0049 */ +static GUI_CONST_STORAGE unsigned char ac0049[32] = { + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: J code:0x004A */ +static GUI_CONST_STORAGE unsigned char ac004A[32] = { + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + XX__XX__,________, + XXXXX___,________, + ________,________ +}; + +/* char: K code:0x004B */ +static GUI_CONST_STORAGE unsigned char ac004B[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX_XX__,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XX_XX__,________, + _XX_XX__,________, + _XX__XX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: L code:0x004C */ +static GUI_CONST_STORAGE unsigned char ac004C[32] = { + ________,________, + ________,________, + ________,________, + XXXX____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX___XX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: M code:0x004D */ +static GUI_CONST_STORAGE unsigned char ac004D[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: N code:0x004E */ +static GUI_CONST_STORAGE unsigned char ac004E[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XXX_XX_,________, + _XXX_XX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XX_XXX_,________, + _XX_XXX_,________, + _XX_XXX_,________, + XXXX_XX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: O code:0x004F */ +static GUI_CONST_STORAGE unsigned char ac004F[32] = { + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XX__XX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XX__XX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: P code:0x0050 */ +static GUI_CONST_STORAGE unsigned char ac0050[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + XXXX____,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: Q code:0x0051 */ +static GUI_CONST_STORAGE unsigned char ac0051[32] = { + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XX__XX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXXXX_XX,________, + _XX_XXX_,________, + __XXXX__,________, + _____XXX,________, + ________,________, + ________,________ +}; + +/* char: R code:0x0052 */ +static GUI_CONST_STORAGE unsigned char ac0052[32] = { + ________,________, + ________,________, + ________,________, + XXXXXX__,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XXXXX__,________, + _XXXX___,________, + _XX_XX__,________, + _XX_XX__,________, + _XX__XX_,________, + XXXX_XXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: S code:0x0053 */ +static GUI_CONST_STORAGE unsigned char ac0053[32] = { + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XX___XX,________, + _XX___XX,________, + _XX_____,________, + __XXX___,________, + ____XXX_,________, + ______XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: T code:0x0054 */ +static GUI_CONST_STORAGE unsigned char ac0054[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + XX_XX_XX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: U code:0x0055 */ +static GUI_CONST_STORAGE unsigned char ac0055[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: V code:0x0056 */ +static GUI_CONST_STORAGE unsigned char ac0056[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: W code:0x0057 */ +static GUI_CONST_STORAGE unsigned char ac0057[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: X code:0x0058 */ +static GUI_CONST_STORAGE unsigned char ac0058[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + __XXXX__,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + __XXXX__,________, + __XXXX__,________, + _XX__XX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: Y code:0x0059 */ +static GUI_CONST_STORAGE unsigned char ac0059[32] = { + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: Z code:0x005A */ +static GUI_CONST_STORAGE unsigned char ac005A[32] = { + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XX__XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX__XX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: [ code:0x005B */ +static GUI_CONST_STORAGE unsigned char ac005B[32] = { + ________,________, + ___XXXX_,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XXXX_,________, + ________,________, + ________,________ +}; + +/* char: \ code:0x005C */ +static GUI_CONST_STORAGE unsigned char ac005C[32] = { + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + __XX____,________, + __XX____,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ______XX,________, + ________,________ +}; + +/* char: ] code:0x005D */ +static GUI_CONST_STORAGE unsigned char ac005D[32] = { + ________,________, + _XXXXX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + _XXXXX__,________, + ________,________, + ________,________ +}; + +/* char: ^ code:0x005E */ +static GUI_CONST_STORAGE unsigned char ac005E[32] = { + ________,________, + ___XXX__,________, + __XX_XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: _ code:0x005F */ +static GUI_CONST_STORAGE unsigned char ac005F[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + ________,________ +}; + +/* char: ` code:0x0060 */ +static GUI_CONST_STORAGE unsigned char ac0060[32] = { + _XXX____,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: a code:0x0061 */ +static GUI_CONST_STORAGE unsigned char ac0061[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XX__XX_,________, + ____XXX_,________, + __XXXXX_,________, + _XX__XX_,________, + _XX_XXX_,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: b code:0x0062 */ +static GUI_CONST_STORAGE unsigned char ac0062[32] = { + ________,________, + ________,________, + XXX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXX_,________, + _XXX__XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: c code:0x0063 */ +static GUI_CONST_STORAGE unsigned char ac0063[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: d code:0x0064 */ +static GUI_CONST_STORAGE unsigned char ac0064[32] = { + ________,________, + ________,________, + _____XXX,________, + ______XX,________, + ______XX,________, + ______XX,________, + __XXXXXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XXX,________, + __XXXXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: e code:0x0065 */ +static GUI_CONST_STORAGE unsigned char ac0065[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + _XX_____,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: f code:0x0066 */ +static GUI_CONST_STORAGE unsigned char ac0066[32] = { + ________,________, + ________,________, + ____XXX_,________, + ___XX_XX,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: g code:0x0067 */ +static GUI_CONST_STORAGE unsigned char ac0067[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + _XX_____,________, + __XXXXX_,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________ +}; + +/* char: h code:0x0068 */ +static GUI_CONST_STORAGE unsigned char ac0068[32] = { + ________,________, + ________,________, + XXX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXX_,________, + _XXX__XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + XXXX_XXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: i code:0x0069 */ +static GUI_CONST_STORAGE unsigned char ac0069[32] = { + ________,________, + ________,________, + __XXX___,________, + __XXX___,________, + ________,________, + ________,________, + _XXXX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: j code:0x006A */ +static GUI_CONST_STORAGE unsigned char ac006A[32] = { + ________,________, + ________,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + ________,________, + ___XXXX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _XX__XX_,________, + _XXXXX__,________, + ________,________ +}; + +/* char: k code:0x006B */ +static GUI_CONST_STORAGE unsigned char ac006B[32] = { + ________,________, + ________,________, + XXX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_XXXX,________, + _XX_XX__,________, + _XXXX___,________, + _XXXXX__,________, + _XX_XX__,________, + _XX__XX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: l code:0x006C */ +static GUI_CONST_STORAGE unsigned char ac006C[32] = { + ________,________, + ________,________, + _XXXX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: m code:0x006D */ +static GUI_CONST_STORAGE unsigned char ac006D[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXX__,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: n code:0x006E */ +static GUI_CONST_STORAGE unsigned char ac006E[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + _XXX__XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + XXXX_XXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: o code:0x006F */ +static GUI_CONST_STORAGE unsigned char ac006F[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XX_XX_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: p code:0x0070 */ +static GUI_CONST_STORAGE unsigned char ac0070[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + _XXX__XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXX__XX,________, + _XXXXXX_,________, + _XX_____,________, + XXXX____,________, + ________,________ +}; + +/* char: q code:0x0071 */ +static GUI_CONST_STORAGE unsigned char ac0071[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XX__XXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XXX,________, + __XXXXXX,________, + ______XX,________, + _____XXX,X_______, + ________,________ +}; + +/* char: r code:0x0072 */ +static GUI_CONST_STORAGE unsigned char ac0072[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + __XXX_XX,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + XXXXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: s code:0x0073 */ +static GUI_CONST_STORAGE unsigned char ac0073[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX__XX_,________, + _XX_____,________, + __XXXX__,________, + _____XX_,________, + _XX__XX_,________, + _XXXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: t code:0x0074 */ +static GUI_CONST_STORAGE unsigned char ac0074[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + _XXXXXX_,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX_XX,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: u code:0x0075 */ +static GUI_CONST_STORAGE unsigned char ac0075[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX__XXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XXX,________, + __XXXXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: v code:0x0076 */ +static GUI_CONST_STORAGE unsigned char ac0076[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: w code:0x0077 */ +static GUI_CONST_STORAGE unsigned char ac0077[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXX_,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: x code:0x0078 */ +static GUI_CONST_STORAGE unsigned char ac0078[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + __XX_XX_,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: y code:0x0079 */ +static GUI_CONST_STORAGE unsigned char ac0079[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXX_XXX,X_______, + _XX___XX,________, + __XX_XX_,________, + __XX_XX_,________, + ___XXX__,________, + ___XXX__,________, + ___XX___,________, + ___XX___,________, + _XXX____,________, + ________,________ +}; + +/* char: z code:0x007A */ +static GUI_CONST_STORAGE unsigned char ac007A[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XX__XX_,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + __XX__XX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: { code:0x007B */ +static GUI_CONST_STORAGE unsigned char ac007B[32] = { + ________,________, + _____XXX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XXX,________, + ________,________, + ________,________ +}; + +/* char: | code:0x007C */ +static GUI_CONST_STORAGE unsigned char ac007C[32] = { + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________ +}; + +/* char: } code:0x007D */ +static GUI_CONST_STORAGE unsigned char ac007D[32] = { + ________,________, + _XXX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ___XX___,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + _XXX____,________, + ________,________, + ________,________ +}; + +/* char: ~ code:0x007E */ +static GUI_CONST_STORAGE unsigned char ac007E[32] = { + __XX____,________, + _XXXXXXX,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char:  code:0x007F */ +static GUI_CONST_STORAGE unsigned char ac007F[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ~ code:0xA1AB */ +static GUI_CONST_STORAGE unsigned char acA1AB[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,_____XX_, + __XX__XX,XX__XX__, + _XX_____,_XXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: × code:0xA1C1 */ +static GUI_CONST_STORAGE unsigned char acA1C1[32] = { + ________,________, + ________,________, + ___XX___,___XX___, + ____XX__,__XX____, + _____XX_,_XX_____, + ______XX,XX______, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ____XX__,__XX____, + ___XX___,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: √ code:0xA1CC */ +static GUI_CONST_STORAGE unsigned char acA1CC[32] = { + ________,_____XX_, + ________,_____XX_, + ________,____XX__, + ________,____XX__, + ________,___XX___, + ________,___XX___, + ________,__XX____, + ________,_XX_____, + ________,_XX_____, + ___XX___,XX______, + __XXXX_X,X_______, + _XX__XXX,X_______, + ______XX,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: ° code:0xA1E3 */ +static GUI_CONST_STORAGE unsigned char acA1E3[32] = { + ________,________, + ____XXX_,________, + ___XX_XX,________, + ___XX_XX,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: ℃ code:0xA1E6 */ +static GUI_CONST_STORAGE unsigned char acA1E6[32] = { + __XXX___,________, + _XX_XX__,________, + _XX_XXXX,XXXXXXX_, + __XXXXX_,____XXX_, + ____XX__,_____XX_, + ____XX__,_____XX_, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,_____XX_, + _____XX_,____XX__, + ______XX,XXXXX___, + ________,________, + ________,________, + ________,________, +}; + +/* char: ○ code:0xA1F0 */ +static GUI_CONST_STORAGE unsigned char acA1F0[32] = { + ________,________, + ______XX,XXX_____, + ____XXX_,__XXX___, + ___XX___,____XX__, + ___XX___,____XX__, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + ___XX___,____XX__, + ___XX___,____XX__, + ____XXX_,__XXX___, + ______XX,XXX_____, + ________,________, + ________,________, + ________,________, +}; + +/* char: → code:0xA1FA */ +static GUI_CONST_STORAGE unsigned char acA1FA[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,_XX_____, + ________,_XXXX___, + _XXXXXXX,XXXXXXX_, + ________,_XXXX___, + ________,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: ← code:0xA1FB */ +static GUI_CONST_STORAGE unsigned char acA1FB[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ___XXXX_,________, + _XXXXXXX,XXXXXXX_, + ___XXXX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: ↑ code:0xA1FC */ +static GUI_CONST_STORAGE unsigned char acA1FC[32] = { + _______X,X_______, + _______X,X_______, + ______XX,XX______, + ______XX,XX______, + _____XXX,XXX_____, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: ↓ code:0xA1FD */ +static GUI_CONST_STORAGE unsigned char acA1FD[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _____XXX,XXX_____, + ______XX,XX______, + ______XX,XX______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: ℉ code:0xA848 */ +static GUI_CONST_STORAGE unsigned char acA848[32] = { + ________,________, + __XXXXXX,XXXXXX__, + _XX_XXXX,____XX__, + _XX_XXXX,________, + __XXX_XX,________, + ______XX,__XX____, + ______XX,XXXX____, + ______XX,__XX____, + ______XX,________, + ______XX,________, + ______XX,________, + _____XXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: 安 code:0xB0B2 */ +static GUI_CONST_STORAGE unsigned char acB0B2[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _XX_____,_____XX_, + _XX___XX,_____XX_, + ______XX,________, + _XXXXXXX,XXXXXXX_, + _____XX_,__XX____, + ____XX__,__XX____, + ___XXXXX,_XX_____, + _______X,XX______, + ______XX,_XXX____, + ____XXX_,___XX___, + _XXXX___,____XX__, + ________,________, + ________,________, +}; + +/* char: 按 code:0xB0B4 */ +static GUI_CONST_STORAGE unsigned char acB0B4[32] = { + ___XX___,_XX_____, + ___XX___,__XX____, + ___XX_XX,XXXXXXX_, + _XXXXXXX,_____XX_, + ___XX_XX,_XX__XX_, + ___XX___,_XX_____, + ___XX_XX,XXXXXXX_, + ___XXX__,XX__XX__, + _XXXX___,XX__XX__, + ___XX__X,XX_XX___, + ___XX___,_XXX____, + ___XX___,_XXXX___, + ___XX___,XX__XX__, + _XXXX_XX,X____XX_, + ________,________, + ________,________, +}; + +/* char: 版 code:0xB0E6 */ +static GUI_CONST_STORAGE unsigned char acB0E6[32] = { + _____XX_,________, + __XX_XX_,____XXX_, + __XX_XX_,XXXXX___, + __XX_XX_,XX______, + __XXXXXX,XX______, + __XX____,XXXXXX__, + __XX____,XXXXXX__, + __XXXXX_,XXXXXX__, + __XX_XX_,XXXXXX__, + __XX_XX_,XXXXXX__, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + __XX_XXX,X_XXXX__, + _XX__XXX,_XX__XX_, + ________,________, + ________,________, +}; + +/* char: 薄 code:0xB1A1 */ +static GUI_CONST_STORAGE unsigned char acB1A1[32] = { + _____XX_,_XX_____, + _XXXXXXX,XXXXXXX_, + _____XX_,_XXXX___, + ______XX,XXXXXXX_, + __XX____,_XX_____, + ___XX_XX,XXXXXX__, + ____XXXX,_XX_XX__, + _XX___XX,XXXXXX__, + __XX__XX,_XX_XX__, + ____XXXX,XXXXXX__, + ___XX_XX,_XX_XX__, + ___XXXXX,XXXXXXX_, + __XX___X,X__XX___, + __XX____,XXXXX___, + ________,________, + ________,________, +}; + +/* char: 保 code:0xB1A3 */ +static GUI_CONST_STORAGE unsigned char acB1A3[32] = { + ____XX__,________, + ____XXXX,XXXXXX__, + ____XXXX,____XX__, + ___XX_XX,____XX__, + ___XX_XX,XXXXXX__, + __XXX___,_XX_____, + _XXXX___,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,XXXX____, + ___XX__X,XXXXX___, + ___XX__X,XXXXX___, + ___XX_XX,_XX_XX__, + ___XXXX_,_XX__XX_, + ___XX___,_XX_____, + ________,________, + ________,________, +}; + +/* char: 饱 code:0xB1A5 */ +static GUI_CONST_STORAGE unsigned char acB1A5[32] = { + ___XX___,XX______, + ___XX___,XX______, + ___XXXXX,XXXXXX__, + __XX_XXX,X___XX__, + __XXXXXX,____XX__, + _XX__XXX,XXXXXX__, + ___XX__X,X_XXXX__, + ___XX__X,X_XXXX__, + ___XX__X,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X_XXX___, + ___XXXXX,X____XX_, + ___XXX_X,X____XX_, + ___XX___,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 报 code:0xB1A8 */ +static GUI_CONST_STORAGE unsigned char acB1A8[32] = { + ___XX___,________, + ___XX__X,XXXXXX__, + ___XX__X,X___XX__, + _XXXXXXX,X___XX__, + ___XX__X,X_XXXX__, + ___XX__X,X_______, + ___XXXXX,XXXXXX__, + ___XXX_X,XXX_XX__, + _XXXX__X,XXX_XX__, + ___XX__X,XXXXX___, + ___XX__X,X_XX____, + ___XX__X,XXXXX___, + ___XX__X,XX__XX__, + _XXXX__X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 备 code:0xB1B8 */ +static GUI_CONST_STORAGE unsigned char acB1B8[32] = { + _____XX_,________, + ____XXXX,XXXXX___, + ___XXX__,__XX____, + __XX_XX_,_XX_____, + ______XX,XX______, + ____XXX_,_XXX____, + _XXXX___,___XXXX_, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ________,________, + ________,________, +}; + +/* char: 本 code:0xB1BE */ +static GUI_CONST_STORAGE unsigned char acB1BE[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + _____XXX,XXX_____, + _____XXX,XXX_____, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + __XX___X,X___XX__, + _XX_XXXX,XXXX_XX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 比 code:0xB1C8 */ +static GUI_CONST_STORAGE unsigned char acB1C8[32] = { + ________,XX______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX__XX__, + __XX____,XX_XX___, + __XXXXXX,XXXX____, + __XX____,XXX_____, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + __XX_XX_,XX______, + __XXXX__,XX___XX_, + __XXX___,XX___XX_, + __XX____,_XXXXXX_, + ________,________, + ________,________, +}; + +/* char: 闭 code:0xB1D5 */ +static GUI_CONST_STORAGE unsigned char acB1D5[32] = { + __XX____,________, + ___XXXXX,XXXXXXX_, + ________,_____XX_, + __XX____,_XX__XX_, + __XX____,_XX__XX_, + __XXXXXX,XXXXXXX_, + __XX____,XXX__XX_, + __XX___X,XXX__XX_, + __XX__XX,_XX__XX_, + __XX_XX_,_XX__XX_, + __XXXX__,_XX__XX_, + __XX___X,XXX__XX_, + __XX____,_____XX_, + __XX____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 编 code:0xB1E0 */ +static GUI_CONST_STORAGE unsigned char acB1E0[32] = { + ___XX___,_XX_____, + ___XX___,__XX____, + __XX_XXX,XXXXXXX_, + __XX_XXX,X____XX_, + _XXXXX_X,X____XX_, + ____XX_X,XXXXXXX_, + ___XX__X,X_______, + __XX___X,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ______XX,XXXXXXX_, + _______X,XXXXXXX_, + ____XXXX,XXXXXXX_, + _XXXX__X,XXXXXXX_, + _______X,X___XXX_, + ________,________, + ________,________, +}; + +/* char: 变 code:0xB1E4 */ +static GUI_CONST_STORAGE unsigned char acB1E4[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _____XX_,_XX_____, + ___XXXX_,_XXXX___, + ___XXXX_,_XX_XX__, + __XX_XX_,_XX__XX_, + _XX_____,_____XX_, + ___XXXXX,XXXXX___, + ____XX__,__XX____, + _____XX_,_XX_____, + ______XX,XX______, + ____XXX_,_XXX____, + _XXXX___,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 表 code:0xB1ED */ +static GUI_CONST_STORAGE unsigned char acB1ED[32] = { + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + ___XXXXX,XXXXX___, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + _____XX_,XX__XX__, + ____XXX_,_XXXX___, + ___XXXX_,__XX____, + _XXX_XXX,X__XX___, + _____XXX,____XXX_, + _____XX_,________, + ________,________, + ________,________, +}; + +/* char: 不 code:0xB2BB */ +static GUI_CONST_STORAGE unsigned char acB2BB[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + ________,XX______, + ________,XX______, + _______X,X_______, + ______XX,X_______, + _____XXX,X_XX____, + ____XX_X,X__XX___, + ___XX__X,X___XX__, + __XX___X,X____XX_, + _XX____X,X____XX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 擦 code:0xB2C1 */ +static GUI_CONST_STORAGE unsigned char acB2C1[32] = { + ___XX___,_XX_____, + ___XX_XX,XXXXXXX_, + ___XX_XX,_____XX_, + _XXXXX_X,X__XX___, + ___XX__X,XXXXXXX_, + ___XX_XX,_XXXXXX_, + ___XX__X,XXXXXXX_, + ___XXXXX,XX__XX__, + _XXXX__X,XXXXXXX_, + ___XX_XX,________, + ___XX_XX,XXXXXXX_, + ___XX__X,X_XXXX__, + ___XX__X,X_XX_XX_, + _XXXX_XX,_XXX_XX_, + ________,________, + ________,________, +}; + +/* char: 参 code:0xB2CE */ +static GUI_CONST_STORAGE unsigned char acB2CE[32] = { + _____XX_,________, + ____XX__,__XX____, + ___XXXXX,XXXXX___, + ______XX,___XX___, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + ___XX___,XX_XX___, + _XXX__XX,X___XXX_, + ___XXXX_,_XX_____, + ________,XX______, + _____XXX,X__XX___, + __XXXX__,_XXX____, + ______XX,XX______, + _XXXXXX_,________, + ________,________, + ________,________, +}; + +/* char: 操 code:0xB2D9 */ +static GUI_CONST_STORAGE unsigned char acB2D9[32] = { + ___XX__X,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,XXXXX___, + _XXXXX__,________, + ___XX_XX,XXXXXX__, + ___XX_XX,XXXXXX__, + ___XX_XX,XXXXXX__, + ___XXX__,________, + _XXXX___,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,XXXX____, + ___XX__X,XXXXX___, + ___XXXXX,_XX_XXX_, + _XXXX___,_XX_____, + ________,________, + ________,________, +}; + +/* char: 测 code:0xB2E2 */ +static GUI_CONST_STORAGE unsigned char acB2E2[32] = { + ________,_____XX_, + __XX_XXX,XXX__XX_, + ___XXXX_,_XX__XX_, + _____XXX,XXXXXXX_, + _XX__XXX,XXXXXXX_, + __XX_XXX,XXXXXXX_, + _____XXX,XXXXXXX_, + ___XXXXX,XXXXXXX_, + ___XXXXX,XXXXXXX_, + __XX___X,X__XXXX_, + __XX__XX,XX___XX_, + _XX___XX,_XX__XX_, + _XX__XX_,_XX__XX_, + ____XX__,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 差 code:0xB2EE */ +static GUI_CONST_STORAGE unsigned char acB2EE[32] = { + ____XX__,__XX____, + _____XX_,_XX_____, + __XXXXXX,XXXXXX__, + _______X,X_______, + ___XXXXX,XXXXX___, + ______XX,________, + _XXXXXXX,XXXXXXX_, + _____XX_,________, + ____XX__,________, + ___XXXXX,XXXXX___, + __XX____,XX______, + _XX_____,XX______, + ________,XX______, + ___XXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 常 code:0xB3A3 */ +static GUI_CONST_STORAGE unsigned char acB3A3[32] = { + _______X,X_______, + ___XX__X,X__XX___, + ____XX_X,X_XX____, + _XXXXXXX,XXXXXXX_, + _XX_____,_____XX_, + ____XXXX,XXXX____, + ____XX__,__XX____, + ____XXXX,XXXX____, + _______X,X_______, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X_XXXX__, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 长 code:0xB3A4 */ +static GUI_CONST_STORAGE unsigned char acB3A4[32] = { + ____XX__,___XX___, + ____XX__,__XX____, + ____XX__,_XX_____, + ____XX__,XX______, + ____XX_X,X_______, + ____XX__,________, + _XXXXXXX,XXXXXXX_, + ____XX_X,X_______, + ____XX__,XX______, + ____XX__,_XX_____, + ____XX__,__XX____, + ____XXXX,___XX___, + ____XXX_,____XXX_, + ____XX__,________, + ________,________, + ________,________, +}; + +/* char: 厂 code:0xB3A7 */ +static GUI_CONST_STORAGE unsigned char acB3A7[32] = { + ________,________, + ___XXXXX,XXXXXXX_, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________, + _XX_____,________, + ________,________, + ________,________, +}; + +/* char: 称 code:0xB3C6 */ +static GUI_CONST_STORAGE unsigned char acB3C6[32] = { + ________,XX______, + ____XXX_,XX______, + _XXXX___,XX______, + ___XX___,XXXXXXX_, + ___XX__X,X____XX_, + _XXXXXXX,____XX__, + ___XX___,__XX____, + ___XXX__,__XX____, + __XXXXXX,X_XXXX__, + __XXX__X,X_XX_XX_, + _XXXX_XX,__XX_XX_, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,XXXX____, + ________,________, + ________,________, +}; + +/* char: 成 code:0xB3C9 */ +static GUI_CONST_STORAGE unsigned char acB3C9[32] = { + ________,_XXXX___, + ________,_XX_XX__, + ________,_XX_____, + __XXXXXX,XXXXXXX_, + __XX____,_XX_____, + __XX____,_XX_XX__, + __XXXXXX,_XX_XX__, + __XX__XX,_XX_XX__, + __XX__XX,_XXXX___, + __XX__XX,_XXXX___, + __XX__XX,__XX_XX_, + __XXXXX_,_XXXXXX_, + __XX____,XX__XXX_, + _XX____X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 程 code:0xB3CC */ +static GUI_CONST_STORAGE unsigned char acB3CC[32] = { + ________,________, + ____XXXX,XXXXXX__, + _XXXX__X,X___XX__, + ___XX__X,X___XX__, + ___XX__X,XXXXXX__, + _XXXXXX_,________, + ___XX___,________, + ___XXX_X,XXXXXX__, + __XXXXX_,_XX_____, + __XXX___,_XX_____, + _XXXX__X,XXXXXX__, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX_XX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 出 code:0xB3F6 */ +static GUI_CONST_STORAGE unsigned char acB3F6[32] = { + _______X,X_______, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XXXXXXX,XXXXXXX_, + ________,_____XX_, + ________,________, + ________,________, +}; + +/* char: 储 code:0xB4A2 */ +static GUI_CONST_STORAGE unsigned char acB4A2[32] = { + ____XX__,__XX____, + ____XXX_,__XX_XX_, + ____XXXX,_XXXXXX_, + ___XX_XX,__XXXX__, + ___XX___,XXXXXXX_, + __XXXXXX,__XX____, + _XXXX_XX,_XXXXX__, + ___XX_XX,XXX_XX__, + ___XX_XX,XXX_XX__, + ___XX_XX,_XXXXX__, + ___XX_XX,_XX_XX__, + ___XX_XX,XXX_XX__, + ___XX_XX,_XXXXX__, + ___XX___,_XX_XX__, + ________,________, + ________,________, +}; + +/* char: 传 code:0xB4AB */ +static GUI_CONST_STORAGE unsigned char acB4AB[32] = { + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XXXX,XXXXXX__, + ___XX___,_XX_____, + ___XX___,XX______, + __XXXXXX,XXXXXXX_, + _XXXX___,XX______, + ___XX__X,X_______, + ___XX_XX,XXXXXX__, + ___XX___,____XX__, + ___XX___,___XX___, + ___XX___,XXXX____, + ___XX___,_XX_____, + ___XX___,__XX____, + ________,________, + ________,________, +}; + +/* char: 磁 code:0xB4C5 */ +static GUI_CONST_STORAGE unsigned char acB4C5[32] = { + _______X,X___XX__, + ________,XX_XX___, + _XXXXXXX,XXXXXXX_, + ___XX___,________, + ___XX__X,X___XX__, + __XX___X,X___XX__, + __XXXXXX,___XX___, + _XXXXXXX,XX_XXXX_, + __XXXXXX,XXXXXXX_, + __XXXX_X,X___XX__, + __XXXX_X,X___XX__, + __XXXXXX,XX_XXXX_, + __XXXXXX,XXXXXXX_, + ________,XX___XX_, + ________,________, + ________,________, +}; + +/* char: 次 code:0xB4CE */ +static GUI_CONST_STORAGE unsigned char acB4CE[32] = { + _______X,X_______, + __XX___X,X_______, + ___XX__X,X_______, + ___XX__X,XXXXXXX_, + ______XX,_____XX_, + ______XX,____XX__, + _____XX_,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + __XX____,XXXX____, + __XX____,XXXX____, + _XX____X,X__XX___, + _XX___XX,____XX__, + _____XX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 存 code:0xB4E6 */ +static GUI_CONST_STORAGE unsigned char acB4E6[32] = { + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXXXX_, + _____XX_,________, + ____XX__,________, + ____XX_X,XXXXXX__, + ___XXX__,___XX___, + __XXXX__,__XX____, + _XX_XX__,__XX____, + ____XXXX,XXXXXXX_, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,XXXX____, + ________,________, + ________,________, +}; + +/* char: 大 code:0xB4F3 */ +static GUI_CONST_STORAGE unsigned char acB4F3[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + _____XX_,_XX_____, + _____XX_,_XX_____, + ____XX__,__XX____, + ___XX___,___XX___, + _XXX____,____XXX_, + ________,________, + ________,________, +}; + +/* char: 带 code:0xB4F8 */ +static GUI_CONST_STORAGE unsigned char acB4F8[32] = { + ____XX_X,X_XX____, + ____XX_X,X_XX____, + _XXXXXXX,XXXXXXX_, + ____XX_X,X_XX____, + ________,________, + _XXXXXXX,XXXXXXX_, + _XX____X,X____XX_, + _______X,X_______, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,XXXXX___, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 待 code:0xB4FD */ +static GUI_CONST_STORAGE unsigned char acB4FD[32] = { + ____XX__,_XX_____, + ___XX___,_XX_____, + __XX__XX,XXXXXX__, + _XX_XX__,_XX_____, + ____XX__,_XX_____, + ___XXXXX,XXXXXXX_, + __XXX___,___XX___, + _XXXX___,___XX___, + ___XXXXX,XXXXXXX_, + ___XX___,___XX___, + ___XX_XX,___XX___, + ___XX__X,X__XX___, + ___XX___,___XX___, + ___XX___,_XXXX___, + ________,________, + ________,________, +}; + +/* char: 单 code:0xB5A5 */ +static GUI_CONST_STORAGE unsigned char acB5A5[32] = { + ____XX__,__XX____, + _____XX_,_XX_____, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 弹 code:0xB5AF */ +static GUI_CONST_STORAGE unsigned char acB5AF[32] = { + _______X,X__XX___, + _XXXXX__,XXXX____, + ____XXXX,XXXXXX__, + ____XXXX,_XX_XX__, + _XXXXXXX,_XX_XX__, + _XX___XX,XXXXXX__, + _XX___XX,_XX_XX__, + _XX___XX,_XX_XX__, + _XXXXXXX,XXXXXX__, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XXXX,XXXXXXX_, + ____XX__,_XX_____, + __XXX___,_XX_____, + ________,________, + ________,________, +}; + +/* char: 当 code:0xB5B1 */ +static GUI_CONST_STORAGE unsigned char acB5B1[32] = { + _______X,X_______, + __XX___X,X___XX__, + ___XX__X,X__XX___, + ____XX_X,X_XX____, + _XXXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + __XXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + _XXXXXXX,XXXXXX__, + ________,____XX__, + ________,________, + ________,________, +}; + +/* char: 的 code:0xB5C4 */ +static GUI_CONST_STORAGE unsigned char acB5C4[32] = { + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX___,_XXXXXX_, + __XXXXXX,XX___XX_, + __XX__XX,X____XX_, + __XX__XX,_____XX_, + __XX__XX,_XX__XX_, + __XXXXXX,__XX_XX_, + __XX__XX,__XX_XX_, + __XX__XX,_____XX_, + __XX__XX,_____XX_, + __XX__XX,_____XX_, + __XXXXXX,_____XX_, + __XX__XX,___XXX__, + ________,________, + ________,________, +}; + +/* char: 低 code:0xB5CD */ +static GUI_CONST_STORAGE unsigned char acB5CD[32] = { + ____XX__,________, + ____XX__,__XXXX__, + ____XXXX,XXXX____, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + __XXX_XX,__XX____, + _XXXX_XX,XXXXXXX_, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + ___XX_XX,XX_XX___, + ___XX_XX,X__XXXX_, + ___XX_XX,_XX_XXX_, + ___XX___,__XX_XX_, + ________,________, + ________,________, +}; + +/* char: 地 code:0xB5D8 */ +static GUI_CONST_STORAGE unsigned char acB5D8[32] = { + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX_XX,_XX_XX__, + ___XX_XX,_XXXXX__, + _XXXXXXX,XXXXXX__, + ___XXXXX,XXX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XXXXX__, + ___XXXXX,_XX_____, + _XXX__XX,_____XX_, + ______XX,_____XX_, + _______X,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 点 code:0xB5E3 */ +static GUI_CONST_STORAGE unsigned char acB5E3[32] = { + ______XX,________, + ______XX,________, + ______XX,XXXXXX__, + ______XX,________, + ______XX,________, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ________,________, + __XX_XX_,XX__XX__, + __XX__XX,_XX__XX_, + _XX___XX,_XX__XX_, + ________,________, + ________,________, +}; + +/* char: 电 code:0xB5E7 */ +static GUI_CONST_STORAGE unsigned char acB5E7[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + __XX___X,X_______, + _______X,X____XX_, + _______X,X____XX_, + ________,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 定 code:0xB6A8 */ +static GUI_CONST_STORAGE unsigned char acB6A8[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _XX_____,_____XX_, + ________,________, + ___XXXXX,XXXXX___, + _______X,X_______, + _______X,X_______, + ___XX__X,X_______, + ___XX__X,XXXXX___, + ___XX__X,X_______, + ___XX__X,X_______, + __XXXX_X,X_______, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 动 code:0xB6AF */ +static GUI_CONST_STORAGE unsigned char acB6AF[32] = { + ________,_XX_____, + __XXXXX_,_XX_____, + ________,_XX_____, + _______X,XXXXXXX_, + ________,_XX__XX_, + _XXXXXXX,_XX__XX_, + ___XX___,_XX__XX_, + ___XX___,_XX__XX_, + __XX_XX_,_XX__XX_, + __XX__XX,_XX__XX_, + _XXXXXXX,XX___XX_, + ______XX,XX___XX_, + _______X,X____XX_, + ______XX,___XXX__, + ________,________, + ________,________, +}; + +/* char: 度 code:0xB6C8 */ +static GUI_CONST_STORAGE unsigned char acB6C8[32] = { + _______X,X_______, + ________,XX______, + ___XXXXX,XXXXXXX_, + ___XX_XX,___XX___, + ___XXXXX,XXXXXXX_, + ___XX_XX,___XX___, + ___XX_XX,XXXXX___, + ___XX___,________, + ___XXXXX,XXXXXX__, + ___XX_XX,___XX___, + ___XX__X,X_XX____, + __XX____,XXX_____, + __XX__XX,X_XXX___, + _XX_XXX_,____XXX_, + ________,________, + ________,________, +}; + +/* char: 短 code:0xB6CC */ +static GUI_CONST_STORAGE unsigned char acB6CC[32] = { + __XX____,________, + __XX___X,XXXXXX__, + __XXXXX_,________, + _XXXX___,________, + ___XX__X,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X___XX__, + _XXXXXXX,X___XX__, + ___XX__X,XXXXXX__, + ___XX___,________, + __XXXX_X,X___XX__, + __XX_XX_,XX_XX___, + __XX_XX_,________, + _XX___XX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 断 code:0xB6CF */ +static GUI_CONST_STORAGE unsigned char acB6CF[32] = { + ____XX__,___XXX__, + _XX_XX__,XXXX____, + _XXXXXXX,XX______, + _XXXXXX_,XX______, + _XX_XX__,XX______, + _XXXXXXX,XXXXXXX_, + _XX_XX__,XX_XX___, + _XXXXXX_,XX_XX___, + _XXXXXXX,XX_XX___, + _XX_XXXX,XX_XX___, + _XX_XX__,XX_XX___, + _XX_XX__,XX_XX___, + _XX____X,X__XX___, + _XXXXXXX,___XX___, + ________,________, + ________,________, +}; + +/* char: 阀 code:0xB7A7 */ +static GUI_CONST_STORAGE unsigned char acB7A7[32] = { + ___XX___,________, + ____XXXX,XXXXXXX_, + ________,_____XX_, + __XX__XX,XXXX_XX_, + __XX__XX,XX_XXXX_, + __XX_XX_,XXXXXXX_, + __XXXXXX,XXX__XX_, + __XXXXX_,XXXX_XX_, + __XX_XX_,XXXX_XX_, + __XX_XX_,_XXXXXX_, + __XX_XX_,_XXXXXX_, + __XX_XX_,XXXXXXX_, + __XX_XXX,X__XXXX_, + __XX____,____XXX_, + ________,________, + ________,________, +}; + +/* char: 法 code:0xB7A8 */ +static GUI_CONST_STORAGE unsigned char acB7A8[32] = { + ________,_XX_____, + __XX____,_XX_____, + ___XX___,_XX_____, + ______XX,XXXXXX__, + _XX_____,_XX_____, + __XX____,_XX_____, + ________,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,XX______, + __XX____,XX______, + __XX___X,X__XX___, + _XX___XX,____XX__, + _XX__XXX,XXXXXXX_, + ________,_____XX_, + ________,________, + ________,________, +}; + +/* char: 反 code:0xB7B4 */ +static GUI_CONST_STORAGE unsigned char acB7B4[32] = { + ________,_XXXXX__, + ___XXXXX,XX______, + ___XX___,________, + ___XX___,________, + ___XXXXX,XXXXX___, + ___XXXX_,___XX___, + ___XXXX_,___XX___, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + ___XX__X,XXX_____, + __XX____,XX______, + __XX___X,XXX_____, + _XX__XXX,__XXX___, + ___XXX__,____XXX_, + ________,________, + ________,________, +}; + +/* char: 返 code:0xB7B5 */ +static GUI_CONST_STORAGE unsigned char acB7B5[32] = { + ________,__XXXX__, + __XX__XX,XXX_____, + ___XX_XX,________, + ___XX_XX,________, + ______XX,XXXXXX__, + ______XX,____XX__, + _XXXX_XX,XX_XX___, + ___XX_XX,_XXXX___, + ___XX_XX,__XX____, + ___XX_XX,_XXXX___, + ___XXXX_,XX__XX__, + ___XX__X,X___XX__, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 范 code:0xB7B6 */ +static GUI_CONST_STORAGE unsigned char acB7B6[32] = { + ____XX__,__XX____, + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + ___XX___,________, + ____XX_X,XXXXXX__, + _______X,X___XX__, + __XX___X,X___XX__, + ___XX__X,X___XX__, + _______X,X_XXX___, + _____XXX,X_______, + ____XX_X,X____XX_, + ___XX__X,X____XX_, + __XX____,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 方 code:0xB7BD */ +static GUI_CONST_STORAGE unsigned char acB7BD[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XXX,XXXXX___, + _____XX_,___XX___, + _____XX_,___XX___, + ____XX__,___XX___, + ____XX__,___XX___, + ___XX___,___XX___, + __XX____,___XX___, + _XX_____,_XXX____, + ________,________, + ________,________, +}; + +/* char: 放 code:0xB7C5 */ +static GUI_CONST_STORAGE unsigned char acB7C5[32] = { + ___XX___,_XX_____, + ____XX__,_XX_____, + ________,_XX_____, + _XXXXXXX,_XXXXXX_, + ___XX___,XX__XX__, + ___XX__X,XXX_XX__, + ___XXXXX,_XX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XXXX___, + ___XX_XX,_XXXX___, + ___XX_XX,__XX____, + __XX__XX,_XXXX___, + __XX__XX,XX__XX__, + _XX_XXXX,X____XX_, + ________,________, + ________,________, +}; + +/* char: 非 code:0xB7C7 */ +static GUI_CONST_STORAGE unsigned char acB7C7[32] = { + _____XX_,_XX_____, + _____XX_,_XX_____, + _XXXXXX_,_XXXXXX_, + _____XX_,_XX_____, + _____XX_,_XX_____, + _____XX_,_XX_____, + __XXXXX_,_XXXXX__, + _____XX_,_XX_____, + _____XX_,_XX_____, + _____XX_,_XX_____, + _XXXXXX_,_XXXXXX_, + _____XX_,_XX_____, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + ________,________, +}; + +/* char: 分 code:0xB7D6 */ +static GUI_CONST_STORAGE unsigned char acB7D6[32] = { + _____XX_,_XX_____, + _____XX_,_XX_____, + ____XX__,__XX____, + ____XX__,__XX____, + ___XX___,___XX___, + __XX____,____XX__, + _XXXXXXX,XXXX_XX_, + _____XX_,__XX____, + _____XX_,__XX____, + _____XX_,__XX____, + ____XX__,__XX____, + ___XX___,__XX____, + __XX____,__XX____, + _XX_____,XXX_____, + ________,________, + ________,________, +}; + +/* char: 服 code:0xB7FE */ +static GUI_CONST_STORAGE unsigned char acB7FE[32] = { + ________,________, + __XXXXXX,XXXXXX__, + __XX_XXX,X___XX__, + __XX_XXX,X___XX__, + __XX_XXX,X_XXXX__, + __XXXXXX,X_______, + __XX_XXX,XXXXXX__, + __XX_XXX,XXX_XX__, + __XXXXXX,XXX_XX__, + __XX_XXX,XXXXX___, + __XX_XXX,X_XX____, + __XX_XXX,XXXXX___, + __XX_XXX,XX__XX__, + _XX_XXXX,X____XX_, + ________,________, + ________,________, +}; + +/* char: 复 code:0xB8B4 */ +static GUI_CONST_STORAGE unsigned char acB8B4[32] = { + ____XX__,________, + ____XXXX,XXXXXXX_, + ___XX___,________, + __XXXXXX,XXXXX___, + _XX_XX__,___XX___, + ____XXXX,XXXXX___, + ____XX__,___XX___, + ____XXXX,XXXXX___, + _____XX_,________, + ____XXXX,XXXXX___, + __XXXXX_,_XXX____, + ______XX,XX______, + ____XXX_,_XXX____, + _XXXX___,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 感 code:0xB8D0 */ +static GUI_CONST_STORAGE unsigned char acB8D0[32] = { + ________,_XX_XX__, + __XXXXXX,XXXXXXX_, + __XX____,_XX_____, + __XXXXXX,XXX_XX__, + __XX____,_XX_XX__, + __XXXXXX,XXXXX___, + __XXXX_X,X_XX____, + __XXXXXX,XXXXXXX_, + __XX____,XX__XXX_, + _XX____X,X____XX_, + ______XX,________, + __XXXX_X,X___XX__, + __XXXX__,__XX_XX_, + _XX__XXX,XXXX_XX_, + ________,________, + ________,________, +}; + +/* char: 缸 code:0xB8D7 */ +static GUI_CONST_STORAGE unsigned char acB8D7[32] = { + ___XX___,________, + ___XX___,________, + ___XXXXX,XXXXXX__, + __XXXX__,__XX____, + _XX_XX__,__XX____, + ____XX__,__XX____, + _XXXXXXX,X_XX____, + ____XX__,__XX____, + ____XX__,__XX____, + __XXXXXX,__XX____, + __XXXXXX,__XX____, + __XXXXXX,__XX____, + __XXXXXX,__XX____, + __XXX_XX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 高 code:0xB8DF */ +static GUI_CONST_STORAGE unsigned char acB8DF[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ____XXXX,XXXX____, + ____XX__,__XX____, + ____XXXX,XXXX____, + ________,________, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + __XX_XXX,XXX_XX__, + __XX_XX_,_XX_XX__, + __XX_XXX,XXX_XX__, + __XX____,___XXX__, + ________,________, + ________,________, +}; + +/* char: 割 code:0xB8EE */ +static GUI_CONST_STORAGE unsigned char acB8EE[32] = { + ____XX__,_____XX_, + _____XX_,_____XX_, + _XXXXXXX,XXX__XX_, + _XX__XX_,_XXXXXX_, + __XXXXXX,XX_XXXX_, + _____XX_,___XXXX_, + __XXXXXX,XX_XXXX_, + _____XX_,___XXXX_, + _XXXXXXX,XXXXXXX_, + _____XX_,___XXXX_, + __XXXXXX,XX___XX_, + __XX____,XX___XX_, + __XXXXXX,XX___XX_, + __XX____,XX_XXXX_, + ________,________, + ________,________, +}; + +/* char: 个 code:0xB8F6 */ +static GUI_CONST_STORAGE unsigned char acB8F6[32] = { + _______X,X_______, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ____XX__,__XX____, + ___XX__X,X__XX___, + _XXX___X,X___XXX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 更 code:0xB8FC */ +static GUI_CONST_STORAGE unsigned char acB8FC[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + ___XX__X,X_______, + ____XXXX,________, + _____XXX,________, + ___XXX_X,XXX_____, + _XXX____,__XXXXX_, + ________,________, + ________,________, +}; + +/* char: 工 code:0xB9A4 */ +static GUI_CONST_STORAGE unsigned char acB9A4[32] = { + ________,________, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, +}; + +/* char: 功 code:0xB9A6 */ +static GUI_CONST_STORAGE unsigned char acB9A6[32] = { + ________,XX______, + ________,XX______, + _XXXXXX_,XX______, + ___XX__X,XXXXXX__, + ___XX___,XX__XX__, + ___XX___,XX__XX__, + ___XX___,XX__XX__, + ___XX___,XX__XX__, + ___XX___,XX__XX__, + ___XXXX_,XX__XX__, + _XXX___X,X___XX__, + _______X,X___XX__, + ______XX,____XX__, + _____XX_,__XXX___, + ________,________, + ________,________, +}; + +/* char: 公 code:0xB9AB */ +static GUI_CONST_STORAGE unsigned char acB9AB[32] = { + ________,XX______, + _____XX_,XX______, + _____XX_,_XX_____, + ____XX__,_XX_____, + ____XX__,__XX____, + ___XX___,___XX___, + __XX__XX,____XX__, + _XX___XX,_____XX_, + _____XX_,________, + _____XX_,XX______, + ____XX__,_XX_____, + ___XX___,__XX____, + __XXXXXX,XXXXX___, + ________,___XX___, + ________,________, + ________,________, +}; + +/* char: 构 code:0xB9B9 */ +static GUI_CONST_STORAGE unsigned char acB9B9[32] = { + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XXXXXXX_, + _XXXXXXX,X____XX_, + ___XX_XX,_____XX_, + ___XX___,_XX__XX_, + __XXXX__,_XX__XX_, + __XXXXX_,XX___XX_, + _XXXX___,XXXX_XX_, + ___XX__X,XXXXXXX_, + ___XX___,___XXXX_, + ___XX___,_____XX_, + ___XX___,_____XX_, + ___XX___,___XXX__, + ________,________, + ________,________, +}; + +/* char: 故 code:0xB9CA */ +static GUI_CONST_STORAGE unsigned char acB9CA[32] = { + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + _XXXXXXX,_XXXXXX_, + ____XX__,XX__XX__, + ____XX_X,XXX_XX__, + ____XX__,_XX_XX__, + __XXXXXX,_XX_XX__, + __XX__XX,_XXXX___, + __XX__XX,_XXXX___, + __XX__XX,__XX____, + __XXXXXX,_XXXX___, + __XX____,XX__XX__, + _______X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 固 code:0xB9CC */ +static GUI_CONST_STORAGE unsigned char acB9CC[32] = { + __XXXXXX,XXXXXXX_, + __XX___X,X____XX_, + __XX___X,X____XX_, + __XXXXXX,XXXXXXX_, + __XX___X,X____XX_, + __XX___X,X____XX_, + __XXXXXX,XXXX_XX_, + __XXXX__,__XX_XX_, + __XXXX__,__XX_XX_, + __XXXXXX,XXXX_XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XXXXXX,XXXXXXX_, + __XX____,_____XX_, + ________,________, + ________,________, +}; + +/* char: 关 code:0xB9D8 */ +static GUI_CONST_STORAGE unsigned char acB9D8[32] = { + ____XX__,__XX____, + _____XX_,__XX____, + _____XX_,_XX_____, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + ______XX,XX______, + _____XX_,_XX_____, + ____XX__,__XX____, + ___XX___,___XX___, + _XXX____,____XXX_, + ________,________, + ________,________, +}; + +/* char: 过 code:0xB9FD */ +static GUI_CONST_STORAGE unsigned char acB9FD[32] = { + ________,___XX___, + __XX____,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXXXX_, + ________,___XX___, + ______XX,___XX___, + _XXXX__X,X__XX___, + ___XX__X,X__XX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XX___,_XXXX___, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 耗 code:0xBAC4 */ +static GUI_CONST_STORAGE unsigned char acBAC4[32] = { + ____XX__,___XXX__, + ____XX__,XXXX____, + ____XX__,_XX_____, + _XXXXXXX,_XX_____, + ____XX__,_XXXXX__, + __XXXXXX,XXXX____, + ____XX__,_XX_____, + _XXXXXXX,_XX_____, + ___XXX__,_XXXXXX_, + ___XXXXX,XXXX____, + __XXXXXX,_XX_____, + __XXXX__,_XX__XX_, + _XX_XX__,_XX__XX_, + ____XX__,__XXXXX_, + ________,________, + ________,________, +}; + +/* char: 号 code:0xBAC5 */ +static GUI_CONST_STORAGE unsigned char acBAC5[32] = { + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + _____XX_,________, + ____XX__,________, + ___XXXXX,XXXXX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,_XXX____, + ________,________, + ________,________, +}; + +/* char: 和 code:0xBACD */ +static GUI_CONST_STORAGE unsigned char acBACD[32] = { + _____XXX,________, + __XXXX__,________, + ____XX__,XXXXXXX_, + ____XX__,XX___XX_, + _XXXXXXX,XX___XX_, + ____XX__,XX___XX_, + ___XXX__,XX___XX_, + ___XXXX_,XX___XX_, + __XXXXXX,XX___XX_, + __XXXX__,XX___XX_, + _XX_XX__,XXXXXXX_, + ____XX__,XX___XX_, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, +}; + +/* char: 恒 code:0xBAE3 */ +static GUI_CONST_STORAGE unsigned char acBAE3[32] = { + ___XX___,________, + ___XX_XX,XXXXXXX_, + ___XX___,________, + ___XXX__,________, + _XXXXXXX,XXXXXX__, + _XXXX__X,X___XX__, + _XXXX__X,X___XX__, + ___XX__X,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X___XX__, + ___XX__X,XXXXXX__, + ___XX___,________, + ___XX___,________, + ___XX_XX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 护 code:0xBBA4 */ +static GUI_CONST_STORAGE unsigned char acBBA4[32] = { + ___XX___,_XX_____, + ___XX___,__XX____, + ___XX__X,XXXXXXX_, + _XXXXXXX,X____XX_, + ___XX__X,X____XX_, + ___XX__X,X____XX_, + ___XXXXX,XXXXXXX_, + ___XXX_X,X____XX_, + _XXXX__X,X_______, + ___XX__X,X_______, + ___XX__X,X_______, + ___XX_XX,________, + ___XX_XX,________, + _XXXXXX_,________, + ________,________, + ________,________, +}; + +/* char: 欢 code:0xBBB6 */ +static GUI_CONST_STORAGE unsigned char acBBB6[32] = { + ________,_XX_____, + ________,_XX_____, + __XXXXXX,_XX_____, + ______XX,XXXXXXX_, + ______XX,XX___XX_, + __XX_XXX,X_XXXX__, + ___XXXX_,__XX____, + ____XX__,__XX____, + ____XXX_,__XX____, + ___XXXX_,__XX____, + ___XX_XX,_XXXX___, + __XX__XX,_XXXX___, + _XX_____,XX__XX__, + _______X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 环 code:0xBBB7 */ +static GUI_CONST_STORAGE unsigned char acBBB7[32] = { + ________,________, + ______XX,XXXXXXX_, + _XXXXXX_,__XX____, + ___XX___,__XX____, + ___XX___,_XX_____, + ___XX___,_XX_____, + _XXXXXX_,XXXXX___, + ___XX__X,XXX_XX__, + ___XX_XX,_XX__XX_, + ___XX___,_XX__XX_, + ___XXXX_,_XX_____, + _XXXX___,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,________, + ________,________, +}; + +/* char: 换 code:0xBBBB */ +static GUI_CONST_STORAGE unsigned char acBBBB[32] = { + ___XX__X,X_______, + ___XX__X,X_______, + ___XX__X,XXXXX___, + _XXXXXXX,___XX___, + ___XXXX_,__XX____, + ___XX_XX,XXXXXX__, + ___XX_XX,_XX_XX__, + ___XXXXX,_XX_XX__, + _XXXX_XX,_XX_XX__, + ___XXXXX,XXXXXXX_, + ___XX___,XXXX____, + ___XX__X,X__XX___, + ___XX_XX,____XX__, + _XXXXXX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 簧 code:0xBBC9 */ +static GUI_CONST_STORAGE unsigned char acBBC9[32] = { + ___XX___,_XX_____, + __XXXXXX,XXXXXXX_, + _XX__XX_,XX_XX___, + _____XX_,_XX_____, + ___XXXXX,XXXXX___, + _____XX_,_XX_____, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ____XX__,__XX____, + ________,________, + ________,________, +}; + +/* char: 恢 code:0xBBD6 */ +static GUI_CONST_STORAGE unsigned char acBBD6[32] = { + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XXXXX,XXXXXXX_, + _XXXXXX_,XX______, + _XXXX__X,X_XX____, + _XXXX__X,X_XX_XX_, + ___XX_XX,XXXX_XX_, + ___XXXX_,XXXXXX__, + ___XX__X,XXXXX___, + ___XX___,_XXXX___, + ___XX___,XX__XX__, + ___XX__X,X___XX__, + ___XX_XX,_____XX_, + ________,________, + ________,________, +}; + +/* char: 回 code:0xBBD8 */ +static GUI_CONST_STORAGE unsigned char acBBD8[32] = { + ________,________, + __XXXXXX,XXXXXXX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX_XXX,XXXX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XXX,XXXX_XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XXXXXX,XXXXXXX_, + __XX____,_____XX_, + ________,________, + ________,________, +}; + +/* char: 基 code:0xBBF9 */ +static GUI_CONST_STORAGE unsigned char acBBF9[32] = { + ____XX__,__XX____, + __XXXXXX,XXXXXX__, + ____XX__,__XX____, + ____XXXX,XXXX____, + ____XX__,__XX____, + ____XXXX,XXXX____, + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ___XX___,___XX___, + __XX___X,X___XX__, + _XX_XXXX,XXXX_XX_, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 机 code:0xBBFA */ +static GUI_CONST_STORAGE unsigned char acBBFA[32] = { + ___XX___,________, + ___XX__X,XXXXX___, + ___XX__X,X__XX___, + _XXXXXXX,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + __XXXX_X,X__XX___, + __XXXXXX,X__XX___, + _XXXX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX_XX,___XXXX_, + ___XX_XX,___XXXX_, + ___XXXX_,____XXX_, + ________,________, + ________,________, +}; + +/* char: 积 code:0xBBFD */ +static GUI_CONST_STORAGE unsigned char acBBFD[32] = { + ________,________, + ____XXXX,XXXXXX__, + _XXXX__X,X___XX__, + ___XX__X,X___XX__, + ___XX__X,X___XX__, + _XXXXXXX,X___XX__, + ___XX__X,X___XX__, + ___XXX_X,XXXXXX__, + __XXXXX_,________, + __XXX___,________, + _XXXX___,XX_XX___, + ___XX___,XX__XX__, + ___XX__X,X____XX_, + ___XX_XX,_____XX_, + ________,________, + ________,________, +}; + +/* char: 辑 code:0xBCAD */ +static GUI_CONST_STORAGE unsigned char acBCAD[32] = { + ___XX___,________, + ___XX__X,XXXXXX__, + _XXXXXXX,X___XX__, + __XX___X,XXXXXX__, + __XX____,________, + _XXXX_XX,XXXXXXX_, + _XXXXXXX,X___XX__, + ___XX__X,XXXXXX__, + ___XX__X,X___XX__, + ___XXXXX,XXXXXX__, + _XXXX__X,X___XX__, + ___XX__X,X_XXXXX_, + ___XX_XX,XXX_XX__, + ___XX___,____XX__, + ________,________, + ________,________, +}; + +/* char: 技 code:0xBCBC */ +static GUI_CONST_STORAGE unsigned char acBCBC[32] = { + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + _XXXXXXX,XXXXXX__, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX_XX,XXXXX___, + ___XXX_X,X__XX___, + _XXXX__X,X__XX___, + ___XX___,XXXX____, + ___XX___,_XX_____, + ___XX___,XXXX____, + ___XX__X,X__XX___, + _XXXXXXX,____XXX_, + ________,________, + ________,________, +}; + +/* char: 计 code:0xBCC6 */ +static GUI_CONST_STORAGE unsigned char acBCC6[32] = { + __XX____,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ________,_XX_____, + ________,_XX_____, + _XXXXXXX,XXXXXXX_, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XXXX_,_XX_____, + ___XXX__,_XX_____, + ___XX___,_XX_____, + ________,_XX_____, + ________,________, + ________,________, +}; + +/* char: 记 code:0xBCC7 */ +static GUI_CONST_STORAGE unsigned char acBCC7[32] = { + __XX____,________, + ___XX_XX,XXXXXX__, + ___XX___,____XX__, + ________,____XX__, + ________,____XX__, + _XXXX___,____XX__, + ___XX_XX,XXXXXX__, + ___XX_XX,________, + ___XX_XX,________, + ___XX_XX,________, + ___XXXXX,________, + ___XXXXX,_____XX_, + ___XX_XX,_____XX_, + _______X,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 加 code:0xBCD3 */ +static GUI_CONST_STORAGE unsigned char acBCD3[32] = { + ____XX__,________, + ____XX__,________, + ____XX__,________, + _XXXXXXX,XXXXXXX_, + ____XX_X,XXX__XX_, + ____XX_X,XXX__XX_, + ____XX_X,XXX__XX_, + ____XX_X,XXX__XX_, + ___XX__X,XXX__XX_, + ___XX__X,XXX__XX_, + ___XX__X,XXX__XX_, + __XX___X,XXXXXXX_, + __XX___X,XXX__XX_, + _XX__XXX,________, + ________,________, + ________,________, +}; + +/* char: 间 code:0xBCE4 */ +static GUI_CONST_STORAGE unsigned char acBCE4[32] = { + ___XX___,________, + ____XXXX,XXXXXXX_, + ____XX__,_____XX_, + __XX____,_____XX_, + __XX_XXX,XXXX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XXX,XXXX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XXX,XXXX_XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 减 code:0xBCF5 */ +static GUI_CONST_STORAGE unsigned char acBCF5[32] = { + ________,___XXXX_, + __XX____,___XX___, + ___XXXXX,XXXXXXX_, + ___XXXX_,___XX___, + _____XX_,___XX___, + _____XXX,XXXXX___, + _____XX_,___XXXX_, + ___XXXXX,XXXXXXX_, + ___XXXXX,XXXXXX__, + __XX_XXX,XXXXXX__, + __XX_XXX,XXXXXXX_, + _XX__XX_,__XXXXX_, + _XX__XX_,_XX_XXX_, + ____XX__,XX___XX_, + ________,________, + ________,________, +}; + +/* char: 件 code:0xBCFE */ +static GUI_CONST_STORAGE unsigned char acBCFE[32] = { + ____XX__,_XX_____, + ____XXXX,_XX_____, + ___XX_XX,_XX_____, + ___XX_XX,XXXXXX__, + __XXXXX_,_XX_____, + _XXXX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ________,________, + ________,________, +}; + +/* char: 江 code:0xBDAD */ +static GUI_CONST_STORAGE unsigned char acBDAD[32] = { + ________,________, + __XX____,________, + ___XX_XX,XXXXXX__, + ____XX__,_XX_____, + ________,_XX_____, + _XX_____,_XX_____, + __XX____,_XX_____, + ________,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + __XX____,_XX_____, + __XX_XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 角 code:0xBDC7 */ +static GUI_CONST_STORAGE unsigned char acBDC7[32] = { + _____XX_,________, + ____XXXX,XXXX____, + ___XX___,_XX_____, + __XX____,XX______, + _XXXXXXX,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X___XX__, + ___XXXXX,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X___XX__, + ___XXXXX,XXXXXX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + _XX_____,__XXXX__, + ________,________, + ________,________, +}; + +/* char: 进 code:0xBDF8 */ +static GUI_CONST_STORAGE unsigned char acBDF8[32] = { + _______X,X__XX___, + __XX___X,X__XX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXXXX_, + _______X,X__XX___, + _______X,X__XX___, + _XXXX__X,X__XX___, + ___XXXXX,XXXXXXX_, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX_XX,___XX___, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 尽 code:0xBEA1 */ +static GUI_CONST_STORAGE unsigned char acBEA1[32] = { + ________,________, + ___XXXXX,XXXXXX__, + ___XX___,____XX__, + ___XX___,____XX__, + ___XXXXX,XXXXXX__, + ___XX___,XX______, + ___XX___,_XX_____, + __XX____,__XX____, + __XX_XXX,___XX___, + _XX____X,XX__XXX_, + ________,________, + ____XXXX,________, + _______X,XX______, + ________,_XXX____, + ________,________, + ________,________, +}; + +/* char: 警 code:0xBEAF */ +static GUI_CONST_STORAGE unsigned char acBEAF[32] = { + ___XX_XX,__XX____, + __XXXXXX,XXXXXXX_, + ___XX_XX,XX__XX__, + __XXXXXX,XXX_XX__, + _XXXXXXX,X_XXX___, + ___XXXXX,XXX_XXX_, + ______XX,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ___XXXXX,XXXXX___, + ________,________, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ________,________, + ________,________, +}; + +/* char: 境 code:0xBEB3 */ +static GUI_CONST_STORAGE unsigned char acBEB3[32] = { + ___XX___,_XX_____, + ___XX_XX,XXXXXX__, + ___XX__X,X__XX___, + ___XX___,XXXX____, + _XXXXXXX,XXXXXXX_, + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ___XXXXX,XXXXXX__, + _XXX____,XXXX____, + _______X,X_XX_XX_, + _____XXX,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 据 code:0xBEDD */ +static GUI_CONST_STORAGE unsigned char acBEDD[32] = { + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + _XXXXXXX,____XX__, + ___XX_XX,XXXXXX__, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + ___XXXXX,XXXXXXX_, + _XXXX_XX,__XX____, + ___XX_XX,__XX____, + ___XX_XX,XXXXXX__, + ___XXXX_,XX__XX__, + ___XXXX_,XX__XX__, + _XXXXX__,XXXXXX__, + ________,________, + ________,________, +}; + +/* char: 巨 code:0xBEDE */ +static GUI_CONST_STORAGE unsigned char acBEDE[32] = { + ________,________, + __XXXXXX,XXXXXX__, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XXXXXX,XXXXX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 开 code:0xBFAA */ +static GUI_CONST_STORAGE unsigned char acBFAA[32] = { + __XXXXXX,XXXXXX__, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + __XX____,__XX____, + _XX_____,__XX____, + ________,________, + ________,________, +}; + +/* char: 可 code:0xBFC9 */ +static GUI_CONST_STORAGE unsigned char acBFC9[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + ________,___XX___, + ________,___XX___, + ___XXXXX,XX_XX___, + ___XX___,XX_XX___, + ___XX___,XX_XX___, + ___XX___,XX_XX___, + ___XX___,XX_XX___, + ___XXXXX,XX_XX___, + ___XX___,___XX___, + ________,___XX___, + ________,___XX___, + ________,_XXXX___, + ________,________, + ________,________, +}; + +/* char: 空 code:0xBFD5 */ +static GUI_CONST_STORAGE unsigned char acBFD5[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _XX__XX_,_XX__XX_, + _XX_XX__,__XX_XX_, + ___XX___,___XX___, + ________,________, + ___XXXXX,XXXXX___, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 控 code:0xBFD8 */ +static GUI_CONST_STORAGE unsigned char acBFD8[32] = { + ___XX___,XX______, + ___XX___,_XX_____, + ___XX_XX,XXXXXXX_, + _XXXXXXX,_____XX_, + ___XX___,XX_XX___, + ___XX__X,X___XX__, + ___XX_XX,_____XX_, + ___XXX__,________, + _XXXX__X,XXXXXX__, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + _XXXX_XX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 跨 code:0xBFE7 */ +static GUI_CONST_STORAGE unsigned char acBFE7[32] = { + ________,_XX_____, + _XXXXX__,_XX_____, + _XX_XXXX,XXXXXXX_, + _XX_XX__,XX_XX___, + _XX_XX_X,X___XX__, + _XXXXXXX,XXXXXXX_, + ___XX___,________, + _XXXX_XX,XXXXXXX_, + _XXXXX_X,X_______, + _XXXX__X,XXXXXX__, + _XXXX___,____XX__, + _XXXXX__,____XX__, + _XXX____,____XX__, + ________,__XXX___, + ________,________, + ________,________, +}; + +/* char: 块 code:0xBFE9 */ +static GUI_CONST_STORAGE unsigned char acBFE9[32] = { + ___XX___,XX______, + ___XX___,XX______, + ___XX_XX,XXXXXX__, + ___XX___,XX__XX__, + _XXXXXX_,XX__XX__, + ___XX___,XX__XX__, + ___XX___,XX__XX__, + ___XXXXX,XXXXXXX_, + ___XX___,XXXX____, + ___XXXX_,XXXX____, + _XXXX__X,X__XX___, + _______X,X__XX___, + ______XX,____XX__, + _____XX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 蓝 code:0xC0B6 */ +static GUI_CONST_STORAGE unsigned char acC0B6[32] = { + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + ________,________, + _____XX_,XX______, + __XX_XX_,XXXXXX__, + __XX_XXX,X_XX____, + __XX_XXX,___XX___, + _____XX_,____XX__, + ___XXXXX,XXXXX___, + ___XX_XX,XX_XX___, + ___XX_XX,XX_XX___, + ___XX_XX,XX_XX___, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 累 code:0xC0DB */ +static GUI_CONST_STORAGE unsigned char acC0DB[32] = { + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + _____XX_,________, + ____XX__,_XX_____, + ___XXXXX,XX______, + ______XX,___XX___, + __XXXXXX,XXXXXX__, + _______X,X___XX__, + ___XX__X,X_XX____, + __XX___X,X__XX___, + _XX__XXX,X___XX__, + ________,________, + ________,________, +}; + +/* char: 类 code:0xC0E0 */ +static GUI_CONST_STORAGE unsigned char acC0E0[32] = { + _______X,X_______, + ___XX__X,X__XX___, + ____XX_X,X_XX____, + _XXXXXXX,XXXXXXX_, + _____XXX,XXX_____, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + _XXX____,____XX__, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + _____XX_,_XX_____, + ___XXX__,__XXX___, + _XXX____,____XXX_, + ________,________, + ________,________, +}; + +/* char: 离 code:0xC0EB */ +static GUI_CONST_STORAGE unsigned char acC0EB[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ___XXXX_,_XXXX___, + ___XX_XX,XX_XX___, + ___XXXX_,_XXXX___, + ___XXXXX,XXXXX___, + _______X,X_______, + __XXXXXX,XXXXXX__, + __XX_XX_,_XX_XX__, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + __XX____,__XXXX__, + ________,________, + ________,________, +}; + +/* char: 例 code:0xC0FD */ +static GUI_CONST_STORAGE unsigned char acC0FD[32] = { + ____XX__,_____XX_, + ____XXXX,XXXX_XX_, + ___XX__X,X____XX_, + ___XX__X,X__XXXX_, + __XXX__X,XXXXXXX_, + _XXXX_XX,_XXXXXX_, + ___XX_XX,_XXXXXX_, + ___XX_XX,_XXXXXX_, + ___XXXXX,XXXXXXX_, + ___XX___,XX_XXXX_, + ___XX___,XX___XX_, + ___XX__X,X____XX_, + ___XX_XX,_____XX_, + ___XXXX_,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 力 code:0xC1A6 */ +static GUI_CONST_STORAGE unsigned char acC1A6[32] = { + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXXX__, + ______XX,____XX__, + _____XX_,____XX__, + _____XX_,____XX__, + _____XX_,____XX__, + ____XX__,____XX__, + ____XX__,____XX__, + ___XX___,____XX__, + __XX____,___XX___, + _XX_____,_XXX____, + ________,________, + ________,________, +}; + +/* char: 量 code:0xC1BF */ +static GUI_CONST_STORAGE unsigned char acC1BF[32] = { + ___XXXXX,XXXXX___, + ___XX_XX,___XX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ________,________, + _XXXXXXX,XXXXXXX_, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 列 code:0xC1D0 */ +static GUI_CONST_STORAGE unsigned char acC1D0[32] = { + ________,_____XX_, + __XXXXXX,X____XX_, + ____XX__,_____XX_, + ____XX__,__XX_XX_, + ____XXXX,X_XX_XX_, + ___XX__X,X_XX_XX_, + ___XX__X,X_XX_XX_, + __XXXX_X,X_XX_XX_, + _XX__XXX,__XX_XX_, + ______XX,__XX_XX_, + _____XX_,_____XX_, + ____XX__,_____XX_, + ___XX___,_____XX_, + __XX____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 零 code:0xC1E3 */ +static GUI_CONST_STORAGE unsigned char acC1E3[32] = { + ___XXXXX,XXXXX___, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _XX____X,X____XX_, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ___XXX__,__XXX___, + _XXX___X,X___XXX_, + ____XXXX,XXXX____, + ________,_XX_____, + ____XXXX,XX______, + _______X,XX______, + ________,________, + ________,________, +}; + +/* char: 流 code:0xC1F7 */ +static GUI_CONST_STORAGE unsigned char acC1F7[32] = { + ________,_XX_____, + __XX____,__XX____, + ___XX_XX,XXXXXXX_, + ____XX__,_XX_____, + ________,XX_XX___, + _XX____X,X___XX__, + __XX__XX,XXXXXXX_, + ____XX__,_____XX_, + ____XX_X,XXXXX___, + ___XX__X,XXXXX___, + ___XX__X,XXXXX___, + __XX___X,XXXXX___, + __XX__XX,_XXXXXX_, + _____XX_,____XXX_, + ________,________, + ________,________, +}; + +/* char: 路 code:0xC2B7 */ +static GUI_CONST_STORAGE unsigned char acC2B7[32] = { + ________,_XX_____, + __XXXXX_,_XX_____, + __XX_XX_,_XXXXX__, + __XX_XX_,XX__XX__, + __XX_XXX,XXXXX___, + __XXXXX_,__XX____, + ____XX__,_XXXX___, + __XXXX_X,XX__XXX_, + __XXXXXX,________, + __XXXX__,XXXXXX__, + __XXXX__,XX__XX__, + __XXXXXX,XX__XX__, + _XXXX___,XXXXXX__, + ________,XX__XX__, + ________,________, + ________,________, +}; + +/* char: 录 code:0xC2BC */ +static GUI_CONST_STORAGE unsigned char acC2BC[32] = { + ________,________, + __XXXXXX,XXXXX___, + ________,___XX___, + ___XXXXX,XXXXX___, + ________,___XX___, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ___XX__X,X__XX___, + ____XX_X,XXXX____, + _____XXX,XXX_____, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + _XXX___X,X___XXX_, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 率 code:0xC2CA */ +static GUI_CONST_STORAGE unsigned char acC2CA[32] = { + ______XX,________, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _XX___XX,_XX__XX_, + __XX_XXX,XX__XX__, + ___XX__X,X__XX___, + __XX__XX,_XX_XX__, + _XX__XXX,XXXX_XX_, + _______X,X_XX____, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 满 code:0xC2FA */ +static GUI_CONST_STORAGE unsigned char acC2FA[32] = { + _______X,X__XX___, + __XX_XXX,XXXXXXX_, + ___XX__X,X__XX___, + ________,________, + _XX__XXX,XXXXXXX_, + __XX___X,X__XX___, + _______X,X__XX___, + ___XXXXX,XXXXXXX_, + ___XXXXX,X__XXXX_, + __XX_XXX,X__XXXX_, + __XX_XXX,XXXXXXX_, + _XX__XX_,_____XX_, + _XX__XX_,_____XX_, + _____XX_,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 门 code:0xC3C5 */ +static GUI_CONST_STORAGE unsigned char acC3C5[32] = { + ___XX___,________, + ____XXXX,XXXXXXX_, + ____XX__,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 面 code:0xC3E6 */ +static GUI_CONST_STORAGE unsigned char acC3E6[32] = { + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ______XX,________, + __XXXXXX,XXXXXX__, + __XX_XX_,_XX_XX__, + __XX_XX_,_XX_XX__, + __XX_XXX,XXX_XX__, + __XX_XX_,_XX_XX__, + __XX_XX_,_XX_XX__, + __XX_XXX,XXX_XX__, + __XX_XX_,_XX_XX__, + __XX_XX_,_XX_XX__, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + ________,________, + ________,________, +}; + +/* char: 名 code:0xC3FB */ +static GUI_CONST_STORAGE unsigned char acC3FB[32] = { + ______XX,________, + ______XX,________, + _____XXX,XXXXXX__, + ____XX__,___XX___, + __XXXXX_,__XX____, + ______XX,_XX_____, + _______X,XX______, + _____XXX,________, + ___XXXXX,XXXXXX__, + _XXXXX__,____XX__, + ____XX__,____XX__, + ____XX__,____XX__, + ____XXXX,XXXXXX__, + ____XX__,____XX__, + ________,________, + ________,________, +}; + +/* char: 模 code:0xC4A3 */ +static GUI_CONST_STORAGE unsigned char acC4A3[32] = { + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX_XX,XXXXXXX_, + _XXXXX_X,X__XX___, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + __XXXXXX,XXXXXX__, + __XXXXXX,____XX__, + _XXXX_XX,XXXXXX__, + ___XX___,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,XXXX____, + ___XX__X,X__XX___, + ___XXXXX,____XXX_, + ________,________, + ________,________, +}; + +/* char: 膜 code:0xC4A4 */ +static GUI_CONST_STORAGE unsigned char acC4A4[32] = { + ________,_XXXX___, + __XXXXX_,_XXXX___, + __XX_XXX,XXXXXXX_, + __XX_XX_,_XXXX___, + __XX_XX_,XXXXXX__, + __XXXXX_,XX__XX__, + __XX_XX_,XXXXXX__, + __XX_XX_,XX__XX__, + __XXXXX_,XXXXXX__, + __XX_XX_,__XX____, + __XX_XXX,XXXXXXX_, + __XX_XX_,_XXXX___, + __XX_XX_,XX__XX__, + _XX_XXXX,X____XX_, + ________,________, + ________,________, +}; + +/* char: 摩 code:0xC4A6 */ +static GUI_CONST_STORAGE unsigned char acC4A6[32] = { + _______X,X_______, + __XXXXXX,XXXXXXX_, + __XX_XX_,__XX____, + __XXXXXX,XXXXXX__, + __XX_XX_,_XXXX___, + __XXXXXX,XXXXXXX_, + __XXXXX_,__XX____, + __XX_XXX,XXXXX___, + __XX____,XX______, + __XX_XXX,XXXXX___, + __XX____,XX______, + __XXXXXX,XXXXXXX_, + __XX____,XX______, + _XX___XX,XX______, + ________,________, + ________,________, +}; + +/* char: 内 code:0xC4DA */ +static GUI_CONST_STORAGE unsigned char acC4DA[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXXX_, + __XX___X,X____XX_, + __XX___X,X____XX_, + __XX__XX,XX___XX_, + __XX_XX_,_XX__XX_, + __XXXX__,__XX_XX_, + __XXX___,___XXXX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 能 code:0xC4DC */ +static GUI_CONST_STORAGE unsigned char acC4DC[32] = { + ____XX__,_XX_____, + ___XX___,_XX_XXX_, + __XX__XX,_XXXX___, + _XXXXXXX,XXX__XX_, + _______X,XXX__XX_, + ________,__XXXXX_, + __XXXXXX,________, + __XX__XX,_XX__XX_, + __XXXXXX,_XX_XX__, + __XX__XX,_XXXX___, + __XXXXXX,_XX_____, + __XX__XX,_XX__XX_, + __XX__XX,_XX__XX_, + __XX_XXX,__XXXXX_, + ________,________, + ________,________, +}; + +/* char: 拟 code:0xC4E2 */ +static GUI_CONST_STORAGE unsigned char acC4E2[32] = { + ___XX___,___XX___, + ___XX___,XX_XX___, + ___XX_XX,_XXXX___, + _XXXXXXX,_XXXX___, + ___XX_XX,_XXXX___, + ___XX_XX,___XX___, + ___XX_XX,___XX___, + ___XXXXX,___XX___, + _XXXX_XX,___XX___, + ___XX_XX,XXXXXX__, + ___XX_XX,X_XXXX__, + ___XX_XX,_XX__XX_, + ___XX___,XX___XX_, + _XXXX__X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 配 code:0xC5E4 */ +static GUI_CONST_STORAGE unsigned char acC5E4[32] = { + ________,________, + _XXXXXXX,XXXXXX__, + ___XXXX_,____XX__, + ___XXXX_,____XX__, + _XXXXXXX,X___XX__, + _XXXXXXX,X___XX__, + _XXXXXXX,XXXXXX__, + _XXX__XX,XXX_____, + _XX____X,XXX_____, + _XXXXXXX,XXX_____, + _XX____X,XXX_____, + _XX____X,XXX__XX_, + _XXXXXXX,XXX__XX_, + _XX____X,X_XXXXX_, + ________,________, + ________,________, +}; + +/* char: 偏 code:0xC6AB */ +static GUI_CONST_STORAGE unsigned char acC6AB[32] = { + ____XX__,XX______, + ____XX__,_XX_____, + ____XXXX,XXXXXX__, + ___XX_XX,____XX__, + ___XX_XX,____XX__, + __XXX_XX,XXXXXX__, + _XXXX_XX,________, + ___XX_XX,XXXXXX__, + ___XXXXX,XXXXXX__, + ___XXXXX,XXXXXX__, + ___XXXXX,XXXXXX__, + ___XX_XX,XXXXXX__, + ___XX_XX,XXXXXX__, + ___XX_XX,___XXX__, + ________,________, + ________,________, +}; + +/* char: 频 code:0xC6B5 */ +static GUI_CONST_STORAGE unsigned char acC6B5[32] = { + ____XX__,________, + ____XX_X,XXXXXXX_, + __XXXXXX,__XX____, + __XXXX__,_XX_____, + __XXXX__,XXXXXX__, + _XXXXXXX,XX__XX__, + ________,XXXXXX__, + ____XX__,XXXXXX__, + __XXXXXX,XXXXXX__, + _XX_XXXX,XXXXXX__, + _____XX_,XXXXXX__, + ____XX__,_XXXX___, + ___XX___,XX__XX__, + _XXX___X,X___XX__, + ________,________, + ________,________, +}; + +/* char: 平 code:0xC6BD */ +static GUI_CONST_STORAGE unsigned char acC6BD[32] = { + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + ___XX__X,X__XX___, + ____XX_X,X__XX___, + ____XX_X,X_XX____, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 启 code:0xC6F4 */ +static GUI_CONST_STORAGE unsigned char acC6F4[32] = { + ______XX,________, + _______X,X_______, + ___XXXXX,XXXXXX__, + ___XX___,____XX__, + ___XX___,____XX__, + ___XXXXX,XXXXXX__, + ___XX___,________, + ___XX___,________, + ___XXXXX,XXXXXX__, + ___XXXX_,____XX__, + __XX_XX_,____XX__, + __XX_XX_,____XX__, + _XX__XXX,XXXXXX__, + _____XX_,____XX__, + ________,________, + ________,________, +}; + +/* char: 器 code:0xC6F7 */ +static GUI_CONST_STORAGE unsigned char acC6F7[32] = { + __XXXXXX,XXXXXX__, + __XX__XX,XX__XX__, + __XX__XX,XX__XX__, + __XXXXXX,XXXXXX__, + ________,__XX____, + _______X,X__XX___, + _XXXXXXX,XXXXXXX_, + _____XX_,_XX_____, + ___XXX__,__XXX___, + _XXX____,____XXX_, + __XXXXXX,XXXXXX__, + __XX__XX,XX__XX__, + __XX__XX,XX__XX__, + __XXXXXX,XXXXXX__, + ________,________, + ________,________, +}; + +/* char: 气 code:0xC6F8 */ +static GUI_CONST_STORAGE unsigned char acC6F8[32] = { + ___XX___,________, + ___XX___,________, + ___XXXXX,XXXXXXX_, + __XX____,________, + _XX_XXXX,XXXXX___, + ________,________, + __XXXXXX,XXXXX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XXXX_, + ________,____XXX_, + ________,_____XX_, + ________,________, + ________,________, +}; + +/* char: 前 code:0xC7B0 */ +static GUI_CONST_STORAGE unsigned char acC7B0[32] = { + ___XX___,___XX___, + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ________,________, + __XXXXXX,X___XX__, + __XX___X,XXX_XX__, + __XX___X,XXX_XX__, + __XXXXXX,XXX_XX__, + __XX___X,XXX_XX__, + __XX___X,XXX_XX__, + __XXXXXX,XXX_XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX_XXX,X_XXXX__, + ________,________, + ________,________, +}; + +/* char: 切 code:0xC7D0 */ +static GUI_CONST_STORAGE unsigned char acC7D0[32] = { + ___XX___,________, + ___XX__X,XXXXXXX_, + ___XX___,_XX__XX_, + ___XX___,_XX__XX_, + ___XXXXX,_XX__XX_, + _XXXX___,_XX__XX_, + ___XX___,_XX__XX_, + ___XX___,_XX__XX_, + ___XX_XX,_XX__XX_, + ___XXXX_,XX___XX_, + ___XXX__,XX___XX_, + ___XX__X,X____XX_, + ______XX,_____XX_, + _____XX_,___XXX__, + ________,________, + ________,________, +}; + +/* char: 区 code:0xC7F8 */ +static GUI_CONST_STORAGE unsigned char acC7F8[32] = { + __XXXXXX,XXXXXXX_, + __XX____,________, + __XX____,___XX___, + __XXXX__,___XX___, + __XX_XX_,__XX____, + __XX__XX,__XX____, + __XX___X,XXX_____, + __XX____,XX______, + __XX___X,XXX_____, + __XX__XX,__XX____, + __XX_XX_,___XX___, + __XXXX__,___XX___, + __XX____,________, + __XXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 驱 code:0xC7FD */ +static GUI_CONST_STORAGE unsigned char acC7FD[32] = { + ________,________, + _XXXXXX_,XXXXXXX_, + _____XX_,XX______, + __XX_XX_,XX______, + __XX_XX_,XXX_XX__, + __XX_XX_,XXXXXX__, + __XX_XX_,XXXXXX__, + __XXXXXX,XX_XX___, + ______XX,XX_XX___, + ______XX,XXXXXX__, + ___XXXXX,XXXXXX__, + _XXX__XX,XXX_XX__, + ______XX,XX______, + ____XXX_,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 取 code:0xC8A1 */ +static GUI_CONST_STORAGE unsigned char acC8A1[32] = { + ________,________, + _XXXXXXX,________, + __XX_XXX,XXXXXX__, + __XX_XX_,XX__XX__, + __XXXXX_,XX__XX__, + __XX_XX_,XX__XX__, + __XX_XX_,XX__XX__, + __XXXXX_,_XXXX___, + __XX_XX_,_XXXX___, + __XX_XXX,X_XX____, + _XXXXXX_,__XX____, + _____XX_,_XXXX___, + _____XX_,XX__XX__, + _____XXX,X____XX_, + ________,________, + ________,________, +}; + +/* char: 全 code:0xC8AB */ +static GUI_CONST_STORAGE unsigned char acC8AB[32] = { + _______X,X_______, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ____XX__,__XX____, + ___XX___,___XX___, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + ____XXXX,XXXX____, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 确 code:0xC8B7 */ +static GUI_CONST_STORAGE unsigned char acC8B7[32] = { + ________,XX______, + ________,XXXXXX__, + _XXXXXXX,X___XX__, + ___XX_XX,___XX___, + ___XX__X,XXXXXXX_, + __XX___X,X_XX_XX_, + __XXXXXX,X_XX_XX_, + _XXX_XXX,XXXXXXX_, + __XX_XXX,X_XX_XX_, + __XX_XXX,X_XX_XX_, + __XX_XXX,XXXXXXX_, + __XXXXXX,X_XX_XX_, + __XX___X,X_XX_XX_, + ______XX,____XXX_, + ________,________, + ________,________, +}; + +/* char: 认 code:0xC8CF */ +static GUI_CONST_STORAGE unsigned char acC8CF[32] = { + __XX____,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ________,_XX_____, + _XXXX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,XXXX____, + ___XX___,XXXX____, + ___XXXX_,XXXX____, + ___XXX_X,X__XX___, + ___XX__X,X__XX___, + ______XX,____XX__, + _____XX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 入 code:0xC8EB */ +static GUI_CONST_STORAGE unsigned char acC8EB[32] = { + _____XX_,________, + ______XX,________, + ______XX,________, + _______X,X_______, + _______X,X_______, + ______XX,XX______, + ______XX,XX______, + _____XX_,_XX_____, + _____XX_,_XX_____, + ____XX__,__XX____, + ____XX__,__XX____, + ___XX___,___XX___, + __XX____,____XX__, + _XX_____,_____XX_, + ________,________, + ________,________, +}; + +/* char: 软 code:0xC8ED */ +static GUI_CONST_STORAGE unsigned char acC8ED[32] = { + ____XX__,_XX_____, + ____XX__,_XX_____, + _XXXXXXX,_XX_____, + ___XX___,_XXXXXX_, + __XXXX__,XX___XX_, + __XXXX__,XX__XX__, + _XXXXXXX,X_XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ____XXXX,__XX____, + _XXXXX__,_XXXX___, + ____XX__,_XXXX___, + ____XX__,XX__XX__, + ____XX_X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 商 code:0xC9CC */ +static GUI_CONST_STORAGE unsigned char acC9CC[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + _____XX_,_XX_____, + __XXXXXX,XXXXXX__, + __XX_XX_,_XX_XX__, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + __XX_XX_,_XX_XX__, + __XX_XX_,_XX_XX__, + __XX_XXX,XXX_XX__, + __XX____,____XX__, + __XX____,__XXXX__, + ________,________, + ________,________, +}; + +/* char: 上 code:0xC9CF */ +static GUI_CONST_STORAGE unsigned char acC9CF[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 少 code:0xC9D9 */ +static GUI_CONST_STORAGE unsigned char acC9D9[32] = { + _______X,X_______, + _______X,X_______, + ____XX_X,X_XX____, + ____XX_X,X__XX___, + ___XX__X,X___XX__, + __XX___X,X____XX_, + _XX____X,X____XX_, + _______X,X__XX___, + _______X,X_XX____, + ________,_XX_____, + ________,XX______, + ______XX,X_______, + ____XXX_,________, + _XXXX___,________, + ________,________, + ________,________, +}; + +/* char: 设 code:0xC9E8 */ +static GUI_CONST_STORAGE unsigned char acC9E8[32] = { + __XX____,________, + ___XX__X,XXXXX___, + ___XX__X,X__XX___, + _______X,X__XX___, + _______X,X__XX___, + _XXXX_XX,____XXX_, + ___XXXX_,________, + ___XX_XX,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X__XX___, + ___XXXX_,XXXX____, + ___XXX__,_XX_____, + ___XX__X,XXXXX___, + _____XXX,____XXX_, + ________,________, + ________,________, +}; + +/* char: 湿 code:0xCAAA */ +static GUI_CONST_STORAGE unsigned char acCAAA[32] = { + ________,________, + __XX_XXX,XXXXXX__, + ___XXXX_,____XX__, + _____XX_,____XX__, + _XX__XXX,XXXXXX__, + __XX_XX_,____XX__, + _____XX_,____XX__, + ___XXXXX,XXXXXX__, + ___XX__X,X_XX____, + __XXXX_X,X_XX_XX_, + __XX_XXX,X_XXXX__, + _XX___XX,X_XXX___, + _XX____X,X_XX____, + ____XXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 石 code:0xCAAF */ +static GUI_CONST_STORAGE unsigned char acCAAF[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + ______XX,________, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XXXXX,XXXXXX__, + __XXXX__,____XX__, + _XX_XX__,____XX__, + ____XX__,____XX__, + ____XX__,____XX__, + ____XX__,____XX__, + ____XXXX,XXXXXX__, + ____XX__,____XX__, + ________,________, + ________,________, +}; + +/* char: 时 code:0xCAB1 */ +static GUI_CONST_STORAGE unsigned char acCAB1[32] = { + ________,___XX___, + ________,___XX___, + _XXXXX__,___XX___, + _XX_XXXX,XXXXXXX_, + _XX_XX__,___XX___, + _XX_XX__,___XX___, + _XXXXX_X,X__XX___, + _XX_XX__,XX_XX___, + _XX_XX__,XX_XX___, + _XX_XX__,___XX___, + _XXXXX__,___XX___, + _XX_XX__,___XX___, + ________,___XX___, + ________,_XXXX___, + ________,________, + ________,________, +}; + +/* char: 实 code:0xCAB5 */ +static GUI_CONST_STORAGE unsigned char acCAB5[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _XX_____,_____XX_, + _____XX_,_XX_____, + ______XX,_XX_____, + ___XX___,_XX_____, + ____XX__,_XX_____, + ________,XX______, + _XXXXXXX,XXXXXXX_, + _______X,XXX_____, + ______XX,__XX____, + ____XXX_,___XX___, + __XXX___,____XX__, + ________,________, + ________,________, +}; + +/* char: 使 code:0xCAB9 */ +static GUI_CONST_STORAGE unsigned char acCAB9[32] = { + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,_XX_____, + __XXXXXX,XXXXXXX_, + _XXXXXX_,_XX__XX_, + ___XXXX_,_XX__XX_, + ___XXXXX,XXXXXXX_, + ___XX_XX,_XX_____, + ___XX__X,XXX_____, + ___XX___,XX______, + ___XX__X,XXX_____, + ___XX_XX,__XXX___, + ___XXXX_,____XXX_, + ________,________, + ________,________, +}; + +/* char: 式 code:0xCABD */ +static GUI_CONST_STORAGE unsigned char acCABD[32] = { + ________,_XXXX___, + ________,_XX_XX__, + ________,_XX_____, + _XXXXXXX,XXXXXXX_, + ________,_XX_____, + ________,_XX_____, + __XXXXXX,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,__XX____, + ____XX__,__XX_XX_, + ____XXXX,X__XXXX_, + _XXXXX__,____XXX_, + ________,_____XX_, + ________,________, + ________,________, +}; + +/* char: 示 code:0xCABE */ +static GUI_CONST_STORAGE unsigned char acCABE[32] = { + ________,________, + ___XXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ____XX_X,X_XX____, + ____XX_X,X__XX___, + ___XX__X,X___XX__, + __XX___X,X____XX_, + _XX____X,X____XX_, + _______X,X_______, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 试 code:0xCAD4 */ +static GUI_CONST_STORAGE unsigned char acCAD4[32] = { + __XX____,__XXXX__, + ___XX___,__XX_XX_, + ___XX___,__XX____, + _____XXX,XXXXXXX_, + ________,__XX____, + _XXXX___,__XX____, + ___XX_XX,XXXX____, + ___XX__X,X_XX____, + ___XX__X,X_XX____, + ___XX__X,X__XX___, + ___XXXXX,X__XXXX_, + ___XXX_X,XXXXXXX_, + ___XXXXX,X___XXX_, + ________,_____XX_, + ________,________, + ________,________, +}; + +/* char: 手 code:0xCAD6 */ +static GUI_CONST_STORAGE unsigned char acCAD6[32] = { + ________,_XXXXX__, + __XXXXXX,XX______, + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 首 code:0xCAD7 */ +static GUI_CONST_STORAGE unsigned char acCAD7[32] = { + ___XX___,___XX___, + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ______XX,________, + _____XX_,________, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ________,________, + ________,________, +}; + +/* char: 输 code:0xCAE4 */ +static GUI_CONST_STORAGE unsigned char acCAE4[32] = { + __XX____,_XX_____, + __XX____,XXXX____, + _XXXXX_X,X__XX___, + __XX__XX,____XX__, + _XX__XXX,XXXXXXX_, + _XXXX___,________, + _XXXXXXX,XXX__XX_, + ___XX_XX,_XXXXXX_, + ___XX_XX,XXXXXXX_, + ___XXXXX,_XXXXXX_, + _XXXX_XX,XXXXXXX_, + ___XX_XX,_XXXXXX_, + ___XX_XX,_XX__XX_, + ___XX_XX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 术 code:0xCAF5 */ +static GUI_CONST_STORAGE unsigned char acCAF5[32] = { + _______X,X_______, + _______X,X_XX____, + _______X,X__XX___, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + _____XXX,XXX_____, + _____XXX,XXX_____, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + __XX___X,X___XX__, + _XX____X,X____XX_, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 数 code:0xCAFD */ +static GUI_CONST_STORAGE unsigned char acCAFD[32] = { + ____XX__,__XX____, + _XX_XX_X,X_XX____, + __XXXXXX,__XX____, + _XXXXXXX,X_XXXXX_, + ___XXXX_,_XX_XX__, + __XXXXXX,_XX_XX__, + _XX_XX_X,XXXXXX__, + ___XX___,__XXXX__, + _XXXXXXX,__XXXX__, + ___XX_XX,__XXXX__, + __XXX_XX,___XX___, + ____XXX_,___XX___, + ___XXXXX,__XXXX__, + _XXX___X,XXX__XX_, + ________,________, + ________,________, +}; + +/* char: 双 code:0xCBAB */ +static GUI_CONST_STORAGE unsigned char acCBAB[32] = { + ________,________, + _XXXXXXX,XXXXXX__, + ______XX,XX__XX__, + ______XX,XX__XX__, + __XX__XX,XX__XX__, + ___XXXX_,XX__XX__, + ___XXXX_,_XXXX___, + ____XX__,_XXXX___, + ____XX__,__XX____, + ___XXXX_,__XX____, + ___XXXX_,_XXXX___, + __XX_XX_,XX_XX___, + __XX___X,X___XX__, + _XX___XX,_____XX_, + ________,________, + ________,________, +}; + +/* char: 司 code:0xCBBE */ +static GUI_CONST_STORAGE unsigned char acCBBE[32] = { + __XXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + _XXXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + __XXXXXX,XXX_XX__, + __XX____,_XX_XX__, + __XX____,_XX_XX__, + __XX____,_XX_XX__, + __XXXXXX,XXX_XX__, + __XX____,____XX__, + ________,____XX__, + ________,__XXXX__, + ________,________, + ________,________, +}; + +/* char: 死 code:0xCBC0 */ +static GUI_CONST_STORAGE unsigned char acCBC0[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + ___XX___,XX______, + ___XX___,XX______, + ___XXXXX,XX______, + __XX__XX,XX__XX__, + __XX__XX,XX_XX___, + _XXXX_XX,XXXX____, + ____XXX_,XXX_____, + _____XX_,XX______, + ____XX__,XX______, + ___XX___,XX___XX_, + __XX____,XX___XX_, + _XX_____,_XXXXXX_, + ________,________, + ________,________, +}; + +/* char: 苏 code:0xCBD5 */ +static GUI_CONST_STORAGE unsigned char acCBD5[32] = { + ____XX__,__XX____, + ____XX__,__XX____, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + ______XX,________, + ______XX,________, + __XXXXXX,XXXX____, + ______XX,__XX____, + __XX__XX,__XXXX__, + __XX_XX_,__XX_XX_, + _XX__XX_,__XX_XX_, + ____XX__,__XX____, + ___XX___,__XX____, + __XX____,XXX_____, + ________,________, + ________,________, +}; + +/* char: 速 code:0xCBD9 */ +static GUI_CONST_STORAGE unsigned char acCBD9[32] = { + ________,_XX_____, + __XX____,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,_XX_____, + ______XX,XXXXXX__, + ______XX,_XX_XX__, + _XXXX_XX,_XX_XX__, + ___XX_XX,XXXXXX__, + ___XX___,XXXX____, + ___XX__X,XXXXX___, + ___XX_XX,_XX_XX__, + ___XXXX_,_XX__XX_, + __XXXX__,_XX_____, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 算 code:0xCBE3 */ +static GUI_CONST_STORAGE unsigned char acCBE3[32] = { + ___XX___,_XX_____, + __XXXXXX,XXXXXXX_, + _XX__XX_,XX_XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + _____XX_,_XX_____, + _XXXXXXX,XXXXXXX_, + ____XX__,_XX_____, + ___XX___,_XX_____, + ________,________, + ________,________, +}; + +/* char: 所 code:0xCBF9 */ +static GUI_CONST_STORAGE unsigned char acCBF9[32] = { + _____XXX,___XXX__, + __XXXX__,XXXX____, + __XX____,XX______, + __XX____,XX______, + __XXXXXX,XX______, + __XX__XX,XXXXXXX_, + __XX__XX,XX_XX___, + __XX__XX,XX_XX___, + __XXXXXX,XX_XX___, + __XX____,XX_XX___, + __XX____,XX_XX___, + __XX____,XX_XX___, + __XX___X,X__XX___, + _XX___XX,___XX___, + ________,________, + ________,________, +}; + +/* char: 态 code:0xCCAC */ +static GUI_CONST_STORAGE unsigned char acCCAC[32] = { + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ___XXXXX,__XXX___, + _XXX___X,X___XXX_, + ________,________, + _______X,X_______, + ____XX__,XX__XX__, + __XXXX__,XX___XX_, + __XXXX__,__XX_XX_, + _XX__XXX,XXXX____, + ________,________, + ________,________, +}; + +/* char: 条 code:0xCCF5 */ +static GUI_CONST_STORAGE unsigned char acCCF5[32] = { + ____XX__,________, + ____XXXX,XXXXX___, + ___XXX__,__XX____, + __XX_XX_,_XX_____, + ______XX,XX______, + ____XXX_,_XXX____, + _XXXX__X,X__XXXX_, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + __XX___X,X___XX__, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 停 code:0xCDA3 */ +static GUI_CONST_STORAGE unsigned char acCDA3[32] = { + ____XX__,_XX_____, + ____XXXX,XXXXXXX_, + ____XX__,________, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + __XXX_XX,XXXXXX__, + _XXXX___,________, + ___XXXXX,XXXXXXX_, + ___XXXX_,_____XX_, + ___XX_XX,XXXXXX__, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,XXXX____, + ________,________, + ________,________, +}; + +/* char: 通 code:0xCDA8 */ +static GUI_CONST_STORAGE unsigned char acCDA8[32] = { + __XX__XX,XXXXXX__, + ___XX___,XX_XX___, + ___XX___,_XXX____, + ______XX,XXXXXX__, + ______XX,_XX_XX__, + _XXXX_XX,_XX_XX__, + ___XX_XX,XXXXXX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,XXXXXX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XXXXX__, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 投 code:0xCDB6 */ +static GUI_CONST_STORAGE unsigned char acCDB6[32] = { + ___XX___,________, + ___XX__X,XXXXX___, + ___XX__X,X__XX___, + _XXXXXXX,X__XX___, + ___XX__X,X__XX___, + ___XX_XX,____XXX_, + ___XXXX_,________, + ___XXXXX,XXXXXX__, + _XXXX__X,X___XX__, + ___XX__X,X__XX___, + ___XX___,XXXX____, + ___XX___,_XX_____, + ___XX__X,XXXXX___, + _XXXXXXX,____XXX_, + ________,________, + ________,________, +}; + +/* char: 图 code:0xCDBC */ +static GUI_CONST_STORAGE unsigned char acCDBC[32] = { + __XXXXXX,XXXXXXX_, + __XX____,_____XX_, + __XX__XX,_____XX_, + __XX__XX,XXXX_XX_, + __XX_XX_,__XX_XX_, + __XXXXXX,_XX__XX_, + __XX___X,XX___XX_, + __XX_XXX,_XXX_XX_, + __XXXX_X,XX_XXXX_, + __XX____,_XX__XX_, + __XX_XXX,_____XX_, + __XX___X,XX___XX_, + __XX____,_XX__XX_, + __XXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 外 code:0xCDE2 */ +static GUI_CONST_STORAGE unsigned char acCDE2[32] = { + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XXXXX,_XX_____, + __XX__XX,_XXX____, + __XX__XX,_XXXX___, + _XXXX_XX,_XX_XX__, + ____XXX_,_XX__XX_, + _____XX_,_XX__XX_, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX___,_XX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, +}; + +/* char: 微 code:0xCEA2 */ +static GUI_CONST_STORAGE unsigned char acCEA2[32] = { + ___XX_XX,__XX____, + ___XXXXX,XXXX____, + __XXXXXX,XXXX____, + _XX_XXXX,XXXXXXX_, + ___XX___,_XX_XX__, + ___XX___,__XXXX__, + __XXXXXX,XXXXXX__, + _XXX____,__XXXX__, + __XX_XXX,X_XXXX__, + __XX_XXX,X__XX___, + __XX_XXX,X__XX___, + __XX_XXX,XXXXXX__, + __XX_XXX,X_XXXX__, + __XXXX__,_XX__XX_, + ________,________, + ________,________, +}; + +/* char: 围 code:0xCEA7 */ +static GUI_CONST_STORAGE unsigned char acCEA7[32] = { + __XXXXXX,XXXXXXX_, + __XX___X,X____XX_, + __XX___X,X____XX_, + __XXXXXX,XXXXXXX_, + __XX___X,X____XX_, + __XX_XXX,XXXX_XX_, + __XX___X,X____XX_, + __XXXXXX,XXXXXXX_, + __XX___X,X__XXXX_, + __XX___X,X__XXXX_, + __XX___X,XXXX_XX_, + __XX___X,X____XX_, + __XXXXXX,XXXXXXX_, + __XX____,_____XX_, + ________,________, + ________,________, +}; + +/* char: 为 code:0xCEAA */ +static GUI_CONST_STORAGE unsigned char acCEAA[32] = { + ______XX,________, + ___XX_XX,________, + ____XXXX,________, + ______XX,________, + _XXXXXXX,XXXXXX__, + ______XX,____XX__, + _____XX_,____XX__, + _____XX_,XX__XX__, + _____XX_,_XX_XX__, + ____XX__,_XX_XX__, + ____XX__,____XX__, + ___XX___,____XX__, + __XX____,___XX___, + _XX_____,_XXX____, + ________,________, + ________,________, +}; + +/* char: 未 code:0xCEB4 */ +static GUI_CONST_STORAGE unsigned char acCEB4[32] = { + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + _____XXX,XXX_____, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + _XXX___X,X___XXX_, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 位 code:0xCEBB */ +static GUI_CONST_STORAGE unsigned char acCEBB[32] = { + ____XX__,XX______, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX_XX,XXXXXX__, + ___XX___,________, + __XXX___,___XX___, + _XXXX_XX,___XX___, + ___XX_XX,___XX___, + ___XX__X,X__XX___, + ___XX__X,X_XX____, + ___XX__X,X_XX____, + ___XX___,__XX____, + ___XX___,_XX_____, + ___XXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 温 code:0xCEC2 */ +static GUI_CONST_STORAGE unsigned char acCEC2[32] = { + ______XX,XXXXX___, + __XX__XX,___XX___, + ___XX_XX,___XX___, + ______XX,XXXXX___, + _XX___XX,___XX___, + __XX__XX,___XX___, + ______XX,XXXXX___, + ___XX___,________, + ___XXXXX,XXXXXX__, + __XX_XXX,X_XXXX__, + __XX_XXX,X_XXXX__, + _XX__XXX,X_XXXX__, + _XX__XXX,X_XXXX__, + ____XXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 文 code:0xCEC4 */ +static GUI_CONST_STORAGE unsigned char acCEC4[32] = { + ______XX,________, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ____XX__,__XX____, + ____XX__,__XX____, + _____XX_,_XX_____, + _____XX_,_XX_____, + ______XX,XX______, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ___XXX__,__XXX___, + _XXX____,____XXX_, + ________,________, + ________,________, +}; + +/* char: 务 code:0xCEF1 */ +static GUI_CONST_STORAGE unsigned char acCEF1[32] = { + _____XX_,________, + ____XXXX,XXXXX___, + ___XXX__,__XX____, + __XX_XX_,_XX_____, + ______XX,XX______, + ____XXX_,_XXX____, + _XXXX___,___XXXX_, + ______XX,________, + __XXXXXX,XXXXX___, + ______XX,___XX___, + _____XX_,___XX___, + ____XX__,___XX___, + ___XX___,___XX___, + __XX____,_XXX____, + ________,________, + ________,________, +}; + +/* char: 息 code:0xCFA2 */ +static GUI_CONST_STORAGE unsigned char acCFA2[32] = { + ______XX,________, + _____XX_,________, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + _______X,X_______, + ____XX__,XX__XX__, + __XXXX__,XX___XX_, + __XXXX__,__XX_XX_, + _XX__XXX,XXXX____, + ________,________, + ________,________, +}; + +/* char: 系 code:0xCFB5 */ +static GUI_CONST_STORAGE unsigned char acCFB5[32] = { + ________,XXXXX___, + __XXXXXX,X_______, + ______XX,________, + _____XX_,__XX____, + ____XX__,_XX_____, + ___XXXXX,XX______, + ______XX,__XX____, + ____XXX_,___XX___, + __XXXXXX,XXXXXX__, + _______X,X___XX__, + ____XX_X,X_XX____, + ___XX__X,X__XX___, + __XX___X,X___XX__, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 下 code:0xCFC2 */ +static GUI_CONST_STORAGE unsigned char acCFC2[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,_XX_____, + ______XX,__XX____, + ______XX,___XX___, + ______XX,___XX___, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, +}; + +/* char: 显 code:0xCFD4 */ +static GUI_CONST_STORAGE unsigned char acCFD4[32] = { + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + _____XX_,_XX_____, + __XX_XX_,_XX_XX__, + ___XXXX_,_XX_XX__, + ___XXXX_,_XXXX___, + _____XX_,_XX_____, + _____XX_,_XX_____, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 限 code:0xCFDE */ +static GUI_CONST_STORAGE unsigned char acCFDE[32] = { + ________,________, + __XXXXXX,XXXXXX__, + __XX_XXX,X___XX__, + __XX_XXX,X___XX__, + __XXXX_X,XXXXXX__, + __XXXX_X,X___XX__, + __XX_XXX,X___XX__, + __XX_XXX,XXXXXX__, + __XX_XXX,X_XX_XX_, + __XX_XXX,X_XXXX__, + __XXXX_X,X__XX___, + __XX___X,XXXXX___, + __XX___X,XX__XX__, + __XX___X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 线 code:0xCFDF */ +static GUI_CONST_STORAGE unsigned char acCFDF[32] = { + ___XX___,_XXXX___, + ___XX___,_XX_XX__, + __XX_XX_,_XX_____, + __XX_XX_,_XXXXX__, + _XXXXX_X,XXX_____, + ____XX__,_XX_____, + ___XX___,_XXXXXX_, + __XX___X,XXXX____, + _XXXXXX_,_XX_XX__, + ________,_XXXX___, + ________,__XX_XX_, + ____XXX_,_XXXXXX_, + _XXXX__X,XX__XXX_, + ________,_____XX_, + ________,________, + ________,________, +}; + +/* char: 相 code:0xCFE0 */ +static GUI_CONST_STORAGE unsigned char acCFE0[32] = { + ____XX__,________, + ____XX__,XXXXXXX_, + ____XX__,XX___XX_, + _XXXXXXX,XX___XX_, + ____XX__,XX___XX_, + ___XXX__,XXXXXXX_, + ___XXXX_,XX___XX_, + __XXXXXX,XX___XX_, + __XXXX__,XXXXXXX_, + _XX_XX__,XX___XX_, + ____XX__,XX___XX_, + ____XX__,XX___XX_, + ____XX__,XXXXXXX_, + ____XX__,XX___XX_, + ________,________, + ________,________, +}; + +/* char: 项 code:0xCFEE */ +static GUI_CONST_STORAGE unsigned char acCFEE[32] = { + ________,________, + ______XX,XXXXXXX_, + _XXXXX__,_XX_____, + ___XX___,XX______, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XX_XX__, + ___XXXXX,XX__XX__, + _XXX____,XXXX____, + _______X,X__XX___, + ______XX,____XX__, + _____XX_,____XX__, + ________,________, + ________,________, +}; + +/* char: 向 code:0xCFF2 */ +static GUI_CONST_STORAGE unsigned char acCFF2[32] = { + ______XX,________, + _____XX_,________, + __XXXXXX,XXXXXXX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX_XXX,XXXX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XX_,__XX_XX_, + __XX_XXX,XXXX_XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + __XX____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 消 code:0xCFFB */ +static GUI_CONST_STORAGE unsigned char acCFFB[32] = { + ________,_XX_____, + __XX__XX,_XX_XX__, + ___XX__X,XXXXX___, + ____XX__,_XX_____, + ______XX,XXXXXX__, + _XX___XX,____XX__, + __XX__XX,____XX__, + ____XXXX,XXXXXX__, + ____XXXX,____XX__, + ___XX_XX,____XX__, + ___XX_XX,XXXXXX__, + __XX__XX,____XX__, + __XX__XX,____XX__, + ______XX,__XXXX__, + ________,________, + ________,________, +}; + +/* char: 小 code:0xD0A1 */ +static GUI_CONST_STORAGE unsigned char acD0A1[32] = { + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ____XX_X,X_XX____, + ____XX_X,X__XX___, + ___XX__X,X___XX__, + __XX___X,X____XX_, + _XX____X,X____XX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 校 code:0xD0A3 */ +static GUI_CONST_STORAGE unsigned char acD0A3[32] = { + ____XX__,_XX_____, + ____XX__,__XX____, + ____XX_X,XXXXXXX_, + _XXXXXXX,________, + ____XX__,_XXXX___, + ___XXX__,XX__XX__, + ___XXXXX,X____XX_, + __XXXXXX,XX__XX__, + __XXXX__,XX__XX__, + _XX_XX__,_XXXX___, + ____XX__,__XX____, + ____XX__,_XXXX___, + ____XX__,XX__XX__, + ____XX_X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 写 code:0xD0B4 */ +static GUI_CONST_STORAGE unsigned char acD0B4[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + _XX_____,_____XX_, + ____XX__,________, + ____XXXX,XXXXX___, + ____XX__,________, + ___XX___,________, + ___XXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + _XXXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + ________,__XXX___, + ________,________, + ________,________, +}; + +/* char: 新 code:0xD0C2 */ +static GUI_CONST_STORAGE unsigned char acD0C2[32] = { + ___XX___,____XXX_, + ____XX__,_XXXX___, + _XXXXXXX,XXX_____, + __XX__XX,_XX_____, + ___XXXX_,_XX_____, + _XXXXXXX,XXXXXXX_, + ________,_XX_XX__, + ____XX__,_XX_XX__, + _XXXXXXX,XXX_XX__, + ____XX__,_XX_XX__, + __XXXXXX,_XX_XX__, + _XX_XX_X,XXX_XX__, + ____XX__,XX__XX__, + __XXXX_X,X___XX__, + ________,________, + ________,________, +}; + +/* char: 信 code:0xD0C5 */ +static GUI_CONST_STORAGE unsigned char acD0C5[32] = { + ____XX__,XX______, + ____XX__,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,________, + __XXX_XX,XXXXXX__, + _XXXX___,________, + ___XX_XX,XXXXXX__, + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ___XX_XX,____XX__, + ___XX_XX,____XX__, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ________,________, + ________,________, +}; + +/* char: 型 code:0xD0CD */ +static GUI_CONST_STORAGE unsigned char acD0CD[32] = { + ________,____XX__, + __XXXXXX,XXX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,_XX_XX__, + _XXXXXXX,XXX_XX__, + ___XX_XX,_XX_XX__, + ___XX_XX,____XX__, + __XX__XX,____XX__, + _XX____X,X_XXXX__, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 行 code:0xD0D0 */ +static GUI_CONST_STORAGE unsigned char acD0D0[32] = { + ____XX__,________, + ___XX__X,XXXXXX__, + __XX____,________, + _XX_XX__,________, + ____XX__,________, + ___XX_XX,XXXXXXX_, + __XXX___,__XX____, + _XXXX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,XXXX____, + ________,________, + ________,________, +}; + +/* char: 序 code:0xD0F2 */ +static GUI_CONST_STORAGE unsigned char acD0F2[32] = { + _______X,X_______, + ________,XX______, + ___XXXXX,XXXXXXX_, + ___XX___,________, + ___XXXXX,XXXXXX__, + ___XX___,___XX___, + ___XX__X,X_XX____, + ___XX___,XXX_____, + ___XXXXX,XXXXXXX_, + ___XX___,_XX__XX_, + ___XX___,_XX_XX__, + __XX____,_XX_____, + __XX____,_XX_____, + _XX____X,XXX_____, + ________,________, + ________,________, +}; + +/* char: 选 code:0xD1A1 */ +static GUI_CONST_STORAGE unsigned char acD1A1[32] = { + ________,_XX_____, + __XX__XX,_XX_____, + ___XX_XX,_XX_____, + ___XX_XX,XXXXXX__, + _____XX_,_XX_____, + ________,_XX_____, + _XXXXXXX,XXXXXXX_, + ___XX___,XXXX____, + ___XX___,XXXX____, + ___XX__X,X_XX____, + ___XX_XX,__XX_XX_, + ___XXXX_,___XXXX_, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 讯 code:0xD1B6 */ +static GUI_CONST_STORAGE unsigned char acD1B6[32] = { + __XX____,________, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + _______X,X__XX___, + _______X,X__XX___, + _XXXX__X,X__XX___, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XXXX_, + ___XXXXX,X__XXXX_, + ___XXX_X,X__XXXX_, + ___XX__X,X___XXX_, + _______X,X____XX_, + ________,________, + ________,________, +}; + +/* char: 压 code:0xD1B9 */ +static GUI_CONST_STORAGE unsigned char acD1B9[32] = { + ________,________, + ___XXXXX,XXXXXXX_, + ___XX___,________, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + ___XXXXX,XXXXXX__, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX_XX___, + ___XX___,XX__XX__, + __XX____,XX__XX__, + __XX____,XX______, + _XX_XXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 牙 code:0xD1C0 */ +static GUI_CONST_STORAGE unsigned char acD1C0[32] = { + ________,________, + __XXXXXX,XXXXXX__, + ________,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ___XX___,__XX____, + ___XXXXX,XXXXXXX_, + ________,XXXX____, + _______X,X_XX____, + ______XX,__XX____, + _____XX_,__XX____, + ___XXX__,__XX____, + _XXX____,__XX____, + ________,XXXX____, + ________,________, + ________,________, +}; + +/* char: 言 code:0xD1D4 */ +static GUI_CONST_STORAGE unsigned char acD1D4[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ___XXXXX,XXXXX___, + ________,________, + ___XXXXX,XXXXX___, + ________,________, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ________,________, + ________,________, +}; + +/* char: 要 code:0xD2AA */ +static GUI_CONST_STORAGE unsigned char acD2AA[32] = { + _XXXXXXX,XXXXXXX_, + _____XX_,_XX_____, + _____XX_,_XX_____, + __XXXXXX,XXXXXX__, + __XX_XX_,_XX_XX__, + __XX_XX_,_XX_XX__, + __XXXXXX,XXXXXX__, + ______XX,________, + _XXXXXXX,XXXXXXX_, + _____XX_,__XX____, + ____XXX_,_XX_____, + ______XX,XX______, + ____XXX_,_XXXX___, + _XXXX___,____XX__, + ________,________, + ________,________, +}; + +/* char: 页 code:0xD2B3 */ +static GUI_CONST_STORAGE unsigned char acD2B3[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ______XX,________, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX__XX,____XX__, + _____XX_,XXXX____, + ___XXX__,___XXX__, + _XXX____,_____XX_, + ________,________, + ________,________, +}; + +/* char: 一 code:0xD2BB */ +static GUI_CONST_STORAGE unsigned char acD2BB[32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, +}; + +/* char: 移 code:0xD2C6 */ +static GUI_CONST_STORAGE unsigned char acD2C6[32] = { + ________,_XX_____, + ____XXX_,_XX_____, + _XXXX___,XXXXX___, + ___XX__X,X__XX___, + ___XX_XX,XXXX____, + _XXXXXX_,_XX_____, + ___XX___,XX_XX___, + ___XXXXX,X_XX____, + __XXXXX_,_XXXXXX_, + __XXX___,XX__XX__, + _XXXX_XX,XXXXX___, + ___XX___,__XX____, + ___XX___,XXX_____, + ___XX_XX,X_______, + ________,________, + ________,________, +}; + +/* char: 仪 code:0xD2C7 */ +static GUI_CONST_STORAGE unsigned char acD2C7[32] = { + ____XX__,XX______, + ____XX__,_XX_____, + ____XX__,_XX_XX__, + ___XX_XX,____XX__, + ___XX_XX,____XX__, + __XXX__X,X__XX___, + _XXXX__X,X__XX___, + ___XX___,XXXX____, + ___XX___,XXXX____, + ___XX___,_XX_____, + ___XX___,XXXX____, + ___XX__X,X__XX___, + ___XX_XX,____XX__, + ___XXXX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 已 code:0xD2D1 */ +static GUI_CONST_STORAGE unsigned char acD2D1[32] = { + ________,________, + __XXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XXXXXX,XXXXXX__, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,_____XX_, + __XX____,_____XX_, + ___XXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 益 code:0xD2E6 */ +static GUI_CONST_STORAGE unsigned char acD2E6[32] = { + ___XX___,___XX___, + ____XX__,__XX____, + ________,________, + _XXXXXXX,XXXXXXX_, + ________,________, + ____XX__,__XX____, + ___XX___,___XX___, + __XX____,____XX__, + ___XXXXX,XXXXX___, + ___XX_XX,XX_XX___, + ___XX_XX,XX_XX___, + ___XX_XX,XX_XX___, + ___XX_XX,XX_XX___, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 英 code:0xD3A2 */ +static GUI_CONST_STORAGE unsigned char acD3A2[32] = { + _____XX_,_XX_____, + _____XX_,_XX_____, + _XXXXXXX,XXXXXXX_, + _____XX_,_XX_____, + _______X,X_______, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + _____XX_,_XX_____, + ___XXX__,__XXX___, + _XXX____,____XXX_, + ________,________, + ________,________, +}; + +/* char: 迎 code:0xD3AD */ +static GUI_CONST_STORAGE unsigned char acD3AD[32] = { + ________,________, + __XX___X,X_______, + ___XXXXX,_XXXXXX_, + ___XXXX_,_XX__XX_, + _____XX_,_XX__XX_, + _____XX_,_XX__XX_, + _XXXXXX_,_XX__XX_, + ___XXXX_,_XX__XX_, + ___XXXXX,XXX__XX_, + ___XXXXX,_XXXXXX_, + ___XXXX_,_XX_____, + ___XX___,_XX_____, + __XXXX__,_XX_____, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 硬 code:0xD3B2 */ +static GUI_CONST_STORAGE unsigned char acD3B2[32] = { + ________,________, + _XXXXXXX,XXXXXXX_, + ___XX___,__XX____, + ___XX__X,XXXXXXX_, + __XX___X,X_XX_XX_, + __XXXXXX,X_XX_XX_, + _XXX_XXX,XXXXXXX_, + __XX_XXX,X_XX_XX_, + __XX_XXX,X_XX_XX_, + __XX_XXX,XXXXXXX_, + __XXXXX_,XXXX____, + __XX_XX_,_XX_____, + ________,XXXXX___, + ______XX,X___XXX_, + ________,________, + ________,________, +}; + +/* char: 用 code:0xD3C3 */ +static GUI_CONST_STORAGE unsigned char acD3C3[32] = { + ________,________, + ___XXXXX,XXXXXXX_, + ___XX___,XX___XX_, + ___XX___,XX___XX_, + ___XX___,XX___XX_, + ___XXXXX,XXXXXXX_, + ___XX___,XX___XX_, + ___XX___,XX___XX_, + ___XXXXX,XXXXXXX_, + ___XX___,XX___XX_, + ___XX___,XX___XX_, + __XX____,XX___XX_, + __XX____,XX___XX_, + _XX_____,___XXXX_, + ________,________, + ________,________, +}; + +/* char: 有 code:0xD3D0 */ +static GUI_CONST_STORAGE unsigned char acD3D0[32] = { + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXXXX_, + _____XX_,________, + ____XXXX,XXXXX___, + ___XXX__,___XX___, + __XXXX__,___XX___, + _XX_XXXX,XXXXX___, + ____XX__,___XX___, + ____XX__,___XX___, + ____XXXX,XXXXX___, + ____XX__,___XX___, + ____XX__,___XX___, + ____XX__,_XXXX___, + ________,________, + ________,________, +}; + +/* char: 语 code:0xD3EF */ +static GUI_CONST_STORAGE unsigned char acD3EF[32] = { + __XX_XXX,XXXXXXX_, + ___XX___,XX______, + ___XX___,XX______, + ______XX,XXXXXX__, + _______X,X___XX__, + _XXXX__X,X___XX__, + ___XXXXX,XXXXXXX_, + ___XX___,________, + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XXXXX,____XX__, + ___XXXXX,____XX__, + ___XX_XX,XXXXXX__, + ______XX,____XX__, + ________,________, + ________,________, +}; + +/* char: 域 code:0xD3F2 */ +static GUI_CONST_STORAGE unsigned char acD3F2[32] = { + ___XX___,__XX____, + ___XX___,__XXXX__, + ___XX___,__XX_XX_, + ___XX_XX,XXXXXXX_, + _XXXXX__,__XX____, + ___XX_XX,XXXX_XX_, + ___XX_XX,XXXX_XX_, + ___XX_XX,XXXX_XX_, + ___XX_XX,XXXXXX__, + ___XX___,__XXXX__, + ___XXX__,XX_XXXX_, + _XXX__XX,X_XXXXX_, + ________,_XX_XXX_, + ________,XX___XX_, + ________,________, + ________,________, +}; + +/* char: 源 code:0xD4B4 */ +static GUI_CONST_STORAGE unsigned char acD4B4[32] = { + ________,________, + __XX__XX,XXXXXXX_, + ___XX_XX,__XX____, + ____XXXX,_XX_____, + ______XX,XXXXXX__, + _XX___XX,XX__XX__, + __XX__XX,XXXXXX__, + ____XXXX,XX__XX__, + ____XXXX,XXXXXX__, + ___XX_XX,__XX____, + ___XX_XX,XXXXXX__, + __XX_XX_,XXXX_XX_, + __XX_XXX,X_XX_XX_, + ____XX__,_XXX____, + ________,________, + ________,________, +}; + +/* char: 运 code:0xD4CB */ +static GUI_CONST_STORAGE unsigned char acD4CB[32] = { + ________,________, + __XX__XX,XXXXX___, + ___XX___,________, + ___XX___,________, + ________,________, + _____XXX,XXXXXXX_, + _XXXX___,XX______, + ___XX___,XX______, + ___XX__X,X_XX____, + ___XX_XX,___XX___, + ___XXXXX,XXXXXX__, + ___XX___,____XX__, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 在 code:0xD4DA */ +static GUI_CONST_STORAGE unsigned char acD4DA[32] = { + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXXXX_, + _____XX_,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XXX__,_XX_____, + __XXXXXX,XXXXXX__, + _XX_XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XXXX,XXXXXXX_, + ____XX__,________, + ________,________, + ________,________, +}; + +/* char: 造 code:0xD4EC */ +static GUI_CONST_STORAGE unsigned char acD4EC[32] = { + ________,_XX_____, + __XX__XX,_XX_____, + ___XX_XX,XXXXXX__, + ___XXXX_,_XX_____, + ________,_XX_____, + _____XXX,XXXXXXX_, + _XXXX___,________, + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ___XX_XX,____XX__, + ___XX_XX,XXXXXX__, + __XXXX__,________, + _XX__XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 择 code:0xD4F1 */ +static GUI_CONST_STORAGE unsigned char acD4F1[32] = { + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XX__X,X__XX___, + _XXXXXX_,XXXX____, + ___XX___,_XX_____, + ___XX___,XXXXX___, + ___XX_XX,X___XXX_, + ___XXX__,_XX_____, + _XXXX__X,XXXXX___, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XXXXX,XXXXXXX_, + ___XX___,_XX_____, + _XXXX___,_XX_____, + ________,________, + ________,________, +}; + +/* char: 增 code:0xD4F6 */ +static GUI_CONST_STORAGE unsigned char acD4F6[32] = { + ___XX_XX,____XX__, + ___XX__X,X__XX___, + ___XXXXX,XXXXXXX_, + ___XXXX_,_XX__XX_, + _XXXXXXX,XXXXXXX_, + ___XXXX_,_XX__XX_, + ___XXXXX,XXXXXXX_, + ___XX___,________, + ___XX_XX,XXXXXX__, + ___XX_XX,____XX__, + ___XXXXX,XXXXXX__, + _XXX__XX,____XX__, + ______XX,XXXXXX__, + ______XX,____XX__, + ________,________, + ________,________, +}; + +/* char: 障 code:0xD5CF */ +static GUI_CONST_STORAGE unsigned char acD5CF[32] = { + ________,_XX_____, + _XXXXXXX,XXXXXX__, + _XX_XX_X,X__XX___, + _XX_XXXX,XXXXXXX_, + _XXXX___,________, + _XXXX_XX,XXXXXX__, + _XX_XXXX,____XX__, + _XX_XXXX,XXXXXX__, + _XX_XXXX,____XX__, + _XX_XXXX,XXXXXX__, + _XXXX___,_XX_____, + _XX__XXX,XXXXXXX_, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, +}; + +/* char: 诊 code:0xD5EF */ +static GUI_CONST_STORAGE unsigned char acD5EF[32] = { + __XX____,_XX_____, + ___XX___,_XX_____, + ___XX___,XXXX____, + _______X,X__XX___, + _____XXX,_XX_XXX_, + _XXXX___,XX______, + ___XX__X,X_______, + ___XX_XX,__XX____, + ___XX___,_XX_____, + ___XX___,XX__XX__, + ___XX_XX,X__XX___, + ___XXX__,__XX____, + ___XX___,XXX_____, + ______XX,X_______, + ________,________, + ________,________, +}; + +/* char: 整 code:0xD5FB */ +static GUI_CONST_STORAGE unsigned char acD5FB[32] = { + ____XX__,_XX_____, + _XXXXXXX,XXX_____, + ____XX__,_XXXXXX_, + __XXXXXX,XX__XX__, + __XXXXXX,XXXXX___, + __XXXXXX,__XX____, + ___XXXX_,_XXXX___, + __XXXXXX,XX__XXX_, + _XX_XX__,________, + __XXXXXX,XXXXXX__, + _______X,X_______, + ____XX_X,XXXXX___, + ____XX_X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 正 code:0xD5FD */ +static GUI_CONST_STORAGE unsigned char acD5FD[32] = { + ________,________, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ___XX__X,X_______, + ___XX__X,X_______, + ___XX__X,XXXXX___, + ___XX__X,X_______, + ___XX__X,X_______, + ___XX__X,X_______, + ___XX__X,X_______, + ___XX__X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 知 code:0xD6AA */ +static GUI_CONST_STORAGE unsigned char acD6AA[32] = { + ___XX___,________, + ___XX___,________, + ___XX___,_XXXXXX_, + __XXXXXX,_XX__XX_, + __XXXX__,_XX__XX_, + _XX_XX__,_XX__XX_, + ____XX__,_XX__XX_, + _XXXXXXX,XXX__XX_, + ____XX__,_XX__XX_, + ____XX__,_XX__XX_, + ___XXXX_,_XX__XX_, + ___XX_XX,_XXXXXX_, + __XX__XX,_XX__XX_, + _XX_____,________, + ________,________, + ________,________, +}; + +/* char: 直 code:0xD6B1 */ +static GUI_CONST_STORAGE unsigned char acD6B1[32] = { + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 执 code:0xD6B4 */ +static GUI_CONST_STORAGE unsigned char acD6B4[32] = { + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + _XXXXXXX,XXXXX___, + ___XX___,XX_XX___, + ___XX___,XX_XX___, + ___XX_XX,XX_XX___, + ___XXX_X,XX_XX___, + _XXXX___,XX_XX___, + ___XX___,XX_XX___, + ___XX__X,XXXXX___, + ___XX__X,XXXXXXX_, + ___XX_XX,____XXX_, + _XXXXXX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 址 code:0xD6B7 */ +static GUI_CONST_STORAGE unsigned char acD6B7[32] = { + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + ___XX___,__XX____, + _XXXXXXX,X_XX____, + ___XX__X,X_XXXXX_, + ___XX__X,X_XX____, + ___XX__X,X_XX____, + ___XX__X,X_XX____, + ___XX__X,X_XX____, + ___XXXXX,X_XX____, + _XXXX__X,X_XX____, + _______X,X_XX____, + _____XXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 指 code:0xD6B8 */ +static GUI_CONST_STORAGE unsigned char acD6B8[32] = { + ___XX__X,X_______, + ___XX__X,X__XXX__, + ___XX__X,XXXX____, + _XXXXXXX,X____XX_, + ___XX__X,X____XX_, + ___XX___,XXXXXXX_, + ___XXXX_,________, + ___XXX_X,XXXXXX__, + _XXXX__X,X___XX__, + ___XX__X,X___XX__, + ___XX__X,XXXXXX__, + ___XX__X,X___XX__, + ___XX__X,X___XX__, + _XXXX__X,XXXXXX__, + ________,________, + ________,________, +}; + +/* char: 置 code:0xD6C3 */ +static GUI_CONST_STORAGE unsigned char acD6C3[32] = { + __XXXXXX,XXXXXX__, + __XX_XX_,_XX_XX__, + __XX_XX_,_XX_XX__, + __XXXXXX,XXXXXX__, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XX___,___XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + ___XX__X,X__XX___, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 制 code:0xD6C6 */ +static GUI_CONST_STORAGE unsigned char acD6C6[32] = { + _____XX_,____XX__, + __XX_XX_,____XX__, + __XXXXXX,XXXXXX__, + _XX__XX_,__XXXX__, + _____XX_,__XXXX__, + _XXXXXXX,XXXXXX__, + _____XX_,__XXXX__, + _____XX_,__XXXX__, + __XXXXXX,XXXXXX__, + __XX_XX_,XXXXXX__, + __XX_XX_,XX__XX__, + __XX_XX_,XX__XX__, + __XX_XXX,XX__XX__, + _____XX_,__XXXX__, + ________,________, + ________,________, +}; + +/* char: 智 code:0xD6C7 */ +static GUI_CONST_STORAGE unsigned char acD6C7[32] = { + __XX____,________, + __XXXXXX,XXXXXX__, + _XX_XX__,XX__XX__, + ____XX__,XX__XX__, + _XXXXXXX,XX__XX__, + ___XXXX_,XX__XX__, + __XX__XX,XXXXXX__, + _XX_____,________, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ___XXXXX,XXXXX___, + ___XX___,___XX___, + ________,________, + ________,________, +}; + +/* char: 中 code:0xD6D0 */ +static GUI_CONST_STORAGE unsigned char acD6D0[32] = { + _______X,X_______, + _______X,X_______, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XX___X,X___XX__, + __XXXXXX,XXXXXX__, + __XX___X,X___XX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, +}; + +/* char: 重 code:0xD6D8 */ +static GUI_CONST_STORAGE unsigned char acD6D8[32] = { + ________,XXXXXX__, + __XXXXXX,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + ___XX__X,X__XX___, + ___XXXXX,XXXXX___, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 主 code:0xD6F7 */ +static GUI_CONST_STORAGE unsigned char acD6F7[32] = { + ______XX,________, + _______X,X_______, + __XXXXXX,XXXXXX__, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ___XXXXX,XXXXX___, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, +}; + +/* char: 装 code:0xD7B0 */ +static GUI_CONST_STORAGE unsigned char acD7B0[32] = { + ____XX__,_XX_____, + _XX_XX__,_XX_____, + __XXXXXX,XXXXXXX_, + ____XX__,_XX_____, + ___XXX__,_XX_____, + _XXXXX_X,XXXXXX__, + ____XXXX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _____XXX,X__XX___, + ____XXX_,XXXX____, + ___XXXX_,_XX_____, + _XXX_XXX,X_XXX___, + _____XXX,____XXX_, + ________,________, + ________,________, +}; + +/* char: 状 code:0xD7B4 */ +static GUI_CONST_STORAGE unsigned char acD7B4[32] = { + ____XX__,_XX_____, + ____XX__,_XXXX___, + _XX_XX__,_XX_XX__, + __XXXX__,_XX_____, + __XXXXXX,XXXXXXX_, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XXX__,XXXX____, + __XXXX__,XXXX____, + _XX_XX__,XXXX____, + ____XX_X,X__XX___, + ____XX_X,X__XX___, + ____XXXX,____XX__, + ____XXX_,_____XX_, + ________,________, + ________,________, +}; + +/* char: 准 code:0xD7BC */ +static GUI_CONST_STORAGE unsigned char acD7BC[32] = { + _______X,X_XX____, + __XX___X,X__XX___, + ___XX_XX,________, + ___XX_XX,XXXXXXX_, + _____XXX,__XX____, + ____XXXX,__XX____, + ______XX,XXXXXX__, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + __XX__XX,XXXXXX__, + __XX__XX,__XX____, + _XX___XX,__XX____, + _XX___XX,XXXXXXX_, + ______XX,________, + ________,________, + ________,________, +}; + +/* char: 自 code:0xD7D4 */ +static GUI_CONST_STORAGE unsigned char acD7D4[32] = { + ______XX,________, + _____XX_,________, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + __XX____,____XX__, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + __XX____,____XX__, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XXXXXX,XXXXXX__, + __XX____,____XX__, + ________,________, + ________,________, +}; + +/* char: 字 code:0xD7D6 */ +static GUI_CONST_STORAGE unsigned char acD7D6[32] = { + ______XX,________, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + ___XXXXX,XXXX____, + ________,_XX_____, + ________,XX______, + _______X,X_______, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _____XXX,X_______, + ________,________, + ________,________, +}; + +/* char: 作 code:0xD7F7 */ +static GUI_CONST_STORAGE unsigned char acD7F7[32] = { + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,XXXXXXX_, + ___XX_XX,XX______, + ___XX_XX,XX______, + __XXXXX_,XX______, + _XXXX___,XXXXXX__, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XXXXXXX_, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + ________,________, + ________,________, +}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[359] = { + { 6, 6, 2, (unsigned char *)&ac0020 }, /*0: */ + { 5, 5, 2, (unsigned char *)&ac0021 }, /*1: !*/ + { 7, 7, 2, (unsigned char *)&ac0022 }, /*2: "*/ + { 8, 8, 2, (unsigned char *)&ac0023 }, /*3: #*/ + { 8, 8, 2, (unsigned char *)&ac0024 }, /*4: $*/ + { 8, 8, 2, (unsigned char *)&ac0025 }, /*5: %*/ + { 9, 9, 2, (unsigned char *)&ac0026 }, /*6: &*/ + { 4, 4, 2, (unsigned char *)&ac0027 }, /*7: '*/ + { 8, 8, 2, (unsigned char *)&ac0028 }, /*8: (*/ + { 5, 5, 2, (unsigned char *)&ac0029 }, /*9: )*/ + { 8, 8, 2, (unsigned char *)&ac002A }, /*10: **/ + { 9, 9, 2, (unsigned char *)&ac002B }, /*11: +*/ + { 4, 4, 2, (unsigned char *)&ac002C }, /*12: ,*/ + { 8, 8, 2, (unsigned char *)&ac002D }, /*13: -*/ + { 4, 4, 2, (unsigned char *)&ac002E }, /*14: .*/ + { 8, 8, 2, (unsigned char *)&ac002F }, /*15: /*/ + { 8, 8, 2, (unsigned char *)&ac0030 }, /*16: 0*/ + { 7, 7, 2, (unsigned char *)&ac0031 }, /*17: 1*/ + { 8, 8, 2, (unsigned char *)&ac0032 }, /*18: 2*/ + { 8, 8, 2, (unsigned char *)&ac0033 }, /*19: 3*/ + { 9, 9, 2, (unsigned char *)&ac0034 }, /*20: 4*/ + { 8, 8, 2, (unsigned char *)&ac0035 }, /*21: 5*/ + { 8, 8, 2, (unsigned char *)&ac0036 }, /*22: 6*/ + { 8, 8, 2, (unsigned char *)&ac0037 }, /*23: 7*/ + { 8, 8, 2, (unsigned char *)&ac0038 }, /*24: 8*/ + { 8, 8, 2, (unsigned char *)&ac0039 }, /*25: 9*/ + { 6, 6, 2, (unsigned char *)&ac003A }, /*26: :*/ + { 5, 5, 2, (unsigned char *)&ac003B }, /*27: ;*/ + { 7, 7, 2, (unsigned char *)&ac003C }, /*28: <*/ + { 8, 8, 2, (unsigned char *)&ac003D }, /*29: =*/ + { 8, 8, 2, (unsigned char *)&ac003E }, /*30: >*/ + { 8, 8, 2, (unsigned char *)&ac003F }, /*31: ?*/ + { 8, 8, 2, (unsigned char *)&ac0040 }, /*32: @*/ + { 8, 8, 2, (unsigned char *)&ac0041 }, /*33: A*/ + { 8, 8, 2, (unsigned char *)&ac0042 }, /*34: B*/ + { 8, 8, 2, (unsigned char *)&ac0043 }, /*35: C*/ + { 8, 8, 2, (unsigned char *)&ac0044 }, /*36: D*/ + { 8, 8, 2, (unsigned char *)&ac0045 }, /*37: E*/ + { 8, 8, 2, (unsigned char *)&ac0046 }, /*38: F*/ + { 8, 8, 2, (unsigned char *)&ac0047 }, /*39: G*/ + { 8, 8, 2, (unsigned char *)&ac0048 }, /*40: H*/ + { 7, 7, 2, (unsigned char *)&ac0049 }, /*41: I*/ + { 8, 8, 2, (unsigned char *)&ac004A }, /*42: J*/ + { 8, 8, 2, (unsigned char *)&ac004B }, /*43: K*/ + { 8, 8, 2, (unsigned char *)&ac004C }, /*44: L*/ + { 8, 8, 2, (unsigned char *)&ac004D }, /*45: M*/ + { 8, 8, 2, (unsigned char *)&ac004E }, /*46: N*/ + { 8, 8, 2, (unsigned char *)&ac004F }, /*47: O*/ + { 8, 8, 2, (unsigned char *)&ac0050 }, /*48: P*/ + { 8, 8, 2, (unsigned char *)&ac0051 }, /*49: Q*/ + { 8, 8, 2, (unsigned char *)&ac0052 }, /*50: R*/ + { 8, 8, 2, (unsigned char *)&ac0053 }, /*51: S*/ + { 8, 8, 2, (unsigned char *)&ac0054 }, /*52: T*/ + { 8, 8, 2, (unsigned char *)&ac0055 }, /*53: U*/ + { 8, 8, 2, (unsigned char *)&ac0056 }, /*54: V*/ + { 8, 8, 2, (unsigned char *)&ac0057 }, /*55: W*/ + { 8, 8, 2, (unsigned char *)&ac0058 }, /*56: X*/ + { 8, 8, 2, (unsigned char *)&ac0059 }, /*57: Y*/ + { 8, 8, 2, (unsigned char *)&ac005A }, /*58: Z*/ + { 7, 7, 2, (unsigned char *)&ac005B }, /*59: [*/ + { 8, 8, 2, (unsigned char *)&ac005C }, /*60: \*/ + { 6, 6, 2, (unsigned char *)&ac005D }, /*61: ]*/ + { 7, 7, 2, (unsigned char *)&ac005E }, /*62: ^*/ + { 8, 8, 2, (unsigned char *)&ac005F }, /*63: _*/ + { 5, 5, 2, (unsigned char *)&ac0060 }, /*64: `*/ + { 8, 8, 2, (unsigned char *)&ac0061 }, /*65: a*/ + { 8, 8, 2, (unsigned char *)&ac0062 }, /*66: b*/ + { 8, 8, 2, (unsigned char *)&ac0063 }, /*67: c*/ + { 9, 9, 2, (unsigned char *)&ac0064 }, /*68: d*/ + { 8, 8, 2, (unsigned char *)&ac0065 }, /*69: e*/ + { 8, 8, 2, (unsigned char *)&ac0066 }, /*70: f*/ + { 8, 8, 2, (unsigned char *)&ac0067 }, /*71: g*/ + { 9, 9, 2, (unsigned char *)&ac0068 }, /*72: h*/ + { 7, 7, 2, (unsigned char *)&ac0069 }, /*73: i*/ + { 7, 7, 2, (unsigned char *)&ac006A }, /*74: j*/ + { 8, 8, 2, (unsigned char *)&ac006B }, /*75: k*/ + { 7, 7, 2, (unsigned char *)&ac006C }, /*76: l*/ + { 8, 8, 2, (unsigned char *)&ac006D }, /*77: m*/ + { 9, 9, 2, (unsigned char *)&ac006E }, /*78: n*/ + { 8, 8, 2, (unsigned char *)&ac006F }, /*79: o*/ + { 8, 8, 2, (unsigned char *)&ac0070 }, /*80: p*/ + { 9, 9, 2, (unsigned char *)&ac0071 }, /*81: q*/ + { 8, 8, 2, (unsigned char *)&ac0072 }, /*82: r*/ + { 7, 7, 2, (unsigned char *)&ac0073 }, /*83: s*/ + { 8, 8, 2, (unsigned char *)&ac0074 }, /*84: t*/ + { 9, 9, 2, (unsigned char *)&ac0075 }, /*85: u*/ + { 8, 8, 2, (unsigned char *)&ac0076 }, /*86: v*/ + { 8, 8, 2, (unsigned char *)&ac0077 }, /*87: w*/ + { 8, 8, 2, (unsigned char *)&ac0078 }, /*88: x*/ + { 9, 9, 2, (unsigned char *)&ac0079 }, /*89: y*/ + { 8, 8, 2, (unsigned char *)&ac007A }, /*90: z*/ + { 8, 8, 2, (unsigned char *)&ac007B }, /*91: {*/ + { 6, 6, 2, (unsigned char *)&ac007C }, /*92: |*/ + { 5, 5, 2, (unsigned char *)&ac007D }, /*93: }*/ + { 8, 8, 2, (unsigned char *)&ac007E }, /*94: ~*/ + { 6, 6, 2, (unsigned char *)&ac007F }, /*95: */ + { 15, 15, 2, (unsigned char *)&acA1AB }, /*96: ~*/ + { 13, 13, 2, (unsigned char *)&acA1C1 }, /*97: ×*/ + { 15, 15, 2, (unsigned char *)&acA1CC }, /*98: √*/ + { 8, 8, 2, (unsigned char *)&acA1E3 }, /*99: °*/ + { 15, 15, 2, (unsigned char *)&acA1E6 }, /*100: ℃*/ + { 15, 15, 2, (unsigned char *)&acA1F0 }, /*101: ○*/ + { 15, 15, 2, (unsigned char *)&acA1FA }, /*102: →*/ + { 15, 15, 2, (unsigned char *)&acA1FB }, /*103: ←*/ + { 11, 11, 2, (unsigned char *)&acA1FC }, /*104: ↑*/ + { 11, 11, 2, (unsigned char *)&acA1FD }, /*105: ↓*/ + { 14, 14, 2, (unsigned char *)&acA848 }, /*106: ℉*/ + { 15, 15, 2, (unsigned char *)&acB0B2 }, /*107: 安*/ + { 15, 15, 2, (unsigned char *)&acB0B4 }, /*108: 按*/ + { 15, 15, 2, (unsigned char *)&acB0E6 }, /*109: 版*/ + { 15, 15, 2, (unsigned char *)&acB1A1 }, /*110: 薄*/ + { 15, 15, 2, (unsigned char *)&acB1A3 }, /*111: 保*/ + { 15, 15, 2, (unsigned char *)&acB1A5 }, /*112: 饱*/ + { 15, 15, 2, (unsigned char *)&acB1A8 }, /*113: 报*/ + { 15, 15, 2, (unsigned char *)&acB1B8 }, /*114: 备*/ + { 15, 15, 2, (unsigned char *)&acB1BE }, /*115: 本*/ + { 15, 15, 2, (unsigned char *)&acB1C8 }, /*116: 比*/ + { 15, 15, 2, (unsigned char *)&acB1D5 }, /*117: 闭*/ + { 15, 15, 2, (unsigned char *)&acB1E0 }, /*118: 编*/ + { 15, 15, 2, (unsigned char *)&acB1E4 }, /*119: 变*/ + { 15, 15, 2, (unsigned char *)&acB1ED }, /*120: 表*/ + { 15, 15, 2, (unsigned char *)&acB2BB }, /*121: 不*/ + { 15, 15, 2, (unsigned char *)&acB2C1 }, /*122: 擦*/ + { 15, 15, 2, (unsigned char *)&acB2CE }, /*123: 参*/ + { 15, 15, 2, (unsigned char *)&acB2D9 }, /*124: 操*/ + { 15, 15, 2, (unsigned char *)&acB2E2 }, /*125: 测*/ + { 15, 15, 2, (unsigned char *)&acB2EE }, /*126: 差*/ + { 15, 15, 2, (unsigned char *)&acB3A3 }, /*127: 常*/ + { 15, 15, 2, (unsigned char *)&acB3A4 }, /*128: 长*/ + { 15, 15, 2, (unsigned char *)&acB3A7 }, /*129: 厂*/ + { 15, 15, 2, (unsigned char *)&acB3C6 }, /*130: 称*/ + { 15, 15, 2, (unsigned char *)&acB3C9 }, /*131: 成*/ + { 15, 15, 2, (unsigned char *)&acB3CC }, /*132: 程*/ + { 15, 15, 2, (unsigned char *)&acB3F6 }, /*133: 出*/ + { 15, 15, 2, (unsigned char *)&acB4A2 }, /*134: 储*/ + { 15, 15, 2, (unsigned char *)&acB4AB }, /*135: 传*/ + { 15, 15, 2, (unsigned char *)&acB4C5 }, /*136: 磁*/ + { 15, 15, 2, (unsigned char *)&acB4CE }, /*137: 次*/ + { 15, 15, 2, (unsigned char *)&acB4E6 }, /*138: 存*/ + { 15, 15, 2, (unsigned char *)&acB4F3 }, /*139: 大*/ + { 15, 15, 2, (unsigned char *)&acB4F8 }, /*140: 带*/ + { 15, 15, 2, (unsigned char *)&acB4FD }, /*141: 待*/ + { 15, 15, 2, (unsigned char *)&acB5A5 }, /*142: 单*/ + { 15, 15, 2, (unsigned char *)&acB5AF }, /*143: 弹*/ + { 14, 14, 2, (unsigned char *)&acB5B1 }, /*144: 当*/ + { 15, 15, 2, (unsigned char *)&acB5C4 }, /*145: 的*/ + { 15, 15, 2, (unsigned char *)&acB5CD }, /*146: 低*/ + { 15, 15, 2, (unsigned char *)&acB5D8 }, /*147: 地*/ + { 15, 15, 2, (unsigned char *)&acB5E3 }, /*148: 点*/ + { 15, 15, 2, (unsigned char *)&acB5E7 }, /*149: 电*/ + { 15, 15, 2, (unsigned char *)&acB6A8 }, /*150: 定*/ + { 15, 15, 2, (unsigned char *)&acB6AF }, /*151: 动*/ + { 15, 15, 2, (unsigned char *)&acB6C8 }, /*152: 度*/ + { 15, 15, 2, (unsigned char *)&acB6CC }, /*153: 短*/ + { 15, 15, 2, (unsigned char *)&acB6CF }, /*154: 断*/ + { 15, 15, 2, (unsigned char *)&acB7A7 }, /*155: 阀*/ + { 15, 15, 2, (unsigned char *)&acB7A8 }, /*156: 法*/ + { 15, 15, 2, (unsigned char *)&acB7B4 }, /*157: 反*/ + { 15, 15, 2, (unsigned char *)&acB7B5 }, /*158: 返*/ + { 15, 15, 2, (unsigned char *)&acB7B6 }, /*159: 范*/ + { 15, 15, 2, (unsigned char *)&acB7BD }, /*160: 方*/ + { 15, 15, 2, (unsigned char *)&acB7C5 }, /*161: 放*/ + { 15, 15, 2, (unsigned char *)&acB7C7 }, /*162: 非*/ + { 15, 15, 2, (unsigned char *)&acB7D6 }, /*163: 分*/ + { 15, 15, 2, (unsigned char *)&acB7FE }, /*164: 服*/ + { 15, 15, 2, (unsigned char *)&acB8B4 }, /*165: 复*/ + { 15, 15, 2, (unsigned char *)&acB8D0 }, /*166: 感*/ + { 15, 15, 2, (unsigned char *)&acB8D7 }, /*167: 缸*/ + { 15, 15, 2, (unsigned char *)&acB8DF }, /*168: 高*/ + { 15, 15, 2, (unsigned char *)&acB8EE }, /*169: 割*/ + { 15, 15, 2, (unsigned char *)&acB8F6 }, /*170: 个*/ + { 15, 15, 2, (unsigned char *)&acB8FC }, /*171: 更*/ + { 15, 15, 2, (unsigned char *)&acB9A4 }, /*172: 工*/ + { 14, 14, 2, (unsigned char *)&acB9A6 }, /*173: 功*/ + { 15, 15, 2, (unsigned char *)&acB9AB }, /*174: 公*/ + { 15, 15, 2, (unsigned char *)&acB9B9 }, /*175: 构*/ + { 15, 15, 2, (unsigned char *)&acB9CA }, /*176: 故*/ + { 15, 15, 2, (unsigned char *)&acB9CC }, /*177: 固*/ + { 15, 15, 2, (unsigned char *)&acB9D8 }, /*178: 关*/ + { 15, 15, 2, (unsigned char *)&acB9FD }, /*179: 过*/ + { 15, 15, 2, (unsigned char *)&acBAC4 }, /*180: 耗*/ + { 15, 15, 2, (unsigned char *)&acBAC5 }, /*181: 号*/ + { 15, 15, 2, (unsigned char *)&acBACD }, /*182: 和*/ + { 15, 15, 2, (unsigned char *)&acBAE3 }, /*183: 恒*/ + { 15, 15, 2, (unsigned char *)&acBBA4 }, /*184: 护*/ + { 15, 15, 2, (unsigned char *)&acBBB6 }, /*185: 欢*/ + { 15, 15, 2, (unsigned char *)&acBBB7 }, /*186: 环*/ + { 15, 15, 2, (unsigned char *)&acBBBB }, /*187: 换*/ + { 15, 15, 2, (unsigned char *)&acBBC9 }, /*188: 簧*/ + { 15, 15, 2, (unsigned char *)&acBBD6 }, /*189: 恢*/ + { 15, 15, 2, (unsigned char *)&acBBD8 }, /*190: 回*/ + { 15, 15, 2, (unsigned char *)&acBBF9 }, /*191: 基*/ + { 15, 15, 2, (unsigned char *)&acBBFA }, /*192: 机*/ + { 15, 15, 2, (unsigned char *)&acBBFD }, /*193: 积*/ + { 15, 15, 2, (unsigned char *)&acBCAD }, /*194: 辑*/ + { 15, 15, 2, (unsigned char *)&acBCBC }, /*195: 技*/ + { 15, 15, 2, (unsigned char *)&acBCC6 }, /*196: 计*/ + { 15, 15, 2, (unsigned char *)&acBCC7 }, /*197: 记*/ + { 15, 15, 2, (unsigned char *)&acBCD3 }, /*198: 加*/ + { 15, 15, 2, (unsigned char *)&acBCE4 }, /*199: 间*/ + { 15, 15, 2, (unsigned char *)&acBCF5 }, /*200: 减*/ + { 15, 15, 2, (unsigned char *)&acBCFE }, /*201: 件*/ + { 15, 15, 2, (unsigned char *)&acBDAD }, /*202: 江*/ + { 14, 14, 2, (unsigned char *)&acBDC7 }, /*203: 角*/ + { 15, 15, 2, (unsigned char *)&acBDF8 }, /*204: 进*/ + { 15, 15, 2, (unsigned char *)&acBEA1 }, /*205: 尽*/ + { 15, 15, 2, (unsigned char *)&acBEAF }, /*206: 警*/ + { 15, 15, 2, (unsigned char *)&acBEB3 }, /*207: 境*/ + { 15, 15, 2, (unsigned char *)&acBEDD }, /*208: 据*/ + { 15, 15, 2, (unsigned char *)&acBEDE }, /*209: 巨*/ + { 15, 15, 2, (unsigned char *)&acBFAA }, /*210: 开*/ + { 15, 15, 2, (unsigned char *)&acBFC9 }, /*211: 可*/ + { 15, 15, 2, (unsigned char *)&acBFD5 }, /*212: 空*/ + { 15, 15, 2, (unsigned char *)&acBFD8 }, /*213: 控*/ + { 15, 15, 2, (unsigned char *)&acBFE7 }, /*214: 跨*/ + { 15, 15, 2, (unsigned char *)&acBFE9 }, /*215: 块*/ + { 15, 15, 2, (unsigned char *)&acC0B6 }, /*216: 蓝*/ + { 14, 14, 2, (unsigned char *)&acC0DB }, /*217: 累*/ + { 15, 15, 2, (unsigned char *)&acC0E0 }, /*218: 类*/ + { 15, 15, 2, (unsigned char *)&acC0EB }, /*219: 离*/ + { 15, 15, 2, (unsigned char *)&acC0FD }, /*220: 例*/ + { 14, 14, 2, (unsigned char *)&acC1A6 }, /*221: 力*/ + { 15, 15, 2, (unsigned char *)&acC1BF }, /*222: 量*/ + { 15, 15, 2, (unsigned char *)&acC1D0 }, /*223: 列*/ + { 15, 15, 2, (unsigned char *)&acC1E3 }, /*224: 零*/ + { 15, 15, 2, (unsigned char *)&acC1F7 }, /*225: 流*/ + { 15, 15, 2, (unsigned char *)&acC2B7 }, /*226: 路*/ + { 15, 15, 2, (unsigned char *)&acC2BC }, /*227: 录*/ + { 15, 15, 2, (unsigned char *)&acC2CA }, /*228: 率*/ + { 15, 15, 2, (unsigned char *)&acC2FA }, /*229: 满*/ + { 15, 15, 2, (unsigned char *)&acC3C5 }, /*230: 门*/ + { 15, 15, 2, (unsigned char *)&acC3E6 }, /*231: 面*/ + { 14, 14, 2, (unsigned char *)&acC3FB }, /*232: 名*/ + { 15, 15, 2, (unsigned char *)&acC4A3 }, /*233: 模*/ + { 15, 15, 2, (unsigned char *)&acC4A4 }, /*234: 膜*/ + { 15, 15, 2, (unsigned char *)&acC4A6 }, /*235: 摩*/ + { 15, 15, 2, (unsigned char *)&acC4DA }, /*236: 内*/ + { 15, 15, 2, (unsigned char *)&acC4DC }, /*237: 能*/ + { 15, 15, 2, (unsigned char *)&acC4E2 }, /*238: 拟*/ + { 15, 15, 2, (unsigned char *)&acC5E4 }, /*239: 配*/ + { 14, 14, 2, (unsigned char *)&acC6AB }, /*240: 偏*/ + { 15, 15, 2, (unsigned char *)&acC6B5 }, /*241: 频*/ + { 15, 15, 2, (unsigned char *)&acC6BD }, /*242: 平*/ + { 14, 14, 2, (unsigned char *)&acC6F4 }, /*243: 启*/ + { 15, 15, 2, (unsigned char *)&acC6F7 }, /*244: 器*/ + { 15, 15, 2, (unsigned char *)&acC6F8 }, /*245: 气*/ + { 15, 15, 2, (unsigned char *)&acC7B0 }, /*246: 前*/ + { 15, 15, 2, (unsigned char *)&acC7D0 }, /*247: 切*/ + { 15, 15, 2, (unsigned char *)&acC7F8 }, /*248: 区*/ + { 15, 15, 2, (unsigned char *)&acC7FD }, /*249: 驱*/ + { 15, 15, 2, (unsigned char *)&acC8A1 }, /*250: 取*/ + { 15, 15, 2, (unsigned char *)&acC8AB }, /*251: 全*/ + { 15, 15, 2, (unsigned char *)&acC8B7 }, /*252: 确*/ + { 15, 15, 2, (unsigned char *)&acC8CF }, /*253: 认*/ + { 15, 15, 2, (unsigned char *)&acC8EB }, /*254: 入*/ + { 15, 15, 2, (unsigned char *)&acC8ED }, /*255: 软*/ + { 15, 15, 2, (unsigned char *)&acC9CC }, /*256: 商*/ + { 15, 15, 2, (unsigned char *)&acC9CF }, /*257: 上*/ + { 15, 15, 2, (unsigned char *)&acC9D9 }, /*258: 少*/ + { 15, 15, 2, (unsigned char *)&acC9E8 }, /*259: 设*/ + { 15, 15, 2, (unsigned char *)&acCAAA }, /*260: 湿*/ + { 15, 15, 2, (unsigned char *)&acCAAF }, /*261: 石*/ + { 15, 15, 2, (unsigned char *)&acCAB1 }, /*262: 时*/ + { 15, 15, 2, (unsigned char *)&acCAB5 }, /*263: 实*/ + { 15, 15, 2, (unsigned char *)&acCAB9 }, /*264: 使*/ + { 15, 15, 2, (unsigned char *)&acCABD }, /*265: 式*/ + { 15, 15, 2, (unsigned char *)&acCABE }, /*266: 示*/ + { 15, 15, 2, (unsigned char *)&acCAD4 }, /*267: 试*/ + { 15, 15, 2, (unsigned char *)&acCAD6 }, /*268: 手*/ + { 15, 15, 2, (unsigned char *)&acCAD7 }, /*269: 首*/ + { 15, 15, 2, (unsigned char *)&acCAE4 }, /*270: 输*/ + { 15, 15, 2, (unsigned char *)&acCAF5 }, /*271: 术*/ + { 15, 15, 2, (unsigned char *)&acCAFD }, /*272: 数*/ + { 15, 15, 2, (unsigned char *)&acCBAB }, /*273: 双*/ + { 14, 14, 2, (unsigned char *)&acCBBE }, /*274: 司*/ + { 15, 15, 2, (unsigned char *)&acCBC0 }, /*275: 死*/ + { 15, 15, 2, (unsigned char *)&acCBD5 }, /*276: 苏*/ + { 15, 15, 2, (unsigned char *)&acCBD9 }, /*277: 速*/ + { 15, 15, 2, (unsigned char *)&acCBE3 }, /*278: 算*/ + { 15, 15, 2, (unsigned char *)&acCBF9 }, /*279: 所*/ + { 15, 15, 2, (unsigned char *)&acCCAC }, /*280: 态*/ + { 15, 15, 2, (unsigned char *)&acCCF5 }, /*281: 条*/ + { 15, 15, 2, (unsigned char *)&acCDA3 }, /*282: 停*/ + { 15, 15, 2, (unsigned char *)&acCDA8 }, /*283: 通*/ + { 15, 15, 2, (unsigned char *)&acCDB6 }, /*284: 投*/ + { 15, 15, 2, (unsigned char *)&acCDBC }, /*285: 图*/ + { 15, 15, 2, (unsigned char *)&acCDE2 }, /*286: 外*/ + { 15, 15, 2, (unsigned char *)&acCEA2 }, /*287: 微*/ + { 15, 15, 2, (unsigned char *)&acCEA7 }, /*288: 围*/ + { 14, 14, 2, (unsigned char *)&acCEAA }, /*289: 为*/ + { 15, 15, 2, (unsigned char *)&acCEB4 }, /*290: 未*/ + { 15, 15, 2, (unsigned char *)&acCEBB }, /*291: 位*/ + { 15, 15, 2, (unsigned char *)&acCEC2 }, /*292: 温*/ + { 15, 15, 2, (unsigned char *)&acCEC4 }, /*293: 文*/ + { 15, 15, 2, (unsigned char *)&acCEF1 }, /*294: 务*/ + { 15, 15, 2, (unsigned char *)&acCFA2 }, /*295: 息*/ + { 14, 14, 2, (unsigned char *)&acCFB5 }, /*296: 系*/ + { 15, 15, 2, (unsigned char *)&acCFC2 }, /*297: 下*/ + { 15, 15, 2, (unsigned char *)&acCFD4 }, /*298: 显*/ + { 15, 15, 2, (unsigned char *)&acCFDE }, /*299: 限*/ + { 15, 15, 2, (unsigned char *)&acCFDF }, /*300: 线*/ + { 15, 15, 2, (unsigned char *)&acCFE0 }, /*301: 相*/ + { 15, 15, 2, (unsigned char *)&acCFEE }, /*302: 项*/ + { 15, 15, 2, (unsigned char *)&acCFF2 }, /*303: 向*/ + { 14, 14, 2, (unsigned char *)&acCFFB }, /*304: 消*/ + { 15, 15, 2, (unsigned char *)&acD0A1 }, /*305: 小*/ + { 15, 15, 2, (unsigned char *)&acD0A3 }, /*306: 校*/ + { 15, 15, 2, (unsigned char *)&acD0B4 }, /*307: 写*/ + { 15, 15, 2, (unsigned char *)&acD0C2 }, /*308: 新*/ + { 15, 15, 2, (unsigned char *)&acD0C5 }, /*309: 信*/ + { 15, 15, 2, (unsigned char *)&acD0CD }, /*310: 型*/ + { 15, 15, 2, (unsigned char *)&acD0D0 }, /*311: 行*/ + { 15, 15, 2, (unsigned char *)&acD0F2 }, /*312: 序*/ + { 15, 15, 2, (unsigned char *)&acD1A1 }, /*313: 选*/ + { 15, 15, 2, (unsigned char *)&acD1B6 }, /*314: 讯*/ + { 15, 15, 2, (unsigned char *)&acD1B9 }, /*315: 压*/ + { 15, 15, 2, (unsigned char *)&acD1C0 }, /*316: 牙*/ + { 15, 15, 2, (unsigned char *)&acD1D4 }, /*317: 言*/ + { 15, 15, 2, (unsigned char *)&acD2AA }, /*318: 要*/ + { 15, 15, 2, (unsigned char *)&acD2B3 }, /*319: 页*/ + { 15, 15, 2, (unsigned char *)&acD2BB }, /*320: 一*/ + { 15, 15, 2, (unsigned char *)&acD2C6 }, /*321: 移*/ + { 15, 15, 2, (unsigned char *)&acD2C7 }, /*322: 仪*/ + { 15, 15, 2, (unsigned char *)&acD2D1 }, /*323: 已*/ + { 15, 15, 2, (unsigned char *)&acD2E6 }, /*324: 益*/ + { 15, 15, 2, (unsigned char *)&acD3A2 }, /*325: 英*/ + { 15, 15, 2, (unsigned char *)&acD3AD }, /*326: 迎*/ + { 15, 15, 2, (unsigned char *)&acD3B2 }, /*327: 硬*/ + { 15, 15, 2, (unsigned char *)&acD3C3 }, /*328: 用*/ + { 15, 15, 2, (unsigned char *)&acD3D0 }, /*329: 有*/ + { 15, 15, 2, (unsigned char *)&acD3EF }, /*330: 语*/ + { 15, 15, 2, (unsigned char *)&acD3F2 }, /*331: 域*/ + { 15, 15, 2, (unsigned char *)&acD4B4 }, /*332: 源*/ + { 15, 15, 2, (unsigned char *)&acD4CB }, /*333: 运*/ + { 15, 15, 2, (unsigned char *)&acD4DA }, /*334: 在*/ + { 15, 15, 2, (unsigned char *)&acD4EC }, /*335: 造*/ + { 15, 15, 2, (unsigned char *)&acD4F1 }, /*336: 择*/ + { 15, 15, 2, (unsigned char *)&acD4F6 }, /*337: 增*/ + { 15, 15, 2, (unsigned char *)&acD5CF }, /*338: 障*/ + { 15, 15, 2, (unsigned char *)&acD5EF }, /*339: 诊*/ + { 15, 15, 2, (unsigned char *)&acD5FB }, /*340: 整*/ + { 15, 15, 2, (unsigned char *)&acD5FD }, /*341: 正*/ + { 15, 15, 2, (unsigned char *)&acD6AA }, /*342: 知*/ + { 15, 15, 2, (unsigned char *)&acD6B1 }, /*343: 直*/ + { 15, 15, 2, (unsigned char *)&acD6B4 }, /*344: 执*/ + { 15, 15, 2, (unsigned char *)&acD6B7 }, /*345: 址*/ + { 15, 15, 2, (unsigned char *)&acD6B8 }, /*346: 指*/ + { 15, 15, 2, (unsigned char *)&acD6C3 }, /*347: 置*/ + { 14, 14, 2, (unsigned char *)&acD6C6 }, /*348: 制*/ + { 14, 14, 2, (unsigned char *)&acD6C7 }, /*349: 智*/ + { 14, 14, 2, (unsigned char *)&acD6D0 }, /*350: 中*/ + { 15, 15, 2, (unsigned char *)&acD6D8 }, /*351: 重*/ + { 15, 15, 2, (unsigned char *)&acD6F7 }, /*352: 主*/ + { 15, 15, 2, (unsigned char *)&acD7B0 }, /*353: 装*/ + { 15, 15, 2, (unsigned char *)&acD7B4 }, /*354: 状*/ + { 15, 15, 2, (unsigned char *)&acD7BC }, /*355: 准*/ + { 14, 14, 2, (unsigned char *)&acD7D4 }, /*356: 自*/ + { 15, 15, 2, (unsigned char *)&acD7D6 }, /*357: 字*/ + { 15, 15, 2, (unsigned char *)&acD7F7 }, /*358: 作*/ +}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop243 = { + 0xD7F7, /*start :作*/ + 0xD7F7, /*end :作, len=1*/ + &Cinfo[ 358 ], + (void*)0 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop242 = { + 0xD7D6, /*start :字*/ + 0xD7D6, /*end :字, len=1*/ + &Cinfo[ 357 ], + &Prop243 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop241 = { + 0xD7D4, /*start :自*/ + 0xD7D4, /*end :自, len=1*/ + &Cinfo[ 356 ], + &Prop242 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop240 = { + 0xD7BC, /*start :准*/ + 0xD7BC, /*end :准, len=1*/ + &Cinfo[ 355 ], + &Prop241 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop239 = { + 0xD7B4, /*start :状*/ + 0xD7B4, /*end :状, len=1*/ + &Cinfo[ 354 ], + &Prop240 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop238 = { + 0xD7B0, /*start :装*/ + 0xD7B0, /*end :装, len=1*/ + &Cinfo[ 353 ], + &Prop239 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop237 = { + 0xD6F7, /*start :主*/ + 0xD6F7, /*end :主, len=1*/ + &Cinfo[ 352 ], + &Prop238 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop236 = { + 0xD6D8, /*start :重*/ + 0xD6D8, /*end :重, len=1*/ + &Cinfo[ 351 ], + &Prop237 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop235 = { + 0xD6D0, /*start :中*/ + 0xD6D0, /*end :中, len=1*/ + &Cinfo[ 350 ], + &Prop236 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop234 = { + 0xD6C6, /*start :制*/ + 0xD6C7, /*end :智, len=2*/ + &Cinfo[ 348 ], + &Prop235 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop233 = { + 0xD6C3, /*start :置*/ + 0xD6C3, /*end :置, len=1*/ + &Cinfo[ 347 ], + &Prop234 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop232 = { + 0xD6B7, /*start :址*/ + 0xD6B8, /*end :指, len=2*/ + &Cinfo[ 345 ], + &Prop233 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop231 = { + 0xD6B4, /*start :执*/ + 0xD6B4, /*end :执, len=1*/ + &Cinfo[ 344 ], + &Prop232 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop230 = { + 0xD6B1, /*start :直*/ + 0xD6B1, /*end :直, len=1*/ + &Cinfo[ 343 ], + &Prop231 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop229 = { + 0xD6AA, /*start :知*/ + 0xD6AA, /*end :知, len=1*/ + &Cinfo[ 342 ], + &Prop230 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop228 = { + 0xD5FD, /*start :正*/ + 0xD5FD, /*end :正, len=1*/ + &Cinfo[ 341 ], + &Prop229 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop227 = { + 0xD5FB, /*start :整*/ + 0xD5FB, /*end :整, len=1*/ + &Cinfo[ 340 ], + &Prop228 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop226 = { + 0xD5EF, /*start :诊*/ + 0xD5EF, /*end :诊, len=1*/ + &Cinfo[ 339 ], + &Prop227 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop225 = { + 0xD5CF, /*start :障*/ + 0xD5CF, /*end :障, len=1*/ + &Cinfo[ 338 ], + &Prop226 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop224 = { + 0xD4F6, /*start :增*/ + 0xD4F6, /*end :增, len=1*/ + &Cinfo[ 337 ], + &Prop225 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop223 = { + 0xD4F1, /*start :择*/ + 0xD4F1, /*end :择, len=1*/ + &Cinfo[ 336 ], + &Prop224 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop222 = { + 0xD4EC, /*start :造*/ + 0xD4EC, /*end :造, len=1*/ + &Cinfo[ 335 ], + &Prop223 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop221 = { + 0xD4DA, /*start :在*/ + 0xD4DA, /*end :在, len=1*/ + &Cinfo[ 334 ], + &Prop222 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop220 = { + 0xD4CB, /*start :运*/ + 0xD4CB, /*end :运, len=1*/ + &Cinfo[ 333 ], + &Prop221 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop219 = { + 0xD4B4, /*start :源*/ + 0xD4B4, /*end :源, len=1*/ + &Cinfo[ 332 ], + &Prop220 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop218 = { + 0xD3F2, /*start :域*/ + 0xD3F2, /*end :域, len=1*/ + &Cinfo[ 331 ], + &Prop219 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop217 = { + 0xD3EF, /*start :语*/ + 0xD3EF, /*end :语, len=1*/ + &Cinfo[ 330 ], + &Prop218 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop216 = { + 0xD3D0, /*start :有*/ + 0xD3D0, /*end :有, len=1*/ + &Cinfo[ 329 ], + &Prop217 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop215 = { + 0xD3C3, /*start :用*/ + 0xD3C3, /*end :用, len=1*/ + &Cinfo[ 328 ], + &Prop216 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop214 = { + 0xD3B2, /*start :硬*/ + 0xD3B2, /*end :硬, len=1*/ + &Cinfo[ 327 ], + &Prop215 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop213 = { + 0xD3AD, /*start :迎*/ + 0xD3AD, /*end :迎, len=1*/ + &Cinfo[ 326 ], + &Prop214 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop212 = { + 0xD3A2, /*start :英*/ + 0xD3A2, /*end :英, len=1*/ + &Cinfo[ 325 ], + &Prop213 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop211 = { + 0xD2E6, /*start :益*/ + 0xD2E6, /*end :益, len=1*/ + &Cinfo[ 324 ], + &Prop212 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop210 = { + 0xD2D1, /*start :已*/ + 0xD2D1, /*end :已, len=1*/ + &Cinfo[ 323 ], + &Prop211 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop209 = { + 0xD2C6, /*start :移*/ + 0xD2C7, /*end :仪, len=2*/ + &Cinfo[ 321 ], + &Prop210 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop208 = { + 0xD2BB, /*start :一*/ + 0xD2BB, /*end :一, len=1*/ + &Cinfo[ 320 ], + &Prop209 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop207 = { + 0xD2B3, /*start :页*/ + 0xD2B3, /*end :页, len=1*/ + &Cinfo[ 319 ], + &Prop208 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop206 = { + 0xD2AA, /*start :要*/ + 0xD2AA, /*end :要, len=1*/ + &Cinfo[ 318 ], + &Prop207 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop205 = { + 0xD1D4, /*start :言*/ + 0xD1D4, /*end :言, len=1*/ + &Cinfo[ 317 ], + &Prop206 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop204 = { + 0xD1C0, /*start :牙*/ + 0xD1C0, /*end :牙, len=1*/ + &Cinfo[ 316 ], + &Prop205 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop203 = { + 0xD1B9, /*start :压*/ + 0xD1B9, /*end :压, len=1*/ + &Cinfo[ 315 ], + &Prop204 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop202 = { + 0xD1B6, /*start :讯*/ + 0xD1B6, /*end :讯, len=1*/ + &Cinfo[ 314 ], + &Prop203 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop201 = { + 0xD1A1, /*start :选*/ + 0xD1A1, /*end :选, len=1*/ + &Cinfo[ 313 ], + &Prop202 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop200 = { + 0xD0F2, /*start :序*/ + 0xD0F2, /*end :序, len=1*/ + &Cinfo[ 312 ], + &Prop201 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop199 = { + 0xD0D0, /*start :行*/ + 0xD0D0, /*end :行, len=1*/ + &Cinfo[ 311 ], + &Prop200 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop198 = { + 0xD0CD, /*start :型*/ + 0xD0CD, /*end :型, len=1*/ + &Cinfo[ 310 ], + &Prop199 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop197 = { + 0xD0C5, /*start :信*/ + 0xD0C5, /*end :信, len=1*/ + &Cinfo[ 309 ], + &Prop198 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop196 = { + 0xD0C2, /*start :新*/ + 0xD0C2, /*end :新, len=1*/ + &Cinfo[ 308 ], + &Prop197 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop195 = { + 0xD0B4, /*start :写*/ + 0xD0B4, /*end :写, len=1*/ + &Cinfo[ 307 ], + &Prop196 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop194 = { + 0xD0A3, /*start :校*/ + 0xD0A3, /*end :校, len=1*/ + &Cinfo[ 306 ], + &Prop195 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop193 = { + 0xD0A1, /*start :小*/ + 0xD0A1, /*end :小, len=1*/ + &Cinfo[ 305 ], + &Prop194 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop192 = { + 0xCFFB, /*start :消*/ + 0xCFFB, /*end :消, len=1*/ + &Cinfo[ 304 ], + &Prop193 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop191 = { + 0xCFF2, /*start :向*/ + 0xCFF2, /*end :向, len=1*/ + &Cinfo[ 303 ], + &Prop192 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop190 = { + 0xCFEE, /*start :项*/ + 0xCFEE, /*end :项, len=1*/ + &Cinfo[ 302 ], + &Prop191 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop189 = { + 0xCFDE, /*start :限*/ + 0xCFE0, /*end :相, len=3*/ + &Cinfo[ 299 ], + &Prop190 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop188 = { + 0xCFD4, /*start :显*/ + 0xCFD4, /*end :显, len=1*/ + &Cinfo[ 298 ], + &Prop189 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop187 = { + 0xCFC2, /*start :下*/ + 0xCFC2, /*end :下, len=1*/ + &Cinfo[ 297 ], + &Prop188 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop186 = { + 0xCFB5, /*start :系*/ + 0xCFB5, /*end :系, len=1*/ + &Cinfo[ 296 ], + &Prop187 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop185 = { + 0xCFA2, /*start :息*/ + 0xCFA2, /*end :息, len=1*/ + &Cinfo[ 295 ], + &Prop186 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop184 = { + 0xCEF1, /*start :务*/ + 0xCEF1, /*end :务, len=1*/ + &Cinfo[ 294 ], + &Prop185 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop183 = { + 0xCEC4, /*start :文*/ + 0xCEC4, /*end :文, len=1*/ + &Cinfo[ 293 ], + &Prop184 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop182 = { + 0xCEC2, /*start :温*/ + 0xCEC2, /*end :温, len=1*/ + &Cinfo[ 292 ], + &Prop183 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop181 = { + 0xCEBB, /*start :位*/ + 0xCEBB, /*end :位, len=1*/ + &Cinfo[ 291 ], + &Prop182 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop180 = { + 0xCEB4, /*start :未*/ + 0xCEB4, /*end :未, len=1*/ + &Cinfo[ 290 ], + &Prop181 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop179 = { + 0xCEAA, /*start :为*/ + 0xCEAA, /*end :为, len=1*/ + &Cinfo[ 289 ], + &Prop180 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop178 = { + 0xCEA7, /*start :围*/ + 0xCEA7, /*end :围, len=1*/ + &Cinfo[ 288 ], + &Prop179 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop177 = { + 0xCEA2, /*start :微*/ + 0xCEA2, /*end :微, len=1*/ + &Cinfo[ 287 ], + &Prop178 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop176 = { + 0xCDE2, /*start :外*/ + 0xCDE2, /*end :外, len=1*/ + &Cinfo[ 286 ], + &Prop177 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop175 = { + 0xCDBC, /*start :图*/ + 0xCDBC, /*end :图, len=1*/ + &Cinfo[ 285 ], + &Prop176 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop174 = { + 0xCDB6, /*start :投*/ + 0xCDB6, /*end :投, len=1*/ + &Cinfo[ 284 ], + &Prop175 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop173 = { + 0xCDA8, /*start :通*/ + 0xCDA8, /*end :通, len=1*/ + &Cinfo[ 283 ], + &Prop174 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop172 = { + 0xCDA3, /*start :停*/ + 0xCDA3, /*end :停, len=1*/ + &Cinfo[ 282 ], + &Prop173 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop171 = { + 0xCCF5, /*start :条*/ + 0xCCF5, /*end :条, len=1*/ + &Cinfo[ 281 ], + &Prop172 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop170 = { + 0xCCAC, /*start :态*/ + 0xCCAC, /*end :态, len=1*/ + &Cinfo[ 280 ], + &Prop171 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop169 = { + 0xCBF9, /*start :所*/ + 0xCBF9, /*end :所, len=1*/ + &Cinfo[ 279 ], + &Prop170 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop168 = { + 0xCBE3, /*start :算*/ + 0xCBE3, /*end :算, len=1*/ + &Cinfo[ 278 ], + &Prop169 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop167 = { + 0xCBD9, /*start :速*/ + 0xCBD9, /*end :速, len=1*/ + &Cinfo[ 277 ], + &Prop168 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop166 = { + 0xCBD5, /*start :苏*/ + 0xCBD5, /*end :苏, len=1*/ + &Cinfo[ 276 ], + &Prop167 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop165 = { + 0xCBC0, /*start :死*/ + 0xCBC0, /*end :死, len=1*/ + &Cinfo[ 275 ], + &Prop166 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop164 = { + 0xCBBE, /*start :司*/ + 0xCBBE, /*end :司, len=1*/ + &Cinfo[ 274 ], + &Prop165 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop163 = { + 0xCBAB, /*start :双*/ + 0xCBAB, /*end :双, len=1*/ + &Cinfo[ 273 ], + &Prop164 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop162 = { + 0xCAFD, /*start :数*/ + 0xCAFD, /*end :数, len=1*/ + &Cinfo[ 272 ], + &Prop163 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop161 = { + 0xCAF5, /*start :术*/ + 0xCAF5, /*end :术, len=1*/ + &Cinfo[ 271 ], + &Prop162 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop160 = { + 0xCAE4, /*start :输*/ + 0xCAE4, /*end :输, len=1*/ + &Cinfo[ 270 ], + &Prop161 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop159 = { + 0xCAD6, /*start :手*/ + 0xCAD7, /*end :首, len=2*/ + &Cinfo[ 268 ], + &Prop160 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop158 = { + 0xCAD4, /*start :试*/ + 0xCAD4, /*end :试, len=1*/ + &Cinfo[ 267 ], + &Prop159 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop157 = { + 0xCABD, /*start :式*/ + 0xCABE, /*end :示, len=2*/ + &Cinfo[ 265 ], + &Prop158 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop156 = { + 0xCAB9, /*start :使*/ + 0xCAB9, /*end :使, len=1*/ + &Cinfo[ 264 ], + &Prop157 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop155 = { + 0xCAB5, /*start :实*/ + 0xCAB5, /*end :实, len=1*/ + &Cinfo[ 263 ], + &Prop156 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop154 = { + 0xCAB1, /*start :时*/ + 0xCAB1, /*end :时, len=1*/ + &Cinfo[ 262 ], + &Prop155 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop153 = { + 0xCAAF, /*start :石*/ + 0xCAAF, /*end :石, len=1*/ + &Cinfo[ 261 ], + &Prop154 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop152 = { + 0xCAAA, /*start :湿*/ + 0xCAAA, /*end :湿, len=1*/ + &Cinfo[ 260 ], + &Prop153 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop151 = { + 0xC9E8, /*start :设*/ + 0xC9E8, /*end :设, len=1*/ + &Cinfo[ 259 ], + &Prop152 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop150 = { + 0xC9D9, /*start :少*/ + 0xC9D9, /*end :少, len=1*/ + &Cinfo[ 258 ], + &Prop151 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop149 = { + 0xC9CF, /*start :上*/ + 0xC9CF, /*end :上, len=1*/ + &Cinfo[ 257 ], + &Prop150 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop148 = { + 0xC9CC, /*start :商*/ + 0xC9CC, /*end :商, len=1*/ + &Cinfo[ 256 ], + &Prop149 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop147 = { + 0xC8ED, /*start :软*/ + 0xC8ED, /*end :软, len=1*/ + &Cinfo[ 255 ], + &Prop148 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop146 = { + 0xC8EB, /*start :入*/ + 0xC8EB, /*end :入, len=1*/ + &Cinfo[ 254 ], + &Prop147 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop145 = { + 0xC8CF, /*start :认*/ + 0xC8CF, /*end :认, len=1*/ + &Cinfo[ 253 ], + &Prop146 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop144 = { + 0xC8B7, /*start :确*/ + 0xC8B7, /*end :确, len=1*/ + &Cinfo[ 252 ], + &Prop145 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop143 = { + 0xC8AB, /*start :全*/ + 0xC8AB, /*end :全, len=1*/ + &Cinfo[ 251 ], + &Prop144 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop142 = { + 0xC8A1, /*start :取*/ + 0xC8A1, /*end :取, len=1*/ + &Cinfo[ 250 ], + &Prop143 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop141 = { + 0xC7FD, /*start :驱*/ + 0xC7FD, /*end :驱, len=1*/ + &Cinfo[ 249 ], + &Prop142 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop140 = { + 0xC7F8, /*start :区*/ + 0xC7F8, /*end :区, len=1*/ + &Cinfo[ 248 ], + &Prop141 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop139 = { + 0xC7D0, /*start :切*/ + 0xC7D0, /*end :切, len=1*/ + &Cinfo[ 247 ], + &Prop140 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop138 = { + 0xC7B0, /*start :前*/ + 0xC7B0, /*end :前, len=1*/ + &Cinfo[ 246 ], + &Prop139 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop137 = { + 0xC6F7, /*start :器*/ + 0xC6F8, /*end :气, len=2*/ + &Cinfo[ 244 ], + &Prop138 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop136 = { + 0xC6F4, /*start :启*/ + 0xC6F4, /*end :启, len=1*/ + &Cinfo[ 243 ], + &Prop137 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop135 = { + 0xC6BD, /*start :平*/ + 0xC6BD, /*end :平, len=1*/ + &Cinfo[ 242 ], + &Prop136 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop134 = { + 0xC6B5, /*start :频*/ + 0xC6B5, /*end :频, len=1*/ + &Cinfo[ 241 ], + &Prop135 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop133 = { + 0xC6AB, /*start :偏*/ + 0xC6AB, /*end :偏, len=1*/ + &Cinfo[ 240 ], + &Prop134 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop132 = { + 0xC5E4, /*start :配*/ + 0xC5E4, /*end :配, len=1*/ + &Cinfo[ 239 ], + &Prop133 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop131 = { + 0xC4E2, /*start :拟*/ + 0xC4E2, /*end :拟, len=1*/ + &Cinfo[ 238 ], + &Prop132 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop130 = { + 0xC4DC, /*start :能*/ + 0xC4DC, /*end :能, len=1*/ + &Cinfo[ 237 ], + &Prop131 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop129 = { + 0xC4DA, /*start :内*/ + 0xC4DA, /*end :内, len=1*/ + &Cinfo[ 236 ], + &Prop130 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop128 = { + 0xC4A6, /*start :摩*/ + 0xC4A6, /*end :摩, len=1*/ + &Cinfo[ 235 ], + &Prop129 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop127 = { + 0xC4A3, /*start :模*/ + 0xC4A4, /*end :膜, len=2*/ + &Cinfo[ 233 ], + &Prop128 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop126 = { + 0xC3FB, /*start :名*/ + 0xC3FB, /*end :名, len=1*/ + &Cinfo[ 232 ], + &Prop127 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop125 = { + 0xC3E6, /*start :面*/ + 0xC3E6, /*end :面, len=1*/ + &Cinfo[ 231 ], + &Prop126 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop124 = { + 0xC3C5, /*start :门*/ + 0xC3C5, /*end :门, len=1*/ + &Cinfo[ 230 ], + &Prop125 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop123 = { + 0xC2FA, /*start :满*/ + 0xC2FA, /*end :满, len=1*/ + &Cinfo[ 229 ], + &Prop124 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop122 = { + 0xC2CA, /*start :率*/ + 0xC2CA, /*end :率, len=1*/ + &Cinfo[ 228 ], + &Prop123 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop121 = { + 0xC2BC, /*start :录*/ + 0xC2BC, /*end :录, len=1*/ + &Cinfo[ 227 ], + &Prop122 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop120 = { + 0xC2B7, /*start :路*/ + 0xC2B7, /*end :路, len=1*/ + &Cinfo[ 226 ], + &Prop121 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop119 = { + 0xC1F7, /*start :流*/ + 0xC1F7, /*end :流, len=1*/ + &Cinfo[ 225 ], + &Prop120 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop118 = { + 0xC1E3, /*start :零*/ + 0xC1E3, /*end :零, len=1*/ + &Cinfo[ 224 ], + &Prop119 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop117 = { + 0xC1D0, /*start :列*/ + 0xC1D0, /*end :列, len=1*/ + &Cinfo[ 223 ], + &Prop118 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop116 = { + 0xC1BF, /*start :量*/ + 0xC1BF, /*end :量, len=1*/ + &Cinfo[ 222 ], + &Prop117 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop115 = { + 0xC1A6, /*start :力*/ + 0xC1A6, /*end :力, len=1*/ + &Cinfo[ 221 ], + &Prop116 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop114 = { + 0xC0FD, /*start :例*/ + 0xC0FD, /*end :例, len=1*/ + &Cinfo[ 220 ], + &Prop115 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop113 = { + 0xC0EB, /*start :离*/ + 0xC0EB, /*end :离, len=1*/ + &Cinfo[ 219 ], + &Prop114 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop112 = { + 0xC0E0, /*start :类*/ + 0xC0E0, /*end :类, len=1*/ + &Cinfo[ 218 ], + &Prop113 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop111 = { + 0xC0DB, /*start :累*/ + 0xC0DB, /*end :累, len=1*/ + &Cinfo[ 217 ], + &Prop112 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop110 = { + 0xC0B6, /*start :蓝*/ + 0xC0B6, /*end :蓝, len=1*/ + &Cinfo[ 216 ], + &Prop111 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop109 = { + 0xBFE9, /*start :块*/ + 0xBFE9, /*end :块, len=1*/ + &Cinfo[ 215 ], + &Prop110 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop108 = { + 0xBFE7, /*start :跨*/ + 0xBFE7, /*end :跨, len=1*/ + &Cinfo[ 214 ], + &Prop109 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop107 = { + 0xBFD8, /*start :控*/ + 0xBFD8, /*end :控, len=1*/ + &Cinfo[ 213 ], + &Prop108 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop106 = { + 0xBFD5, /*start :空*/ + 0xBFD5, /*end :空, len=1*/ + &Cinfo[ 212 ], + &Prop107 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop105 = { + 0xBFC9, /*start :可*/ + 0xBFC9, /*end :可, len=1*/ + &Cinfo[ 211 ], + &Prop106 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop104 = { + 0xBFAA, /*start :开*/ + 0xBFAA, /*end :开, len=1*/ + &Cinfo[ 210 ], + &Prop105 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop103 = { + 0xBEDD, /*start :据*/ + 0xBEDE, /*end :巨, len=2*/ + &Cinfo[ 208 ], + &Prop104 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop102 = { + 0xBEB3, /*start :境*/ + 0xBEB3, /*end :境, len=1*/ + &Cinfo[ 207 ], + &Prop103 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop101 = { + 0xBEAF, /*start :警*/ + 0xBEAF, /*end :警, len=1*/ + &Cinfo[ 206 ], + &Prop102 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop100 = { + 0xBEA1, /*start :尽*/ + 0xBEA1, /*end :尽, len=1*/ + &Cinfo[ 205 ], + &Prop101 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop99 = { + 0xBDF8, /*start :进*/ + 0xBDF8, /*end :进, len=1*/ + &Cinfo[ 204 ], + &Prop100 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop98 = { + 0xBDC7, /*start :角*/ + 0xBDC7, /*end :角, len=1*/ + &Cinfo[ 203 ], + &Prop99 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop97 = { + 0xBDAD, /*start :江*/ + 0xBDAD, /*end :江, len=1*/ + &Cinfo[ 202 ], + &Prop98 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop96 = { + 0xBCFE, /*start :件*/ + 0xBCFE, /*end :件, len=1*/ + &Cinfo[ 201 ], + &Prop97 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop95 = { + 0xBCF5, /*start :减*/ + 0xBCF5, /*end :减, len=1*/ + &Cinfo[ 200 ], + &Prop96 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop94 = { + 0xBCE4, /*start :间*/ + 0xBCE4, /*end :间, len=1*/ + &Cinfo[ 199 ], + &Prop95 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop93 = { + 0xBCD3, /*start :加*/ + 0xBCD3, /*end :加, len=1*/ + &Cinfo[ 198 ], + &Prop94 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop92 = { + 0xBCC6, /*start :计*/ + 0xBCC7, /*end :记, len=2*/ + &Cinfo[ 196 ], + &Prop93 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop91 = { + 0xBCBC, /*start :技*/ + 0xBCBC, /*end :技, len=1*/ + &Cinfo[ 195 ], + &Prop92 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop90 = { + 0xBCAD, /*start :辑*/ + 0xBCAD, /*end :辑, len=1*/ + &Cinfo[ 194 ], + &Prop91 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop89 = { + 0xBBFD, /*start :积*/ + 0xBBFD, /*end :积, len=1*/ + &Cinfo[ 193 ], + &Prop90 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop88 = { + 0xBBF9, /*start :基*/ + 0xBBFA, /*end :机, len=2*/ + &Cinfo[ 191 ], + &Prop89 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop87 = { + 0xBBD8, /*start :回*/ + 0xBBD8, /*end :回, len=1*/ + &Cinfo[ 190 ], + &Prop88 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop86 = { + 0xBBD6, /*start :恢*/ + 0xBBD6, /*end :恢, len=1*/ + &Cinfo[ 189 ], + &Prop87 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop85 = { + 0xBBC9, /*start :簧*/ + 0xBBC9, /*end :簧, len=1*/ + &Cinfo[ 188 ], + &Prop86 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop84 = { + 0xBBBB, /*start :换*/ + 0xBBBB, /*end :换, len=1*/ + &Cinfo[ 187 ], + &Prop85 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop83 = { + 0xBBB6, /*start :欢*/ + 0xBBB7, /*end :环, len=2*/ + &Cinfo[ 185 ], + &Prop84 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop82 = { + 0xBBA4, /*start :护*/ + 0xBBA4, /*end :护, len=1*/ + &Cinfo[ 184 ], + &Prop83 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop81 = { + 0xBAE3, /*start :恒*/ + 0xBAE3, /*end :恒, len=1*/ + &Cinfo[ 183 ], + &Prop82 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop80 = { + 0xBACD, /*start :和*/ + 0xBACD, /*end :和, len=1*/ + &Cinfo[ 182 ], + &Prop81 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop79 = { + 0xBAC4, /*start :耗*/ + 0xBAC5, /*end :号, len=2*/ + &Cinfo[ 180 ], + &Prop80 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop78 = { + 0xB9FD, /*start :过*/ + 0xB9FD, /*end :过, len=1*/ + &Cinfo[ 179 ], + &Prop79 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop77 = { + 0xB9D8, /*start :关*/ + 0xB9D8, /*end :关, len=1*/ + &Cinfo[ 178 ], + &Prop78 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop76 = { + 0xB9CC, /*start :固*/ + 0xB9CC, /*end :固, len=1*/ + &Cinfo[ 177 ], + &Prop77 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop75 = { + 0xB9CA, /*start :故*/ + 0xB9CA, /*end :故, len=1*/ + &Cinfo[ 176 ], + &Prop76 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop74 = { + 0xB9B9, /*start :构*/ + 0xB9B9, /*end :构, len=1*/ + &Cinfo[ 175 ], + &Prop75 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop73 = { + 0xB9AB, /*start :公*/ + 0xB9AB, /*end :公, len=1*/ + &Cinfo[ 174 ], + &Prop74 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop72 = { + 0xB9A6, /*start :功*/ + 0xB9A6, /*end :功, len=1*/ + &Cinfo[ 173 ], + &Prop73 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop71 = { + 0xB9A4, /*start :工*/ + 0xB9A4, /*end :工, len=1*/ + &Cinfo[ 172 ], + &Prop72 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop70 = { + 0xB8FC, /*start :更*/ + 0xB8FC, /*end :更, len=1*/ + &Cinfo[ 171 ], + &Prop71 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop69 = { + 0xB8F6, /*start :个*/ + 0xB8F6, /*end :个, len=1*/ + &Cinfo[ 170 ], + &Prop70 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop68 = { + 0xB8EE, /*start :割*/ + 0xB8EE, /*end :割, len=1*/ + &Cinfo[ 169 ], + &Prop69 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop67 = { + 0xB8DF, /*start :高*/ + 0xB8DF, /*end :高, len=1*/ + &Cinfo[ 168 ], + &Prop68 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop66 = { + 0xB8D7, /*start :缸*/ + 0xB8D7, /*end :缸, len=1*/ + &Cinfo[ 167 ], + &Prop67 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop65 = { + 0xB8D0, /*start :感*/ + 0xB8D0, /*end :感, len=1*/ + &Cinfo[ 166 ], + &Prop66 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop64 = { + 0xB8B4, /*start :复*/ + 0xB8B4, /*end :复, len=1*/ + &Cinfo[ 165 ], + &Prop65 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop63 = { + 0xB7FE, /*start :服*/ + 0xB7FE, /*end :服, len=1*/ + &Cinfo[ 164 ], + &Prop64 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop62 = { + 0xB7D6, /*start :分*/ + 0xB7D6, /*end :分, len=1*/ + &Cinfo[ 163 ], + &Prop63 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop61 = { + 0xB7C7, /*start :非*/ + 0xB7C7, /*end :非, len=1*/ + &Cinfo[ 162 ], + &Prop62 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop60 = { + 0xB7C5, /*start :放*/ + 0xB7C5, /*end :放, len=1*/ + &Cinfo[ 161 ], + &Prop61 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop59 = { + 0xB7BD, /*start :方*/ + 0xB7BD, /*end :方, len=1*/ + &Cinfo[ 160 ], + &Prop60 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop58 = { + 0xB7B4, /*start :反*/ + 0xB7B6, /*end :范, len=3*/ + &Cinfo[ 157 ], + &Prop59 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop57 = { + 0xB7A7, /*start :阀*/ + 0xB7A8, /*end :法, len=2*/ + &Cinfo[ 155 ], + &Prop58 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop56 = { + 0xB6CF, /*start :断*/ + 0xB6CF, /*end :断, len=1*/ + &Cinfo[ 154 ], + &Prop57 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop55 = { + 0xB6CC, /*start :短*/ + 0xB6CC, /*end :短, len=1*/ + &Cinfo[ 153 ], + &Prop56 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop54 = { + 0xB6C8, /*start :度*/ + 0xB6C8, /*end :度, len=1*/ + &Cinfo[ 152 ], + &Prop55 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop53 = { + 0xB6AF, /*start :动*/ + 0xB6AF, /*end :动, len=1*/ + &Cinfo[ 151 ], + &Prop54 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop52 = { + 0xB6A8, /*start :定*/ + 0xB6A8, /*end :定, len=1*/ + &Cinfo[ 150 ], + &Prop53 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop51 = { + 0xB5E7, /*start :电*/ + 0xB5E7, /*end :电, len=1*/ + &Cinfo[ 149 ], + &Prop52 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop50 = { + 0xB5E3, /*start :点*/ + 0xB5E3, /*end :点, len=1*/ + &Cinfo[ 148 ], + &Prop51 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop49 = { + 0xB5D8, /*start :地*/ + 0xB5D8, /*end :地, len=1*/ + &Cinfo[ 147 ], + &Prop50 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop48 = { + 0xB5CD, /*start :低*/ + 0xB5CD, /*end :低, len=1*/ + &Cinfo[ 146 ], + &Prop49 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop47 = { + 0xB5C4, /*start :的*/ + 0xB5C4, /*end :的, len=1*/ + &Cinfo[ 145 ], + &Prop48 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop46 = { + 0xB5B1, /*start :当*/ + 0xB5B1, /*end :当, len=1*/ + &Cinfo[ 144 ], + &Prop47 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop45 = { + 0xB5AF, /*start :弹*/ + 0xB5AF, /*end :弹, len=1*/ + &Cinfo[ 143 ], + &Prop46 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop44 = { + 0xB5A5, /*start :单*/ + 0xB5A5, /*end :单, len=1*/ + &Cinfo[ 142 ], + &Prop45 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop43 = { + 0xB4FD, /*start :待*/ + 0xB4FD, /*end :待, len=1*/ + &Cinfo[ 141 ], + &Prop44 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop42 = { + 0xB4F8, /*start :带*/ + 0xB4F8, /*end :带, len=1*/ + &Cinfo[ 140 ], + &Prop43 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop41 = { + 0xB4F3, /*start :大*/ + 0xB4F3, /*end :大, len=1*/ + &Cinfo[ 139 ], + &Prop42 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop40 = { + 0xB4E6, /*start :存*/ + 0xB4E6, /*end :存, len=1*/ + &Cinfo[ 138 ], + &Prop41 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop39 = { + 0xB4CE, /*start :次*/ + 0xB4CE, /*end :次, len=1*/ + &Cinfo[ 137 ], + &Prop40 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop38 = { + 0xB4C5, /*start :磁*/ + 0xB4C5, /*end :磁, len=1*/ + &Cinfo[ 136 ], + &Prop39 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop37 = { + 0xB4AB, /*start :传*/ + 0xB4AB, /*end :传, len=1*/ + &Cinfo[ 135 ], + &Prop38 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop36 = { + 0xB4A2, /*start :储*/ + 0xB4A2, /*end :储, len=1*/ + &Cinfo[ 134 ], + &Prop37 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop35 = { + 0xB3F6, /*start :出*/ + 0xB3F6, /*end :出, len=1*/ + &Cinfo[ 133 ], + &Prop36 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop34 = { + 0xB3CC, /*start :程*/ + 0xB3CC, /*end :程, len=1*/ + &Cinfo[ 132 ], + &Prop35 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop33 = { + 0xB3C9, /*start :成*/ + 0xB3C9, /*end :成, len=1*/ + &Cinfo[ 131 ], + &Prop34 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop32 = { + 0xB3C6, /*start :称*/ + 0xB3C6, /*end :称, len=1*/ + &Cinfo[ 130 ], + &Prop33 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop31 = { + 0xB3A7, /*start :厂*/ + 0xB3A7, /*end :厂, len=1*/ + &Cinfo[ 129 ], + &Prop32 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop30 = { + 0xB3A3, /*start :常*/ + 0xB3A4, /*end :长, len=2*/ + &Cinfo[ 127 ], + &Prop31 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop29 = { + 0xB2EE, /*start :差*/ + 0xB2EE, /*end :差, len=1*/ + &Cinfo[ 126 ], + &Prop30 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop28 = { + 0xB2E2, /*start :测*/ + 0xB2E2, /*end :测, len=1*/ + &Cinfo[ 125 ], + &Prop29 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop27 = { + 0xB2D9, /*start :操*/ + 0xB2D9, /*end :操, len=1*/ + &Cinfo[ 124 ], + &Prop28 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop26 = { + 0xB2CE, /*start :参*/ + 0xB2CE, /*end :参, len=1*/ + &Cinfo[ 123 ], + &Prop27 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop25 = { + 0xB2C1, /*start :擦*/ + 0xB2C1, /*end :擦, len=1*/ + &Cinfo[ 122 ], + &Prop26 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop24 = { + 0xB2BB, /*start :不*/ + 0xB2BB, /*end :不, len=1*/ + &Cinfo[ 121 ], + &Prop25 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop23 = { + 0xB1ED, /*start :表*/ + 0xB1ED, /*end :表, len=1*/ + &Cinfo[ 120 ], + &Prop24 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop22 = { + 0xB1E4, /*start :变*/ + 0xB1E4, /*end :变, len=1*/ + &Cinfo[ 119 ], + &Prop23 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop21 = { + 0xB1E0, /*start :编*/ + 0xB1E0, /*end :编, len=1*/ + &Cinfo[ 118 ], + &Prop22 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop20 = { + 0xB1D5, /*start :闭*/ + 0xB1D5, /*end :闭, len=1*/ + &Cinfo[ 117 ], + &Prop21 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop19 = { + 0xB1C8, /*start :比*/ + 0xB1C8, /*end :比, len=1*/ + &Cinfo[ 116 ], + &Prop20 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop18 = { + 0xB1BE, /*start :本*/ + 0xB1BE, /*end :本, len=1*/ + &Cinfo[ 115 ], + &Prop19 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop17 = { + 0xB1B8, /*start :备*/ + 0xB1B8, /*end :备, len=1*/ + &Cinfo[ 114 ], + &Prop18 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop16 = { + 0xB1A8, /*start :报*/ + 0xB1A8, /*end :报, len=1*/ + &Cinfo[ 113 ], + &Prop17 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop15 = { + 0xB1A5, /*start :饱*/ + 0xB1A5, /*end :饱, len=1*/ + &Cinfo[ 112 ], + &Prop16 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop14 = { + 0xB1A3, /*start :保*/ + 0xB1A3, /*end :保, len=1*/ + &Cinfo[ 111 ], + &Prop15 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop13 = { + 0xB1A1, /*start :薄*/ + 0xB1A1, /*end :薄, len=1*/ + &Cinfo[ 110 ], + &Prop14 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop12 = { + 0xB0E6, /*start :版*/ + 0xB0E6, /*end :版, len=1*/ + &Cinfo[ 109 ], + &Prop13 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop11 = { + 0xB0B4, /*start :按*/ + 0xB0B4, /*end :按, len=1*/ + &Cinfo[ 108 ], + &Prop12 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop10 = { + 0xB0B2, /*start :安*/ + 0xB0B2, /*end :安, len=1*/ + &Cinfo[ 107 ], + &Prop11 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop9 = { + 0xA848, /*start :℉*/ + 0xA848, /*end :℉, len=1*/ + &Cinfo[ 106 ], + &Prop10 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop8 = { + 0xA1FA, /*start :→*/ + 0xA1FD, /*end :↓, len=4*/ + &Cinfo[ 102 ], + &Prop9 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop7 = { + 0xA1F0, /*start :○*/ + 0xA1F0, /*end :○, len=1*/ + &Cinfo[ 101 ], + &Prop8 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop6 = { + 0xA1E6, /*start :℃*/ + 0xA1E6, /*end :℃, len=1*/ + &Cinfo[ 100 ], + &Prop7 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop5 = { + 0xA1E3, /*start :°*/ + 0xA1E3, /*end :°, len=1*/ + &Cinfo[ 99 ], + &Prop6 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop4 = { + 0xA1CC, /*start :√*/ + 0xA1CC, /*end :√, len=1*/ + &Cinfo[ 98 ], + &Prop5 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = { + 0xA1C1, /*start :×*/ + 0xA1C1, /*end :×, len=1*/ + &Cinfo[ 97 ], + &Prop4 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = { + 0xA1AB, /*start :~*/ + 0xA1AB, /*end :~, len=1*/ + &Cinfo[ 96 ], + &Prop3 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { + 0x0020, /*start : */ + 0x007F, /*end :, len=96*/ + &Cinfo[ 0 ], + &Prop2 +}; + + +GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16x16 = { + GUI_FONTTYPE_PROP_SJIS, + 16, /* height of font */ + 16, /* space of font y */ + 1, + 1, + &Prop1 +}; + diff --git a/User/system/lib/lcd/font/HZ18x18.c b/User/system/lib/lcd/font/HZ18x18.c new file mode 100644 index 0000000..a7e0b6c --- /dev/null +++ b/User/system/lib/lcd/font/HZ18x18.c @@ -0,0 +1,374 @@ +/* +********************************************************************** +* UcGUI Font +* Chinese GB2312 library +* (c) Copyright 19xx-20xx, company name +* +* +* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967) +* +********************************************************************** +*/ + +#include "GUI.H" + + +/* char: code:0x0031 */ +static GUI_CONST_STORAGE unsigned char ac0031[54] = { + _____XX_,_____X__,________, + _____XX_,___XXXXX,________, + _XXX_XX_,__XX___X,X_______, + __XX____,_XX_____,X_______, + ___X____,XX______,XX______, + XXX_____,X_______,X_______, + XXX_____,_______X,X_______, + ________,______XX,________, + ____XX__,_____XX_,________, + ___XX___,____XX__,________, + __XX____,________,________, + _XX_____,_______X,XX______, + XX______,_X_____X,XX______, + XX______,XX____X_,________, + XX_____X,X_____XX,________, + _XX___XX,___XX_XX,X_______, + __XXXXX_,___XX___,________, + ___XXX__,___XX___,________ +}; + +/* char: code:0x0032 */ +static GUI_CONST_STORAGE unsigned char ac0032[54] = { + ________,____XXX_,________, + ________,___XXXXX,________, + ________,__XX___X,X_______, + ________,_XX_____,XX______, + _______X,XX______,XX______, + _______X,X_______,XX______, + ______XX,______XX,X_______, + ______XX,_XX__XXX,________, + ____X_XX,_XXXXXX_,________, + ___XXXXX,X_XX_X__,________, + __XXX__X,X_XX____,________, + _XXX____,__XX____,________, + XX______,_XX_____,________, + XX______,XXX_____,________, + XX_____X,X_______,________, + _XX___XX,________,________, + __XXXXX_,________,________, + ___XXX__,________,________ +}; + +/* char: code:0x0033 */ +static GUI_CONST_STORAGE unsigned char ac0033[54] = { + ________,___XXXX_,________, + ________,__XXXXXX,X_______, + ________,_XXX__XX,XX______, + ________,_XXX____,XX______, + ________,_XX_____,XX______, + ________,_XX_____,XX______, + ________,_XX_____,XX______, + ________,________,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + _XXXXXXX,XXXX____,________, + ________,________,________ +}; + +/* char: code:0x0034 */ +static GUI_CONST_STORAGE unsigned char ac0034[54] = { + _______X,XXX_____,________, + ______XX,XXXX____,________, + _____XXX,__XXX___,________, + _____XX_,___XX___,________, + ____XXX_,___XX___,________, + ____XXX_,___XX___,________, + ____XXX_,___XX___,________, + ________,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + ___XXXXX,XXXXXXX_,________, + ________,________,________ +}; + +/* char: code:0x0035 */ +static GUI_CONST_STORAGE unsigned char ac0035[54] = { + ________,________,________, + ________,________,________, + _____XXX,XXXXX___,________, + ____XX__,____XX__,________, + ___XX___,____XXX_,________, + __XX____,___XX_XX,________, + __X_____,__XXX__X,________, + __X_____,_XXX___X,________, + __X_____,XXX____X,________, + __X____X,XX_____X,________, + __X___XX,X______X,________, + __X__XXX,_______X,________, + ___XXXX_,______XX,________, + ___XX___,_____XX_,________, + ____XX__,____XX__,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________ +}; + +/* char: code:0x0036 */ +static GUI_CONST_STORAGE unsigned char ac0036[54] = { + ________,XX______,________, + ________,XXX_____,________, + ________,XXXX____,________, + ________,XXXXX___,________, + ____XX__,XX_XXX__,________, + _____XX_,XX_XXX__,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + ________,XXX_____,________, + ________,XXX_____,________, + _______X,XXXX____,________, + _____XXX,XX_XX___,________, + _____XX_,XX__XX__,________, + ____XX__,XX_XXX__,________, + ________,XXXXX___,________, + ________,XXXX____,________, + ________,XXX_____,________, + ________,XX______,________ +}; + +/* char: code:0x0037 */ +static GUI_CONST_STORAGE unsigned char ac0037[54] = { + ________,_______X,________, + ________,______XX,________, + ________,____XXXX,________, + ________,__XXXXXX,________, + ________,_XXXXXXX,________, + _______X,XXXXXXXX,________, + ______XX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,________, + ___XXXXX,XXXXXXXX,________, + ___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,________, + ______XX,XXXXXXXX,________, + _______X,XXXXXXXX,________, + ________,_XXXXXXX,________, + ________,___XXXXX,________, + ________,____XXXX,________, + ________,______XX,________, + ________,_______X,________ +}; + +/* char: code:0x0061 */ +static GUI_CONST_STORAGE unsigned char ac0061[54] = { + ________,________,________, + _______X,XXX_____,________, + ______XX,XXX_____,________, + ______XX,XXXX____,________, + ______XX,_XXX____,________, + _____XXX,__XX____,________, + _____XXX,__XXX___,________, + ____XXX_,__XXX___,________, + ____XXX_,___XXX__,________, + ____XX__,___XXX__,________, + ___XXX__,____XX__,________, + ___XXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXX___,_____XX_,________, + __XXX___,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,______XX,X_______, + ________,________,________ +}; + +/* char: code:0x0066 */ +static GUI_CONST_STORAGE unsigned char ac0066[54] = { + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + ________,________,________ +}; + +/* char: code:0x006D */ +static GUI_CONST_STORAGE unsigned char ac006D[54] = { + ________,________,________, + _XXXX___,______XX,X_______, + _XXXX___,_____XXX,X_______, + _XXXXX__,_____XXX,X_______, + _XX_XX__,____XXXX,X_______, + _XXXXX__,____XX_X,X_______, + _XXXXXX_,____XX_X,X_______, + _XXX_XX_,___XX__X,X_______, + _XXX_XX_,___XX__X,X_______, + _XXX__XX,___XX__X,X_______, + _XXX__XX,__XX___X,X_______, + _XXX__XX,__XX___X,X_______, + _XXX___X,X_XX___X,X_______, + _XXX___X,XXX____X,X_______, + _XXX___X,XXX____X,X_______, + _XXX____,XXX____X,X_______, + _XXX____,XX_____X,X_______, + ________,________,________ +}; + +/* char: code:0x0073 */ +static GUI_CONST_STORAGE unsigned char ac0073[54] = { + ________,________,________, + _____XXX,XXXXX___,________, + ___XXXXX,XXXXXXX_,________, + __XXXX__,___XXXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + ___XXXXX,X_______,________, + ____XXXX,XXXXX___,________, + _______X,XXXXXXX_,________, + ________,___XXXXX,________, + ________,_____XXX,X_______, + ____X___,_____XXX,X_______, + _XXXX___,_____XXX,X_______, + __XXXX__,____XXXX,________, + ___XXXXX,XXXXXXX_,________, + _____XXX,XXXXX___,________, + ________,________,________ +}; + +/* char: code:0x0074 */ +static GUI_CONST_STORAGE unsigned char ac0074[54] = { + ________,________,________, + _XXXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,________,________ +}; + +/* char: code:0x0077 */ +static GUI_CONST_STORAGE unsigned char ac0077[54] = { + ________,________,________, + _XX_____,XX_____X,X_______, + _XX_____,XX_____X,X_______, + _XX____X,XX_____X,X_______, + _XX____X,XXX___XX,X_______, + _XX____X,XXX___XX,________, + __XX___X,_XX___XX,________, + __XX__XX,__X___XX,________, + __XX__XX,__X___XX,________, + __XX__XX,__XX__XX,________, + __XX__XX,__XX_XX_,________, + ___XX_X_,__XX_XX_,________, + ___XXXX_,___X_XX_,________, + ___XXXX_,___X_XX_,________, + ___XXXX_,___XXX__,________, + ___XXX__,___XXX__,________, + ____XX__,___XXX__,________, + ________,________,________ +}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[13] = { + { 18, 18, 3, (unsigned char *)&ac0031 }, /*0: */ + { 18, 18, 3, (unsigned char *)&ac0032 }, /*1: */ + { 18, 18, 3, (unsigned char *)&ac0033 }, /*2: */ + { 16, 16, 3, (unsigned char *)&ac0034 }, /*3: */ + { 16, 16, 3, (unsigned char *)&ac0035 }, /*4: */ + { 14, 14, 3, (unsigned char *)&ac0036 }, /*5: */ + { 16, 16, 3, (unsigned char *)&ac0037 }, /*6: */ + { 17, 17, 3, (unsigned char *)&ac0061 }, /*7: */ + { 17, 17, 3, (unsigned char *)&ac0066 }, /*8: */ + { 17, 17, 3, (unsigned char *)&ac006D }, /*9: */ + { 17, 17, 3, (unsigned char *)&ac0073 }, /*10: */ + { 17, 17, 3, (unsigned char *)&ac0074 }, /*11: */ + { 17, 17, 3, (unsigned char *)&ac0077 }, /*12: */ +}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop6 = { + 0x0077, /*start :*/ + 0x0077, /*end :, len=1*/ + &Cinfo[ 12 ], + (void*)0 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop5 = { + 0x0073, /*start :*/ + 0x0074, /*end :, len=2*/ + &Cinfo[ 10 ], + &Prop6 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop4 = { + 0x006D, /*start :*/ + 0x006D, /*end :, len=1*/ + &Cinfo[ 9 ], + &Prop5 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = { + 0x0066, /*start :*/ + 0x0066, /*end :, len=1*/ + &Cinfo[ 8 ], + &Prop4 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = { + 0x0061, /*start :*/ + 0x0061, /*end :, len=1*/ + &Cinfo[ 7 ], + &Prop3 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { + 0x0031, /*start :*/ + 0x0037, /*end :, len=7*/ + &Cinfo[ 0 ], + &Prop2 +}; + + +GUI_CONST_STORAGE GUI_FONT GUI_FontHZ18x18 = { + GUI_FONTTYPE_PROP_SJIS, + 18, /* height of font */ + 18, /* space of font y */ + 1, + 1, + &Prop1 +}; + diff --git a/User/system/lib/lcd/font/HZ20x20.c b/User/system/lib/lcd/font/HZ20x20.c new file mode 100644 index 0000000..12ed338 --- /dev/null +++ b/User/system/lib/lcd/font/HZ20x20.c @@ -0,0 +1,198 @@ +/* +********************************************************************** +* UcGUI Font +* Chinese GB2312 library +* (c) Copyright 19xx-20xx, company name +* +* +* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967) +* +********************************************************************** +*/ + +#include "GUI.H" + +/* char: code:0x0030 */ +static GUI_CONST_STORAGE unsigned char ac0030[60] = { + ________, ________, ________, + _______X, XXXXX___, ________, + _____XXX, ____XXX_, ________, + ____XX__, ______XX, ________, + ___XX___, _______X, X_______, + __XX__X_, _____X__, XX______, + __X__XXX, ____XXX_, _X______, + _XX___XX, X__XXX__, _XX_____, + _X_____X, XXXXX___, _XX_____, + _X______, XXXX____, __X_____, + _X______, XXXX____, __X_____, + _X_____X, XXXXX___, _XX_____, + _XX___XX, X__XXX__, _XX_____, + __X__XXX, ____XXX_, _X______, + __XX__X_, _____X__, XX______, + ___XX___, _______X, X_______, + ____XX__, ______XX, ________, + _____XXX, X__XXXX_, ________, + _______X, XXXXX___, ________, + ________, ________, ________}; + +/* char: code:0x0031 */ +static GUI_CONST_STORAGE unsigned char ac0031[60] = { + _______X, XXXXX___, ________, + _____XXX, XXXXXXX_, ________, + ___XXX__, ______XX, X_______, + __XXX___, _______X, XX______, + __XX____, ________, XX______, + _XX____X, XXXXX___, _XX_____, + _X_____X, X__XX___, __X_____, + XX____XX, ____XX__, __XX____, + XX______, ____XX__, __XX____, + XX______, ___XX___, __XX____, + XX______, __XX____, __XX____, + XX______, _XX_____, __XX____, + XX______, _XX_____, __XX____, + _X______, ________, _XX_____, + _XX_____, _XX_____, _XX_____, + __XX____, _XX_____, XX______, + __XXX___, _X_____X, X_______, + ___XXX__, ______XX, ________, + _____XXX, XXXXXXX_, ________, + _______X, XXXXX___, ________}; + +/* char: code:0x0032 */ +static GUI_CONST_STORAGE unsigned char ac0032[60] = { + _____XXX, XX______, ________, + ____XXXX, XXX_____, ________, + _____XX_, __XX____, ________, + ______XX, ___XX___, ________, + _X_____X, ____XX__, ________, + XXX____X, X___XX__, ________, + XXXX___X, X____X__, ________, + XX_XXXXX, _____X__, ________, + XX___X__, ____XX__, ________, + XX______, ____XX__, ________, + _XX_____, _____XX_, ________, + __XX____, ______XX, ________, + ___XXX__, XX_____X, X_______, + ____XXXX, XXX_____, XX______, + ________, __XX____, _XX_____, + ________, ___XX___, __XX____, + ________, ____XX__, __XX____, + ________, _____XX_, __XX____, + ________, ______XX, XXX_____, + ________, _______X, XX______}; + +/* char: code:0x0033 */ +static GUI_CONST_STORAGE unsigned char ac0033[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, XX______, + ________, _______X, XXX_____, + ________, ______XX, XX______, + ________, _____XXX, X_______, + __XX____, ____XXXX, ________, + __XXX___, ___XXXX_, ________, + ___XXX__, __XXXX__, ________, + ____XXX_, _XXXX___, ________, + _____XXX, XXXX____, ________, + ______XX, XXX_____, ________, + _______X, XX______, ________, + ________, X_______, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: code:0x0034 */ +static GUI_CONST_STORAGE unsigned char ac0034[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _______X, ________, + ___X____, _X____X_, X_______, + __X_X___, X_X__X__, ________, + ___X____, _X____X_, X_______, + ________, _______X, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: code:0x0035 */ +static GUI_CONST_STORAGE unsigned char ac0035[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___X____, ________, ________, + __X_XX__, _X_____X, ________, + _____X__, X_X___X_, X_______, + __X_XX__, _X_____X, ________, + ___X____, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: code:0x0036 */ +static GUI_CONST_STORAGE unsigned char ac0036[60] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _X______, ________, + ___X____, X_X____X, ________, + __X_X__X, ___X__X_, X_______, + ___X____, X_X____X, ________, + ________, _X______, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[7] = { + {19, 19, 3, (unsigned char *)&ac0030}, /*0: */ + {20, 20, 3, (unsigned char *)&ac0031}, /*1: */ + {20, 20, 3, (unsigned char *)&ac0032}, /*2: */ + {19, 19, 3, (unsigned char *)&ac0033}, /*3: */ + {17, 17, 3, (unsigned char *)&ac0034}, /*4: */ + {17, 17, 3, (unsigned char *)&ac0035}, /*5: */ + {17, 17, 3, (unsigned char *)&ac0036}, /*6: */ +}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { + 0x0030, /*start :*/ + 0x0036, /*end :, len=7*/ + &Cinfo[0], + (void *)0}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontHZ20x20 = { + GUI_FONTTYPE_PROP_SJIS, + 20, /* height of font */ + 20, /* space of font y */ + 1, + 1, + &Prop1}; diff --git a/User/system/lib/lcd/font/HZ24x24.c b/User/system/lib/lcd/font/HZ24x24.c new file mode 100644 index 0000000..34e92e5 --- /dev/null +++ b/User/system/lib/lcd/font/HZ24x24.c @@ -0,0 +1,8317 @@ +/* +********************************************************************** +* UcGUI Font +* Chinese GB2312 library +* (c) Copyright 19xx-20xx, company name +* +* +* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967) +* 字体:宋体,字形:粗体,大小:18,宽:24,高:24,水平偏移:0,垂直偏移:0 +* +********************************************************************** +*/ + +#include "GUI.H" + + +/* char: code:0x0020 */ +static GUI_CONST_STORAGE unsigned char ac0020[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ! code:0x0021 */ +static GUI_CONST_STORAGE unsigned char ac0021[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: " code:0x0022 */ +static GUI_CONST_STORAGE unsigned char ac0022[48] = { + ________,________, + ________,________, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,XXX_____, + ___XXX_X,XX______, + ___XX__X,X_______, + __XX__XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: # code:0x0023 */ +static GUI_CONST_STORAGE unsigned char ac0023[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + ___XX___,_XX_____, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: $ code:0x0024 */ +static GUI_CONST_STORAGE unsigned char ac0024[48] = { + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ____XXXX,XX______, + ___XXXXX,XXX_____, + __XXX_XX,XXX_____, + __XXX_XX,XXX_____, + __XXX_XX,________, + ___XXXXX,________, + ____XXXX,________, + _____XXX,X_______, + ______XX,XX______, + ______XX,XX______, + ______XX,XXX_____, + __XXX_XX,XXX_____, + __XXXXXX,XXX_____, + __XXX_XX,XXX_____, + ___XX_XX,XX______, + ____XXXX,X_______, + ______XX,________, + ______XX,________, + ________,________ +}; + +/* char: % code:0x0025 */ +static GUI_CONST_STORAGE unsigned char ac0025[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX___,XX______, + _XXXX___,XX______, + XX__XX_X,X_______, + XX__XX_X,X_______, + XX__XX_X,X_______, + XX__XXXX,________, + XX__XXXX,________, + _XXXXXX_,________, + _XXXXXXX,XXX_____, + _____XXX,XXX_____, + ____XXXX,__XX____, + ____XXXX,__XX____, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + ___XX_XX,__XX____, + __XX___X,XXX_____, + __XX___X,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: & code:0x0026 */ +static GUI_CONST_STORAGE unsigned char ac0026[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XXXXXX,________, + __XXXXXX,________, + __XXXXXX,________, + __XXXXXX,________, + __XXXXXX,________, + __XXXXX_,________, + ___XXX_X,XXXX____, + __XXXX__,XX______, + _XXXXX__,XX______, + XXX_XXX_,XX______, + XXX_XXX_,XX______, + XXX__XXX,XX______, + XXX__XXX,X_______, + XXX___XX,X__XX___, + _XXX__XX,XX_XX___, + __XXXXX_,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: ' code:0x0027 */ +static GUI_CONST_STORAGE unsigned char ac0027[48] = { + ________,________, + ________,________, + __XXX___,________, + __XXXX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ( code:0x0028 */ +static GUI_CONST_STORAGE unsigned char ac0028[48] = { + ________,________, + ________,________, + ________,__XX____, + ________,_XX_____, + ________,XX______, + _______X,X_______, + _______X,X_______, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ______XX,________, + ______XX,________, + _______X,X_______, + _______X,X_______, + ________,XX______, + ________,_XX_____, + ________,__XX____, + ________,________ +}; + +/* char: ) code:0x0029 */ +static GUI_CONST_STORAGE unsigned char ac0029[48] = { + ________,________, + ________,________, + _XX_____,________, + __XX____,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + _____XX_,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XX_____,________, + ________,________ +}; + +/* char: * code:0x002A */ +static GUI_CONST_STORAGE unsigned char ac002A[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,X_______, + ______XX,________, + _XXX__XX,__XXX___, + _XXXX_XX,XXXXX___, + ____XXXX,XX______, + ____XXXX,XX______, + _XXXXXXX,XXXXX___, + _XXX__XX,__XXX___, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: + code:0x002B */ +static GUI_CONST_STORAGE unsigned char ac002B[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXX___, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: , code:0x002C */ +static GUI_CONST_STORAGE unsigned char ac002C[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,________, + __XXXX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + __XX____,________ +}; + +/* char: - code:0x002D */ +static GUI_CONST_STORAGE unsigned char ac002D[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: . code:0x002E */ +static GUI_CONST_STORAGE unsigned char ac002E[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: / code:0x002F */ +static GUI_CONST_STORAGE unsigned char ac002F[48] = { + ________,________, + ________,________, + ________,__XX____, + ________,_XXX____, + ________,_XX_____, + ________,XXX_____, + ________,XX______, + ________,XX______, + _______X,X_______, + _______X,X_______, + ______XX,________, + ______XX,________, + _____XXX,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + __XXX___,________, + __XX____,________, + _XXX____,________, + _XX_____,________, + ________,________ +}; + +/* char: 0 code:0x0030 */ +static GUI_CONST_STORAGE unsigned char ac0030[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXX_X,XX______, + __XXX___,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ___XXX_X,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: 1 code:0x0031 */ +static GUI_CONST_STORAGE unsigned char ac0031[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + __XXXXXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: 2 code:0x0032 */ +static GUI_CONST_STORAGE unsigned char ac0032[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XX___X,XX______, + _XX_____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + ________,XXX_____, + ________,XX______, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + _____XX_,________, + ____XX__,________, + ___XX___,_XX_____, + __XX____,_XX_____, + _XXX____,_XX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: 3 code:0x0033 */ +static GUI_CONST_STORAGE unsigned char ac0033[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + _XXX__XX,X_______, + _XXX___X,XX______, + _XXX___X,XX______, + _______X,XX______, + _______X,XX______, + ______XX,X_______, + ____XXXX,________, + _______X,XX______, + ________,XX______, + ________,XXX_____, + ________,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: 4 code:0x0034 */ +static GUI_CONST_STORAGE unsigned char ac0034[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,XX______, + _______X,XX______, + ______XX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XX_X,XX______, + ___XX__X,XX______, + ___XX__X,XX______, + __XX___X,XX______, + _XX____X,XX______, + _XXXXXXX,XXXXX___, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _____XXX,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: 5 code:0x0035 */ +static GUI_CONST_STORAGE unsigned char ac0035[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,X_______, + __XXX__X,XX______, + __XX____,XXX_____, + ________,XXX_____, + ________,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XX____X,XX______, + __XX___X,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: 6 code:0x0036 */ +static GUI_CONST_STORAGE unsigned char ac0036[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXX__,XXX_____, + __XXX___,XXX_____, + __XXX___,________, + __XX____,________, + _XXX____,________, + _XXX_XXX,XX______, + _XXXXX__,XXX_____, + _XXXX___,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XX____,_XXX____, + __XXX___,_XX_____, + ___XXX__,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: 7 code:0x0037 */ +static GUI_CONST_STORAGE unsigned char ac0037[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXXX____, + __XXX___,_XXX____, + __XX____,_XX_____, + __XX____,XX______, + ________,XX______, + ________,XX______, + _______X,X_______, + _______X,X_______, + ______XX,________, + ______XX,________, + ______XX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 8 code:0x0038 */ +static GUI_CONST_STORAGE unsigned char ac0038[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XX______, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,_XX_____, + __XXXX__,XXX_____, + ____XXXX,X_______, + ___XX_XX,XX______, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: 9 code:0x0039 */ +static GUI_CONST_STORAGE unsigned char ac0039[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXX___,XX______, + __XXX___,XXX_____, + _XXX____,_XX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,XXXX____, + __XXX__X,XXXX____, + ___XXXXX,_XXX____, + ________,_XXX____, + ________,XXX_____, + ________,XXX_____, + __XXX___,XX______, + __XXX__X,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: : code:0x003A */ +static GUI_CONST_STORAGE unsigned char ac003A[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: ; code:0x003B */ +static GUI_CONST_STORAGE unsigned char ac003B[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + ______XX,________, + _____XX_,________, + _____XX_,________ +}; + +/* char: < code:0x003C */ +static GUI_CONST_STORAGE unsigned char ac003C[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,__XX____, + ________,_XX_____, + ________,XX______, + _______X,X_______, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + ___XX___,________, + ____XX__,________, + _____XX_,________, + ______XX,________, + _______X,X_______, + ________,XX______, + ________,_XX_____, + ________,__XX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: = code:0x003D */ +static GUI_CONST_STORAGE unsigned char ac003D[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: > code:0x003E */ +static GUI_CONST_STORAGE unsigned char ac003E[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + ___XX___,________, + ____XX__,________, + _____XX_,________, + ______XX,________, + _______X,X_______, + ________,XX______, + ________,_XX_____, + ________,__XX____, + ________,_XX_____, + ________,XX______, + _______X,X_______, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: ? code:0x003F */ +static GUI_CONST_STORAGE unsigned char ac003F[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXX__,_XXX____, + __XX____,__XXX___, + __XX____,__XXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + ________,XXXX____, + _______X,XX______, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: @ code:0x0040 */ +static GUI_CONST_STORAGE unsigned char ac0040[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ___XXX__,XXX_____, + __XXX___,_XX_____, + __XXX_XX,XXXX____, + __XX_XXX,XXXX____, + _XXX_XXX,XXXX____, + _XXX_XXX,XXXX____, + _XXXXXXX,X_XX____, + _XXXXXXX,X_XX____, + _XXXXXXX,X_XX____, + _XXXXXXX,X_XX____, + _XXXXXXX,XXX_____, + __XX_XXX,XX______, + __XXX___,__XX____, + __XXX___,_XX_____, + ___XXX__,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: A code:0x0041 */ +static GUI_CONST_STORAGE unsigned char ac0041[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + ____XXXX,________, + ____XXXX,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX__X,X_______, + ___XX__X,XX______, + ___XX___,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XXX____, + XXXXX___,XXXXX___, + ________,________, + ________,________, + ________,________ +}; + +/* char: B code:0x0042 */ +static GUI_CONST_STORAGE unsigned char ac0042[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + __XXX__X,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX__X,XX______, + __XXXXXX,X_______, + __XXX___,XXX_____, + __XXX___,_XX_____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,XXX_____, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: C code:0x0043 */ +static GUI_CONST_STORAGE unsigned char ac0043[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXX__,XXX_____, + __XXX___,_XXX____, + __XXX___,__XX____, + __XX____,__XX____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,__XX____, + __XXX___,__XX____, + __XXX___,_XX_____, + ___XXX__,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: D code:0x0044 */ +static GUI_CONST_STORAGE unsigned char ac0044[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + __XXX__X,XX______, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX__X,XX______, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: E code:0x0045 */ +static GUI_CONST_STORAGE unsigned char ac0045[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXX_____, + _XXX____,XXX_____, + _XXX____,__XX____, + _XXX____,__XX____, + _XXX____,________, + _XXX___X,X_______, + _XXX___X,X_______, + _XXXXXXX,X_______, + _XXX___X,X_______, + _XXX___X,X_______, + _XXX___X,X_______, + _XXX____,________, + _XXX____,__XX____, + _XXX____,__XX____, + _XXX____,_XX_____, + XXXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: F code:0x0046 */ +static GUI_CONST_STORAGE unsigned char ac0046[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXX_____, + _XXX____,XXX_____, + _XXX____,__XX____, + _XXX____,__XX____, + _XXX____,________, + _XXX___X,X_______, + _XXX___X,X_______, + _XXXXXXX,X_______, + _XXX___X,X_______, + _XXX___X,X_______, + _XXX___X,X_______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + XXXXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: G code:0x0047 */ +static GUI_CONST_STORAGE unsigned char ac0047[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXX__,XX______, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XX____,_XX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX__XX,XXXXX___, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ___XXX__,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: H code:0x0048 */ +static GUI_CONST_STORAGE unsigned char ac0048[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX___,XXXXX___, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXXXXX,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + XXXXX___,XXXXX___, + ________,________, + ________,________, + ________,________ +}; + +/* char: I code:0x0049 */ +static GUI_CONST_STORAGE unsigned char ac0049[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: J code:0x004A */ +static GUI_CONST_STORAGE unsigned char ac004A[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXXX____, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + _XXX__XX,X_______, + _XXX_XXX,________, + __XXXXX_,________ +}; + +/* char: K code:0x004B */ +static GUI_CONST_STORAGE unsigned char ac004B[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX_XX,XXX_____, + _XXX___X,XX______, + _XXX__XX,X_______, + _XXX__XX,________, + _XXX_XX_,________, + _XXXXX__,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XXXXXXX,________, + _XXX__XX,________, + _XXX__XX,X_______, + _XXX___X,X_______, + _XXX___X,XX______, + _XXX____,XX______, + _XXX____,XXX_____, + XXXXX__X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: L code:0x004C */ +static GUI_CONST_STORAGE unsigned char ac004C[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXX__,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,__XX____, + _XXX____,__XX____, + _XXX____,_XX_____, + XXXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: M code:0x004D */ +static GUI_CONST_STORAGE unsigned char ac004D[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXX____,XXXX____, + _XXX___X,XXX_____, + _XXX___X,XXX_____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + _XXXX_XX,XXX_____, + _XXXX_XX,XXX_____, + _XXXX_XX,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXX_,XXX_____, + _XX_XXX_,XXX_____, + _XX_XXX_,XXX_____, + _XX_XXX_,XXX_____, + _XX_XX__,XXX_____, + XXXX___X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: N code:0x004E */ +static GUI_CONST_STORAGE unsigned char ac004E[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX__X,XXXXX___, + __XXX___,_XX_____, + __XXXX__,_XX_____, + __XXXX__,_XX_____, + __XXXXX_,_XX_____, + __XXXXX_,_XX_____, + __XX_XXX,_XX_____, + __XX_XXX,_XX_____, + __XX__XX,_XX_____, + __XX__XX,XXX_____, + __XX___X,XXX_____, + __XX___X,XXX_____, + __XX___X,XXX_____, + __XX____,XXX_____, + __XX____,XXX_____, + XXXXXX__,_XX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: O code:0x004F */ +static GUI_CONST_STORAGE unsigned char ac004F[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXX_X,XX______, + __XXX___,XXX_____, + __XXX___,_XX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,_XX_____, + __XXX___,XXX_____, + ___XXX_X,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: P code:0x0050 */ +static GUI_CONST_STORAGE unsigned char ac0050[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,X_______, + _XXX____,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX___X,XXX_____, + _XXXXXXX,X_______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + XXXXXX__,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: Q code:0x0051 */ +static GUI_CONST_STORAGE unsigned char ac0051[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXX_X,XX______, + __XXX___,XXX_____, + __XXX___,_XX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXXXXX,_XXX____, + __XXX_XX,_XX_____, + __XXX_XX,XXX_____, + ___XXX_X,XX______, + ____XXXX,X_______, + _______X,XXXX____, + ________,XXX_____, + ________,________ +}; + +/* char: R code:0x0052 */ +static GUI_CONST_STORAGE unsigned char ac0052[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XX______, + _XXX____,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,XXX_____, + _XXXXXXX,X_______, + _XXX__XX,________, + _XXX__XX,X_______, + _XXX___X,X_______, + _XXX___X,XX______, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,_XXX____, + XXXXX___,_XXXX___, + ________,________, + ________,________, + ________,________ +}; + +/* char: S code:0x0053 */ +static GUI_CONST_STORAGE unsigned char ac0053[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XX_____, + _XXX____,_XX_____, + _XXX____,________, + _XXXX___,________, + __XXXXX_,________, + ___XXXXX,X_______, + _____XXX,XXX_____, + _______X,XXX_____, + ________,XXXX____, + _XX_____,_XXX____, + _XX_____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: T code:0x0054 */ +static GUI_CONST_STORAGE unsigned char ac0054[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + _XX__XXX,__XX____, + XX___XXX,___XX___, + XX___XXX,___XX___, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: U code:0x0055 */ +static GUI_CONST_STORAGE unsigned char ac0055[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX__,XXXX____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + ___XXX__,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: V code:0x0056 */ +static GUI_CONST_STORAGE unsigned char ac0056[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX___,XXXX____, + _XXX____,_XX_____, + __XX____,XX______, + __XX____,XX______, + __XXX___,XX______, + __XXX___,XX______, + ___XX__X,X_______, + ___XX__X,X_______, + ___XXX_X,X_______, + ___XXX_X,X_______, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: W code:0x0057 */ +static GUI_CONST_STORAGE unsigned char ac0057[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXX___, + _XX__XXX,__XX____, + _XX___XX,__XX____, + _XXX__XX,__XX____, + _XXX__XX,__XX____, + __XX_XXX,_XX_____, + __XX_XXX,_XX_____, + __XX_XXX,XXX_____, + __XX_XXX,XXX_____, + __XXXX_X,XXX_____, + __XXXX_X,XX______, + ___XXX_X,XX______, + ___XXX_X,XX______, + ___XX__X,XX______, + ___XX__X,X_______, + ___XX__X,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: X code:0x0058 */ +static GUI_CONST_STORAGE unsigned char ac0058[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX_X,XXXX____, + __XXX___,XX______, + ___XX___,XX______, + ___XXX__,XX______, + ____XX_X,X_______, + ____XXXX,X_______, + _____XXX,________, + _____XX_,________, + _____XXX,________, + _____XXX,________, + ____XXXX,X_______, + ____XX_X,X_______, + ___XX__X,XX______, + ___XX___,XX______, + __XX____,XXX_____, + _XXXX__X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: Y code:0x0059 */ +static GUI_CONST_STORAGE unsigned char ac0059[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX___,XXXXX___, + _XXX____,__XX____, + __XX____,_XX_____, + __XXX___,_XX_____, + ___XX___,XX______, + ___XXX__,XX______, + ___XXXXX,X_______, + ____XXXX,X_______, + ____XXXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: Z code:0x005A */ +static GUI_CONST_STORAGE unsigned char ac005A[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXXX____, + __XXX___,_XX_____, + _XXX____,XXX_____, + _XX_____,XX______, + _______X,XX______, + _______X,X_______, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ___XXX__,________, + ___XX___,__XX____, + __XXX___,__XX____, + __XX____,_XX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: [ code:0x005B */ +static GUI_CONST_STORAGE unsigned char ac005B[48] = { + ________,________, + ________,________, + _____XXX,XXX_____, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XXX,XXX_____, + ________,________ +}; + +/* char: \ code:0x005C */ +static GUI_CONST_STORAGE unsigned char ac005C[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + ___XX___,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + _____XX_,________, + ______XX,________, + ______XX,________, + ______XX,X_______, + _______X,X_______, + _______X,X_______, + ________,XX______, + ________,XX______, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,__XX____ +}; + +/* char: ] code:0x005D */ +static GUI_CONST_STORAGE unsigned char ac005D[48] = { + ________,________, + ________,________, + __XXXXXX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + __XXXXXX,________, + ________,________ +}; + +/* char: ^ code:0x005E */ +static GUI_CONST_STORAGE unsigned char ac005E[48] = { + ________,________, + _____XXX,________, + ____XX_X,X_______, + ___XX___,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: _ code:0x005F */ +static GUI_CONST_STORAGE unsigned char ac005F[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXX___ +}; + +/* char: ` code:0x0060 */ +static GUI_CONST_STORAGE unsigned char ac0060[48] = { + ________,________, + ________,________, + ___XXX__,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: a code:0x0061 */ +static GUI_CONST_STORAGE unsigned char ac0061[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + __XXX___,XXX_____, + __XXX___,XXX_____, + ________,XXX_____, + _____XXX,XXX_____, + __XXXX__,XXX_____, + _XXXX___,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XXXXX___, + __XXXXXX,_XXXX___, + ________,________, + ________,________, + ________,________ +}; + +/* char: b code:0x0062 */ +static GUI_CONST_STORAGE unsigned char ac0062[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + _XXXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX_XX,XX______, + __XXXXX_,XXX_____, + __XXXX__,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XX_____, + __XXXX__,XXX_____, + __XX_XXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: c code:0x0063 */ +static GUI_CONST_STORAGE unsigned char ac0063[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXX__X,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,_XX_____, + __XXX___,_XX_____, + __XXX___,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: d code:0x0064 */ +static GUI_CONST_STORAGE unsigned char ac0064[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,_XX_____, + ______XX,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ___XXXXX,XXX_____, + __XXX__X,XXX_____, + __XXX___,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XX____,XXX_____, + __XXX__X,XXXX____, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: e code:0x0065 */ +static GUI_CONST_STORAGE unsigned char ac0065[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXX__,XXX_____, + ___XX___,_XX_____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + ___XXX__,__XX____, + ___XXX__,_XX_____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: f code:0x0066 */ +static GUI_CONST_STORAGE unsigned char ac0066[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XXX_____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: g code:0x0067 */ +static GUI_CONST_STORAGE unsigned char ac0067[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XXXX____, + ___XXXXX,XXXX____, + __XXX__X,XX______, + __XXX__X,XX______, + __XXX__X,XX______, + ___XXX_X,XX______, + ___XXXXX,X_______, + __XXX___,________, + __XXXXXX,X_______, + __XXX_XX,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XXX_____, + ___XXXXX,X_______ +}; + +/* char: h code:0x0068 */ +static GUI_CONST_STORAGE unsigned char ac0068[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + _XXXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XX______, + __XXXX__,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + _XXXXX_X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: i code:0x0069 */ +static GUI_CONST_STORAGE unsigned char ac0069[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ______XX,________, + __XXXXXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: j code:0x006A */ +static GUI_CONST_STORAGE unsigned char ac006A[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XX______, + ______XX,XX______, + ________,________, + ________,________, + ________,XX______, + ____XXXX,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + __XXX_XX,X_______, + __XXXXXX,________ +}; + +/* char: k code:0x006B */ +static GUI_CONST_STORAGE unsigned char ac006B[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + _XXXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX__X,XXX_____, + __XXX__X,X_______, + __XXX__X,X_______, + __XXX_XX,________, + __XXXXXX,________, + __XXXXXX,________, + __XXX__X,X_______, + __XXX__X,XX______, + __XXX___,XX______, + __XXX___,XXX_____, + _XXXXX_X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: l code:0x006C */ +static GUI_CONST_STORAGE unsigned char ac006C[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + __XXXXXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________ +}; + +/* char: m code:0x006D */ +static GUI_CONST_STORAGE unsigned char ac006D[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,XXXX____, + _XXXXXXX,XXXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + _XXX_XXX,_XXX____, + XXXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________ +}; + +/* char: n code:0x006E */ +static GUI_CONST_STORAGE unsigned char ac006E[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + __XXXX__,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + _XXXXX_X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: o code:0x006F */ +static GUI_CONST_STORAGE unsigned char ac006F[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXX_X,XX______, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: p code:0x0070 */ +static GUI_CONST_STORAGE unsigned char ac0070[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + __XXXX__,XXX_____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,_XXX____, + __XXX___,XXX_____, + __XXXX__,XXX_____, + __XXXXXX,XX______, + __XXX___,________, + __XXX___,________, + _XXXXXX_,________ +}; + +/* char: q code:0x0071 */ +static GUI_CONST_STORAGE unsigned char ac0071[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,_XX_____, + __XXX__X,XXX_____, + __XXX___,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XX____,XXX_____, + __XXX__X,XXX_____, + ___XXXXX,XXX_____, + ________,XXX_____, + ________,XXX_____, + ______XX,XXXX____ +}; + +/* char: r code:0x0072 */ +static GUI_CONST_STORAGE unsigned char ac0072[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXX_X,XXX_____, + ___XXXXX,_XXX____, + ___XXXX_,_XXX____, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + XXXXXXXX,X_______, + ________,________, + ________,________, + ________,________ +}; + +/* char: s code:0x0073 */ +static GUI_CONST_STORAGE unsigned char ac0073[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XXX_____, + __XXXX__,XXX_____, + __XXX___,_XX_____, + __XXX___,_XX_____, + ___XXXX_,________, + ____XXXX,X_______, + ______XX,XXX_____, + __XX____,XXX_____, + __XX____,XXX_____, + __XXX__X,XXX_____, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: t code:0x0074 */ +static GUI_CONST_STORAGE unsigned char ac0074[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,_XX_____, + ____XXX_,_XX_____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: u code:0x0075 */ +static GUI_CONST_STORAGE unsigned char ac0075[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,_XX_____, + _XXXX__X,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXX_X,XXXX____, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: v code:0x0076 */ +static GUI_CONST_STORAGE unsigned char ac0076[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX__,XXXX____, + __XXX___,_XX_____, + ___XX___,XX______, + ___XX___,XX______, + ___XXX__,XX______, + ____XX_X,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + _____XXX,________, + _____XX_,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: w code:0x0077 */ +static GUI_CONST_STORAGE unsigned char ac0077[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXX___, + _XX__XXX,__XX____, + _XXX__XX,__XX____, + __XX_XXX,_XX_____, + __XX_XXX,_XX_____, + __XXXXXX,XXX_____, + __XXXX_X,XX______, + ___XXX_X,XX______, + ___XXX_X,XX______, + ___XXX_X,XX______, + ___XX___,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: x code:0x0078 */ +static GUI_CONST_STORAGE unsigned char ac0078[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXXX____, + ___XXX__,XX______, + ____XX__,XX______, + ____XXXX,X_______, + _____XXX,________, + _____XXX,________, + _____XXX,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XXX_____, + _XXXXX_X,XXXX____, + ________,________, + ________,________, + ________,________ +}; + +/* char: y code:0x0079 */ +static GUI_CONST_STORAGE unsigned char ac0079[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX_X,XXXX____, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + ____XX_X,X_______, + ____XX_X,X_______, + ____XXXX,X_______, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XX_,________, + _____XX_,________, + __XX_XX_,________, + __XXXX__,________ +}; + +/* char: z code:0x007A */ +static GUI_CONST_STORAGE unsigned char ac007A[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XX___X,XX______, + __XX__XX,X_______, + __XX__XX,________, + _____XXX,________, + _____XX_,________, + ____XXX_,________, + ___XXX__,_XX_____, + ___XX___,_XX_____, + __XXX___,XXX_____, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________ +}; + +/* char: { code:0x007B */ +static GUI_CONST_STORAGE unsigned char ac007B[48] = { + ________,________, + ________,________, + ________,XXX_____, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ______XX,________, + _____XX_,________, + ______XX,________, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,XXX_____, + ________,________ +}; + +/* char: | code:0x007C */ +static GUI_CONST_STORAGE unsigned char ac007C[48] = { + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________ +}; + +/* char: } code:0x007D */ +static GUI_CONST_STORAGE unsigned char ac007D[48] = { + ________,________, + ________,________, + __XXX___,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + ______XX,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + __XXX___,________, + ________,________ +}; + +/* char: ~ code:0x007E */ +static GUI_CONST_STORAGE unsigned char ac007E[48] = { + ________,________, + __XXXX__,________, + _XX__XX_,__XX____, + _XX___XX,X_XX____, + _______X,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char:  code:0x007F */ +static GUI_CONST_STORAGE unsigned char ac007F[48] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________ +}; + +/* char: 。 code:0xA1A3 */ +static GUI_CONST_STORAGE unsigned char acA1A3[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXXX,________,________, + ___XX__X,X_______,________, + ___XX__X,X_______,________, + ___XX__X,X_______,________, + ____XXXX,________,________, + ________,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: ° code:0xA1E3 */ +static GUI_CONST_STORAGE unsigned char acA1E3[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,________,________, + ____XX_X,X_______,________, + ___XX___,XX______,________, + ___XX___,XX______,________, + ___XX__X,X_______,________, + ____XXXX,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: ℃ code:0xA1E6 */ +static GUI_CONST_STORAGE unsigned char acA1E6[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ____XXX_,________,________, + ___XX_XX,___XXXXX,XX______, + ___XX_XX,__XXX___,_XXXXX__, + ___XX_XX,_XXX____,___XXX__, + ____XXX_,XXX_____,___XXX__, + ________,XX______,____XX__, + _______X,XX______,____XX__, + _______X,XX______,________, + _______X,XX______,________, + _______X,XX______,________, + _______X,XX______,________, + _______X,XX______,________, + ________,XX______,________, + ________,XXX_____,________, + ________,XXX_____,___XX___, + ________,_XXX____,__XX____, + ________,__XXXX__,XXX_____, + ________,____XXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: , code:0xA3AC */ +static GUI_CONST_STORAGE unsigned char acA3AC[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXX_,________,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ____XXX_,________,________, + ____XX__,________,________, + ____XX__,________,________, + ___XX___,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: ℉ code:0xA848 */ +static GUI_CONST_STORAGE unsigned char acA848[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ___XXXXX,XXXXXXXX,XXXXX___, + __XX_XXX,__XX____,__XXX___, + __XX__XX,__XX____,___XX___, + __XX_XX_,__XX____,________, + ___XXX__,__XX____,________, + ________,__XX____,XX______, + ________,__XX____,XX______, + ________,__XXXXXX,XX______, + ________,__XX___X,XX______, + ________,__XX____,XX______, + ________,__XX____,________, + ________,__XX____,________, + ________,__XX____,________, + ________,__XX____,________, + ________,__XX____,________, + ________,__XX____,________, + ________,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: 败 code:0xB0DC */ +static GUI_CONST_STORAGE unsigned char acB0DC[72] = { + ________,________,________, + ________,______XX,________, + ________,______XX,X_______, + __XXXXXX,XXXX__XX,________, + __XXX___,_XX__XXX,________, + __XXX___,_XX__XX_,________, + __XXX_XX,_XX__XXX,XXXXXXX_, + __XXX_XX,_XX__XX_,__XXX___, + __XXX_XX,_XX_XXX_,__XXX___, + __XXX_XX,_XX_XXX_,__XX____, + __XXX_XX,_XXXX_XX,__XX____, + __XXX_XX,_XXX__XX,__XX____, + __XXX_XX,_XX___XX,_XXX____, + __XXXXXX,_XX___XX,_XX_____, + __XXXXX_,_XX____X,XXX_____, + __XXXXXX,XXX____X,XXX_____, + __XX_XX_,XX______,XX______, + ____XXX_,_XX____X,XXX_____, + ____XX__,_XXX__XX,XXX_____, + ___XX___,__XX_XXX,__XXX___, + __XX____,____XX__,__XXXX__, + _XX_____,__XXX___,___XXXXX, + ________,_XX_____,________, + ________,________,________, +}; + +/* char: 版 code:0xB0E6 */ +static GUI_CONST_STORAGE unsigned char acB0E6[72] = { + ________,________,________, + ______XX,________,________, + ______XX,X_______,___XXX__, + ___XX_XX,X______X,XXXXXX__, + ___XX_XX,X__XXXXX,________, + ___XX_XX,X__XX___,________, + ___XX_XX,X__XX___,________, + ___XX_XX,X__XX___,________, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XX___,___XXXX_,___XXX__, + ___XX___,___XX_XX,___XX___, + ___XX___,___XX_XX,___XX___, + ___XXXXX,XX_XX_XX,__XXX___, + ___XX__X,XX_XX_XX,__XX____, + ___XX__X,XX_XX__X,X_XX____, + ___XX__X,XX_XX__X,XXX_____, + ___XX__X,XX_XX___,XXX_____, + __XXX__X,XXXX____,XXX_____, + __XX___X,XXXX___X,XXXX____, + __XX___X,XXXX__XX,__XXX___, + __XX___X,XXX__XX_,___XXXX_, + _XX_____,_XXXXX__,____XXX_, + _XX_____,XXXX____,________, + ________,________,________, +}; + +/* char: 包 code:0xB0FC */ +static GUI_CONST_STORAGE unsigned char acB0FC[72] = { + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,X_______,________, + ______XX,XXXXXXXX,XXXXX___, + _____XXX,________,__XX____, + _____XX_,________,__XX____, + ____XX__,________,__XX____, + ___XXXXX,XXXXXXXX,__XX____, + ___XXXXX,_____XX_,__XX____, + __XX__XX,_____XX_,__XX____, + _XX___XX,_____XX_,__XX____, + ______XX,_____XX_,__XX____, + ______XX,XXXXXXX_,__XX____, + ______XX,_____XX_,__XX____, + ______XX,______XX,XXXX____, + ______XX,________,XXX__XX_, + ______XX,________,_____XX_, + ______XX,________,_____XX_, + ______XX,________,_____XX_, + ______XX,XXX_____,_XXXXXX_, + ________,XXXXXXXX,XXXXX___, + ________,________,________, +}; + +/* char: 保 code:0xB1A3 */ +static GUI_CONST_STORAGE unsigned char acB1A3[72] = { + ________,________,________, + _______X,X_______,________, + ______XX,X_______,________, + ______XX,__XXXXXX,XXXXXX__, + ______XX,__XX____,___XX___, + _____XXX,__XX____,___XX___, + _____XX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XXXXXX,XXXXX___, + ___XXXX_,__XX__XX,___XX___, + ___XXXX_,______XX,________, + __XX_XX_,______XX,_____XX_, + _XX__XXX,XXXXXXXX,XXXXXXXX, + _____XX_,_____XXX,XX______, + _____XX_,____XXXX,XX______, + _____XX_,____XXXX,_XX_____, + _____XX_,___XXXXX,__XX____, + _____XX_,___XX_XX,__XX____, + _____XX_,__XX__XX,___XX___, + _____XX_,_XX___XX,____XXX_, + _____XX_,XX____XX,X___XXX_, + _____XXX,X_____XX,X_______, + _____XX_,______XX,________, + ________,________,________, +}; + +/* char: 备 code:0xB1B8 */ +static GUI_CONST_STORAGE unsigned char acB1B8[72] = { + ________,________,________, + ________,_XX_____,________, + ________,XXX_____,________, + ________,XXXXXXXX,XXX_____, + _______X,XX______,XX______, + _______X,XXX____X,XX______, + ______XX,_XX___XX,X_______, + _____XXX,__XX_XXX,________, + ____XXX_,__XXXXX_,________, + ___XX___,___XXX__,________, + ________,__XXXXX_,________, + ________,_XX___XX,X_______, + _______X,XX_____X,XXXX____, + _____XXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,____XX__,_XX_XX__, + ______XX,____XX__,_XX_____, + ______XX,____XX__,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,____XX__,_XX_____, + ______XX,____XX__,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ________,________,________, +}; + +/* char: 本 code:0xB1BE */ +static GUI_CONST_STORAGE unsigned char acB1BE[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,__XXXXX_,________, + ________,__XXXXX_,________, + ________,_XXXXXXX,________, + ________,_XXXXXXX,________, + ________,XXXXXX_X,X_______, + ________,XX_XXX_X,XX______, + _______X,XX_XXX__,XX______, + ______XX,X__XXX__,_XX_____, + ______XX,___XXX__,_XXX____, + _____XX_,___XXX__,XXXXXX__, + ____XXXX,XXXXXXXX,XXXXXXXX, + __XXX___,___XXX__,____XX__, + _XX_____,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, +}; + +/* char: 编 code:0xB1E0 */ +static GUI_CONST_STORAGE unsigned char acB1E0[72] = { + ________,________,________, + ________,______XX,________, + _____XXX,_______X,X_______, + _____XX_,_______X,X_______, + ____XX__,__XXXXXX,XXXXXX__, + ____XX__,__XX____,___XXX__, + ___XX__X,XXXX____,___XXX__, + ___XX__X,X_XX____,___XXX__, + __XX_XXX,X_XXXXXX,XXXXXX__, + __XXXXXX,__XX____,___XX___, + _____XX_,__XX____,________, + ____XX__,__XXXXXX,XXXXXXX_, + ___XX___,_XXXX_XX,_XX_XXX_, + __XXX_XX,XXXXX_XX,_XX_XXX_, + __XXXXX_,_XXXX_XX,_XX_XXX_, + ________,_XXXXXXX,XXXXXXX_, + _______X,XXXXX_XX,_XX_XXX_, + ____XXXX,XXXXX_XX,_XX_XXX_, + _XXXXX__,XX_XX_XX,_XX_XXX_, + __XX___X,XX_XX_XX,_XX_XXX_, + _______X,X__XX___,____XXX_, + ______XX,___XX___,___XXX__, + _____XX_,________,____XX__, + ________,________,________, +}; + +/* char: 变 code:0xB1E4 */ +static GUI_CONST_STORAGE unsigned char acB1E4[72] = { + ________,________,________, + ________,__XX____,________, + ________,___XXX__,________, + ________,___XXX__,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,_XX___XX,________, + ________,_XX___XX,________, + ______XX,XXX___XX,XXX_____, + _____XXX,_XX___XX,__XX____, + ____XXX_,_XX___XX,___XXX__, + ____XX__,_XX___XX,____XXX_, + ___XX___,_XX___XX,_XX__XX_, + __XXXXXX,XXXXXXXX,XXXX____, + ________,XX______,XXX_____, + ________,_XX____X,XX______, + ________,_XX___XX,X_______, + ________,__XX__XX,________, + ________,___XXXX_,________, + ________,___XXX__,________, + ________,__XXXXXX,________, + ________,XXX____X,XXX_____, + _____XXX,X_______,_XXXXXXX, + __XXXX__,________,___XXX__, + ________,________,________, +}; + +/* char: 不 code:0xB2BB */ +static GUI_CONST_STORAGE unsigned char acB2BB[72] = { + ________,________,________, + ________,________,________, + ________,________,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,____XXX_,________, + ________,___XXX__,________, + ________,___XX___,________, + ________,__XXX___,________, + ________,__XXXX__,________, + ________,_XXXXX__,________, + ________,XXXXXX_X,XX______, + ________,XX_XXX__,_XX_____, + _______X,X__XXX__,__XXX___, + ______XX,___XXX__,___XXX__, + _____XX_,___XXX__,____XXX_, + ____XX__,___XXX__,____XXX_, + __XXX___,___XXX__,_____XX_, + _XX_____,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 菜 code:0xB2CB */ +static GUI_CONST_STORAGE unsigned char acB2CB[72] = { + ________,________,________, + ________,XX____XX,________, + ________,XXX___XX,________, + ________,XXX___XX,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,XXX___XX,________, + ________,XXX___XX,__XX____, + ________,____XXXX,XXXXX___, + ___XXXXX,XXXXX___,________, + ________,__XX____,________, + _____XX_,___XXX__,_XXX____, + ______XX,____XX__,XXX_____, + ______XX,X__XX___,XX______, + ________,___XXX_X,X___XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,_XXXXXX_,________, + ________,_XXXXXXX,________, + ________,XX_XXX_X,X_______, + _______X,X__XXX__,XX______, + _____XXX,___XXX__,_XXX____, + ____XXX_,___XXX__,__XXXXXX, + __XXX___,___XXX__,____XX__, + _XX_____,___XX___,________, + ________,________,________, +}; + +/* char: 参 code:0xB2CE */ +static GUI_CONST_STORAGE unsigned char acB2CE[72] = { + ________,________,________, + ________,________,________, + ________,__XXX___,________, + ________,XXX___XX,X_______, + _______X,X_______,XXX_____, + _____XXX,____XXXX,XXXX____, + _____XXX,XXXXX___,__XXX___, + ________,_XXX____,___XX___, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,XXX___XX,________, + _______X,XX__XX_X,X_______, + ______XX,X__XXX__,XX______, + _____XXX,__XXX___,_XXX____, + ____XX__,_XXX__XX,__XXXXXX, + __XXX___,XX___XXX,X___XX__, + _XX___XX,X___XXX_,________, + ____XXX_,___XXX__,________, + ________,_XXX____,_XXX____, + _______X,XX_____X,XXX_____, + _____XXX,_____XXX,X_______, + ________,___XXXX_,________, + ________,XXXX____,________, + ___XXXXX,X_______,________, + ________,________,________, +}; + +/* char: 测 code:0xB2E2 */ +static GUI_CONST_STORAGE unsigned char acB2E2[72] = { + ________,________,________, + ________,________,________, + ___XX___,________,____XX__, + ____XX_X,XXXXXXXX,____XX__, + ____XXXX,XX___XXX,____XX__, + _______X,XX___XXX,____XX__, + _______X,XXXXXXXX,_XXXXX__, + _XX____X,XXXXXXXX,_XX_XX__, + __XXX_XX,XXXXXXXX,_XX_XX__, + ___XX_XX,XXXXXXXX,_XX_XX__, + ___XX_XX,XXXXXXXX,_XX_XX__, + _____XXX,XXXXXXXX,_XX_XX__, + _____XXX,XXXXXXXX,_XX_XX__, + _____XXX,XXXXXXXX,_XX_XX__, + ____XX_X,XXXX_XXX,_XX_XX__, + ____XX_X,XXXX_XXX,_XX_XX__, + __XXXX_X,XXXX_XX_,_XX_XX__, + ___XXX_X,XXXX____,____XX__, + ___XXX__,_XXXXX__,____XX__, + ___XXX__,XXX__XX_,____XX__, + ___XXX__,XX___XXX,____XX__, + ___XXXXX,X_____XX,__XXXX__, + _____XX_,________,___XXX__, + ________,________,________, +}; + +/* char: 查 code:0xB2E9 */ +static GUI_CONST_STORAGE unsigned char acB2E9[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XXX__,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,__XXXXX_,________, + ________,_XXXXXXX,________, + ________,XXXXXX_X,X_______, + _______X,XX_XXX__,XX______, + ______XX,X__XXX__,_XXX____, + _____XX_,___XX___,__XXXXXX, + ___XXXXX,XXXXXXXX,XXXXXX__, + _XXX__XX,X_______,_XX_____, + ______XX,X_______,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,X_______,_XX_____, + ______XX,X_______,_XX_____, + ______XX,X_______,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,X_______,_XX_____, + ______XX,________,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 常 code:0xB3A3 */ +static GUI_CONST_STORAGE unsigned char acB3A3[72] = { + ________,________,________, + ________,___XXX__,________, + ______XX,X__XXX__,XXX_____, + _______X,XX_XXX__,XX______, + ________,XX_XXX_X,X_______, + ___XXXXX,XXXXXXXX,XXXXXXX_, + ___XX___,________,____XXX_, + __XXX___,________,____XX__, + __XX___X,XXXXXXXX,XX_XX___, + _______X,X_______,XX______, + _______X,X_______,XX______, + _______X,XXXXXXXX,XX______, + _______X,X__XXX__,XX______, + ________,___XXX__,________, + _____XXX,XXXXXXXX,XXXXX___, + _____XX_,___XXX__,__XX____, + _____XX_,___XXX__,__XX____, + _____XX_,___XXX__,__XX____, + _____XX_,___XXX__,__XX____, + _____XX_,___XXX__,XXXX____, + _____XX_,___XXX__,_XXX____, + ________,___XXX__,________, + ________,___XXX__,________, + ________,________,________, +}; + +/* char: 厂 code:0xB3A7 */ +static GUI_CONST_STORAGE unsigned char acB3A7[72] = { + ________,________,________, + ________,________,________, + ________,________,____XX__, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XX__,________,________, + ____XX__,________,________, + ____XX__,________,________, + ____XX__,________,________, + ___XX___,________,________, + ___XX___,________,________, + __XX____,________,________, + __XX____,________,________, + _XX_____,________,________, + ________,________,________, +}; + +/* char: 超 code:0xB3AC */ +static GUI_CONST_STORAGE unsigned char acB3AC[72] = { + ________,________,________, + ______XX,________,________, + ______XX,X_______,________, + ______XX,____XXXX,XXXXXXX_, + ______XX,_______X,X___XXX_, + __XXXXXX,XXXX___X,X___XX__, + ______XX,______XX,X___XX__, + ______XX,______XX,X___XX__, + ______XX,______XX,____XX__, + _XXXXXXX,XXXXXXX_,_XXXXX__, + ______XX,X___XX__,___XX___, + ______XX,X__XXX__,____XX__, + ___XXXXX,X____XXX,XXXXXXX_, + ___XX_XX,X_XX_XX_,____XX__, + ___XX_XX,XXXXXXX_,____XX__, + ___XX_XX,X____XX_,____XX__, + ___XX_XX,X____XX_,____XX__, + ___XXXXX,X____XXX,XXXXXX__, + __XXXXXX,X____XX_,____XX__, + __XX_XXX,X____XX_,________, + __XX___X,XX______,________, + _XX_____,XXXXXXXX,XXXXXXXX, + _XX_____,_____XXX,XXXXXXX_, + ________,________,________, +}; + +/* char: 成 code:0xB3C9 */ +static GUI_CONST_STORAGE unsigned char acB3C9[72] = { + ________,________,________, + ________,________,________, + ________,____XXX_,XX______, + ________,____XXX_,_XX_____, + ________,____XXX_,__XX____, + ________,_____XX_,__XXXX__, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XX__,_____XX_,________, + ____XX__,_____XX_,________, + ____XX__,_____XX_,___XX___, + ____XX__,_____XXX,___XXX__, + ____XXXX,XXXX_XXX,__XXX___, + ____XX__,__XX__XX,__XX____, + ____XX__,__XX__XX,_XXX____, + ____XX__,__XX__XX,XXXX____, + ____XX__,_XXX__XX,XXX_____, + ____XX__,_XXX___X,XX____XX, + ___XX___,_XXX___X,XX____XX, + ___XX_XX,XXX___XX,XXX__XX_, + ___XX___,XXX__XXX,_XXXXXX_, + __XX____,____XX__,__XXXXX_, + __XX____,__XXX___,___XXXX_, + _XX_____,________,________, + ________,________,________, +}; + +/* char: 程 code:0xB3CC */ +static GUI_CONST_STORAGE unsigned char acB3CC[72] = { + ________,________,________, + ________,________,________, + ________,XX______,________, + _____XXX,XXXXXXXX,XXXXXX__, + __XXXXXX,____XX__,____XX__, + ______XX,____XX__,____XX__, + ______XX,____XX__,____XX__, + ______XX,____XX__,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXX__, + _____XXX,___XXX__,____XX__, + _____XXX,___XX___,____XX__, + _____XXX,X_XXXXXX,XXXXXXX_, + ____XXXX,XXX_____,XX______, + ____XXXX,_XX_____,XX______, + ___XXXXX,________,XX______, + ___XX_XX,________,XX__XX__, + __XX__XX,___XXXXX,XXXXXXX_, + __XX__XX,________,XX______, + _XX___XX,________,XX______, + _____XXX,________,XX______, + _____XXX,________,XX___XX_, + _____XXX,_XXXXXXX,XXXXXXXX, + _____XXX,________,________, + ________,________,________, +}; + +/* char: 出 code:0xB3F6 */ +static GUI_CONST_STORAGE unsigned char acB3F6[72] = { + ________,________,________, + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ____XXX_,___XXX__,__XXX___, + ____XXX_,___XXX__,__XX____, + ____XXX_,___XXX__,__XX____, + ____XXX_,___XXX__,__XX____, + ____XXX_,___XXX__,__XX____, + ____XXX_,___XXX__,__XX____, + ____XXXX,XXXXXXXX,XXXX____, + ________,___XXX__,__XXX___, + ________,___XXX__,________, + ________,___XXX__,________, + ____XXX_,___XXX__,___XXX__, + ____XX__,___XXX__,___XX___, + ____XX__,___XXX__,___XX___, + ____XX__,___XXX__,___XX___, + ____XX__,___XXX__,___XX___, + ____XX__,___XXX__,___XX___, + ___XXXXX,XXXXXXXX,XXXXX___, + ________,________,___XX___, + ________,________,________, +}; + +/* char: 存 code:0xB4E6 */ +static GUI_CONST_STORAGE unsigned char acB4E6[72] = { + ________,________,________, + ________,__XX____,________, + ________,__XXX___,________, + ________,__XX____,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,_XXX____,________, + ________,_XX_____,________, + ________,XXXXXXXX,XXXXX___, + _______X,XX______,__XXX___, + ______XX,X_______,_XX_____, + ______XX,________,XX______, + _____XXX,_______X,XX______, + _____XXX,_______X,X_______, + ____XXXX,_______X,X_______, + ___XX_XX,XXXXXXXX,XXXXXXX_, + __XX__XX,_______X,X_______, + _XX___XX,_______X,X_______, + ______XX,_______X,X_______, + ______XX,_______X,X_______, + ______XX,_______X,X_______, + ______XX,_______X,X_______, + ______XX,____XXXX,X_______, + ______XX,______XX,________, + ________,________,________, +}; + +/* char: 错 code:0xB4ED */ +static GUI_CONST_STORAGE unsigned char acB4ED[72] = { + ________,________,________, + ________,________,________, + ________,_____XX_,_XX_____, + ____XXXX,_____XX_,_XXX____, + ____XXX_,_____XX_,_XXX____, + ____XX__,_____XX_,_XXX____, + ____XXXX,XXXXXXXX,XXXXXXX_, + ___XXX__,_____XX_,_XXX____, + ___XX___,_____XX_,_XXX____, + __XXXXXX,XX___XX_,_XXX_XX_, + __XX_XX_,_XXXXXXX,XXXXXXXX, + _XX__XX_,________,________, + _____XX_,________,________, + _____XX_,___XXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__,___XX___, + _____XX_,___XXX__,___XX___, + _____XX_,___XXXXX,XXXXX___, + _____XX_,___XXX__,___XX___, + _____XX_,___XXX__,___XX___, + _____XXX,X__XXX__,___XX___, + _____XXX,___XXXXX,XXXXX___, + _____XX_,___XXX__,___XX___, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 单 code:0xB5A5 */ +static GUI_CONST_STORAGE unsigned char acB5A5[72] = { + ________,________,________, + _______X,X______X,X_______, + ________,XX_____X,XX______, + ________,XXX___XX,X_______, + ________,_XX___XX,________, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,___XX___,__XX____, + ____XX__,___XX___,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 但 code:0xB5AB */ +static GUI_CONST_STORAGE unsigned char acB5AB[72] = { + ________,________,________, + ________,________,________, + ______XX,________,________, + ______XX,X_______,________, + _____XXX,__XXXXXX,XXXXXX__, + _____XXX,__XX____,___XX___, + _____XX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ___XXXX_,__XX____,___XX___, + ___XXXX_,__XXXXXX,XXXXX___, + __XXXXX_,__XX____,___XX___, + _XX_XXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XXXXXX,XXXXX___, + ____XXX_,__XX____,___XX___, + ____XXX_,_XXX____,___XX___, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XX__,________,________, + ________,________,________, +}; + +/* char: 当 code:0xB5B1 */ +static GUI_CONST_STORAGE unsigned char acB5B1[72] = { + ________,________,________, + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ____XX__,___XXX__,_XXX____, + _____XXX,___XXX__,_XXX____, + ______XX,X__XXX__,XXX_____, + ______XX,X__XXX__,XX______, + _______X,X__XXX_X,X_______, + ________,___XXXXX,________, + ___XXXXX,XXXXXXXX,XXXXXXX_, + ________,________,___XXX__, + ________,________,___XXX__, + ________,________,___XXX__, + ________,________,___XXX__, + ____XXXX,XXXXXXXX,XXXXXX__, + ________,________,___XXX__, + ________,________,___XXX__, + ________,________,___XXX__, + ________,________,___XXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,________,___XXX__, + ________,________,___XXX__, + ________,________,________, +}; + +/* char: 的 code:0xB5C4 */ +static GUI_CONST_STORAGE unsigned char acB5C4[72] = { + ________,________,________, + ______XX,_______X,X_______, + ______XX,X______X,XX______, + ______XX,______XX,X_______, + ______XX,______XX,X_______, + _____XX_,______XX,________, + ___XXXXX,XXXX_XXX,XXXXXXX_, + ___XX___,_XX__XX_,____XX__, + ___XX___,_XX_XX__,____XX__, + ___XX___,_XX_XX__,____XX__, + ___XX___,_XXXX___,____XX__, + ___XX___,_XX__XX_,____XX__, + ___XXXXX,XXX___XX,X___XX__, + ___XX___,_XX____X,X___XX__, + ___XX___,_XX____X,X___XX__, + ___XX___,_XX_____,____XX__, + ___XX___,_XX_____,____XX__, + ___XX___,_XX_____,____XX__, + ___XX___,_XX_____,____XX__, + ___XXXXX,XXX_____,___XXX__, + ___XX___,_XX____X,X__XXX__, + ___XX___,_XX_____,XXXXX___, + ________,________,__XX____, + ________,________,________, +}; + +/* char: 电 code:0xB5E7 */ +static GUI_CONST_STORAGE unsigned char acB5E7[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ____XXXX,XXXXXXXX,XXXXX___, + ____XX__,___XX___,__XX____, + ____XX__,___XX___,__XX____, + ____XX__,___XX___,__XX____, + ____XXXX,XXXXXXXX,XXXX____, + ____XX__,___XX___,__XX____, + ____XX__,___XX___,__XX____, + ____XX__,___XX___,__XX____, + ____XX__,___XX___,__XX____, + ____XXXX,XXXXXXXX,XXXX____, + ____XX__,___XX___,__XX____, + ____XX__,___XX___,________, + ________,___XX___,_____XX_, + ________,___XX___,_____XX_, + ________,___XX___,_____XX_, + ________,___XX___,____XXX_, + ________,___XXXXX,XXXXXXX_, + ________,________,________, +}; + +/* char: 定 code:0xB6A8 */ +static GUI_CONST_STORAGE unsigned char acB6A8[72] = { + ________,________,________, + ________,__XX____,________, + ________,___XXX__,________, + ________,____XX__,________, + ____XX__,____XX__,____XX__, + ____XXXX,XXXXXXXX,XXXXXX__, + ____XX__,________,___XXX__, + ___XXX__,________,___XX___, + __XXX___,________,__XX____, + ___XXXXX,XXXXXXXX,XXXXX___, + ________,___XXX__,________, + ________,___XXX__,________, + ______XX,___XXX__,________, + ______XX,X__XXX__,________, + ______XX,___XXXXX,XXXX____, + _____XXX,___XXX__,________, + _____XXX,___XXX__,________, + _____XXX,X__XXX__,________, + _____XX_,XX_XXX__,________, + ____XX__,_XXXXX__,________, + ___XX___,__XXXXXX,_____XX_, + ___XX___,____XXXX,XXXXXX__, + __XX____,________,________, + ________,________,________, +}; + +/* char: 动 code:0xB6AF */ +static GUI_CONST_STORAGE unsigned char acB6AF[72] = { + ________,________,________, + ________,________,________, + ________,_______X,X_______, + ________,_______X,X_______, + ________,_XX____X,X_______, + __XXXXXX,XXXX___X,X_______, + ________,_______X,X_______, + ________,____XXXX,XXXXXXX_, + ________,_______X,X___XXX_, + _XXXXXXX,XXXXX__X,X___XXX_, + ______XX,_______X,X___XXX_, + _____XXX,_______X,X___XXX_, + _____XX_,_______X,X___XX__, + ____XXX_,XX_____X,X___XX__, + ____XX__,_XX___XX,X___XX__, + ___XX___,_XXX__XX,____XX__, + ___XX___,__XX__XX,____XX__, + __XXXXXX,XXXXXXX_,____XX__, + __XXX___,___XXXX_,____XX__, + ________,____XX__,____XX__, + ________,___XX__X,XX_XXX__, + ________,_XXX____,_XXXX___, + ________,XX______,__XX____, + ________,________,________, +}; + +/* char: 度 code:0xB6C8 */ +static GUI_CONST_STORAGE unsigned char acB6C8[72] = { + ________,________,________, + ________,___XX___,________, + ________,____XXX_,________, + ________,____XXX_,____XX__, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XX__,_XX_____,XX______, + ____XX__,__XX____,XXX_____, + ____XX__,__XX____,XX__XX__, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XX__,__XX____,XX______, + ____XX__,__XX____,XX______, + ____XX__,__XXXXXX,XX______, + ____XX__,__XX____,XX______, + ____XX__,________,________, + ___XXX_X,XXXXXXXX,XXXX____, + ___XXX__,__XX____,_XX_____, + ___XX___,__XX____,XX______, + ___XX___,___XX__X,X_______, + ___XX___,____XXXX,________, + __XX____,____XXXX,________, + __XX____,__XXX__X,XXX_____, + _XX_____,XXX_____,_XXXXXXX, + _____XXX,X_______,____XX__, + ________,________,________, +}; + +/* char: 断 code:0xB6CF */ +static GUI_CONST_STORAGE unsigned char acB6CF[72] = { + ________,________,________, + ________,________,________, + ___XX___,XX______,____XX__, + ___XX___,XX______,__XXXXX_, + ___XX___,XX____XX,XXX_____, + ___XXXX_,XX_XXXXX,________, + ___XX_XX,XX_XX_XX,________, + ___XX_XX,XXXX__XX,________, + ___XX___,XXX___XX,________, + ___XXXXX,XXXXXXXX,XXXXXXX_, + ___XX__X,XX___XXX,___XX___, + ___XX__X,XXX___XX,___XX___, + ___XX__X,XXXX__XX,___XX___, + ___XX_XX,XX_XX_XX,___XX___, + ___XX_XX,XX_XXXXX,___XX___, + ___XXXX_,XX__XXXX,___XX___, + ___XXXX_,XX____XX,___XX___, + ___XXX__,XX___XXX,___XX___, + ___XX___,XXXX_XX_,___XX___, + __XXXXXX,XXXXXXX_,___XX___, + ________,____XX__,___XX___, + ________,___XX___,___XX___, + ________,__XX____,________, + ________,________,________, +}; + +/* char: 对 code:0xB6D4 */ +static GUI_CONST_STORAGE unsigned char acB6D4[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,__XX____, + ________,________,__XX____, + __XXXXXX,XXXX____,__XX____, + ________,_XX_____,__XX____, + ________,_XX_____,__XX____, + ________,XXXXXXXX,XXXXXXX_, + ___XX___,XX______,__XX____, + ____XX__,XX______,__XX____, + _____XXX,XX__XX__,__XX____, + ______XX,X___XXX_,__XX____, + ______XX,X____XXX,__XX____, + ______XX,X____XXX,__XX____, + _____XXX,XX___XX_,__XX____, + _____XX_,XXX_____,__XX____, + ____XX__,XXX_____,__XX____, + ___XX___,_XX_____,__XX____, + ___XX___,_XX_____,__XX____, + _XXX____,_XX__XXX,__XX____, + ________,_______X,XXXX____, + ________,________,_XX_____, + ________,________,________, +}; + +/* char: 发 code:0xB7A2 */ +static GUI_CONST_STORAGE unsigned char acB7A2[72] = { + ________,________,________, + ________,__XX__XX,________, + ________,__XX___X,XX______, + _____XXX,_XXX____,XXX_____, + ____XXX_,_XXX____,_XXX____, + ____XX__,_XX_____,_XXX____, + ___XXX__,_XX_____,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ___XX___,_XX_____,________, + ________,XXX_____,________, + ________,XXX_____,________, + ________,XXXXXXXX,XXXX____, + ________,XXXX____,_XXX____, + _______X,XXXX____,_XX_____, + _______X,X__XX___,XXX_____, + ______XX,X___XX_X,XX______, + ______XX,____XX_X,X_______, + _____XXX,_____XXX,________, + _____XX_,_____XXX,X_______, + ____XX__,___XXX_X,XXX_____, + ___XX___,__XXX___,XXXXX___, + __XX____,XXX_____,__XXXXXX, + _XX__XXX,X_______,____XX__, + ________,________,________, +}; + +/* char: 阀 code:0xB7A7 */ +static GUI_CONST_STORAGE unsigned char acB7A7[72] = { + ________,________,________, + _____XX_,________,________, + _____XXX,________,________, + ______XX,X_XXXXXX,XXXXXXX_, + ______XX,X_______,____XX__, + ___XXX__,____XX__,____XX__, + ___XXX__,_XXXXXXX,XX__XX__, + ___XXX__,XXX_XX__,XXX_XX__, + ___XXX__,XX__XX__,_XX_XX__, + ___XXX__,XX__XX__,_XX_XX__, + ___XXX_X,X__XXXXX,XX__XX__, + ___XXX_X,XXXX_XX_,XX__XX__, + ___XXXXX,XX___XX_,XXX_XX__, + ___XXXXX,XX___XXX,XX__XX__, + ___XXX_X,XX___XXX,X___XX__, + ___XXX_X,XX___XXX,__XXXX__, + ___XXX_X,XX__XXXX,X_XXXX__, + ___XXX_X,XXXXX__X,XXXXXX__, + ___XXX_X,XXX_____,XXXXXX__, + ___XXX_X,XX______,__XXXX__, + ___XXX__,________,____XX__, + ___XXX__,________,_XXXXX__, + ___XX___,________,___XX___, + ________,________,________, +}; + +/* char: 返 code:0xB7B5 */ +static GUI_CONST_STORAGE unsigned char acB7B5[72] = { + ________,________,________, + ________,________,________, + ________,________,__XX____, + ____XX__,______XX,XXXXX___, + _____XX_,__XXXXX_,________, + _____XXX,__XX____,________, + _____XX_,__XX____,________, + ________,__XX____,________, + ________,__XXXXXX,XXXXX___, + ________,__XX____,__XXX___, + _XXXXXXX,__XX____,__XX____, + _____XX_,__XXXX__,_XXX____, + _____XX_,_XXX_XX_,_XX_____, + _____XX_,_XXX__XX,XXX_____, + _____XX_,_XX_____,XXX_____, + _____XX_,_XX____X,XXXX____, + _____XX_,XX____XX,__XXX___, + _____XX_,XX___XX_,___XXX__, + _____XXX,X__XXX__,____XX__, + ____XXXX,_XXX____,________, + ___XX__X,X_______,________, + _XXX____,XXXXXXXX,XXXXXXXX, + __XX____,___XXXXX,XXXXXX__, + ________,________,________, +}; + +/* char: 复 code:0xB8B4 */ +static GUI_CONST_STORAGE unsigned char acB8B4[72] = { + ________,________,________, + _______X,X_______,________, + _______X,XX______,________, + ______XX,XXXXXXXX,XXXXXX__, + ______XX,________,________, + _____XX_,________,________, + ____XX_X,XXXXXXXX,XXXX____, + ___XX__X,X_______,_XX_____, + __XX___X,X_______,_XX_____, + _______X,XXXXXXXX,XXX_____, + _______X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,XXXXXXXX,XXXX____, + ________,XXX_____,_XX_____, + ________,XXXXXXXX,XXX_____, + _______X,XXX_____,XXX_____, + ______XX,X_XX___X,XX______, + _____XX_,__XXX_XX,X_______, + ____XX__,___XXXXX,________, + ___XX___,___XXXX_,________, + ________,_XXX__XX,XX______, + ______XX,XX______,XXXXXXXX, + __XXXXX_,________,___XXX__, + ________,________,________, +}; + +/* char: 改 code:0xB8C4 */ +static GUI_CONST_STORAGE unsigned char acB8C4[72] = { + ________,________,________, + ________,________,________, + ________,______XX,X_______, + ________,______XX,X_______, + ________,______XX,________, + __XXXXXX,XXXX__XX,________, + ________,_XX__XX_,________, + ________,_XX__XXX,XXXXXXX_, + ________,_XX_XXX_,___XX___, + ________,_XX_XXX_,___XX___, + ___XXXXX,XXXXXXX_,__XXX___, + ___XX___,_XXXXXX_,__XX____, + ___XX___,__XX__XX,__XX____, + ___XX___,______XX,__XX____, + ___XX___,______XX,__XX____, + ___XX___,_______X,XXX_____, + ___XX___,_______X,XXX_____, + ___XX___,_XXX____,XX______, + ___XX__X,XX_____X,XXX_____, + ___XXXXX,______XX,__XX____, + __XXXX__,____XXX_,__XXXX__, + ___XX___,__XXX___,____XXXX, + ________,_XX_____,________, + ________,________,________, +}; + +/* char: 格 code:0xB8F1 */ +static GUI_CONST_STORAGE unsigned char acB8F1[72] = { + ________,________,________, + _____XX_,_____XX_,________, + _____XX_,____XXX_,________, + _____XX_,____XX__,________, + _____XX_,____XXXX,XXXXX___, + _____XX_,XX_XXX__,__XX____, + _XXXXXXX,XXXXXXX_,_XXX____, + _____XX_,__XX_XX_,XXX_____, + ____XXX_,_XX___XX,XX______, + ____XXXX,______XX,X_______, + ____XXXX,X_____XX,X_______, + ____XXXX,XX___XX_,XXX_____, + ___XXXX_,XX__XX__,_XXXX___, + ___XXXX_,__XXX___,___XXXX_, + __XX_XX_,XXXXXXXX,XXXXX___, + __XX_XXX,X__XX___,__XX____, + _XX__XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XX_,___XXXXX,XXXX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + ________,________,________, +}; + +/* char: 功 code:0xB9A6 */ +static GUI_CONST_STORAGE unsigned char acB9A6[72] = { + ________,________,________, + ________,_______X,X_______, + ________,_______X,XX______, + ________,_______X,X_______, + ________,__XX___X,X_______, + __XXXXXX,XXXXX__X,X_______, + ______XX,_______X,X_______, + ______XX,___XXXXX,XXXXXXX_, + ______XX,_______X,X___XXX_, + ______XX,_______X,X___XXX_, + ______XX,_______X,X___XXX_, + ______XX,_______X,X___XX__, + ______XX,______XX,X___XX__, + ______XX,______XX,____XX__, + ______XX,______XX,____XX__, + ______XX,_XXX__XX,____XX__, + ______XX,XX___XX_,____XX__, + __XXXXX_,____XXX_,____XX__, + __XXX___,____XX__,____XX__, + ________,___XX___,____XX__, + ________,__XX___X,XX_XXX__, + ________,XXX_____,_XXXX___, + _______X,X_______,__XX____, + ________,________,________, +}; + +/* char: 公 code:0xB9AB */ +static GUI_CONST_STORAGE unsigned char acB9AB[72] = { + ________,________,________, + ________,________,________, + ________,_____XXX,________, + ________,_XX__XX_,________, + ________,XXX___XX,________, + ________,XXX___XX,________, + _______X,XX_____X,X_______, + _______X,X______X,X_______, + ______XX,X_______,XX______, + ______XX,________,XXX_____, + _____XX_,___XX___,_XXX____, + ____XX__,___XXX__,__XXX___, + ___XX___,__XXX___,___XXXX_, + __XX____,__XX____,____XX__, + ________,_XXX____,________, + ________,_XX_____,________, + ________,XX____XX,________, + _______X,X______X,XX______, + ______XX,X_______,XXX_____, + _____XXX,________,_XX_____, + ____XXXX,XXXXXXXX,XXXX____, + _____XXX,________,__XX____, + ________,________,__XX____, + ________,________,________, +}; + +/* char: 故 code:0xB9CA */ +static GUI_CONST_STORAGE unsigned char acB9CA[72] = { + ________,________,________, + ________,_______X,X_______, + _______X,XX_____X,XX______, + _______X,X______X,X_______, + _______X,X_____XX,X_______, + _______X,X_____XX,X_______, + _______X,X_____XX,________, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + _______X,X____XXX,___XX___, + _______X,X____XXX,___XX___, + _______X,X___XXXX,___XX___, + _______X,X___XXXX,___XX___, + ___XXXXX,XXXX___X,X_XXX___, + ___XXX__,_XXX___X,X_XX____, + ___XXX__,_XXX___X,X_XX____, + ___XXX__,_XXX___X,X_XX____, + ___XXX__,_XXX____,XXX_____, + ___XXX__,_XXX____,XXX_____, + ___XXX__,_XXX___X,XXX_____, + ___XXXXX,XXXX__XX,X_XX____, + ___XXX__,_XXX_XXX,__XXXX__, + ___XXX__,___XXX__,____XXXX, + ________,__XX____,________, + ________,________,________, +}; + +/* char: 规 code:0xB9E6 */ +static GUI_CONST_STORAGE unsigned char acB9E6[72] = { + ________,________,________, + _____XXX,________,________, + _____XXX,________,________, + ______XX,____XXXX,XXXXXXX_, + ______XX,____XX__,____XX__, + ______XX,____XX__,____XX__, + __XXXXXX,XXX_XX_X,XX__XX__, + ______XX,____XX_X,XX__XX__, + ______XX,____XX_X,XX__XX__, + ______XX,____XX_X,XX__XX__, + ______XX,____XX_X,XX__XX__, + _XXXXXXX,XXXXXX_X,XX__XX__, + ______XX,____XX_X,XXX_XX__, + _____XXX,____XX_X,XXX_XX__, + _____XXX,____XX_X,XXX_____, + _____XXX,XX_____X,XXX_____, + _____XX_,XXX___XX,XXX_____, + _____XX_,_XX___XX,_XX__XX_, + ____XX__,_XX__XXX,_XX__XX_, + ____XX__,_____XX_,_XX__XX_, + ___XX___,___XXX__,_XX__XXX, + __XX____,__XX____,_XXXXXX_, + _XX_____,XXX_____,________, + ________,________,________, +}; + +/* char: 号 code:0xBAC5 */ +static GUI_CONST_STORAGE unsigned char acBAC5[72] = { + ________,________,________, + ________,________,________, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,XXX_____,________, + ________,XX______,________, + _______X,XX______,________, + _______X,XXXXXXXX,XXXX____, + _______X,X_______,_XXX____, + ________,________,_XX_____, + ________,________,_XX_____, + ________,________,_XX_____, + ________,________,XXX_____, + ________,___XXX__,XX______, + ________,_____XXX,XX______, + ________,_____XXX,________, + ________,________,________, +}; + +/* char: 后 code:0xBAF3 */ +static GUI_CONST_STORAGE unsigned char acBAF3[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + ________,______XX,XXXXXX__, + _____XXX,XXXXXXX_,________, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,________,____XX__, + _____XXX,XXXXXXXX,XXXXXXX_, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,XXXXXXXX,XXXXX___, + _____XX_,_XX_____,__XXX___, + _____XX_,_XX_____,__XXX___, + ____XXX_,_XX_____,__XXX___, + ____XX__,_XX_____,__XXX___, + ____XX__,_XX_____,__XXX___, + ___XX___,XXXXXXXX,XXXXX___, + ___XX___,XXX_____,__XXX___, + __XX____,XXX_____,__XX____, + _XX_____,________,________, + ________,________,________, +}; + +/* char: 护 code:0xBBA4 */ +static GUI_CONST_STORAGE unsigned char acBBA4[72] = { + ________,________,________, + ________,________,________, + _____XX_,______XX,________, + _____XXX,_______X,X_______, + _____XXX,_______X,XX______, + _____XXX,________,XX______, + _____XXX,___XXXXX,XXXXXXX_, + _XXXXXXX,XXXXX___,____XX__, + _____XXX,__XXX___,____XX__, + _____XXX,___XX___,____XX__, + _____XXX,___XX___,____XX__, + _____XXX,XXXXXXXX,XXXXXXX_, + _____XXX,X__XX___,____XXX_, + __XXXXXX,___XX___,________, + __XX_XXX,___XX___,________, + _____XXX,___XX___,________, + _____XXX,__XXX___,________, + _____XXX,__XX____,________, + _____XXX,__XX____,________, + _____XXX,_XX_____,________, + __XX_XXX,XX______,________, + ___XXXX_,XX______,________, + ____XXXX,X_______,________, + ________,________,________, +}; + +/* char: 欢 code:0xBBB6 */ +static GUI_CONST_STORAGE unsigned char acBBB6[72] = { + ________,________,________, + ________,________,________, + ________,______XX,________, + ________,______XX,________, + ________,_____XXX,________, + _XXXXXXX,XXX__XX_,________, + ________,XXX__XX_,________, + ________,XX___XXX,XXXXXXX_, + __XX____,XX__XX_X,X___XXX_, + ___XX__X,XX__XX_X,XX__XX__, + ____XX_X,X__XX__X,XX_XX___, + _____XXX,X__XX__X,XX______, + _____XXX,X_XX___X,XX______, + ______XX,______XX,XX______, + _____XXX,X_____XX,_XX_____, + _____XXX,XX____XX,_XX_____, + ____XXX_,XXX__XXX,_XX_____, + ____XX__,XXX__XX_,_XXX____, + ___XX___,_XX_XXX_,__XX____, + __XX____,_XXXXX__,__XXX___, + __XX____,__XXX___,___XXX__, + _XX_____,_XX_____,____XXXX, + _______X,XX______,________, + ________,________,________, +}; + +/* char: 恢 code:0xBBD6 */ +static GUI_CONST_STORAGE unsigned char acBBD6[72] = { + ________,________,________, + _____XX_,____XX__,________, + _____XX_,____XXX_,________, + _____XX_,____XXX_,________, + _____XX_,____XXX_,________, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XXX,____XX__,________, + _____XXX,X___XX_X,XX______, + __XX_XXX,XX_XXX_X,XX______, + __XX_XX_,___XX__X,XX______, + _XXX_XX_,___XXXXX,XX__XX__, + _____XX_,__XXXXXX,XX__XXX_, + _____XX_,__XX_XXX,XX_XX___, + _____XX_,__XXXX_X,XXXX____, + _____XX_,_XXXXX_X,XXX_____, + _____XX_,_XX___XX,XXX_____, + _____XX_,XX____XX,_XX_____, + _____XXX,X____XXX,__XX____, + _____XXX,X____XX_,__XXX___, + _____XXX,____XX__,___XXX__, + _____XX_,___XX___,___XXXX_, + _____XX_,_XXX____,____XXX_, + ____XX__,XX______,________, + ________,________,________, +}; + +/* char: 回 code:0xBBD8 */ +static GUI_CONST_STORAGE unsigned char acBBD8[72] = { + ________,________,________, + ________,________,________, + ________,________,____XX__, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XXX__,________,___XXX__, + ___XXX__,________,___XXX__, + ___XXX__,________,___XXX__, + ___XXX__,________,___XXX__, + ___XXX__,XXXXXXXX,XX_XXX__, + ___XXX__,XX_____X,X__XXX__, + ___XXX__,XX_____X,X__XXX__, + ___XXX__,XX_____X,X__XXX__, + ___XXX__,XX_____X,X__XXX__, + ___XXX__,XX_____X,X__XXX__, + ___XXX__,XXXXXXXX,X__XXX__, + ___XXX__,XX_____X,X__XXX__, + ___XXX__,XX______,___XXX__, + ___XXX__,________,___XXX__, + ___XXX__,________,___XXX__, + ___XXX__,________,___XXX__, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XXX__,________,___XXX__, + ___XXX__,________,________, + ________,________,________, +}; + +/* char: 或 code:0xBBF2 */ +static GUI_CONST_STORAGE unsigned char acBBF2[72] = { + ________,________,________, + ________,________,________, + ________,_____XX_,_XX_____, + ________,_____XXX,__XXX___, + ________,_____XXX,__XXX___, + ________,_____XXX,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,_____XXX,________, + ________,_____XXX,________, + ____XXXX,XXXX__XX,___XX___, + ____XX__,__XX__XX,___XXX__, + ____XX__,__XX__XX,__XXX___, + ____XX__,__XX__XX,__XXX___, + ____XX__,__XX__XX,X_XX____, + ____XXXX,XXXX__XX,XXXX____, + ____XX__,__XX___X,XXX_____, + ___XX___,_______X,XXX_____, + ________,___XXX_X,XX______, + _______X,XXXX__XX,XXX__XX_, + _XXXXXXX,_____XX_,_XXX_XX_, + __XXX___,____XX__,__XXXXX_, + ________,__XXX___,___XXXX_, + ________,_XX_____,_____XXX, + ________,________,________, +}; + +/* char: 辑 code:0xBCAD */ +static GUI_CONST_STORAGE unsigned char acBCAD[72] = { + ________,________,________, + _____XX_,________,________, + _____XXX,___XXXXX,XXXXX___, + _____XX_,___XX___,__XX____, + ____XXX_,___XX___,__XX____, + _XXXXXXX,XXXXX___,__XX____, + ____XX__,___XXXXX,XXXX____, + ___XXX__,___XX___,__XX____, + ___XX_XX,X__XX___,________, + ___XX_XX,_XXXXXXX,XXXXXXX_, + __XXX_XX,XX_XXX__,__XX____, + _XXXXXXX,XXXXXXXX,XXXX____, + __XX__XX,___XXX__,__XX____, + ______XX,___XXX__,__XX____, + ______XX,___XXXXX,XXXX____, + ______XX,XXXXXX__,__XX____, + ____XXXX,___XXX__,__XX____, + _XXXX_XX,___XXX__,__XX_XX_, + ______XX,_XXXXXXX,XXXXXXX_, + ______XX,________,__XX____, + ______XX,________,__XX____, + ______XX,________,__XX____, + ______XX,________,__XX____, + ________,________,________, +}; + +/* char: 技 code:0xBCBC */ +static GUI_CONST_STORAGE unsigned char acBCBC[72] = { + ________,________,________, + _____XX_,_______X,X_______, + _____XXX,_______X,XX______, + _____XXX,_______X,X_______, + _____XXX,_______X,X_______, + _____XXX,_______X,X_______, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + _____XXX,_______X,X_______, + _____XXX,_______X,X_______, + _____XXX,_______X,X_______, + _____XXX,_XX____X,X_______, + _____XXX,XXXXXXXX,XXXXXX__, + ____XXXX,____XX__,___XX___, + _XXXXXXX,____XX__,__XXX___, + __XX_XXX,_____XX_,__XX____, + _____XXX,_____XX_,_XXX____, + _____XXX,______XX,_XX_____, + _____XXX,______XX,XXX_____, + _____XXX,_______X,XX______, + _____XXX,______XX,XXX_____, + __XX_XXX,____XXX_,_XXXX___, + ___XXXXX,__XXX___,__XXXXXX, + _____XX_,XXX_____,____XX__, + ________,________,________, +}; + +/* char: 计 code:0xBCC6 */ +static GUI_CONST_STORAGE unsigned char acBCC6[72] = { + ________,________,________, + ________,________,________, + ____XX__,______XX,________, + _____XXX,______XX,X_______, + ______XX,______XX,X_______, + ______XX,______XX,X_______, + ________,______XX,X_______, + ________,______XX,X_______, + ________,______XX,X_______, + _XXXXXXX,______XX,X____XX_, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,_XX___XX,X_______, + _____XX_,XX____XX,X_______, + _____XXX,X_____XX,X_______, + _____XXX,X_____XX,X_______, + _____XXX,______XX,X_______, + ________,______XX,X_______, + ________,______XX,X_______, + ________,________,________, +}; + +/* char: 加 code:0xBCD3 */ +static GUI_CONST_STORAGE unsigned char acBCD3[72] = { + ________,________,________, + ______XX,________,________, + ______XX,________,________, + ______XX,________,________, + ______XX,________,________, + ______XX,________,________, + _XXXXXXX,XXXXX_XX,XXXXXXX_, + ______XX,__XXX_XX,____XX__, + ______XX,__XXX_XX,____XX__, + ______XX,__XXX_XX,____XX__, + ______XX,__XXX_XX,____XX__, + _____XXX,__XX__XX,____XX__, + _____XXX,__XX__XX,____XX__, + _____XX_,__XX__XX,____XX__, + _____XX_,__XX__XX,____XX__, + _____XX_,__XX__XX,____XX__, + ____XXX_,__XX__XX,____XX__, + ____XX__,__XX__XX,____XX__, + ____XX__,__XX__XX,____XX__, + ___XXXXX,_XXX__XX,XXXXXX__, + ___XX__X,XXX___XX,____XXX_, + __XX____,XX____XX,____XXX_, + _XX_____,______XX,________, + ________,________,________, +}; + +/* char: 检 code:0xBCEC */ +static GUI_CONST_STORAGE unsigned char acBCEC[72] = { + ________,________,________, + _____XX_,______XX,________, + _____XX_,______XX,________, + _____XX_,_____XXX,X_______, + _____XX_,_____XXX,X_______, + _____XX_,____XXX_,XX______, + _XXXXXXX,XXX_XX__,_XX_____, + _____XX_,___XX___,__XXX___, + ____XXX_,__XX____,___XXXX_, + ____XXXX,_XX_____,____XX__, + ____XXXX,XXXXXXXX,XXXX____, + ____XXXX,XX______,________, + ___XXXX_,XX___XX_,__XXX___, + ___XXXX_,______XX,__XXX___, + __XX_XX_,__XX__XX,__XXX___, + __XX_XX_,__XX__XX,X_XX____, + _XX__XX_,___XX_XX,X_XX____, + _____XX_,___XX__X,XXXX____, + _____XX_,___XX___,_XX_____, + _____XX_,___XX___,_XX_____, + _____XX_,________,XX______, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,________,________, + ________,________,________, +}; + +/* char: 键 code:0xBCFC */ +static GUI_CONST_STORAGE unsigned char acBCFC[72] = { + ________,________,________, + ____XX__,________,XX______, + ____XXX_,________,XXX_____, + ____XX__,________,XX______, + ___XXX__,XXXXXXXX,XXXXXX__, + ___XXXXX,X__XX___,XX__XX__, + ___XX___,__XXXXXX,XXXXXXX_, + __XX____,__XX____,XX__XX__, + __XXXXXX,X_XX____,XX__XX__, + _XX_XX__,_XX___XX,XXXXXX__, + ____XX__,XXXXXX__,XX______, + ____XX__,_XX_XX__,XX______, + ____XX__,____XXXX,XXXXXX__, + _XXXXXXX,XX__XX__,XX______, + ____XX__,_XXXXX__,XX______, + ____XX__,_XXXX___,XX______, + ____XX__,_XXXXXXX,XXXXXXX_, + ____XX__,__XXX___,XX______, + ____XX_X,X_XX____,XX______, + ____XXXX,_XXXXX__,XXX_____, + ____XXX_,XXX_XXXX,XX___XXX, + _______X,X______X,XXXXXXX_, + ______XX,________,________, + ________,________,________, +}; + +/* char: 件 code:0xBCFE */ +static GUI_CONST_STORAGE unsigned char acBCFE[72] = { + ________,________,________, + _______X,X______X,X_______, + ______XX,XX_____X,X_______, + ______XX,X______X,X_______, + ______XX,__XXX__X,X_______, + _____XXX,__XXX__X,X_______, + _____XX_,__XX___X,X_______, + ____XXX_,__XXXXXX,XXXXXX__, + ____XXX_,__XX___X,X_______, + ___XXXX_,_XX____X,X_______, + ___XXXX_,_XX____X,X_______, + __XX_XX_,XX_____X,X_______, + _XX__XX_,XX_____X,X_______, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + ________,________,________, +}; + +/* char: 江 code:0xBDAD */ +static GUI_CONST_STORAGE unsigned char acBDAD[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ___XX___,________,________, + ____XX__,________,____XX__, + ____XXX_,XXXXXXXX,XXXXXX__, + _____XXX,X_____XX,________, + _______X,X_____XX,________, + _XX____X,X_____XX,________, + __XXX_XX,______XX,________, + ___XX_XX,______XX,________, + ___XX_XX,______XX,________, + _____XX_,______XX,________, + _____XX_,______XX,________, + _____XX_,______XX,________, + ____XX__,______XX,________, + __XXXX__,______XX,________, + ___XXX__,______XX,________, + ___XXX__,______XX,________, + ___XXX__,______XX,_____XX_, + ___XXXXX,XXXXXXXX,XXXXXXXX, + ___XXX__,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: 阶 code:0xBDD7 */ +static GUI_CONST_STORAGE unsigned char acBDD7[72] = { + ________,________,________, + ________,______XX,________, + ________,_____XXX,________, + __XXXXXX,XX___XXX,X_______, + __XX___X,X___XXXX,X_______, + __XX__XX,X___XX__,XX______, + __XX__XX,___XXX__,_XX_____, + __XX__XX,___XX___,_XXX____, + __XX_XX_,__XX____,__XXXX__, + __XX_XX_,XXXXX___,____XXXX, + __XX_XX_,___XXX__,_XX_____, + __XX__XX,___XXX__,_XX_____, + __XX___X,X__XXX__,_XX_____, + __XX___X,X__XXX__,_XX_____, + __XX___X,XX_XXX__,_XX_____, + __XX___X,X__XXX__,_XX_____, + __XXXXXX,X__XXX__,_XX_____, + __XX_XXX,___XX___,_XX_____, + __XX____,___XX___,_XX_____, + __XX____,__XXX___,_XX_____, + __XX____,__XX____,_XX_____, + __XX____,XXX_____,_XX_____, + __XX___X,X_______,________, + ________,________,________, +}; + +/* char: 进 code:0xBDF8 */ +static GUI_CONST_STORAGE unsigned char acBDF8[72] = { + ________,________,________, + ________,________,________, + ________,________,XX______, + ____XX__,____XX__,_XX_____, + ____XXX_,____XX__,_XX_____, + _____XXX,____XX__,_XX_____, + _____XX_,____XX__,_XX_XX__, + ________,XXXXXXXX,XXXXXXX_, + ________,____XX__,_XX_____, + _____XX_,____XX__,_XX_____, + _XXXXXXX,____XX__,_XX_____, + _____XX_,____XX__,_XX_____, + _____XXX,XXXXXXXX,XXXXXXX_, + _____XX_,____XX__,_XX_____, + _____XX_,___XXX__,_XX_____, + _____XX_,___XX___,_XX_____, + _____XX_,___XX___,_XX_____, + _____XX_,__XX____,_XX_____, + _____XX_,_XX_____,_XX_____, + ____XXXX,XX______,_XX_____, + __XXX__X,X_______,________, + _XXX____,XXXXXXX_,__XXXXXX, + ________,___XXXXX,XXXXXX__, + ________,________,________, +}; + +/* char: 据 code:0xBEDD */ +static GUI_CONST_STORAGE unsigned char acBEDD[72] = { + ________,________,________, + ________,________,________, + _____XX_,________,________, + _____XXX,__XXXXXX,XXXXXX__, + _____XX_,__XXX___,___XXX__, + _____XX_,__XXX___,___XXX__, + _____XX_,XXXXX___,___XXX__, + _XXXXXXX,XXXXXXXX,XXXXXX__, + _____XX_,__XXX___,XX_XXX__, + _____XX_,__XX____,XX______, + _____XX_,_XXX____,XX______, + _____XXX,XXXXXXXX,XXXXXXX_, + _____XXX,__XX____,XX______, + ____XXX_,__XX____,XX______, + _XXXXXX_,__XX____,XX______, + __XX_XX_,_XXXXXXX,XXXXXX__, + _____XX_,_XX_XX__,___XXX__, + _____XX_,_XX_XX__,___XXX__, + _____XX_,XX__XX__,___XXX__, + _____XX_,XX__XX__,___XXX__, + _____XXX,X___XXXX,XXXXXX__, + __XXXXXX,____XX__,___XXX__, + ____XXX_,____XX__,___XX___, + ________,________,________, +}; + +/* char: 巨 code:0xBEDE */ +static GUI_CONST_STORAGE unsigned char acBEDE[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + ____XXXX,XXXXXXXX,XXXXXX__, + ____XX__,________,________, + ____XX__,________,________, + ____XX__,________,________, + ____XX__,________,________, + ____XXXX,XXXXXXXX,XXXXX___, + ____XX__,________,__XX____, + ____XX__,________,__XX____, + ____XX__,________,__XX____, + ____XX__,________,__XX____, + ____XX__,________,__XX____, + ____XX__,________,__XX____, + ____XXXX,XXXXXXXX,XXXX____, + ____XX__,________,__XX____, + ____XX__,________,________, + ____XX__,________,________, + ____XX__,________,________, + ____XX__,________,____XX__, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XX__,________,________, + ________,________,________, +}; + +/* char: 控 code:0xBFD8 */ +static GUI_CONST_STORAGE unsigned char acBFD8[72] = { + ________,________,________, + _____XX_,________,________, + _____XXX,______XX,________, + _____XX_,_______X,XX______, + _____XX_,_______X,X_______, + _____XX_,__XXXXXX,XXXXXXX_, + _XXXXXXX,XXXX____,____XXX_, + _____XX_,_XXX_XX_,____XX__, + _____XX_,_____XXX,XXX_____, + _____XX_,____XXX_,__XXX___, + _____XX_,XX_XXX__,___XXX__, + _____XXX,X_XX____,____XX__, + ____XXXX,_XX_____,____XX__, + _XXXXXX_,__XXXXXX,XXXXX___, + _XXX_XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,XXXXXXXX,XXXXXXX_, + __XXXXX_,________,________, + ____XX__,________,________, + ________,________,________, +}; + +/* char: 括 code:0xC0A8 */ +static GUI_CONST_STORAGE unsigned char acC0A8[72] = { + ________,________,________, + _____XX_,________,________, + _____XXX,________,________, + _____XXX,________,_XXXXX__, + _____XXX,___XXXXX,XX______, + _____XXX,_______X,X_______, + _XXXXXXX,XXX____X,X_______, + _____XXX,_______X,X_______, + _____XXX,_______X,X____XX_, + _____XXX,_XXXXXXX,XXXXXXXX, + _____XXX,_______X,X_______, + _____XXX,XXX____X,X_______, + _____XXX,X______X,X_______, + __XXXXXX,___XXXXX,XXXXXX__, + _XXX_XXX,___XX___,___XXX__, + _____XXX,___XX___,___XXX__, + _____XXX,___XX___,___XXX__, + _____XXX,___XX___,___XXX__, + _____XXX,___XX___,___XXX__, + _____XXX,___XXXXX,XXXXXX__, + __XX_XXX,___XX___,___XXX__, + ___XXXXX,___XX___,___XXX__, + _____XX_,________,________, + ________,________,________, +}; + +/* char: 量 code:0xC1BF */ +static GUI_CONST_STORAGE unsigned char acC1BF[72] = { + ________,________,________, + ________,________,________, + _____XXX,XXXXXXXX,XXX_____, + _____XXX,________,_XX_____, + _____XXX,XXXXXXXX,XXX_____, + _____XXX,________,_XX_____, + _____XXX,________,_XX_____, + _____XXX,XXXXXXXX,XXX_____, + _____XXX,________,_XX__XX_, + _XXXXXXX,XXXXXXXX,XXXXXXXX, + ________,________,________, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,___XXX__,_XXX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,___XXX__,_XXX____, + _____XX_,___XXX__,_XXX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,___XXX__,_XXX____, + ___XXXXX,XXXXXXXX,XXXXX___, + ________,___XXX__,________, + ________,___XXX__,_____XX_, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 流 code:0xC1F7 */ +static GUI_CONST_STORAGE unsigned char acC1F7[72] = { + ________,________,________, + ________,____XX__,________, + ___XX___,_____XXX,________, + ____XXX_,______XX,____XX__, + _____XXX,XXXXXXXX,XXXXXXX_, + _____XXX,_____XXX,________, + ________,XX__XXX_,________, + _______X,X___XX__,_XX_____, + _XXX___X,X__XX___,__XX____, + __XXX__X,X_XX___X,XXXXX___, + ___XX_XX,_XXXXXXX,___XX___, + ___XX_XX,________,___XX___, + ______XX,_XXX_XXX,_XXX____, + _____XX_,_XXX_XX_,_XX_____, + _____XX_,_XXX_XX_,_XX_____, + ____XX__,_XXX_XX_,_XX_____, + _XXXXX__,_XXX_XX_,_XX_____, + ___XXX__,_XX__XX_,_XX_____, + ___XXX__,_XX__XX_,_XX__XX_, + ___XXX__,XXX__XX_,_XX__XX_, + ___XXX__,XX___XX_,_XX__XXX, + ___XXX_X,X____XX_,_XXXXXX_, + _____XXX,_____XX_,________, + ________,________,________, +}; + +/* char: 码 code:0xC2EB */ +static GUI_CONST_STORAGE unsigned char acC2EB[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + _XXXXXXX,XXXXXXXX,XXXXXX__, + _____XX_,________,___XX___, + ____XXX_,____XXX_,___XX___, + ____XX__,____XXX_,___XX___, + ____XX__,____XX__,__XXX___, + ____XX__,____XX__,__XXX___, + ___XXXXX,XX__XX__,__XX____, + ___XXX_X,XX__XX__,__XX____, + __XXXX_X,XX__XX__,__XX____, + __XXXX_X,XX_XXXXX,XXXXXXX_, + _XXXXX_X,XX__XX__,_____XX_, + ___XXX_X,XX______,_____XX_, + ___XXX_X,XX______,_____XX_, + ___XXX_X,XXXXXXXX,XXXXXXX_, + ___XXXXX,XX______,____XXX_, + ___XXX_X,XX______,____XX__, + ___XXX_X,X_______,____XX__, + ___XXX__,________,XX__XX__, + ________,________,_XXXXX__, + ________,________,__XXX___, + ________,________,________, +}; + +/* char: 满 code:0xC2FA */ +static GUI_CONST_STORAGE unsigned char acC2FA[72] = { + ________,________,________, + ________,____XX__,XX______, + ___XX___,____XX__,XX______, + ____XXX_,____XX__,XX______, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,____XX__,XX______, + ________,____XX__,XX______, + _XX___XX,________,________, + __XXX_XX,XXXXXXXX,XXXXXXX_, + ___XX_XX,____XX__,XX______, + ___XXXX_,____XX__,XX______, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,XX__XX__,XX__XX__, + _____XX_,XX__XX__,XX__XX__, + ____XX__,XX__XXX_,XX__XX__, + ____XX__,XX__XXXX,XXX_XX__, + __XXXX__,XX_XX_XX,X_XXXX__, + ___XXX__,XX_XX__X,X_XXXX__, + ___XXX__,XXXX__XX,____XX__, + ___XXX__,XXX__XX_,____XX__, + ___XXX__,XX______,____XX__, + ___XXX__,XX______,__XXXX__, + ________,XX______,___XX___, + ________,________,________, +}; + +/* char: 门 code:0xC3C5 */ +static GUI_CONST_STORAGE unsigned char acC3C5[72] = { + ________,________,________, + ________,________,________, + ______XX,________,________, + ______XX,X_______,________, + _______X,XX_XXXXX,XXXXXX__, + _______X,XX______,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,________,___XXX__, + ____XX__,_______X,XX_XXX__, + ____XX__,________,_XXXX___, + ____XX__,________,__XX____, + ________,________,________, +}; + +/* char: 密 code:0xC3DC */ +static GUI_CONST_STORAGE unsigned char acC3DC[72] = { + ________,________,________, + ________,__XX____,________, + ________,___XXX__,________, + ________,___XXX__,________, + ___XXXXX,XXXXXXXX,XXXXXXX_, + ___XX___,_XX_____,____XX__, + __XXX___,__XXX___,XX_XX___, + __XX____,XX_XX__X,XX______, + ________,XX_XX_XX,X_______, + _____XX_,XX__XXX_,__XXX___, + ____XX__,XX_XXX__,XX_XXX__, + ___XXX__,XXXX____,XX__XX__, + _______X,XXX_____,XX__XX__, + ____XXXX,XXXXXXXX,XX______, + _XXXX___,________,________, + ________,___XX___,________, + ________,___XXX__,________, + _____XXX,___XX___,__XXX___, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + _____XX_,___XX___,__XX____, + ____XXXX,XXXXXXXX,XXXX____, + ________,________,__XX____, + ________,________,________, +}; + +/* char: 面 code:0xC3E6 */ +static GUI_CONST_STORAGE unsigned char acC3E6[72] = { + ________,________,________, + ________,________,________, + ________,________,_____XX_, + _XXXXXXX,XXXXXXXX,XXXXXXXX, + ________,__XXX___,________, + ________,__XX____,________, + ________,__XX____,________, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XXXXXXX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XXXXXXX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXX__,_XX___XX,___XXX__, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XXX__,________,___XXX__, + ___XX___,________,___XX___, + ________,________,________, +}; + +/* char: 秒 code:0xC3EB */ +static GUI_CONST_STORAGE unsigned char acC3EB[72] = { + ________,________,________, + ________,________,XX______, + ________,XXX_____,XX______, + ____XXXX,XX______,XX______, + __XXX_XX,________,XX______, + ______XX,________,XX______, + ______XX,____XXX_,XX_XX___, + ______XX,____XXX_,XX__XX__, + _XXXXXXX,XXX_XX__,XX__XXX_, + _____XXX,____XX__,XX___XX_, + _____XXX,___XXX__,XX___XX_, + _____XXX,XX_XX___,XX______, + ____XXXX,XXXXX___,XX__XX__, + ____XXXX,XXXX____,XX_XXXX_, + ___XX_XX,________,XX_XXX__, + __XX__XX,________,XXXXX___, + __XX__XX,________,_XXX____, + _XX___XX,________,XXX_____, + ______XX,_______X,XX______, + ______XX,______XX,X_______, + ______XX,____XXX_,________, + ______XX,_XXXX___,________, + ________,XX______,________, + ________,________,________, +}; + +/* char: 默 code:0xC4AC */ +static GUI_CONST_STORAGE unsigned char acC4AC[72] = { + ________,________,________, + ________,_______X,X_______, + ________,_______X,XX______, + __XXXXXX,XXXX___X,X_XX____, + __XX__XX,_XXX___X,X__XXX__, + __XX__XX,XXXX___X,X__XXX__, + __XXXXXX,XXXX___X,X___XX__, + __XXXXXX,_XXX___X,X____XX_, + __XXXXXX,XXXXXXXX,XXXXXXX_, + __XX__XX,_XXX___X,XX______, + ______XX,_______X,XXX_____, + ______XX,_______X,XXX_____, + __XXXXXX,XXXX___X,XXX_____, + ______XX,_______X,XXX_____, + ______XX,_______X,XXX_____, + ______XX,XXXX__XX,XXX_____, + ___XXXXX,X_____XX,__XX____, + __XXX___,__XX__XX,__XX____, + _______X,X__XXXXX,__XXX___, + _____XX_,XX_XXXX_,___XX___, + __XX_XXX,XX__XX__,___XXX__, + __XX_XXX,___XX___,____XXX_, + __XX____,__XX____,____XX__, + ________,_XX_____,________, +}; + +/* char: 目 code:0xC4BF */ +static GUI_CONST_STORAGE unsigned char acC4BF[72] = { + ________,________,________, + ________,________,________, + ________,________,_XX_____, + ______XX,XXXXXXXX,XXXX____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XXX____, + ________,________,_XX_____, + ________,________,________, +}; + +/* char: 能 code:0xC4DC */ +static GUI_CONST_STORAGE unsigned char acC4DC[72] = { + ________,________,________, + ______XX,________,________, + ______XX,X_____XX,X_______, + _____XXX,______XX,___XX___, + _____XX_,_XX___XX,__XXXX__, + ____XX__,__XX__XX,_XXX____, + __XXX___,XXXXX_XX,XX______, + __XXXXXX,X__XX_XX,________, + ________,___XX_XX,_____XX_, + ___XXXXX,XXXX__XX,_____XX_, + ___XXX__,_XXX__XX,XXXXXXX_, + ___XXX__,_XXX____,________, + ___XXXXX,XXXX_XX_,________, + ___XXX__,_XXX__XX,___XX___, + ___XXX__,_XXX__XX,__XXXX__, + ___XXX__,_XXX__XX,_XXX____, + ___XXXXX,XXXX__XX,XX______, + ___XXX__,_XXX__XX,_____XX_, + ___XXX__,_XXX__XX,_____XX_, + ___XXX__,_XXX__XX,_____XX_, + ___XXX__,_XXX__XX,_____XXX, + ___XXX_X,XXXX__XX,XXXXXXX_, + ___XX___,_XX_____,________, + ________,________,________, +}; + +/* char: 配 code:0xC5E4 */ +static GUI_CONST_STORAGE unsigned char acC5E4[72] = { + ________,________,________, + ________,________,________, + ________,___XX___,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + _____XX_,XX______,____XX__, + _____XX_,XX______,____XX__, + __XXXXXX,XXXXX___,____XX__, + __XXXXX_,XXXXX___,____XX__, + __XXXXX_,XXXXX___,____XX__, + __XXXXX_,XXXXX___,____XX__, + __XXXXX_,XXXXX_XX,XXXXXX__, + __XXXXX_,XXXXX_XX,____XX__, + __XXXX__,XXXXX_XX,________, + __XXX___,XXXXX_XX,________, + __XXX___,__XXX_XX,________, + __XXXXXX,XXXXX_XX,________, + __XXX___,__XXX_XX,_____XX_, + __XXX___,__XXX_XX,_____XX_, + __XXX___,__XXX_XX,_____XX_, + __XXX___,__XXX_XX,_____XX_, + __XXXXXX,XXXXX_XX,_____XXX, + __XXX___,__XXX_XX,XXXXXXX_, + __XXX___,__XX____,________, + ________,________,________, +}; + +/* char: 坡 code:0xC6C2 */ +static GUI_CONST_STORAGE unsigned char acC6C2[72] = { + ________,________,________, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,__XXXXXX,XXXXXXX_, + _____XX_,__XXX__X,X___XXX_, + _____XX_,__XXX__X,X__XX___, + _XXXXXXX,XXXXX__X,X_______, + _____XX_,__XXX__X,X_______, + _____XX_,__XXX__X,X_______, + _____XX_,__XXXXXX,XXXXX___, + _____XX_,__XX_XX_,__XXX___, + _____XX_,__XX_XX_,__XX____, + _____XX_,__XX__XX,__XX____, + _____XXX,XXXX__XX,_XXX____, + ____XXXX,__XX___X,XXX_____, + _XXXX___,_XX____X,XX______, + __XX____,_XX____X,XX______, + ________,XX____XX,_XXX____, + ________,XX__XXX_,__XXXX__, + _______X,X_XXX___,___XXXXX, + ______XX,_XX_____,________, + ________,________,________, +}; + +/* char: 启 code:0xC6F4 */ +static GUI_CONST_STORAGE unsigned char acC6F4[72] = { + ________,________,________, + ________,___XX___,________, + ________,____XX__,________, + ________,____XXX_,________, + _____XXX,XXXXXXXX,XXXXX___, + _____XX_,________,__XXX___, + _____XX_,________,__XXX___, + _____XX_,________,__XXX___, + _____XX_,________,__XXX___, + _____XXX,XXXXXXXX,XXXXX___, + _____XX_,________,__XXX___, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,XXXXXXXX,XXXXX___, + _____XX_,XX______,__XXX___, + _____XX_,XX______,__XXX___, + ____XXX_,XX______,__XXX___, + ____XX__,XX______,__XXX___, + ____XX__,XX______,__XXX___, + ___XXX__,XX______,__XXX___, + ___XX___,XXXXXXXX,XXXXX___, + __XX____,XX______,__XXX___, + _XX_____,XX______,__XX____, + ________,________,________, +}; + +/* char: 器 code:0xC6F7 */ +static GUI_CONST_STORAGE unsigned char acC6F7[72] = { + ________,________,________, + ________,________,________, + ____XXXX,XXX__XXX,XXXXX___, + ____XXX_,_XXX_XXX,__XXX___, + ____XXX_,_XXX_XXX,__XXX___, + ____XXX_,_XXX_XXX,__XXX___, + ____XXX_,_XXX_XXX,__XXX___, + ____XXXX,XXXX_XXX,XXXXX___, + ____XXX_,_XXXXXXX,XXXXX___, + ____XX__,__XXX___,XXX_XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,_XX___XX,________, + ________,XX_____X,X_______, + _______X,X_______,XX______, + _____XXX,________,_XXXX___, + ____XXXX,XXXX_XXX,XXXXXXX_, + __XXXXX_,_XXX_XX_,__XXX___, + _____XX_,_XXX_XX_,__XXX___, + _____XX_,_XXX_XX_,__XXX___, + _____XX_,_XXX_XX_,__XXX___, + _____XXX,XXXX_XXX,XXXXX___, + _____XX_,_XXX_XX_,__XXX___, + ____XX__,_XX__XX_,__XX____, + ________,________,________, +}; + +/* char: 前 code:0xC7B0 */ +static GUI_CONST_STORAGE unsigned char acC7B0[72] = { + ________,________,________, + _______X,X_______,________, + ________,XX_____X,XX______, + ________,XXX____X,X_______, + ________,_XX___XX,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,__XX____, + ____XXXX,XXXX__XX,__XXX___, + ____XX__,__XX__XX,X_XXX___, + ____XX__,__XX__XX,__XXX___, + ____XX__,__XX__XX,__XXX___, + ____XXXX,XXXX__XX,__XXX___, + ____XX__,__XX__XX,__XXX___, + ____XX__,__XX__XX,__XXX___, + ____XX__,__XX__XX,__XXX___, + ____XXXX,XXXX__XX,__XXX___, + ____XX__,__XX__XX,__XXX___, + ____XX__,__XX__XX,X_XXX___, + ____XX__,__XX____,__XXX___, + ____XX__,__XX___X,X_XXX___, + ____XX_X,XXXX____,XXXX____, + ____XX__,_XX_____,_XX_____, + ________,________,________, +}; + +/* char: 请 code:0xC7EB */ +static GUI_CONST_STORAGE unsigned char acC7EB[72] = { + ________,________,________, + ________,______XX,________, + ____XX__,______XX,X_______, + ____XXX_,______XX,X___XX__, + ____XXX_,XXXXXXXX,XXXXXXX_, + _____XX_,______XX,X__XX___, + ________,__XXXXXX,XXXXXX__, + ________,______XX,X_______, + ________,______XX,X____XX_, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,__XXXXXX,XXXXX___, + ____XXX_,__XXX___,___XX___, + ____XXX_,__XXXXXX,XXXXX___, + ____XXX_,__XXX___,___XX___, + ____XXX_,XXXXX___,___XX___, + ____XXXX,X_XXXXXX,XXXXX___, + ____XXXX,__XXX___,___XX___, + ____XXXX,__XXX___,___XX___, + ____XXX_,__XXX___,___XX___, + ________,__XXX___,XXXXX___, + ________,__XX____,__XX____, + ________,________,________, +}; + +/* char: 求 code:0xC7F3 */ +static GUI_CONST_STORAGE unsigned char acC7F3[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX_X,XX______, + ________,___XX___,XXX_____, + ________,___XX___,_XXX____, + ________,___XX___,_XX_XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,___XXX__,________, + ________,___XXX__,________, + ____XXX_,___XXX__,___XX___, + _____XXX,___XXXX_,__XXXX__, + ______XX,X__XXXX_,_XXX____, + _______X,X__XX_XX,XX______, + ________,___XX_XX,X_______, + ________,_XXXX_XX,X_______, + ________,XX_XX__X,XX______, + ______XX,X__XX___,XXX_____, + ____XXX_,___XX___,XXXX____, + _XXXXX__,___XX___,_XXXXX__, + __XX____,___XX___,__XXXXXX, + _______X,XX_XX___,____XX__, + ________,_XXXX___,________, + ________,__XX____,________, + ________,________,________, +}; + +/* char: 驱 code:0xC7FD */ +static GUI_CONST_STORAGE unsigned char acC7FD[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XX______,_____XX_, + ________,XXX_XXXX,XXXXXXX_, + ________,XX__XX__,________, + ____XX__,XX__XX__,________, + ____XX__,XX__XX__,____XX__, + ___XXX__,XX__XXXX,____XXX_, + ___XXX__,XX__XX_X,X__XXX__, + ___XX___,XX__XX__,XX_XX___, + ___XX__X,XX__XX__,_XXXX___, + ___XX__X,XX__XX__,_XXX____, + ___XXXXX,XXXXXX__,_XXX____, + ___XX___,__XXXX__,_XXXX___, + ________,_XXXXX__,XX_XXX__, + ________,XXX_XX__,XX__XX__, + _____XXX,XXX_XX_X,X___XX__, + _XXXXX__,_XX_XXXX,________, + ________,_XX_XX__,________, + ________,XXX_XX__,_____XX_, + ______XX,XX__XXXX,XXXXXXXX, + _______X,X___XX__,________, + ________,________,________, +}; + +/* char: 取 code:0xC8A1 */ +static GUI_CONST_STORAGE unsigned char acC8A1[72] = { + ________,________,________, + ________,________,________, + ________,___XX___,________, + _XXXXXXX,XXXXX___,________, + ____XX__,_XX_____,________, + ____XX__,_XXXXXXX,XXXXXX__, + ____XX__,_XX__XX_,___XX___, + ____XXXX,XXX__XX_,___XX___, + ____XX__,_XX__XX_,___XX___, + ____XX__,_XX___XX,__XXX___, + ____XX__,_XX___XX,__XX____, + ____XX__,_XX___XX,__XX____, + ____XXXX,XXX___XX,_XXX____, + ____XX__,_XX____X,XXX_____, + ____XX__,_XX____X,XXX_____, + ____XX__,_XXXXX_X,XX______, + ____XX_X,XXXX____,XX______, + _XXXXXXX,_XX____X,XXX_____, + __XXX___,_XX___XX,_XXX____, + ________,_XX__XXX,__XXXX__, + ________,_XX_XXX_,___XXXXX, + ________,_XXXX___,____XX__, + ________,_XXX____,________, + ________,________,________, +}; + +/* char: 认 code:0xC8CF */ +static GUI_CONST_STORAGE unsigned char acC8CF[72] = { + ________,________,________, + ________,________,________, + ________,______XX,________, + _____XX_,______XX,X_______, + _____XXX,______XX,________, + ______XX,______XX,________, + ______XX,______XX,________, + ______XX,______XX,X_______, + ________,______XX,X_______, + _____XX_,______XX,X_______, + _XXXXXXX,______XX,X_______, + _____XX_,_____XXX,X_______, + _____XX_,_____XXX,X_______, + _____XX_,_____XX_,XX______, + _____XX_,_____XX_,XX______, + _____XX_,__XXXXX_,XX______, + _____XX_,_XX_XX__,_XX_____, + _____XX_,XX_XXX__,_XXX____, + _____XXX,X__XX___,__XX____, + _____XXX,__XX____,__XXX___, + _____XXX,_XX_____,___XXXX_, + _____XXX,XX______,____XXX_, + ______XX,________,________, + ________,________,________, +}; + +/* char: 入 code:0xC8EB */ +static GUI_CONST_STORAGE unsigned char acC8EB[72] = { + ________,________,________, + ________,________,________, + _______X,XX______,________, + ________,_XXX____,________, + ________,__XXX___,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,__XXXXX_,________, + ________,__XX_XX_,________, + ________,__XX_XX_,________, + ________,_XXX__XX,________, + ________,_XX___XX,________, + ________,XX____XX,X_______, + _______X,XX_____X,XX______, + _______X,X_______,XX______, + ______XX,________,XXX_____, + _____XXX,________,_XXX____, + ____XXX_,________,__XXXX__, + ___XX___,________,___XXXXX, + __XX____,________,____XX__, + _XX_____,________,________, + ________,________,________, +}; + +/* char: 设 code:0xC9E8 */ +static GUI_CONST_STORAGE unsigned char acC9E8[72] = { + ________,________,________, + ________,________,________, + ____XX__,___XXXXX,XXX_____, + _____XX_,___XXX__,_XXX____, + _____XXX,___XXX__,_XX_____, + _____XXX,___XXX__,_XX_____, + ________,___XX___,_XX_____, + ________,___XX___,_XX_____, + ________,__XX____,_XX_____, + _XXXXXXX,_XXX____,_XXXXXXX, + _____XX_,XX______,__XX____, + _____XXX,X_XXXXXX,XXXXX___, + _____XX_,___XX___,__XX____, + _____XX_,____XX__,_XXX____, + _____XX_,____XX__,_XXX____, + _____XX_,_____XX_,_XX_____, + _____XX_,_XX__XX_,XX______, + _____XX_,XX____XX,XX______, + _____XXX,X_____XX,X_______, + _____XXX,_____XXX,XXX_____, + _____XXX,___XXX__,_XXXX___, + ________,_XXX____,___XXXX_, + _______X,XX______,________, + ________,________,________, +}; + +/* char: 生 code:0xC9FA */ +static GUI_CONST_STORAGE unsigned char acC9FA[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ______XX,___XXX__,________, + _____XXX,___XXX__,________, + _____XXX,___XXX__,________, + _____XX_,___XXX__,___XX___, + ____XXXX,XXXXXXXX,XXXXXX__, + ____XX__,___XXX__,________, + ____XX__,___XXX__,________, + ___XX___,___XXX__,________, + ___XX___,___XXX__,________, + __XX____,___XXX__,________, + _XX_____,___XXX__,__XX____, + _____XXX,XXXXXXXX,XXXXX___, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,____XXX_, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 失 code:0xCAA7 */ +static GUI_CONST_STORAGE unsigned char acCAA7[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ______XX,___XXX__,________, + ______XX,___XXX__,________, + _____XXX,___XXX__,__XX____, + _____XXX,XXXXXXXX,XXXXX___, + _____XX_,___XXX__,________, + ____XX__,___XXX__,________, + ____XX__,___XX___,________, + ___XX___,___XX___,________, + ________,___XX___,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,___XXXX_,________, + ________,__XXXXX_,________, + ________,__XX__XX,________, + ________,_XXX__XX,________, + ________,_XX____X,X_______, + ________,XX______,XX______, + _______X,X_______,_XXX____, + ______XX,________,__XXX___, + ____XXX_,________,___XXXXX, + __XXX___,________,____XX__, + ________,________,________, +}; + +/* char: 石 code:0xCAAF */ +static GUI_CONST_STORAGE unsigned char acCAAF[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,__XXX___,________, + ________,__XX____,________, + ________,_XXX____,________, + ________,_XX_____,________, + ________,XX______,________, + _______X,XX______,__XX____, + _______X,XXXXXXXX,XXXXX___, + ______XX,XX______,__XX____, + _____XXX,XX______,__XX____, + ____XXX_,XX______,__XX____, + ___XX___,XX______,__XX____, + __XX____,XX______,__XX____, + _XX_____,XX______,__XX____, + ________,XX______,__XX____, + ________,XXXXXXXX,XXXX____, + ________,XX______,__XX____, + ________,XX______,__XX____, + _______X,X_______,________, + ________,________,________, +}; + +/* char: 时 code:0xCAB1 */ +static GUI_CONST_STORAGE unsigned char acCAB1[72] = { + ________,________,________, + ________,________,_XX_____, + ________,________,_XXX____, + ________,________,_XX_____, + __XXXXXX,XX______,_XX_____, + __XX___X,XX______,_XX_____, + __XX___X,XX______,_XX_____, + __XX___X,XXXXXXXX,XXXXXXX_, + __XX___X,XX______,_XX_____, + __XX___X,XX______,_XX_____, + __XXXXXX,XX______,_XX_____, + __XX___X,XX_XX___,_XX_____, + __XX___X,XX__XXX_,_XX_____, + __XX___X,XX__XXX_,_XX_____, + __XX___X,XX___XX_,_XX_____, + __XX___X,XX______,_XX_____, + __XX___X,XX______,_XX_____, + __XXXXXX,XX______,_XX_____, + __XX___X,XX______,_XX_____, + __XX___X,X_______,_XX_____, + ________,_____XX_,_XX_____, + ________,______XX,XXX_____, + ________,________,XX______, + ________,________,________, +}; + +/* char: 实 code:0xCAB5 */ +static GUI_CONST_STORAGE unsigned char acCAB5[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,____XXX_,________, + ________,____XX__,________, + ____XXXX,XXXXXXXX,XXXXXXX_, + ___XX___,________,____XXX_, + ___XX__X,X____XX_,___XX___, + __XXX___,XXX__XXX,________, + ________,_XXX_XX_,________, + ________,_XX__XX_,________, + _____XXX,_____XX_,________, + ______XX,X____XX_,________, + _______X,X___XXX_,________, + _______X,X___XXX_,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,____XX__,________, + ________,___XXXX_,________, + ________,___XX_XX,X_______, + ________,__XX____,XXXX____, + ________,XXX_____,__XXX___, + _____XXX,X_______,___XXX__, + __XXXX__,________,____XX__, + ________,________,________, +}; + +/* char: 使 code:0xCAB9 */ +static GUI_CONST_STORAGE unsigned char acCAB9[72] = { + ________,________,________, + _______X,X_____XX,________, + ______XX,X_____XX,X_______, + ______XX,X_____XX,X_______, + ______XX,______XX,X_______, + _____XXX,XXXXXXXX,XXXXXXX_, + _____XX_,______XX,X_______, + ____XXX_,______XX,X_______, + ____XXXX,__XXXXXX,XXXXXX__, + ___XXXX_,__XX__XX,X__XXX__, + ___XXXX_,__XX__XX,X__XXX__, + __XX_XX_,__XX__XX,X__XXX__, + _XX__XX_,__XXXXXX,XXXXXX__, + _____XX_,_XXX__XX,X__XXX__, + _____XX_,__XX__XX,________, + _____XX_,___XX_XX,________, + _____XX_,____XXXX,________, + _____XX_,_____XXX,________, + _____XX_,_____XXX,________, + _____XX_,____XXXX,XX______, + _____XX_,___XXX__,XXXX____, + _____XX_,_XXX____,_XXXXXXX, + _____XXX,XX______,____XX__, + ________,________,________, +}; + +/* char: 试 code:0xCAD4 */ +static GUI_CONST_STORAGE unsigned char acCAD4[72] = { + ________,________,________, + ________,________,________, + ________,_______X,X_______, + ___XX___,_______X,XXXXX___, + ____XX__,________,XX_XXX__, + ____XXX_,________,XX__XX__, + _____XX_,________,XX___XX_, + _____XX_,XXXXXXXX,XXXXXXXX, + ________,________,XX______, + ________,________,XX______, + _XXXXXXX,______XX,XX______, + _____XX_,XXXXXXXX,XX______, + _____XX_,____XX__,XX______, + _____XX_,____XX__,XXX_____, + _____XX_,____XX__,_XX_____, + _____XX_,____XX__,_XX_____, + _____XX_,_XX_XX__,_XXX____, + _____XX_,XX__XX_X,X_XX__XX, + _____XXX,X___XXXX,__XXX_XX, + _____XXX,_XXXX___,___XX_XX, + ____XXXX,_XX_____,___XXXX_, + _____XX_,________,____XXXX, + ________,________,______XX, + ________,________,________, +}; + +/* char: 首 code:0xCAD7 */ +static GUI_CONST_STORAGE unsigned char acCAD7[72] = { + ________,________,________, + _______X,X______X,X_______, + ________,XX_____X,XX______, + ________,XXX____X,X_______, + ________,_XX___XX,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,__XXX___,________, + ________,__XX____,________, + ________,__XX____,________, + ______XX,XXXXXXXX,XXXX____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ________,________,________, +}; + +/* char: 输 code:0xCAE4 */ +static GUI_CONST_STORAGE unsigned char acCAE4[72] = { + ________,________,________, + ________,______XX,________, + ____XXX_,______XX,X_______, + ____XXX_,_____XXX,X_______, + ____XX__,_____XX_,XX______, + _XXXXXXX,XXX_XXX_,_XX_____, + ___XXX__,____XX__,__XX____, + ___XX___,___XX___,_XXXXX__, + ___XXXXX,_XXXXXXX,XXXXXXX_, + __XXX_XX,XX______,________, + __XX__XX,__XXXXXX,____XX__, + _XXXXXXX,XXXX__XX,_XX_XX__, + ______XX,__XX__XX,_XX_XX__, + ______XX,__XXXXXX,_XX_XX__, + ______XX,__XX__XX,_XX_XX__, + ______XX,XXXX__XX,_XX_XX__, + ___XXXXX,__XXXXXX,_XX_XX__, + _XXX__XX,__XX__XX,_XX_XX__, + ______XX,__XX__XX,_XX_XX__, + ______XX,__XX__XX,____XX__, + _____XXX,__XX__XX,____XX__, + _____XXX,__XXXXXX,__XXXX__, + _____XXX,__XX_XX_,___XX___, + ________,________,________, +}; + +/* char: 术 code:0xCAF5 */ +static GUI_CONST_STORAGE unsigned char acCAF5[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX_X,X_______, + ________,___XXX__,XXX_____, + ________,___XXX__,_XXX____, + ________,___XXX__,__XX____, + ________,___XXX__,__XXXX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,__XXXXX_,________, + ________,__XXXXX_,________, + ________,_XXXXXXX,________, + ________,_XXXXXXX,________, + ________,XXXXXX_X,X_______, + _______X,XX_XXX_X,X_______, + _______X,X__XXX__,XX______, + ______XX,___XXX__,XXX_____, + _____XX_,___XXX__,_XXXX___, + ____XX__,___XXX__,__XXXX__, + ___XX___,___XXX__,___XXXX_, + __XX____,___XXX__,____XX__, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 数 code:0xCAFD */ +static GUI_CONST_STORAGE unsigned char acCAFD[72] = { + ________,________,________, + _______X,X______X,X_______, + ___XX__X,X__XX__X,XX______, + ____XX_X,X__XX__X,X_______, + ____XXXX,X_XX__XX,X_______, + ____XX_X,XXX___XX,________, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ______XX,X____XXX,___XX___, + _____XXX,XXX__XXX,___XX___, + _____XXX,X_XX_XXX,___XX___, + ____XX_X,X_XXXXXX,__XXX___, + __XXX__X,X___XXXX,__XXX___, + _XX____X,X______X,X_XXX___, + ______XX,X______X,X_XX____, + _XXXXXXX,XXXXX__X,X_XX____, + _____XXX,__XX___X,XXXX____, + _____XX_,__XX____,XXX_____, + ____XXXX,_XX_____,XXX_____, + _______X,XXXX___X,XXXX____, + _______X,XXXXX_XX,X_XXX___, + _____XXX,___XXXXX,___XXXX_, + ___XXX__,___XXX__,____XXX_, + _XXX____,__XX____,________, + ________,________,________, +}; + +/* char: 司 code:0xCBBE */ +static GUI_CONST_STORAGE unsigned char acCBBE[72] = { + ________,________,________, + ________,________,________, + ____XXXX,XXXXXXXX,XXXXX___, + ________,________,___XX___, + ________,________,___XX___, + ________,________,___XX___, + ________,________,___XX___, + __XXXXXX,XXXXXXXX,X__XX___, + ________,________,___XX___, + ________,________,___XX___, + _____XXX,XXXXXXX_,___XX___, + _____XX_,____XXX_,___XX___, + _____XX_,____XXX_,___XX___, + _____XX_,____XXX_,___XX___, + _____XX_,____XXX_,___XX___, + _____XX_,____XXX_,___XX___, + _____XXX,XXXXXXX_,___XX___, + _____XX_,____XXX_,___XX___, + _____XX_,____XX__,___XX___, + ________,________,___XX___, + ________,_______X,X_XXX___, + ________,________,XXXXX___, + ________,________,__XX____, + ________,________,________, +}; + +/* char: 苏 code:0xCBD5 */ +static GUI_CONST_STORAGE unsigned char acCBD5[72] = { + ________,________,________, + ________,XX____XX,________, + ________,XX____XX,X_______, + ________,XX____XX,X___XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,XX____XX,X_______, + ________,XX____XX,X_______, + ________,XXXXX_XX,X_______, + ________,__XXX___,________, + ________,__XXX___,________, + ___XXXXX,XXXXXXXX,XXXX____, + ________,__XX____,XXX_____, + ________,__XX____,XXX_____, + ________,__XX____,XXX_____, + ____XX__,_XXX____,XX_XXX__, + ____XX__,_XX_____,XX__XXX_, + ___XXX__,_XX_____,XX__XXX_, + __XXX___,XX______,XX___XX_, + _______X,XX______,XX______, + _______X,X______X,XX______, + _____XXX,___XXXXX,XX______, + ____XX__,_____XXX,X_______, + ___XX___,________,________, + ________,________,________, +}; + +/* char: 所 code:0xCBF9 */ +static GUI_CONST_STORAGE unsigned char acCBF9[72] = { + ________,________,________, + ________,________,________, + ________,__XX____,____XX__, + _______X,XXXXX___,_XXXXXX_, + ____XXXX,_____XXX,XX______, + ____XX__,_____XX_,________, + ____XX__,_____XX_,________, + ____XX__,_____XX_,________, + ____XXXX,XXXX_XX_,_____XX_, + ____XX__,_XXX_XXX,XXXXXXXX, + ____XX__,_XXX_XX_,__XX____, + ____XX__,_XXX_XX_,__XX____, + ____XX__,_XXX_XX_,__XX____, + ____XXXX,XXXX_XX_,__XX____, + ____XX__,_XXXXXX_,__XX____, + ____XX__,____XX__,__XX____, + ___XXX__,____XX__,__XX____, + ___XX___,___XXX__,__XX____, + ___XX___,___XX___,__XX____, + ___XX___,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,_XX_____,__XX____, + _XX_____,XX______,__XX____, + ________,________,________, +}; + +/* char: 特 code:0xCCD8 */ +static GUI_CONST_STORAGE unsigned char acCCD8[72] = { + ________,________,________, + ________,______XX,X_______, + ______XX,______XX,X_______, + ______XX,______XX,X__XX___, + __XXX_XX,__XXXXXX,XXXXXX__, + __XXX_XX,______XX,X_______, + __XX__XX,______XX,X_______, + __XXXXXX,XXX___XX,X_______, + __XX__XX,______XX,X____XX_, + _XX___XX,_XXXXXXX,XXXXXXXX, + _XX___XX,________,_XX_____, + ______XX,_XX_____,_XXX____, + ______XX,XX______,_XX__XX_, + _____XXX,_XXXXXXX,XXXXXXXX, + ___XXXXX,________,_XX_____, + _XXXX_XX,___XX___,_XX_____, + __XX__XX,___XXX__,_XX_____, + ______XX,____XXX_,_XX_____, + ______XX,____XX__,_XX_____, + ______XX,________,_XX_____, + ______XX,_____XXX,_XX_____, + ______XX,_______X,XXX_____, + ______XX,________,XX______, + ________,________,________, +}; + +/* char: 条 code:0xCCF5 */ +static GUI_CONST_STORAGE unsigned char acCCF5[72] = { + ________,________,________, + ________,XX______,________, + ________,XXX_____,________, + _______X,XXXXXXXX,XXX_____, + _______X,XX______,XXX_____, + ______XX,_XX____X,XX______, + _____XX_,_XX___XX,X_______, + ____XX__,__XX_XXX,________, + ___XX___,___XXXX_,________, + __XX____,___XXXX_,________, + ________,_XXX_XXX,X_______, + ______XX,XX__XX_X,XXXXXXXX, + __XXXXX_,____XX__,_XXXXX__, + ________,____XX__,__XX____, + ____XXXX,XXXXXXXX,XXXXX___, + ________,____XX__,________, + _______X,XX__XX_X,X_______, + _______X,XX__XX__,XX______, + ______XX,X___XX__,_XXX____, + _____XXX,____XX__,__XXX___, + ____XX__,XX_XXX__,___XXX__, + ___XX___,_XXXXX__,___XXX__, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 维 code:0xCEAC */ +static GUI_CONST_STORAGE unsigned char acCEAC[72] = { + ________,________,________, + ________,____XX__,________, + _____XXX,____XXX_,XX______, + _____XX_,____XX__,XXX_____, + ____XXX_,___XXX__,_XX_____, + ____XX__,___XX___,_XX_____, + ____XX__,XXXXXXXX,XXXXXXX_, + ___XX__X,XXXXX___,XX______, + ___XX__X,X_XXX___,XX______, + __XX_XXX,XXXXX___,XX__XX__, + __XXXXXX,_XXXXXXX,XXXXXXX_, + __XX_XXX,XX_XX___,XX______, + _____XX_,___XX___,XX______, + ____XX__,___XX___,XX______, + ___XX__X,XX_XX___,XX__XX__, + __XXXXXX,___XXXXX,XXXXXXX_, + __XXX___,___XX___,XX______, + ________,_XXXX___,XX______, + ______XX,XX_XX___,XX______, + ___XXXX_,___XX___,XX___XX_, + __XXX___,___XXXXX,XXXXXXXX, + ________,___XX___,________, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 未 code:0xCEB4 */ +static GUI_CONST_STORAGE unsigned char acCEB4[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ____XXXX,XXXXXXXX,XXXX____, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,__XXXXX_,________, + ________,_XXXXXX_,________, + ________,_XXXXXXX,________, + ________,XXXXXX_X,X_______, + _______X,XX_XXX_X,XX______, + ______XX,X__XXX__,XXX_____, + _____XXX,___XXX__,_XXX____, + ____XX__,___XXX__,__XXXX__, + ___XX___,___XXX__,___XXXX_, + _XXX____,___XXX__,____XX__, + ________,___XXX__,________, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 位 code:0xCEBB */ +static GUI_CONST_STORAGE unsigned char acCEBB[72] = { + ________,________,________, + ______XX,____XX__,________, + ______XX,X____XX_,________, + ______XX,_____XXX,________, + _____XXX,______XX,________, + _____XX_,______XX,____XX__, + _____XX_,XXXXXXXX,XXXXXXX_, + ____XXX_,________,________, + ____XXXX,________,__XX____, + ___XXXX_,________,__XXX___, + ___XXXX_,__XX____,_XXX____, + __XX_XX_,___XX___,_XXX____, + __XX_XX_,___XX___,_XX_____, + _XX__XX_,___XXX__,_XX_____, + _____XX_,___XXX__,_XX_____, + _____XX_,___XXX__,XX______, + _____XX_,____XX__,XX______, + _____XX_,________,XX______, + _____XX_,_______X,X_______, + _____XX_,_______X,X____XX_, + _____XXX,XXXXXXXX,XXXXXXXX, + _____XX_,________,________, + _____XX_,________,________, + ________,________,________, +}; + +/* char: 温 code:0xCEC2 */ +static GUI_CONST_STORAGE unsigned char acCEC2[72] = { + ________,________,________, + ________,________,________, + ___XX___,________,__XX____, + ____XXX_,_XXXXXXX,XXXX____, + _____XX_,_XX_____,__XX____, + ________,_XX_____,__XX____, + _______X,XXXXXXXX,XXXX____, + _XX____X,XXX_____,__XX____, + __XXX_XX,_XX_____,__XX____, + ___XX_XX,_XX_____,__XX____, + ___XX_XX,_XXXXXXX,XXXX____, + _____XX_,_XX_____,__XX____, + _____XX_,________,________, + _____XX_,XXXXXXXX,XXXXXX__, + _____XX_,XX__XX_X,X__XX___, + ____XX__,XX__XX_X,X__XX___, + _XXXXX__,XX__XX_X,X__XX___, + ___XXX__,XX__XX_X,X__XX___, + ___XXX__,XX__XX_X,X__XX___, + ___XXX__,XX__XX_X,X__XX___, + ___XXX__,XX__XX_X,X__XXXX_, + ___XXXXX,XXXXXXXX,XXXXXXXX, + ________,________,________, + ________,________,________, +}; + +/* char: 误 code:0xCEF3 */ +static GUI_CONST_STORAGE unsigned char acCEF3[72] = { + ________,________,________, + ________,________,________, + ________,__XXXXXX,XXXXX___, + ____XXX_,__XXX___,___XX___, + _____XX_,__XXX___,___XX___, + _____XXX,__XXX___,___XX___, + ________,__XXX___,___XX___, + ________,__XXXXXX,XXXXX___, + ________,__XXX___,________, + _XXXXXXX,________,________, + _____XX_,_XXXXXXX,XXXXXX__, + _____XX_,______XX,________, + _____XX_,______XX,________, + _____XX_,______XX,________, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,_XX___XX,X_______, + _____XX_,XX___XXX,XX______, + _____XXX,X____XX_,XX______, + _____XXX,____XXX_,_XX_____, + _____XXX,___XXX__,__XX____, + _____XX_,__XXX___,__XXXX__, + ________,_XXX____,___XXXXX, + _______X,XX______,________, + ________,________,________, +}; + +/* char: 息 code:0xCFA2 */ +static GUI_CONST_STORAGE unsigned char acCFA2[72] = { + ________,________,________, + ________,__XXX___,________, + ________,__XX____,________, + ______XX,XXXXXXXX,XXXX____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXXX____, + ______XX,__XX____,_XX_____, + ________,___XX___,________, + _______X,X__XXX__,________, + ____XX_X,XX__XXX_,___XX___, + ____XX_X,XX__XXX_,____XX__, + ____XX_X,XX______,_XX_XXX_, + ___XXX_X,XX______,_XX__XX_, + __XXXX__,XX______,XXX__XX_, + ________,XXXXXXXX,XXX_____, + ________,________,________, + ________,________,________, +}; + +/* char: 限 code:0xCFDE */ +static GUI_CONST_STORAGE unsigned char acCFDE[72] = { + ________,________,________, + ________,________,________, + ___XXXXX,XX______,___XX___, + ___XX__X,X__XXXXX,XXXXX___, + ___XX__X,X__XX___,__XXX___, + ___XX__X,X__XX___,__XXX___, + ___XX_XX,___XX___,__XXX___, + ___XX_XX,___XXXXX,XXXXX___, + ___XX_XX,___XX___,__XXX___, + ___XX_XX,___XX___,__XXX___, + ___XX__X,X__XX___,__XXX___, + ___XX__X,X__XXXXX,XXXXX___, + ___XX___,XX_XX_XX,__XX____, + ___XX___,XX_XX_XX,___XXX__, + ___XX___,XX_XX_XX,___XXX__, + ___XXX_X,XX_XX__X,XXXX____, + ___XXXXX,XX_XX__X,XX______, + ___XX_XX,___XX___,XX______, + ___XX___,___XX__X,XXX_____, + ___XX___,___XXXXX,_XXX____, + ___XX___,___XXX__,__XXXX__, + ___XX___,___XX___,___XXXX_, + ___XX___,___XX___,________, + ________,________,________, +}; + +/* char: 项 code:0xCFEE */ +static GUI_CONST_STORAGE unsigned char acCFEE[72] = { + ________,________,________, + ________,________,____XX__, + ________,_XXXXXXX,XXXXXXX_, + ________,XX_____X,X_______, + _XXXXXXX,XXX____X,X_______, + _____XX_,______XX,________, + _____XX_,___XXXXX,XXXXXX__, + _____XX_,___XX___,____XX__, + _____XX_,___XX___,____XX__, + _____XX_,___XX__X,XX__XX__, + _____XX_,___XX__X,XX__XX__, + _____XX_,___XX__X,XX__XX__, + _____XX_,___XX__X,XX__XX__, + _____XX_,___XX__X,XX__XX__, + _____XX_,XXXXX__X,X___XX__, + _____XXX,X__XX__X,X___XX__, + __XXXX__,___XX__X,XX__XX__, + __XX____,______XX,XXX_____, + ________,______XX,__XXX___, + ________,_____XXX,___XXX__, + ________,____XXX_,____XXX_, + ________,__XXX___,_____XX_, + ________,XXX_____,_____XX_, + ________,________,________, +}; + +/* char: 消 code:0xCFFB */ +static GUI_CONST_STORAGE unsigned char acCFFB[72] = { + ________,________,________, + ________,_______X,X_______, + ____XX__,_XX____X,X_______, + ____XXX_,__XX___X,X__XXXX_, + _____XXX,___XX__X,X__XX___, + _____XXX,___XXX_X,X_XX____, + ________,XX_XXX_X,XXX_____, + _XX_____,XX_____X,XXX_____, + __XXX___,XXXXXXXX,XXXXXX__, + ___XXX_X,X_XX____,___XX___, + ___XXX_X,X_XX____,___XX___, + _______X,X_XXXXXX,XXXXX___, + ______XX,__XX____,___XX___, + ______XX,__XX____,___XX___, + ______XX,__XX____,___XX___, + _____XX_,__XXXXXX,XXXXX___, + __XXXXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XX____,___XX___, + ____XXX_,__XX____,XXXXX___, + _____XX_,__XX____,__XX____, + ________,________,________, +}; + +/* char: 校 code:0xD0A3 */ +static GUI_CONST_STORAGE unsigned char acD0A3[72] = { + ________,________,________, + _____XX_,_____XX_,________, + _____XXX,______XX,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,XXXXXXXX,XXXXXXX_, + _XXXXXXX,XXX_____,________, + _____XX_,_____XX_,_XX_____, + _____XX_,____XXX_,__XXX___, + ____XXXX,X__XXX__,___XXX__, + ____XXXX,XX_XX___,____XXX_, + ____XXX_,XXXXX___,__XXXXX_, + ___XXXX_,_XX_XX__,_XXXX___, + ___XXXX_,____XX__,_XXX____, + ___XXXX_,____XX__,XXX_____, + __XX_XX_,_____XX_,XXX_____, + _XX__XX_,_____XXX,XX______, + _____XX_,______XX,X_______, + _____XX_,______XX,X_______, + _____XX_,_____XXX,XXX_____, + _____XX_,___XXX__,_XXXX___, + _____XX_,_XXX____,__XXXXXX, + _____XXX,XX______,____XX__, + ________,________,________, +}; + +/* char: 斜 code:0xD0B1 */ +static GUI_CONST_STORAGE unsigned char acD0B1[72] = { + ________,________,________, + _______X,X_______,__XX____, + _______X,XX______,__XXX___, + ______XX,XX______,__XXX___, + ______XX,_XXX__XX,__XXX___, + _____XX_,__XXX__X,XXXXX___, + ____XXX_,___XXX_X,XXXXX___, + ____XX__,__XXXX__,__XXX___, + ___XXXXX,XXXXX___,__XXX___, + __XX___X,X____XX_,__XXX___, + _XX____X,X_____XX,X_XXX___, + _______X,X__XX__X,X_XXX___, + __XXXXXX,XXXXXX_X,X_XXX___, + _______X,X_______,__XXXXX_, + ____XX_X,X_______,__XXXXX_, + ____XXXX,X_XXXXXX,XXXXX___, + ____XX_X,X_XXX___,__XXX___, + ___XXX_X,X__XXX__,__XXX___, + ___XX__X,X__XXX__,__XXX___, + __XX___X,X___XX__,__XXX___, + __XX___X,X_______,__XXX___, + _XX__XXX,X_______,__XXX___, + ______XX,________,__XX____, + ________,________,________, +}; + +/* char: 信 code:0xD0C5 */ +static GUI_CONST_STORAGE unsigned char acD0C5[72] = { + ________,________,________, + ________,_____XX_,________, + ______XX,X_____XX,________, + ______XX,______XX,X_______, + ______XX,______XX,X___XX__, + _____XX_,XXXXXXXX,XXXXXXX_, + _____XX_,________,________, + ____XX__,________,___XX___, + ____XXX_,_XXXXXXX,XXXXXX__, + ___XXXX_,________,________, + ___XXXX_,________,___XX___, + __XX_XX_,_XXXXXXX,XXXXXX__, + _XX__XX_,________,________, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,__XXXXXX,XXXXXX__, + _____XX_,__XX____,___XX___, + _____XX_,__XX____,___XX___, + _____XX_,__XX____,___XX___, + _____XX_,__XX____,___XX___, + _____XX_,__XXXXXX,XXXXX___, + _____XX_,__XX____,___XX___, + _____XX_,__XX____,___XX___, + ________,________,________, +}; + +/* char: 行 code:0xD0D0 */ +static GUI_CONST_STORAGE unsigned char acD0D0[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,X_______,________, + ______XX,___XXXXX,XXXXXX__, + _____XX_,________,________, + ____XX__,XX______,________, + ___XX__X,XX______,________, + __XX__XX,X_______,_____XX_, + ______XX,_XXXXXXX,XXXXXXX_, + _____XXX,________,XX______, + ____XXXX,________,XX______, + ____XXXX,________,XX______, + ___XX_XX,________,XX______, + __XX__XX,________,XX______, + ______XX,________,XX______, + ______XX,________,XX______, + ______XX,________,XX______, + ______XX,________,XX______, + ______XX,________,XX______, + ______XX,___XXXXX,XX______, + ______XX,______XX,XX______, + ________,_______X,X_______, + ________,________,________, +}; + +/* char: 性 code:0xD0D4 */ +static GUI_CONST_STORAGE unsigned char acD0D4[72] = { + ________,________,________, + _____XX_,_______X,X_______, + _____XX_,_______X,XX______, + _____XX_,___XX__X,X_______, + _____XX_,___XXX_X,X_______, + _____XX_,__XXX__X,X_______, + _____XXX,__XXX__X,X___XX__, + _____XXX,XXXXXXXX,XXXXXXX_, + ___XXXXX,XXXX___X,X_______, + __XX_XX_,_XX____X,X_______, + __XX_XX_,_XX____X,X_______, + _XXX_XX_,XX_____X,X_______, + _____XX_,XX_____X,X_______, + _____XX_,__XXXXXX,XXXXXX__, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X_______, + _____XX_,_______X,X____XX_, + _____XX_,XXXXXXXX,XXXXXXXX, + _____XX_,________,________, + _____XX_,________,________, + ________,________,________, +}; + +/* char: 修 code:0xD0DE */ +static GUI_CONST_STORAGE unsigned char acD0DE[72] = { + ________,________,________, + ______XX,______XX,________, + ______XX,_____XXX,________, + _____XXX,_____XX_,________, + _____XX_,____XXXX,XXXXXX__, + _____XX_,____XXX_,___XXX__, + ____XX_X,XX_XX_XX,__XXX___, + ____XXXX,XXXX___X,XXXX____, + ___XXXXX,XX______,XXX_____, + ___XXXXX,XX_____X,XXX_____, + __XXXXXX,XX___XXX,__XXXX__, + __XXXXXX,XX_XXX__,_XX_XXX_, + _XX_XXXX,XXXX___X,XXX_____, + ____XXXX,XX____XX,X_______, + ____XXXX,XX___XX_,__XXX___, + ____XXXX,XX_XXX__,_XXX____, + ____XXXX,XX______,XXX__XX_, + ____XXXX,XX____XX,X___XXX_, + ____XXXX,XX__XXX_,___XXX__, + ____XXX_,__XXX___,_XXX____, + ____XXX_,_______X,XX______, + ____XXX_,___XXXXX,________, + ____XX__,XXXX____,________, + ________,________,________, +}; + +/* char: 需 code:0xD0E8 */ +static GUI_CONST_STORAGE unsigned char acD0E8[72] = { + ________,________,________, + ________,________,________, + ________,________,__XX____, + ____XXXX,XXXXXXXX,XXXXX___, + ________,____XX__,________, + ____XXXX,XXXXXXXX,XXXXXXX_, + ___XX___,____XX__,____XX__, + __XXX_XX,XXX_XXXX,XXXXX___, + ________,____XX__,________, + _____XXX,XXX_XXXX,XXX_____, + ________,____XX__,________, + ________,________,________, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,__XX____,________, + ____XXXX,XXXXXXXX,XXXXX___, + ____XXX_,_XXX__XX,___XX___, + ____XXX_,_XXX__XX,___XX___, + ____XXX_,_XXX__XX,___XX___, + ____XXX_,_XXX__XX,___XX___, + ____XXX_,_XXX__XX,___XX___, + ____XXX_,_XXX__XX,___XX___, + ____XXX_,_XX_____,_XXXX___, + ____XX__,________,__XX____, + ________,________,________, +}; + +/* char: 选 code:0xD1A1 */ +static GUI_CONST_STORAGE unsigned char acD1A1[72] = { + ________,________,________, + ________,______XX,________, + ___XX___,______XX,________, + ____XX__,__XX__XX,________, + _____XX_,__XXX_XX,________, + _____XX_,__XX__XX,________, + ________,__XXXXXX,XXXXX___, + ________,_XX___XX,________, + ________,_XX___XX,________, + _XXXXXXX,XX____XX,____XX__, + _____XXX,XXXXXXXX,XXXXXX__, + _____XX_,____XX_X,XX______, + _____XX_,____XX_X,XX______, + _____XX_,____XX_X,XX______, + _____XX_,___XXX_X,XX______, + _____XX_,___XX__X,XX______, + _____XX_,__XXX__X,XX__XX__, + _____XX_,__XX___X,XX__XX__, + ____XXX_,XXX____X,XX__XXX_, + __XXX_XX,X_______,XXXXXXX_, + _XXX___X,XX______,________, + ________,_XXXXXXX,XXXXXXX_, + ________,___XXXXX,XXXXXX__, + ________,________,________, +}; + +/* char: 要 code:0xD2AA */ +static GUI_CONST_STORAGE unsigned char acD2AA[72] = { + ________,________,________, + ________,________,________, + ________,________,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,_XX___XX,________, + ________,_XX___XX,________, + ____XXXX,XXXXXXXX,XXXXX___, + ____XXX_,_XX___XX,__XXX___, + ____XXX_,_XX___XX,__XXX___, + ____XXX_,_XX___XX,__XXX___, + ____XXXX,XXXXXXXX,XXXXX___, + ____XXX_,_XX_____,__XX____, + ________,_XXX____,________, + ________,_XX_____,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,XX_____X,XX______, + _______X,X_____XX,X_______, + ______XX,X_____XX,________, + ________,XXXXXXXX,________, + ________,____XXXX,XX______, + ________,__XXX___,XXXXX___, + ______XX,XXX_____,__XXXX__, + __XXXXX_,________,____XX__, + ________,________,________, +}; + +/* char: 页 code:0xD2B3 */ +static GUI_CONST_STORAGE unsigned char acD2B3[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,__XXX___,________, + ________,__XXX___,________, + ________,__XX____,_XX_____, + _____XXX,XXXXXXXX,XXXX____, + _____XXX,________,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,___XXX__,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,__XXX___,_XX_____, + _____XX_,__XXXXXX,________, + ________,_XXX___X,XX______, + ________,XXX_____,XXXX____, + _______X,XX______,__XXXX__, + _____XXX,________,___XXX__, + __XXXX__,________,________, + ________,________,________, +}; + +/* char: 一 code:0xD2BB */ +static GUI_CONST_STORAGE unsigned char acD2BB[72] = { + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: 已 code:0xD2D1 */ +static GUI_CONST_STORAGE unsigned char acD2D1[72] = { + ________,________,________, + ________,________,________, + ________,________,__XX____, + ____XXXX,XXXXXXXX,XXXX____, + ________,________,_XXX____, + ________,________,_XXX____, + ________,________,_XXX____, + ________,________,_XXX____, + ____XX__,________,_XXX____, + ____XXX_,________,_XXX____, + ____XXXX,XXXXXXXX,XXXX____, + ____XXX_,________,_XXX____, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,________, + ____XXX_,________,____XX__, + ____XXX_,________,____XX__, + ____XXX_,________,____XX__, + ____XXX_,________,____XX__, + ____XXX_,________,____XXX_, + _____XXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 迎 code:0xD3AD */ +static GUI_CONST_STORAGE unsigned char acD3AD[72] = { + ________,________,________, + ________,________,________, + ________,______XX,________, + ____XX__,____XXXX,X_______, + ____XXX_,_XXXX___,________, + _____XX_,_XX____X,XXXXXXX_, + ________,_XX____X,X___XX__, + ________,_XX____X,X___XX__, + ________,_XX____X,X___XX__, + _XXXXXXX,_XX____X,X___XX__, + _____XX_,_XX____X,X___XX__, + _____XX_,_XX____X,X___XX__, + _____XX_,_XX____X,X___XX__, + _____XX_,_XX__XXX,X___XX__, + _____XX_,_XXXXX_X,X___XX__, + _____XX_,_XXX___X,XXXXXX__, + _____XX_,_XX____X,X__XXX__, + _____XX_,_______X,X_______, + ___XXXXX,_______X,X_______, + _XXX___X,XX_____X,X_______, + __XX____,XXXXXXX_,__XXXXXX, + ________,___XXXXX,XXXXXX__, + ________,________,________, + ________,________,________, +}; + +/* char: 用 code:0xD3C3 */ +static GUI_CONST_STORAGE unsigned char acD3C3[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + ____XXXX,XXXXXXXX,XXXXXX__, + ____XXX_,____XX__,___XX___, + ____XXX_,____XX__,___XX___, + ____XXX_,____XX__,___XX___, + ____XXX_,____XX__,___XX___, + ____XXXX,XXXXXXXX,XXXXX___, + ____XXX_,____XX__,___XX___, + ____XX__,____XX__,___XX___, + ____XX__,____XX__,___XX___, + ____XX__,____XX__,___XX___, + ____XX__,____XX__,___XX___, + ____XXXX,XXXXXXXX,XXXXX___, + ____XX__,____XX__,___XX___, + ____XX__,____XX__,___XX___, + ___XXX__,____XX__,___XX___, + ___XX___,____XX__,___XX___, + ___XX___,___XXX__,___XX___, + __XX____,___XXX__,XX_XX___, + __XX____,___XXX__,_XXXX___, + _XX_____,___XX___,__XX____, + ________,________,________, +}; + +/* char: 有 code:0xD3D0 */ +static GUI_CONST_STORAGE unsigned char acD3D0[72] = { + ________,________,________, + ________,___XX___,________, + ________,__XXX___,________, + ________,__XXX___,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,_XXX____,________, + ________,XXX_____,________, + ________,XX______,________, + _______X,XXXXXXXX,XXXX____, + _______X,X_______,_XX_____, + ______XX,X_______,_XX_____, + _____XXX,X_______,_XX_____, + ____XX_X,XXXXXXXX,XXX_____, + ___XX__X,X_______,_XX_____, + __XX___X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,XXXXXXXX,XXX_____, + _______X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,X______X,XXX_____, + _______X,X_______,XX______, + ________,________,________, +}; + +/* char: 跃 code:0xD4BE */ +static GUI_CONST_STORAGE unsigned char acD4BE[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + __XXXXXX,XXX_____,_XXXXX__, + __XX____,XX__XXXX,XX______, + __XX____,XX_____X,X_______, + __XX____,XX_____X,X_______, + __XX____,XX_____X,X_______, + __XX____,XX_____X,X_______, + __XXXXXX,XX_____X,X____XX_, + __XX_XXX,XXXXXXXX,XXXXXXXX, + _____XXX,______XX,XX______, + __XXXXXX,______XX,XX______, + __XX_XXX,XXX___XX,XX______, + __XX_XXX,______XX,_XX_____, + __XX_XXX,_____XXX,_XX_____, + __XX_XXX,_____XX_,_XX_____, + __XX_XXX,____XXX_,__XX____, + __XX_XXX,XXX_XX__,__XXX___, + __XXXXX_,___XX___,___XX___, + _XXXX___,__XX____,___XXXX_, + ________,XXX_____,____XXXX, + _______X,X_______,________, + ________,________,________, +}; + +/* char: 载 code:0xD4D8 */ +static GUI_CONST_STORAGE unsigned char acD4D8[72] = { + ________,________,________, + _______X,X_____XX,________, + _______X,X_____XX,________, + _______X,X_____XX,_XXX____, + ___XXXXX,XXXXX_XX,__XXX___, + _______X,X_____XX,___XX___, + _______X,X_____XX,________, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ______XX,X_____XX,________, + ______XX,___XX_XX,___XX___, + _XXXXXXX,XXXXX_XX,___XXX__, + _____XX_,______XX,X__XX___, + ____XXXX,XX_____X,X_XXX___, + ____XX_X,XX_XX__X,X_XX____, + ___XXXXX,XXXXXX_X,XXXX____, + _______X,XX_____X,XXX_____, + _______X,XX______,XX______, + _______X,XXXXX__X,XXX_____, + __XXXXXX,XX____XX,XXX__XX_, + __XXX__X,XX___XXX,_XXX_XX_, + _______X,XX__XXX_,__XXXXX_, + _______X,XX_XX___,____XXX_, + _______X,X_XX____,_____XXX, + ________,________,________, +}; + +/* char: 择 code:0xD4F1 */ +static GUI_CONST_STORAGE unsigned char acD4F1[72] = { + ________,________,________, + ______XX,________,___XX___, + ______XX,__XXXXXX,XXXXXX__, + ______XX,____XX__,__XXX___, + ______XX,____XX__,__XX____, + ______XX,_____XX_,_XX_____, + _XXXXXXX,XXXX__XX,XXX_____, + ______XX,______XX,XX______, + ______XX,______XX,XXX_____, + ______XX,__XXXXX_,_XXXXXXX, + ______XX,XXXXX__X,X__XXX__, + ______XX,XXX____X,X_______, + ____XXXX,_______X,X_______, + _XXXX_XX,__XXXXXX,XXXXXX__, + __XX__XX,_______X,X_______, + ______XX,_______X,X_______, + ______XX,_______X,X_______, + ______XX,XXXXXXXX,XXXXXXX_, + ______XX,_______X,X_______, + ______XX,_______X,X_______, + __XXXXXX,_______X,X_______, + ____XXXX,_______X,X_______, + _____XX_,_______X,X_______, + ________,________,________, +}; + +/* char: 障 code:0xD5CF */ +static GUI_CONST_STORAGE unsigned char acD5CF[72] = { + ________,________,________, + ________,_____XX_,________, + ________,______XX,________, + __XXXXXX,X_____XX,X__XX___, + __XX__XX,XXXXXXXX,XXXXXX__, + __XX__XX,___XX___,_XX_____, + __XX__XX,____XX__,_XX_____, + __XX_XX_,____XXX_,XX______, + __XX_XX_,XXXXXXXX,XXXXXXX_, + __XX_XX_,________,________, + __XX_XX_,__XXXXXX,XXXXXX__, + __XX__XX,__XX____,___XX___, + __XX___X,X_XXXXXX,XXXXX___, + __XX___X,X_XX____,___XX___, + __XX___X,X_XX____,___XX___, + __XX___X,X_XXXXXX,XXXXX___, + __XXXXXX,X_XX__XX,X__XX___, + __XX_XXX,______XX,X____XX_, + __XX___X,XXXXXXXX,XXXXXXXX, + __XX____,______XX,X_______, + __XX____,______XX,X_______, + __XX____,______XX,X_______, + __XX____,______XX,X_______, + ________,________,________, +}; + +/* char: 诊 code:0xD5EF */ +static GUI_CONST_STORAGE unsigned char acD5EF[72] = { + ________,________,________, + ________,______XX,________, + ____XX__,_____XXX,________, + _____XX_,_____XXX,X_______, + _____XXX,____XXXX,X_______, + _____XXX,____XX__,XX______, + ________,___XXX__,XXX_____, + ________,___XX___,_XXX____, + ________,__XX____,__XXX___, + _XXXXXX_,_XX___XX,X__XXXXX, + ____XXX_,XX___XXX,____XX__, + ____XXX_,____XXX_,________, + ____XXX_,___XXX__,_XX_____, + ____XXX_,__XX____,XXXX____, + ____XXX_,_______X,XX______, + ____XXX_,______XX,X_______, + ____XXX_,XX___XX_,____XX__, + ____XXXX,X__XXX__,__XXXX__, + ____XXXX,_XXX____,_XXXX___, + ____XXXX,________,XXX_____, + _____XX_,______XX,X_______, + ________,___XXXX_,________, + ________,_XXX____,________, + ________,________,________, +}; + +/* char: 整 code:0xD5FB */ +static GUI_CONST_STORAGE unsigned char acD5FB[72] = { + ________,________,________, + _______X,X______X,X_______, + _______X,X______X,X_______, + __XXXXXX,XXXXXXXX,X_______, + _______X,X_____XX,XXXXXXX_, + _______X,X_____XX,___XX___, + ___XXXXX,XXXXXXXX,__XXX___, + ___XXX_X,X_XXXXXX,X_XXX___, + ___XXX_X,X_XXXX_X,X_XX____, + ___XXXXX,XXXXX___,XXXX____, + ___XXXXX,XXXX____,XXX_____, + _____XXX,XXXX___X,XXXX____, + ____XX_X,X_XX__XX,__XXXX__, + ___XX__X,X_XXXXX_,__XXXXX_, + __XXXXXX,XXXXXXXX,XXXXX___, + ________,___XXX__,________, + ________,___XXX__,_XX_____, + _______X,X__XXXXX,XXXX____, + _______X,X__XXX__,________, + _______X,X__XXX__,________, + _______X,X__XXX__,____XX__, + __XXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 正 code:0xD5FD */ +static GUI_CONST_STORAGE unsigned char acD5FD[72] = { + ________,________,________, + ________,________,________, + ________,________,____XX__, + ___XXXXX,XXXXXXXX,XXXXXXX_, + ________,____XX__,________, + ________,____XX__,________, + ________,____XX__,________, + ________,____XX__,________, + ______XX,____XX__,________, + ______XX,X___XX__,________, + ______XX,____XX__,___XX___, + ______XX,____XXXX,XXXXXX__, + ______XX,____XX__,________, + ______XX,____XX__,________, + ______XX,____XX__,________, + ______XX,____XX__,________, + ______XX,____XX__,________, + ______XX,____XX__,________, + ______XX,____XX__,________, + ______XX,____XX__,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, + ________,________,________, +}; + +/* char: 知 code:0xD6AA */ +static GUI_CONST_STORAGE unsigned char acD6AA[72] = { + ________,________,________, + ________,________,________, + _____XX_,________,________, + _____XX_,________,________, + _____XX_,________,________, + ____XXX_,________,________, + ____XXXX,XXXXX_XX,XXXXXXX_, + ____XX_X,X_____XX,____XX__, + ___XX__X,X_____XX,____XX__, + ___XX__X,X_____XX,____XX__, + __XX___X,X_____XX,____XX__, + _______X,X__XX_XX,____XX__, + _XXXXXXX,XXXXXXXX,____XX__, + _______X,X_____XX,____XX__, + _______X,X_____XX,____XX__, + _______X,XX____XX,____XX__, + ______XX,XXX___XX,____XX__, + ______XX,__XXX_XX,____XX__, + _____XXX,__XXX_XX,XXXXXX__, + _____XX_,___XXXXX,____XX__, + ____XX__,______XX,____XX__, + ___XX___,______XX,____XX__, + __XX____,________,________, + ________,________,________, +}; + +/* char: 至 code:0xD6C1 */ +static GUI_CONST_STORAGE unsigned char acD6C1[72] = { + ________,________,________, + ________,________,________, + ________,________,___XX___, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,__XXX___,________, + ________,_XXX____,________, + ________,_XX__XXX,________, + ________,XX_____X,X_______, + _______X,X_______,XXX_____, + ______XX,________,_XXXX___, + ____XXXX,XXXXXXXX,XXXXX___, + ____XXXX,X__XXX__,___XX___, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,__XX____, + ____XXXX,XXXXXXXX,XXXXX___, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 置 code:0xD6C3 */ +static GUI_CONST_STORAGE unsigned char acD6C3[72] = { + ________,________,________, + ________,________,________, + ____XXXX,XXXXXXXX,XXXXX___, + ____XX__,_XX___XX,___XX___, + ____XX__,_XX___XX,___XX___, + ____XX__,_XX___XX,___XX___, + ____XXXX,XXXXXXXX,XXXXX___, + ____XX__,___XX___,___XX___, + ________,___XX___,___XX___, + ___XXXXX,XXXXXXXX,XXXXXX__, + ________,___XX___,_XX_____, + ______XX,XXXXXXXX,XXXX____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,________,_XX_____, + ______XX,________,_XX__XX_, + _XXXXXXX,XXXXXXXX,XXXXXXXX, + ________,________,________, + ________,________,________, +}; + +/* char: 制 code:0xD6C6 */ +static GUI_CONST_STORAGE unsigned char acD6C6[72] = { + ________,________,________, + _______X,X_______,____XX__, + _______X,XX______,____XX__, + _______X,X_______,____XX__, + ____XX_X,X_______,____XX__, + ___XXX_X,X__XX___,XXX_XX__, + ___XXXXX,XXXXXX__,XX__XX__, + ___XX__X,X_______,XX__XX__, + __XX___X,X_______,XX__XX__, + _XXXXXXX,XXXXXXX_,XX__XX__, + _______X,X_______,XX__XX__, + _______X,X_______,XX__XX__, + ___XXXXX,XXXXXX__,XX__XX__, + ___XX__X,X___XX__,XX__XX__, + ___XX__X,X___XX__,XX__XX__, + ___XX__X,X___XX__,XX__XX__, + ___XX__X,X___XX__,XX__XX__, + ___XX__X,X___XX__,____XX__, + ___XX__X,XXXXXX__,____XX__, + ___XX__X,X__XX___,____XX__, + _______X,X_______,____XX__, + _______X,X_______,_XXXXX__, + _______X,X_______,___XX___, + ________,________,________, +}; + +/* char: 智 code:0xD6C7 */ +static GUI_CONST_STORAGE unsigned char acD6C7[72] = { + ________,________,________, + _____XX_,________,________, + _____XX_,________,________, + ____XXXX,XXXXX_XX,XXXXXX__, + ____XX__,XX____XX,____XX__, + ___XX___,XX____XX,____XX__, + ___XX__X,XX____XX,____XX__, + __XXXXXX,XXXXXXXX,____XX__, + _______X,X_____XX,____XX__, + _______X,XXX___XX,____XX__, + ______XX,X_XXX_XX,XXXXXX__, + _____XXX,___XXXXX,____XX__, + ____XXX_,___XX_XX,________, + ___XX__X,XXXXXXXX,XXXX____, + __XX___X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,XXXXXXXX,XXX_____, + _______X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,X_______,_XX_____, + _______X,XXXXXXXX,XXXX____, + _______X,X_______,_XXX____, + ________,________,_XX_____, + ________,________,________, +}; + +/* char: 中 code:0xD6D0 */ +static GUI_CONST_STORAGE unsigned char acD6D0[72] = { + ________,________,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XXX__,___XX___,___XXX__, + ___XXX__,___XX___,___XXX__, + ___XXX__,___XX___,___XXX__, + ___XXX__,___XX___,___XXX__, + ___XXX__,___XX___,___XXX__, + ___XXX__,___XX___,___XXX__, + ___XXXXX,XXXXXXXX,XXXXXX__, + ___XXX__,___XX___,___XXX__, + ___XX___,___XX___,___XX___, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XX___,________, + ________,________,________, +}; + +/* char: 重 code:0xD6D8 */ +static GUI_CONST_STORAGE unsigned char acD6D8[72] = { + ________,________,________, + ________,________,________, + ________,________,XXX_____, + ________,__XXXXXX,XXXX____, + ____XXXX,XXXXX___,________, + ________,___XX___,________, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,___XX___,________, + ________,___XX___,________, + _____XXX,XXXXXXXX,XXXX____, + _____XXX,___XX___,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,XXXXXXXX,XXX_____, + _____XXX,___XX___,_XX_____, + _____XXX,___XX___,_XX_____, + _____XXX,XXXXXXXX,XXX_____, + _____XXX,___XX___,_XX_____, + ________,___XX___,__XX____, + ___XXXXX,XXXXXXXX,XXXXX___, + ________,___XX___,________, + ________,___XX___,____XXX_, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 主 code:0xD6F7 */ +static GUI_CONST_STORAGE unsigned char acD6F7[72] = { + ________,________,________, + ________,________,________, + ________,_XX_____,________, + ________,__XXX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,____XX__,___XX___, + ___XXXXX,XXXXXXXX,XXXXXX__, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,__XX____, + _____XXX,XXXXXXXX,XXXXX___, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,____XX__, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,________,________, + ________,________,________, +}; + +/* char: 准 code:0xD7BC */ +static GUI_CONST_STORAGE unsigned char acD7BC[72] = { + ________,________,________, + ________,___XX__X,X_______, + ________,___XXX_X,XX______, + __XXX___,__XXX___,XX______, + ___XXX__,__XX____,XX__XX__, + ___XXX_X,X_XXXXXX,XXXXXXX_, + ____XX_X,XXXX___X,XX______, + ______XX,_XXX___X,XX______, + ______XX,XXXX___X,XX______, + _____XX_,XXXX___X,XX______, + _____XXX,X_XXXXXX,XXXXXX__, + _____XXX,__XX___X,XX______, + ____XX__,__XX___X,XX______, + ___XXX__,__XX___X,XX______, + __XXXX__,__XX___X,XX__XX__, + ___XXX__,__XXXXXX,XXXXXXX_, + ___XX___,__XX___X,XX______, + ___XX___,__XX___X,XX______, + ___XX___,__XX___X,XX______, + ___XX___,__XX___X,XX______, + ___XX___,__XXXXXX,XXXXXXX_, + ________,__XX____,________, + ________,__XX____,________, + ________,________,________, +}; + +/* char: 自 code:0xD7D4 */ +static GUI_CONST_STORAGE unsigned char acD7D4[72] = { + ________,________,________, + ________,__XXX___,________, + ________,__XXX___,________, + ________,__XX____,________, + ________,__XX____,________, + _____XXX,XXXXXXXX,XXXXX___, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + _____XXX,XXXXXXXX,XXXX____, + _____XX_,________,__XX____, + _____XX_,________,__XX____, + ________,________,________, +}; + +/* char: 字 code:0xD7D6 */ +static GUI_CONST_STORAGE unsigned char acD7D6[72] = { + ________,________,________, + ________,__XX____,________, + ________,___XXX__,________, + ________,___XXX__,________, + ____XX__,____XX__,____XX__, + ____XXXX,XXXXXXXX,XXXXXXX_, + ____XX__,________,___XXX__, + ___XXX__,________,___XX___, + __XXXXXX,XXXXXXXX,XXXX____, + ________,_______X,XXX_____, + ________,______XX,X_______, + ________,_____XX_,________, + ________,___XXX__,________, + ________,___XXX__,________, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,XXXXXX__,________, + ________,__XXX___,________, + ________,________,________, +}; + +/* char: 足 code:0xD7E3 */ +static GUI_CONST_STORAGE unsigned char acD7E3[72] = { + ________,________,________, + ________,________,________, + ________,________,_XX_____, + ______XX,XXXXXXXX,XXXX____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,________,_XX_____, + ______XX,XXXXXXXX,XXX_____, + ______XX,___XXX__,_XX_____, + ________,___XXX__,________, + ________,___XXX__,________, + ______XX,___XXX__,________, + _____XXX,___XXXXX,XXXXX___, + _____XXX,___XXX__,________, + _____XX_,___XXX__,________, + ____XXXX,___XXX__,________, + ____XXXX,XX_XXX__,________, + ____XX__,XXXXXX__,________, + ___XX___,_XXXXX__,________, + __XX____,___XXXXX,XXXXXXXX, + _XX_____,______XX,XXXXXX__, + ________,________,________, +}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[245] = { + { 10, 10, 2, (unsigned char *)&ac0020 }, /*0: */ + { 8, 8, 2, (unsigned char *)&ac0021 }, /*1: !*/ + { 12, 12, 2, (unsigned char *)&ac0022 }, /*2: "*/ + { 12, 12, 2, (unsigned char *)&ac0023 }, /*3: #*/ + { 11, 11, 2, (unsigned char *)&ac0024 }, /*4: $*/ + { 12, 12, 2, (unsigned char *)&ac0025 }, /*5: %*/ + { 13, 13, 2, (unsigned char *)&ac0026 }, /*6: &*/ + { 6, 6, 2, (unsigned char *)&ac0027 }, /*7: '*/ + { 12, 12, 2, (unsigned char *)&ac0028 }, /*8: (*/ + { 8, 8, 2, (unsigned char *)&ac0029 }, /*9: )*/ + { 13, 13, 2, (unsigned char *)&ac002A }, /*10: **/ + { 13, 13, 2, (unsigned char *)&ac002B }, /*11: +*/ + { 6, 6, 2, (unsigned char *)&ac002C }, /*12: ,*/ + { 12, 12, 2, (unsigned char *)&ac002D }, /*13: -*/ + { 6, 6, 2, (unsigned char *)&ac002E }, /*14: .*/ + { 12, 12, 2, (unsigned char *)&ac002F }, /*15: /*/ + { 12, 12, 2, (unsigned char *)&ac0030 }, /*16: 0*/ + { 11, 11, 2, (unsigned char *)&ac0031 }, /*17: 1*/ + { 11, 11, 2, (unsigned char *)&ac0032 }, /*18: 2*/ + { 11, 11, 2, (unsigned char *)&ac0033 }, /*19: 3*/ + { 13, 13, 2, (unsigned char *)&ac0034 }, /*20: 4*/ + { 11, 11, 2, (unsigned char *)&ac0035 }, /*21: 5*/ + { 12, 12, 2, (unsigned char *)&ac0036 }, /*22: 6*/ + { 12, 12, 2, (unsigned char *)&ac0037 }, /*23: 7*/ + { 12, 12, 2, (unsigned char *)&ac0038 }, /*24: 8*/ + { 12, 12, 2, (unsigned char *)&ac0039 }, /*25: 9*/ + { 9, 9, 2, (unsigned char *)&ac003A }, /*26: :*/ + { 8, 8, 2, (unsigned char *)&ac003B }, /*27: ;*/ + { 12, 12, 2, (unsigned char *)&ac003C }, /*28: <*/ + { 12, 12, 2, (unsigned char *)&ac003D }, /*29: =*/ + { 12, 12, 2, (unsigned char *)&ac003E }, /*30: >*/ + { 13, 13, 2, (unsigned char *)&ac003F }, /*31: ?*/ + { 12, 12, 2, (unsigned char *)&ac0040 }, /*32: @*/ + { 13, 13, 2, (unsigned char *)&ac0041 }, /*33: A*/ + { 12, 12, 2, (unsigned char *)&ac0042 }, /*34: B*/ + { 12, 12, 2, (unsigned char *)&ac0043 }, /*35: C*/ + { 12, 12, 2, (unsigned char *)&ac0044 }, /*36: D*/ + { 12, 12, 2, (unsigned char *)&ac0045 }, /*37: E*/ + { 12, 12, 2, (unsigned char *)&ac0046 }, /*38: F*/ + { 13, 13, 2, (unsigned char *)&ac0047 }, /*39: G*/ + { 13, 13, 2, (unsigned char *)&ac0048 }, /*40: H*/ + { 11, 11, 2, (unsigned char *)&ac0049 }, /*41: I*/ + { 12, 12, 2, (unsigned char *)&ac004A }, /*42: J*/ + { 12, 12, 2, (unsigned char *)&ac004B }, /*43: K*/ + { 12, 12, 2, (unsigned char *)&ac004C }, /*44: L*/ + { 12, 12, 2, (unsigned char *)&ac004D }, /*45: M*/ + { 13, 13, 2, (unsigned char *)&ac004E }, /*46: N*/ + { 12, 12, 2, (unsigned char *)&ac004F }, /*47: O*/ + { 12, 12, 2, (unsigned char *)&ac0050 }, /*48: P*/ + { 12, 12, 2, (unsigned char *)&ac0051 }, /*49: Q*/ + { 13, 13, 2, (unsigned char *)&ac0052 }, /*50: R*/ + { 12, 12, 2, (unsigned char *)&ac0053 }, /*51: S*/ + { 13, 13, 2, (unsigned char *)&ac0054 }, /*52: T*/ + { 12, 12, 2, (unsigned char *)&ac0055 }, /*53: U*/ + { 12, 12, 2, (unsigned char *)&ac0056 }, /*54: V*/ + { 13, 13, 2, (unsigned char *)&ac0057 }, /*55: W*/ + { 12, 12, 2, (unsigned char *)&ac0058 }, /*56: X*/ + { 13, 13, 2, (unsigned char *)&ac0059 }, /*57: Y*/ + { 12, 12, 2, (unsigned char *)&ac005A }, /*58: Z*/ + { 11, 11, 2, (unsigned char *)&ac005B }, /*59: [*/ + { 12, 12, 2, (unsigned char *)&ac005C }, /*60: \*/ + { 8, 8, 2, (unsigned char *)&ac005D }, /*61: ]*/ + { 10, 10, 2, (unsigned char *)&ac005E }, /*62: ^*/ + { 13, 13, 2, (unsigned char *)&ac005F }, /*63: _*/ + { 8, 8, 2, (unsigned char *)&ac0060 }, /*64: `*/ + { 13, 13, 2, (unsigned char *)&ac0061 }, /*65: a*/ + { 12, 12, 2, (unsigned char *)&ac0062 }, /*66: b*/ + { 11, 11, 2, (unsigned char *)&ac0063 }, /*67: c*/ + { 12, 12, 2, (unsigned char *)&ac0064 }, /*68: d*/ + { 12, 12, 2, (unsigned char *)&ac0065 }, /*69: e*/ + { 12, 12, 2, (unsigned char *)&ac0066 }, /*70: f*/ + { 12, 12, 2, (unsigned char *)&ac0067 }, /*71: g*/ + { 12, 12, 2, (unsigned char *)&ac0068 }, /*72: h*/ + { 11, 11, 2, (unsigned char *)&ac0069 }, /*73: i*/ + { 10, 10, 2, (unsigned char *)&ac006A }, /*74: j*/ + { 12, 12, 2, (unsigned char *)&ac006B }, /*75: k*/ + { 11, 11, 2, (unsigned char *)&ac006C }, /*76: l*/ + { 13, 13, 2, (unsigned char *)&ac006D }, /*77: m*/ + { 12, 12, 2, (unsigned char *)&ac006E }, /*78: n*/ + { 12, 12, 2, (unsigned char *)&ac006F }, /*79: o*/ + { 12, 12, 2, (unsigned char *)&ac0070 }, /*80: p*/ + { 12, 12, 2, (unsigned char *)&ac0071 }, /*81: q*/ + { 12, 12, 2, (unsigned char *)&ac0072 }, /*82: r*/ + { 11, 11, 2, (unsigned char *)&ac0073 }, /*83: s*/ + { 11, 11, 2, (unsigned char *)&ac0074 }, /*84: t*/ + { 12, 12, 2, (unsigned char *)&ac0075 }, /*85: u*/ + { 12, 12, 2, (unsigned char *)&ac0076 }, /*86: v*/ + { 13, 13, 2, (unsigned char *)&ac0077 }, /*87: w*/ + { 12, 12, 2, (unsigned char *)&ac0078 }, /*88: x*/ + { 12, 12, 2, (unsigned char *)&ac0079 }, /*89: y*/ + { 11, 11, 2, (unsigned char *)&ac007A }, /*90: z*/ + { 11, 11, 2, (unsigned char *)&ac007B }, /*91: {*/ + { 8, 8, 2, (unsigned char *)&ac007C }, /*92: |*/ + { 8, 8, 2, (unsigned char *)&ac007D }, /*93: }*/ + { 12, 12, 2, (unsigned char *)&ac007E }, /*94: ~*/ + { 10, 10, 2, (unsigned char *)&ac007F }, /*95: */ + { 9, 9, 3, (unsigned char *)&acA1A3 }, /*96: 。*/ + { 10, 10, 3, (unsigned char *)&acA1E3 }, /*97: °*/ + { 22, 22, 3, (unsigned char *)&acA1E6 }, /*98: ℃*/ + { 7, 7, 3, (unsigned char *)&acA3AC }, /*99: ,*/ + { 21, 21, 3, (unsigned char *)&acA848 }, /*100: ℉*/ + { 24, 24, 3, (unsigned char *)&acB0DC }, /*101: 败*/ + { 23, 23, 3, (unsigned char *)&acB0E6 }, /*102: 版*/ + { 23, 23, 3, (unsigned char *)&acB0FC }, /*103: 包*/ + { 24, 24, 3, (unsigned char *)&acB1A3 }, /*104: 保*/ + { 24, 24, 3, (unsigned char *)&acB1B8 }, /*105: 备*/ + { 24, 24, 3, (unsigned char *)&acB1BE }, /*106: 本*/ + { 23, 23, 3, (unsigned char *)&acB1E0 }, /*107: 编*/ + { 24, 24, 3, (unsigned char *)&acB1E4 }, /*108: 变*/ + { 23, 23, 3, (unsigned char *)&acB2BB }, /*109: 不*/ + { 24, 24, 3, (unsigned char *)&acB2CB }, /*110: 菜*/ + { 24, 24, 3, (unsigned char *)&acB2CE }, /*111: 参*/ + { 22, 22, 3, (unsigned char *)&acB2E2 }, /*112: 测*/ + { 24, 24, 3, (unsigned char *)&acB2E9 }, /*113: 查*/ + { 23, 23, 3, (unsigned char *)&acB3A3 }, /*114: 常*/ + { 23, 23, 3, (unsigned char *)&acB3A7 }, /*115: 厂*/ + { 24, 24, 3, (unsigned char *)&acB3AC }, /*116: 超*/ + { 24, 24, 3, (unsigned char *)&acB3C9 }, /*117: 成*/ + { 24, 24, 3, (unsigned char *)&acB3CC }, /*118: 程*/ + { 22, 22, 3, (unsigned char *)&acB3F6 }, /*119: 出*/ + { 23, 23, 3, (unsigned char *)&acB4E6 }, /*120: 存*/ + { 24, 24, 3, (unsigned char *)&acB4ED }, /*121: 错*/ + { 23, 23, 3, (unsigned char *)&acB5A5 }, /*122: 单*/ + { 23, 23, 3, (unsigned char *)&acB5AB }, /*123: 但*/ + { 23, 23, 3, (unsigned char *)&acB5B1 }, /*124: 当*/ + { 23, 23, 3, (unsigned char *)&acB5C4 }, /*125: 的*/ + { 23, 23, 3, (unsigned char *)&acB5E7 }, /*126: 电*/ + { 23, 23, 3, (unsigned char *)&acB6A8 }, /*127: 定*/ + { 23, 23, 3, (unsigned char *)&acB6AF }, /*128: 动*/ + { 24, 24, 3, (unsigned char *)&acB6C8 }, /*129: 度*/ + { 23, 23, 3, (unsigned char *)&acB6CF }, /*130: 断*/ + { 23, 23, 3, (unsigned char *)&acB6D4 }, /*131: 对*/ + { 24, 24, 3, (unsigned char *)&acB7A2 }, /*132: 发*/ + { 23, 23, 3, (unsigned char *)&acB7A7 }, /*133: 阀*/ + { 24, 24, 3, (unsigned char *)&acB7B5 }, /*134: 返*/ + { 24, 24, 3, (unsigned char *)&acB8B4 }, /*135: 复*/ + { 24, 24, 3, (unsigned char *)&acB8C4 }, /*136: 改*/ + { 23, 23, 3, (unsigned char *)&acB8F1 }, /*137: 格*/ + { 23, 23, 3, (unsigned char *)&acB9A6 }, /*138: 功*/ + { 23, 23, 3, (unsigned char *)&acB9AB }, /*139: 公*/ + { 24, 24, 3, (unsigned char *)&acB9CA }, /*140: 故*/ + { 24, 24, 3, (unsigned char *)&acB9E6 }, /*141: 规*/ + { 23, 23, 3, (unsigned char *)&acBAC5 }, /*142: 号*/ + { 23, 23, 3, (unsigned char *)&acBAF3 }, /*143: 后*/ + { 23, 23, 3, (unsigned char *)&acBBA4 }, /*144: 护*/ + { 24, 24, 3, (unsigned char *)&acBBB6 }, /*145: 欢*/ + { 23, 23, 3, (unsigned char *)&acBBD6 }, /*146: 恢*/ + { 22, 22, 3, (unsigned char *)&acBBD8 }, /*147: 回*/ + { 24, 24, 3, (unsigned char *)&acBBF2 }, /*148: 或*/ + { 23, 23, 3, (unsigned char *)&acBCAD }, /*149: 辑*/ + { 24, 24, 3, (unsigned char *)&acBCBC }, /*150: 技*/ + { 23, 23, 3, (unsigned char *)&acBCC6 }, /*151: 计*/ + { 23, 23, 3, (unsigned char *)&acBCD3 }, /*152: 加*/ + { 23, 23, 3, (unsigned char *)&acBCEC }, /*153: 检*/ + { 24, 24, 3, (unsigned char *)&acBCFC }, /*154: 键*/ + { 23, 23, 3, (unsigned char *)&acBCFE }, /*155: 件*/ + { 24, 24, 3, (unsigned char *)&acBDAD }, /*156: 江*/ + { 24, 24, 3, (unsigned char *)&acBDD7 }, /*157: 阶*/ + { 24, 24, 3, (unsigned char *)&acBDF8 }, /*158: 进*/ + { 23, 23, 3, (unsigned char *)&acBEDD }, /*159: 据*/ + { 23, 23, 3, (unsigned char *)&acBEDE }, /*160: 巨*/ + { 23, 23, 3, (unsigned char *)&acBFD8 }, /*161: 控*/ + { 24, 24, 3, (unsigned char *)&acC0A8 }, /*162: 括*/ + { 24, 24, 3, (unsigned char *)&acC1BF }, /*163: 量*/ + { 24, 24, 3, (unsigned char *)&acC1F7 }, /*164: 流*/ + { 23, 23, 3, (unsigned char *)&acC2EB }, /*165: 码*/ + { 23, 23, 3, (unsigned char *)&acC2FA }, /*166: 满*/ + { 22, 22, 3, (unsigned char *)&acC3C5 }, /*167: 门*/ + { 23, 23, 3, (unsigned char *)&acC3DC }, /*168: 密*/ + { 24, 24, 3, (unsigned char *)&acC3E6 }, /*169: 面*/ + { 23, 23, 3, (unsigned char *)&acC3EB }, /*170: 秒*/ + { 23, 23, 3, (unsigned char *)&acC4AC }, /*171: 默*/ + { 20, 20, 3, (unsigned char *)&acC4BF }, /*172: 目*/ + { 24, 24, 3, (unsigned char *)&acC4DC }, /*173: 能*/ + { 24, 24, 3, (unsigned char *)&acC5E4 }, /*174: 配*/ + { 24, 24, 3, (unsigned char *)&acC6C2 }, /*175: 坡*/ + { 21, 21, 3, (unsigned char *)&acC6F4 }, /*176: 启*/ + { 23, 23, 3, (unsigned char *)&acC6F7 }, /*177: 器*/ + { 23, 23, 3, (unsigned char *)&acC7B0 }, /*178: 前*/ + { 23, 23, 3, (unsigned char *)&acC7EB }, /*179: 请*/ + { 24, 24, 3, (unsigned char *)&acC7F3 }, /*180: 求*/ + { 24, 24, 3, (unsigned char *)&acC7FD }, /*181: 驱*/ + { 24, 24, 3, (unsigned char *)&acC8A1 }, /*182: 取*/ + { 23, 23, 3, (unsigned char *)&acC8CF }, /*183: 认*/ + { 24, 24, 3, (unsigned char *)&acC8EB }, /*184: 入*/ + { 24, 24, 3, (unsigned char *)&acC9E8 }, /*185: 设*/ + { 23, 23, 3, (unsigned char *)&acC9FA }, /*186: 生*/ + { 24, 24, 3, (unsigned char *)&acCAA7 }, /*187: 失*/ + { 23, 23, 3, (unsigned char *)&acCAAF }, /*188: 石*/ + { 23, 23, 3, (unsigned char *)&acCAB1 }, /*189: 时*/ + { 23, 23, 3, (unsigned char *)&acCAB5 }, /*190: 实*/ + { 24, 24, 3, (unsigned char *)&acCAB9 }, /*191: 使*/ + { 24, 24, 3, (unsigned char *)&acCAD4 }, /*192: 试*/ + { 23, 23, 3, (unsigned char *)&acCAD7 }, /*193: 首*/ + { 23, 23, 3, (unsigned char *)&acCAE4 }, /*194: 输*/ + { 23, 23, 3, (unsigned char *)&acCAF5 }, /*195: 术*/ + { 23, 23, 3, (unsigned char *)&acCAFD }, /*196: 数*/ + { 21, 21, 3, (unsigned char *)&acCBBE }, /*197: 司*/ + { 23, 23, 3, (unsigned char *)&acCBD5 }, /*198: 苏*/ + { 24, 24, 3, (unsigned char *)&acCBF9 }, /*199: 所*/ + { 24, 24, 3, (unsigned char *)&acCCD8 }, /*200: 特*/ + { 24, 24, 3, (unsigned char *)&acCCF5 }, /*201: 条*/ + { 24, 24, 3, (unsigned char *)&acCEAC }, /*202: 维*/ + { 23, 23, 3, (unsigned char *)&acCEB4 }, /*203: 未*/ + { 24, 24, 3, (unsigned char *)&acCEBB }, /*204: 位*/ + { 24, 24, 3, (unsigned char *)&acCEC2 }, /*205: 温*/ + { 24, 24, 3, (unsigned char *)&acCEF3 }, /*206: 误*/ + { 23, 23, 3, (unsigned char *)&acCFA2 }, /*207: 息*/ + { 23, 23, 3, (unsigned char *)&acCFDE }, /*208: 限*/ + { 23, 23, 3, (unsigned char *)&acCFEE }, /*209: 项*/ + { 23, 23, 3, (unsigned char *)&acCFFB }, /*210: 消*/ + { 24, 24, 3, (unsigned char *)&acD0A3 }, /*211: 校*/ + { 23, 23, 3, (unsigned char *)&acD0B1 }, /*212: 斜*/ + { 23, 23, 3, (unsigned char *)&acD0C5 }, /*213: 信*/ + { 23, 23, 3, (unsigned char *)&acD0D0 }, /*214: 行*/ + { 24, 24, 3, (unsigned char *)&acD0D4 }, /*215: 性*/ + { 23, 23, 3, (unsigned char *)&acD0DE }, /*216: 修*/ + { 23, 23, 3, (unsigned char *)&acD0E8 }, /*217: 需*/ + { 23, 23, 3, (unsigned char *)&acD1A1 }, /*218: 选*/ + { 23, 23, 3, (unsigned char *)&acD2AA }, /*219: 要*/ + { 22, 22, 3, (unsigned char *)&acD2B3 }, /*220: 页*/ + { 23, 23, 3, (unsigned char *)&acD2BB }, /*221: 一*/ + { 23, 23, 3, (unsigned char *)&acD2D1 }, /*222: 已*/ + { 24, 24, 3, (unsigned char *)&acD3AD }, /*223: 迎*/ + { 22, 22, 3, (unsigned char *)&acD3C3 }, /*224: 用*/ + { 23, 23, 3, (unsigned char *)&acD3D0 }, /*225: 有*/ + { 24, 24, 3, (unsigned char *)&acD4BE }, /*226: 跃*/ + { 24, 24, 3, (unsigned char *)&acD4D8 }, /*227: 载*/ + { 24, 24, 3, (unsigned char *)&acD4F1 }, /*228: 择*/ + { 24, 24, 3, (unsigned char *)&acD5CF }, /*229: 障*/ + { 24, 24, 3, (unsigned char *)&acD5EF }, /*230: 诊*/ + { 23, 23, 3, (unsigned char *)&acD5FB }, /*231: 整*/ + { 23, 23, 3, (unsigned char *)&acD5FD }, /*232: 正*/ + { 23, 23, 3, (unsigned char *)&acD6AA }, /*233: 知*/ + { 23, 23, 3, (unsigned char *)&acD6C1 }, /*234: 至*/ + { 24, 24, 3, (unsigned char *)&acD6C3 }, /*235: 置*/ + { 22, 22, 3, (unsigned char *)&acD6C6 }, /*236: 制*/ + { 22, 22, 3, (unsigned char *)&acD6C7 }, /*237: 智*/ + { 22, 22, 3, (unsigned char *)&acD6D0 }, /*238: 中*/ + { 23, 23, 3, (unsigned char *)&acD6D8 }, /*239: 重*/ + { 23, 23, 3, (unsigned char *)&acD6F7 }, /*240: 主*/ + { 23, 23, 3, (unsigned char *)&acD7BC }, /*241: 准*/ + { 21, 21, 3, (unsigned char *)&acD7D4 }, /*242: 自*/ + { 23, 23, 3, (unsigned char *)&acD7D6 }, /*243: 字*/ + { 24, 24, 3, (unsigned char *)&acD7E3 }, /*244: 足*/ +}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop148 = { + 0xD7E3, /*start :足*/ + 0xD7E3, /*end :足, len=1*/ + &Cinfo[ 244 ], + (void*)0 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop147 = { + 0xD7D6, /*start :字*/ + 0xD7D6, /*end :字, len=1*/ + &Cinfo[ 243 ], + &Prop148 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop146 = { + 0xD7D4, /*start :自*/ + 0xD7D4, /*end :自, len=1*/ + &Cinfo[ 242 ], + &Prop147 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop145 = { + 0xD7BC, /*start :准*/ + 0xD7BC, /*end :准, len=1*/ + &Cinfo[ 241 ], + &Prop146 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop144 = { + 0xD6F7, /*start :主*/ + 0xD6F7, /*end :主, len=1*/ + &Cinfo[ 240 ], + &Prop145 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop143 = { + 0xD6D8, /*start :重*/ + 0xD6D8, /*end :重, len=1*/ + &Cinfo[ 239 ], + &Prop144 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop142 = { + 0xD6D0, /*start :中*/ + 0xD6D0, /*end :中, len=1*/ + &Cinfo[ 238 ], + &Prop143 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop141 = { + 0xD6C6, /*start :制*/ + 0xD6C7, /*end :智, len=2*/ + &Cinfo[ 236 ], + &Prop142 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop140 = { + 0xD6C3, /*start :置*/ + 0xD6C3, /*end :置, len=1*/ + &Cinfo[ 235 ], + &Prop141 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop139 = { + 0xD6C1, /*start :至*/ + 0xD6C1, /*end :至, len=1*/ + &Cinfo[ 234 ], + &Prop140 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop138 = { + 0xD6AA, /*start :知*/ + 0xD6AA, /*end :知, len=1*/ + &Cinfo[ 233 ], + &Prop139 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop137 = { + 0xD5FD, /*start :正*/ + 0xD5FD, /*end :正, len=1*/ + &Cinfo[ 232 ], + &Prop138 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop136 = { + 0xD5FB, /*start :整*/ + 0xD5FB, /*end :整, len=1*/ + &Cinfo[ 231 ], + &Prop137 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop135 = { + 0xD5EF, /*start :诊*/ + 0xD5EF, /*end :诊, len=1*/ + &Cinfo[ 230 ], + &Prop136 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop134 = { + 0xD5CF, /*start :障*/ + 0xD5CF, /*end :障, len=1*/ + &Cinfo[ 229 ], + &Prop135 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop133 = { + 0xD4F1, /*start :择*/ + 0xD4F1, /*end :择, len=1*/ + &Cinfo[ 228 ], + &Prop134 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop132 = { + 0xD4D8, /*start :载*/ + 0xD4D8, /*end :载, len=1*/ + &Cinfo[ 227 ], + &Prop133 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop131 = { + 0xD4BE, /*start :跃*/ + 0xD4BE, /*end :跃, len=1*/ + &Cinfo[ 226 ], + &Prop132 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop130 = { + 0xD3D0, /*start :有*/ + 0xD3D0, /*end :有, len=1*/ + &Cinfo[ 225 ], + &Prop131 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop129 = { + 0xD3C3, /*start :用*/ + 0xD3C3, /*end :用, len=1*/ + &Cinfo[ 224 ], + &Prop130 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop128 = { + 0xD3AD, /*start :迎*/ + 0xD3AD, /*end :迎, len=1*/ + &Cinfo[ 223 ], + &Prop129 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop127 = { + 0xD2D1, /*start :已*/ + 0xD2D1, /*end :已, len=1*/ + &Cinfo[ 222 ], + &Prop128 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop126 = { + 0xD2BB, /*start :一*/ + 0xD2BB, /*end :一, len=1*/ + &Cinfo[ 221 ], + &Prop127 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop125 = { + 0xD2B3, /*start :页*/ + 0xD2B3, /*end :页, len=1*/ + &Cinfo[ 220 ], + &Prop126 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop124 = { + 0xD2AA, /*start :要*/ + 0xD2AA, /*end :要, len=1*/ + &Cinfo[ 219 ], + &Prop125 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop123 = { + 0xD1A1, /*start :选*/ + 0xD1A1, /*end :选, len=1*/ + &Cinfo[ 218 ], + &Prop124 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop122 = { + 0xD0E8, /*start :需*/ + 0xD0E8, /*end :需, len=1*/ + &Cinfo[ 217 ], + &Prop123 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop121 = { + 0xD0DE, /*start :修*/ + 0xD0DE, /*end :修, len=1*/ + &Cinfo[ 216 ], + &Prop122 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop120 = { + 0xD0D4, /*start :性*/ + 0xD0D4, /*end :性, len=1*/ + &Cinfo[ 215 ], + &Prop121 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop119 = { + 0xD0D0, /*start :行*/ + 0xD0D0, /*end :行, len=1*/ + &Cinfo[ 214 ], + &Prop120 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop118 = { + 0xD0C5, /*start :信*/ + 0xD0C5, /*end :信, len=1*/ + &Cinfo[ 213 ], + &Prop119 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop117 = { + 0xD0B1, /*start :斜*/ + 0xD0B1, /*end :斜, len=1*/ + &Cinfo[ 212 ], + &Prop118 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop116 = { + 0xD0A3, /*start :校*/ + 0xD0A3, /*end :校, len=1*/ + &Cinfo[ 211 ], + &Prop117 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop115 = { + 0xCFFB, /*start :消*/ + 0xCFFB, /*end :消, len=1*/ + &Cinfo[ 210 ], + &Prop116 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop114 = { + 0xCFEE, /*start :项*/ + 0xCFEE, /*end :项, len=1*/ + &Cinfo[ 209 ], + &Prop115 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop113 = { + 0xCFDE, /*start :限*/ + 0xCFDE, /*end :限, len=1*/ + &Cinfo[ 208 ], + &Prop114 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop112 = { + 0xCFA2, /*start :息*/ + 0xCFA2, /*end :息, len=1*/ + &Cinfo[ 207 ], + &Prop113 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop111 = { + 0xCEF3, /*start :误*/ + 0xCEF3, /*end :误, len=1*/ + &Cinfo[ 206 ], + &Prop112 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop110 = { + 0xCEC2, /*start :温*/ + 0xCEC2, /*end :温, len=1*/ + &Cinfo[ 205 ], + &Prop111 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop109 = { + 0xCEBB, /*start :位*/ + 0xCEBB, /*end :位, len=1*/ + &Cinfo[ 204 ], + &Prop110 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop108 = { + 0xCEB4, /*start :未*/ + 0xCEB4, /*end :未, len=1*/ + &Cinfo[ 203 ], + &Prop109 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop107 = { + 0xCEAC, /*start :维*/ + 0xCEAC, /*end :维, len=1*/ + &Cinfo[ 202 ], + &Prop108 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop106 = { + 0xCCF5, /*start :条*/ + 0xCCF5, /*end :条, len=1*/ + &Cinfo[ 201 ], + &Prop107 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop105 = { + 0xCCD8, /*start :特*/ + 0xCCD8, /*end :特, len=1*/ + &Cinfo[ 200 ], + &Prop106 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop104 = { + 0xCBF9, /*start :所*/ + 0xCBF9, /*end :所, len=1*/ + &Cinfo[ 199 ], + &Prop105 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop103 = { + 0xCBD5, /*start :苏*/ + 0xCBD5, /*end :苏, len=1*/ + &Cinfo[ 198 ], + &Prop104 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop102 = { + 0xCBBE, /*start :司*/ + 0xCBBE, /*end :司, len=1*/ + &Cinfo[ 197 ], + &Prop103 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop101 = { + 0xCAFD, /*start :数*/ + 0xCAFD, /*end :数, len=1*/ + &Cinfo[ 196 ], + &Prop102 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop100 = { + 0xCAF5, /*start :术*/ + 0xCAF5, /*end :术, len=1*/ + &Cinfo[ 195 ], + &Prop101 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop99 = { + 0xCAE4, /*start :输*/ + 0xCAE4, /*end :输, len=1*/ + &Cinfo[ 194 ], + &Prop100 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop98 = { + 0xCAD7, /*start :首*/ + 0xCAD7, /*end :首, len=1*/ + &Cinfo[ 193 ], + &Prop99 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop97 = { + 0xCAD4, /*start :试*/ + 0xCAD4, /*end :试, len=1*/ + &Cinfo[ 192 ], + &Prop98 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop96 = { + 0xCAB9, /*start :使*/ + 0xCAB9, /*end :使, len=1*/ + &Cinfo[ 191 ], + &Prop97 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop95 = { + 0xCAB5, /*start :实*/ + 0xCAB5, /*end :实, len=1*/ + &Cinfo[ 190 ], + &Prop96 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop94 = { + 0xCAB1, /*start :时*/ + 0xCAB1, /*end :时, len=1*/ + &Cinfo[ 189 ], + &Prop95 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop93 = { + 0xCAAF, /*start :石*/ + 0xCAAF, /*end :石, len=1*/ + &Cinfo[ 188 ], + &Prop94 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop92 = { + 0xCAA7, /*start :失*/ + 0xCAA7, /*end :失, len=1*/ + &Cinfo[ 187 ], + &Prop93 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop91 = { + 0xC9FA, /*start :生*/ + 0xC9FA, /*end :生, len=1*/ + &Cinfo[ 186 ], + &Prop92 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop90 = { + 0xC9E8, /*start :设*/ + 0xC9E8, /*end :设, len=1*/ + &Cinfo[ 185 ], + &Prop91 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop89 = { + 0xC8EB, /*start :入*/ + 0xC8EB, /*end :入, len=1*/ + &Cinfo[ 184 ], + &Prop90 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop88 = { + 0xC8CF, /*start :认*/ + 0xC8CF, /*end :认, len=1*/ + &Cinfo[ 183 ], + &Prop89 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop87 = { + 0xC8A1, /*start :取*/ + 0xC8A1, /*end :取, len=1*/ + &Cinfo[ 182 ], + &Prop88 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop86 = { + 0xC7FD, /*start :驱*/ + 0xC7FD, /*end :驱, len=1*/ + &Cinfo[ 181 ], + &Prop87 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop85 = { + 0xC7F3, /*start :求*/ + 0xC7F3, /*end :求, len=1*/ + &Cinfo[ 180 ], + &Prop86 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop84 = { + 0xC7EB, /*start :请*/ + 0xC7EB, /*end :请, len=1*/ + &Cinfo[ 179 ], + &Prop85 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop83 = { + 0xC7B0, /*start :前*/ + 0xC7B0, /*end :前, len=1*/ + &Cinfo[ 178 ], + &Prop84 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop82 = { + 0xC6F7, /*start :器*/ + 0xC6F7, /*end :器, len=1*/ + &Cinfo[ 177 ], + &Prop83 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop81 = { + 0xC6F4, /*start :启*/ + 0xC6F4, /*end :启, len=1*/ + &Cinfo[ 176 ], + &Prop82 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop80 = { + 0xC6C2, /*start :坡*/ + 0xC6C2, /*end :坡, len=1*/ + &Cinfo[ 175 ], + &Prop81 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop79 = { + 0xC5E4, /*start :配*/ + 0xC5E4, /*end :配, len=1*/ + &Cinfo[ 174 ], + &Prop80 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop78 = { + 0xC4DC, /*start :能*/ + 0xC4DC, /*end :能, len=1*/ + &Cinfo[ 173 ], + &Prop79 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop77 = { + 0xC4BF, /*start :目*/ + 0xC4BF, /*end :目, len=1*/ + &Cinfo[ 172 ], + &Prop78 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop76 = { + 0xC4AC, /*start :默*/ + 0xC4AC, /*end :默, len=1*/ + &Cinfo[ 171 ], + &Prop77 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop75 = { + 0xC3EB, /*start :秒*/ + 0xC3EB, /*end :秒, len=1*/ + &Cinfo[ 170 ], + &Prop76 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop74 = { + 0xC3E6, /*start :面*/ + 0xC3E6, /*end :面, len=1*/ + &Cinfo[ 169 ], + &Prop75 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop73 = { + 0xC3DC, /*start :密*/ + 0xC3DC, /*end :密, len=1*/ + &Cinfo[ 168 ], + &Prop74 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop72 = { + 0xC3C5, /*start :门*/ + 0xC3C5, /*end :门, len=1*/ + &Cinfo[ 167 ], + &Prop73 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop71 = { + 0xC2FA, /*start :满*/ + 0xC2FA, /*end :满, len=1*/ + &Cinfo[ 166 ], + &Prop72 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop70 = { + 0xC2EB, /*start :码*/ + 0xC2EB, /*end :码, len=1*/ + &Cinfo[ 165 ], + &Prop71 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop69 = { + 0xC1F7, /*start :流*/ + 0xC1F7, /*end :流, len=1*/ + &Cinfo[ 164 ], + &Prop70 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop68 = { + 0xC1BF, /*start :量*/ + 0xC1BF, /*end :量, len=1*/ + &Cinfo[ 163 ], + &Prop69 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop67 = { + 0xC0A8, /*start :括*/ + 0xC0A8, /*end :括, len=1*/ + &Cinfo[ 162 ], + &Prop68 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop66 = { + 0xBFD8, /*start :控*/ + 0xBFD8, /*end :控, len=1*/ + &Cinfo[ 161 ], + &Prop67 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop65 = { + 0xBEDD, /*start :据*/ + 0xBEDE, /*end :巨, len=2*/ + &Cinfo[ 159 ], + &Prop66 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop64 = { + 0xBDF8, /*start :进*/ + 0xBDF8, /*end :进, len=1*/ + &Cinfo[ 158 ], + &Prop65 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop63 = { + 0xBDD7, /*start :阶*/ + 0xBDD7, /*end :阶, len=1*/ + &Cinfo[ 157 ], + &Prop64 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop62 = { + 0xBDAD, /*start :江*/ + 0xBDAD, /*end :江, len=1*/ + &Cinfo[ 156 ], + &Prop63 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop61 = { + 0xBCFE, /*start :件*/ + 0xBCFE, /*end :件, len=1*/ + &Cinfo[ 155 ], + &Prop62 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop60 = { + 0xBCFC, /*start :键*/ + 0xBCFC, /*end :键, len=1*/ + &Cinfo[ 154 ], + &Prop61 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop59 = { + 0xBCEC, /*start :检*/ + 0xBCEC, /*end :检, len=1*/ + &Cinfo[ 153 ], + &Prop60 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop58 = { + 0xBCD3, /*start :加*/ + 0xBCD3, /*end :加, len=1*/ + &Cinfo[ 152 ], + &Prop59 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop57 = { + 0xBCC6, /*start :计*/ + 0xBCC6, /*end :计, len=1*/ + &Cinfo[ 151 ], + &Prop58 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop56 = { + 0xBCBC, /*start :技*/ + 0xBCBC, /*end :技, len=1*/ + &Cinfo[ 150 ], + &Prop57 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop55 = { + 0xBCAD, /*start :辑*/ + 0xBCAD, /*end :辑, len=1*/ + &Cinfo[ 149 ], + &Prop56 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop54 = { + 0xBBF2, /*start :或*/ + 0xBBF2, /*end :或, len=1*/ + &Cinfo[ 148 ], + &Prop55 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop53 = { + 0xBBD8, /*start :回*/ + 0xBBD8, /*end :回, len=1*/ + &Cinfo[ 147 ], + &Prop54 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop52 = { + 0xBBD6, /*start :恢*/ + 0xBBD6, /*end :恢, len=1*/ + &Cinfo[ 146 ], + &Prop53 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop51 = { + 0xBBB6, /*start :欢*/ + 0xBBB6, /*end :欢, len=1*/ + &Cinfo[ 145 ], + &Prop52 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop50 = { + 0xBBA4, /*start :护*/ + 0xBBA4, /*end :护, len=1*/ + &Cinfo[ 144 ], + &Prop51 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop49 = { + 0xBAF3, /*start :后*/ + 0xBAF3, /*end :后, len=1*/ + &Cinfo[ 143 ], + &Prop50 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop48 = { + 0xBAC5, /*start :号*/ + 0xBAC5, /*end :号, len=1*/ + &Cinfo[ 142 ], + &Prop49 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop47 = { + 0xB9E6, /*start :规*/ + 0xB9E6, /*end :规, len=1*/ + &Cinfo[ 141 ], + &Prop48 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop46 = { + 0xB9CA, /*start :故*/ + 0xB9CA, /*end :故, len=1*/ + &Cinfo[ 140 ], + &Prop47 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop45 = { + 0xB9AB, /*start :公*/ + 0xB9AB, /*end :公, len=1*/ + &Cinfo[ 139 ], + &Prop46 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop44 = { + 0xB9A6, /*start :功*/ + 0xB9A6, /*end :功, len=1*/ + &Cinfo[ 138 ], + &Prop45 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop43 = { + 0xB8F1, /*start :格*/ + 0xB8F1, /*end :格, len=1*/ + &Cinfo[ 137 ], + &Prop44 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop42 = { + 0xB8C4, /*start :改*/ + 0xB8C4, /*end :改, len=1*/ + &Cinfo[ 136 ], + &Prop43 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop41 = { + 0xB8B4, /*start :复*/ + 0xB8B4, /*end :复, len=1*/ + &Cinfo[ 135 ], + &Prop42 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop40 = { + 0xB7B5, /*start :返*/ + 0xB7B5, /*end :返, len=1*/ + &Cinfo[ 134 ], + &Prop41 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop39 = { + 0xB7A7, /*start :阀*/ + 0xB7A7, /*end :阀, len=1*/ + &Cinfo[ 133 ], + &Prop40 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop38 = { + 0xB7A2, /*start :发*/ + 0xB7A2, /*end :发, len=1*/ + &Cinfo[ 132 ], + &Prop39 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop37 = { + 0xB6D4, /*start :对*/ + 0xB6D4, /*end :对, len=1*/ + &Cinfo[ 131 ], + &Prop38 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop36 = { + 0xB6CF, /*start :断*/ + 0xB6CF, /*end :断, len=1*/ + &Cinfo[ 130 ], + &Prop37 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop35 = { + 0xB6C8, /*start :度*/ + 0xB6C8, /*end :度, len=1*/ + &Cinfo[ 129 ], + &Prop36 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop34 = { + 0xB6AF, /*start :动*/ + 0xB6AF, /*end :动, len=1*/ + &Cinfo[ 128 ], + &Prop35 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop33 = { + 0xB6A8, /*start :定*/ + 0xB6A8, /*end :定, len=1*/ + &Cinfo[ 127 ], + &Prop34 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop32 = { + 0xB5E7, /*start :电*/ + 0xB5E7, /*end :电, len=1*/ + &Cinfo[ 126 ], + &Prop33 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop31 = { + 0xB5C4, /*start :的*/ + 0xB5C4, /*end :的, len=1*/ + &Cinfo[ 125 ], + &Prop32 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop30 = { + 0xB5B1, /*start :当*/ + 0xB5B1, /*end :当, len=1*/ + &Cinfo[ 124 ], + &Prop31 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop29 = { + 0xB5AB, /*start :但*/ + 0xB5AB, /*end :但, len=1*/ + &Cinfo[ 123 ], + &Prop30 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop28 = { + 0xB5A5, /*start :单*/ + 0xB5A5, /*end :单, len=1*/ + &Cinfo[ 122 ], + &Prop29 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop27 = { + 0xB4ED, /*start :错*/ + 0xB4ED, /*end :错, len=1*/ + &Cinfo[ 121 ], + &Prop28 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop26 = { + 0xB4E6, /*start :存*/ + 0xB4E6, /*end :存, len=1*/ + &Cinfo[ 120 ], + &Prop27 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop25 = { + 0xB3F6, /*start :出*/ + 0xB3F6, /*end :出, len=1*/ + &Cinfo[ 119 ], + &Prop26 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop24 = { + 0xB3CC, /*start :程*/ + 0xB3CC, /*end :程, len=1*/ + &Cinfo[ 118 ], + &Prop25 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop23 = { + 0xB3C9, /*start :成*/ + 0xB3C9, /*end :成, len=1*/ + &Cinfo[ 117 ], + &Prop24 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop22 = { + 0xB3AC, /*start :超*/ + 0xB3AC, /*end :超, len=1*/ + &Cinfo[ 116 ], + &Prop23 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop21 = { + 0xB3A7, /*start :厂*/ + 0xB3A7, /*end :厂, len=1*/ + &Cinfo[ 115 ], + &Prop22 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop20 = { + 0xB3A3, /*start :常*/ + 0xB3A3, /*end :常, len=1*/ + &Cinfo[ 114 ], + &Prop21 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop19 = { + 0xB2E9, /*start :查*/ + 0xB2E9, /*end :查, len=1*/ + &Cinfo[ 113 ], + &Prop20 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop18 = { + 0xB2E2, /*start :测*/ + 0xB2E2, /*end :测, len=1*/ + &Cinfo[ 112 ], + &Prop19 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop17 = { + 0xB2CE, /*start :参*/ + 0xB2CE, /*end :参, len=1*/ + &Cinfo[ 111 ], + &Prop18 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop16 = { + 0xB2CB, /*start :菜*/ + 0xB2CB, /*end :菜, len=1*/ + &Cinfo[ 110 ], + &Prop17 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop15 = { + 0xB2BB, /*start :不*/ + 0xB2BB, /*end :不, len=1*/ + &Cinfo[ 109 ], + &Prop16 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop14 = { + 0xB1E4, /*start :变*/ + 0xB1E4, /*end :变, len=1*/ + &Cinfo[ 108 ], + &Prop15 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop13 = { + 0xB1E0, /*start :编*/ + 0xB1E0, /*end :编, len=1*/ + &Cinfo[ 107 ], + &Prop14 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop12 = { + 0xB1BE, /*start :本*/ + 0xB1BE, /*end :本, len=1*/ + &Cinfo[ 106 ], + &Prop13 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop11 = { + 0xB1B8, /*start :备*/ + 0xB1B8, /*end :备, len=1*/ + &Cinfo[ 105 ], + &Prop12 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop10 = { + 0xB1A3, /*start :保*/ + 0xB1A3, /*end :保, len=1*/ + &Cinfo[ 104 ], + &Prop11 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop9 = { + 0xB0FC, /*start :包*/ + 0xB0FC, /*end :包, len=1*/ + &Cinfo[ 103 ], + &Prop10 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop8 = { + 0xB0E6, /*start :版*/ + 0xB0E6, /*end :版, len=1*/ + &Cinfo[ 102 ], + &Prop9 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop7 = { + 0xB0DC, /*start :败*/ + 0xB0DC, /*end :败, len=1*/ + &Cinfo[ 101 ], + &Prop8 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop6 = { + 0xA848, /*start :℉*/ + 0xA848, /*end :℉, len=1*/ + &Cinfo[ 100 ], + &Prop7 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop5 = { + 0xA3AC, /*start :,*/ + 0xA3AC, /*end :,, len=1*/ + &Cinfo[ 99 ], + &Prop6 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop4 = { + 0xA1E6, /*start :℃*/ + 0xA1E6, /*end :℃, len=1*/ + &Cinfo[ 98 ], + &Prop5 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = { + 0xA1E3, /*start :°*/ + 0xA1E3, /*end :°, len=1*/ + &Cinfo[ 97 ], + &Prop4 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = { + 0xA1A3, /*start :。*/ + 0xA1A3, /*end :。, len=1*/ + &Cinfo[ 96 ], + &Prop3 +}; + + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { + 0x0020, /*start : */ + 0x007F, /*end :, len=96*/ + &Cinfo[ 0 ], + &Prop2 +}; + + +GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24x24 = { + GUI_FONTTYPE_PROP_SJIS, + 24, /* height of font */ + 24, /* space of font y */ + 1, + 1, + &Prop1 +}; + diff --git a/User/system/lib/lcd/font/HZ32x32.c b/User/system/lib/lcd/font/HZ32x32.c new file mode 100644 index 0000000..92a4e2e --- /dev/null +++ b/User/system/lib/lcd/font/HZ32x32.c @@ -0,0 +1,3765 @@ +/* +********************************************************************** +* UcGUI Font +* Chinese GB2312 library +* (c) Copyright 19xx-20xx, company name +* +* +* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967) +* 字体:宋体,字形:粗体,大小:26,宽:32,高:32,水平偏移:0,垂直偏移:0 +* +********************************************************************** +*/ + +#include "GUI.H" + +/* char: code:0x0020 */ +static GUI_CONST_STORAGE unsigned char ac0020[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: ! code:0x0021 */ +static GUI_CONST_STORAGE unsigned char ac0021[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + ________, XXXX____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + ________, XXX_____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: " code:0x0022 */ +static GUI_CONST_STORAGE unsigned char ac0022[96] = { + ________, ________, ________, + ________, ________, ________, + ______XX, XX_XXXX_, ________, + ______XX, XX_XXXX_, ________, + _____XXX, XXXXXXX_, ________, + ____XXXX, _XXXX___, ________, + ____XXX_, _XXX____, ________, + ___XXX__, XXX_____, ________, + ___XX___, XX______, ________, + __XX___X, X_______, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: # code:0x0023 */ +static GUI_CONST_STORAGE unsigned char ac0023[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _____XX_, _____XX_, ________, + _____XX_, _____XX_, ________, + _____XX_, _____XX_, ________, + _____XX_, _____XX_, ________, + _____XX_, _____XX_, ________, + _XXXXXXX, XXXXXXXX, XX______, + _XXXXXXX, XXXXXXXX, XX______, + _XXXXXXX, XXXXXXXX, XX______, + ____XXX_, ____XXX_, ________, + ____XX__, ____XX__, ________, + ____XX__, ____XX__, ________, + ____XX__, ____XX__, ________, + ____XX__, ____XX__, ________, + ____XX__, ____XX__, ________, + ____XX__, ____XX__, ________, + _XXXXXXX, XXXXXXXX, XX______, + _XXXXXXX, XXXXXXXX, XX______, + _XXXXXXX, XXXXXXXX, XX______, + ___XXX__, ___XXX__, ________, + ___XXX__, ___XXX__, ________, + ___XX___, ___XXX__, ________, + ___XX___, ___XX___, ________, + ___XX___, ___XX___, ________, + ___XX___, ___XX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: $ code:0x0024 */ +static GUI_CONST_STORAGE unsigned char ac0024[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XX______, ________, + ________, XX______, ________, + ______XX, XXXXX___, ________, + _____XXX, XX__XX__, ________, + ____XXX_, XX___XX_, ________, + ___XXX__, XX___XXX, ________, + ___XXX__, XX___XXX, ________, + ___XXX__, XX__XXXX, ________, + ___XXX__, XX__XXXX, ________, + ___XXXX_, XX______, ________, + ____XXXX, XX______, ________, + _____XXX, XX______, ________, + ______XX, XXX_____, ________, + _______X, XXXX____, ________, + ________, XXXXX___, ________, + ________, XXXXXX__, ________, + ________, XX_XXXX_, ________, + ________, XX__XXXX, ________, + ________, XX__XXXX, ________, + __XXXX__, XX___XXX, ________, + __XXXX__, XX___XXX, ________, + __XXXX__, XX___XXX, ________, + __XXX___, XX___XX_, ________, + ___XX___, XX__XXX_, ________, + ____XX__, XX_XXX__, ________, + _____XXX, XXXX____, ________, + ________, XX______, ________, + ________, XX______, ________}; + +/* char: % code:0x0025 */ +static GUI_CONST_STORAGE unsigned char ac0025[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + __XXXX__, _____XX_, ________, + _XXXXXX_, ____XXX_, ________, + _XX__XX_, ____XX__, ________, + XXX__XXX, ____XX__, ________, + XXX__XXX, ___XX___, ________, + XXX__XXX, ___XX___, ________, + XXX__XXX, __XX____, ________, + XXX__XXX, __XX____, ________, + XXX__XXX, _XXX____, ________, + XXX__XXX, _XX_____, ________, + _XX__XX_, _XX_____, ________, + _XXXXXX_, XX__XXXX, ________, + __XXXX__, XX_XXXXX, X_______, + _______X, X__XX__X, X_______, + _______X, X_XXX__X, XX______, + ______XX, X_XXX__X, XX______, + ______XX, __XXX__X, XX______, + ______XX, __XXX__X, XX______, + _____XX_, __XXX__X, XX______, + _____XX_, __XXX__X, XX______, + ____XX__, __XXX__X, XX______, + ____XX__, ___XX__X, X_______, + ___XX___, ___XXXXX, X_______, + ___XX___, ____XXXX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: & code:0x0026 */ +static GUI_CONST_STORAGE unsigned char ac0026[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _____XXX, XX______, ________, + ____XXX_, XX______, ________, + ___XXX__, XXX_____, ________, + ___XXX__, XXX_____, ________, + ___XXX__, XXX_____, ________, + ___XXX__, XXX_____, ________, + ___XXX__, XXX_____, ________, + ___XXX__, XX______, ________, + ___XXXXX, XX______, ________, + ____XXXX, X_______, ________, + ____XXXX, __XXXXXX, ________, + ___XXXXX, ___XXX__, ________, + __XXXXXX, ____XX__, ________, + _XXX_XXX, ____XX__, ________, + _XX__XXX, X___XX__, ________, + XXX___XX, X__XXX__, ________, + XXX___XX, XX_XX___, ________, + XXX____X, XX_XX___, ________, + XXX____X, XXXXX___, ________, + XXX_____, XXXX____, ________, + _XXX____, _XXXX___, XX______, + _XXX____, _XXXXX_X, XX______, + __XXX___, XX_XXXXX, X_______, + ___XXXXX, X___XXXX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: ' code:0x0027 */ +static GUI_CONST_STORAGE unsigned char ac0027[96] = { + ________, ________, ________, + ________, ________, ________, + ___XXX__, ________, ________, + __XXXXX_, ________, ________, + __XXXXX_, ________, ________, + ___XXXX_, ________, ________, + ____XXX_, ________, ________, + ____XX__, ________, ________, + ___XXX__, ________, ________, + __XXX___, ________, ________, + _XXX____, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: ( code:0x0028 */ +static GUI_CONST_STORAGE unsigned char ac0028[96] = { + ________, ________, ________, + ________, ________, ________, + ________, _______X, X_______, + ________, ______XX, ________, + ________, _____XX_, ________, + ________, ____XXX_, ________, + ________, ____XX__, ________, + ________, ___XXX__, ________, + ________, __XXX___, ________, + ________, __XXX___, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, __XXX___, ________, + ________, __XXX___, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ____XXX_, ________, + ________, _____XX_, ________, + ________, ______XX, ________}; + +/* char: ) code:0x0029 */ +static GUI_CONST_STORAGE unsigned char ac0029[96] = { + ________, ________, ________, + ________, ________, ________, + __XX____, ________, ________, + ___XX___, ________, ________, + ____XX__, ________, ________, + ____XXX_, ________, ________, + _____XX_, ________, ________, + _____XXX, ________, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + _______X, XX______, ________, + _______X, XX______, ________, + _______X, XX______, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + _______X, XX______, ________, + _______X, XX______, ________, + _______X, XX______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + ____XXX_, ________, ________, + ____XX__, ________, ________, + ___XX___, ________, ________}; + +/* char: * code:0x002A */ +static GUI_CONST_STORAGE unsigned char ac002A[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _XXXX___, XX___XXX, X_______, + _XXXXX__, XX__XXXX, X_______, + __XXXXX_, XX_XXXXX, ________, + ____XXXX, XXXXXX__, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + ____XXXX, XXXXXX__, ________, + __XXXXX_, XX_XXXXX, ________, + _XXXXX__, XX__XXXX, X_______, + _XXXX___, XX___XXX, X_______, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: + code:0x002B */ +static GUI_CONST_STORAGE unsigned char ac002B[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + __XXXXXX, XXXXXXXX, XX______, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: , code:0x002C */ +static GUI_CONST_STORAGE unsigned char ac002C[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XXX__, ________, ________, + __XXXXX_, ________, ________, + __XXXXX_, ________, ________, + ___XXXX_, ________, ________, + ____XXX_, ________, ________, + ____XX__, ________, ________, + ___XXX__, ________, ________}; + +/* char: - code:0x002D */ +static GUI_CONST_STORAGE unsigned char ac002D[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXXXX, X_______, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: . code:0x002E */ +static GUI_CONST_STORAGE unsigned char ac002E[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XXX__, ________, ________, + __XXXXX_, ________, ________, + __XXXXX_, ________, ________, + ___XXX__, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: / code:0x002F */ +static GUI_CONST_STORAGE unsigned char ac002F[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, XX______, + ________, _______X, XX______, + ________, _______X, X_______, + ________, ______XX, ________, + ________, ______XX, ________, + ________, _____XX_, ________, + ________, _____XX_, ________, + ________, ____XX__, ________, + ________, ____XX__, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, __XX____, ________, + ________, __XX____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, XX______, ________, + ________, XX______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + ______XX, ________, ________, + ______XX, ________, ________, + _____XX_, ________, ________, + _____XX_, ________, ________, + ____XX__, ________, ________, + ____XX__, ________, ________, + ___XX___, ________, ________, + ___XX___, ________, ________, + __XX____, ________, ________, + _XXX____, ________, ________}; + +/* char: 0 code:0x0030 */ +static GUI_CONST_STORAGE unsigned char ac0030[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXX____, ________, + _____XXX, ___XXX__, ________, + ____XXX_, ____XXX_, ________, + ____XXX_, _____XX_, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ______XX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + ___XXX__, ______XX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ____XXX_, _____XX_, ________, + _____XX_, ____XXX_, ________, + _____XXX, ___XXX__, ________, + _______X, XXXX____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 1 code:0x0031 */ +static GUI_CONST_STORAGE unsigned char ac0031[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _XX_____, ________, + ________, XXX_____, ________, + ____XXXX, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + ____XXXX, XXXXXXX_, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 2 code:0x0032 */ +static GUI_CONST_STORAGE unsigned char ac0032[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXX___, ________, + ____XXX_, ___XXXX_, ________, + ___XXX__, _____XXX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ___XX___, ________, + ________, __XX____, ________, + ________, _XX_____, ________, + ________, XX______, ________, + _______X, X_______, ________, + ______XX, ________, ________, + _____XX_, _______X, X_______, + ____XX__, _______X, X_______, + ___XX___, ______XX, X_______, + __XXX___, _____XXX, X_______, + __XXXXXX, XXXXXXXX, ________, + __XXXXXX, XXXXXXXX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 3 code:0x0033 */ +static GUI_CONST_STORAGE unsigned char ac0033[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _____XXX, XXXX____, ________, + ____XX__, __XXXX__, ________, + ___XX___, ____XXX_, ________, + __XX____, ____XXXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + ________, _____XXX, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, __XXX___, ________, + _______X, XXXX____, ________, + ________, ___XXX__, ________, + ________, _____XX_, ________, + ________, _____XXX, ________, + ________, ______XX, X_______, + ________, ______XX, X_______, + ___XXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ____XXX_, ___XXX__, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 4 code:0x0034 */ +static GUI_CONST_STORAGE unsigned char ac0034[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, __XXXX__, ________, + ________, _XXXXX__, ________, + ________, _XXXXX__, ________, + ________, XX_XXX__, ________, + _______X, XX_XXX__, ________, + _______X, X__XXX__, ________, + ______XX, ___XXX__, ________, + _____XXX, ___XXX__, ________, + _____XX_, ___XXX__, ________, + ____XX__, ___XXX__, ________, + ___XXX__, ___XXX__, ________, + ___XX___, ___XXX__, ________, + __XX____, ___XXX__, ________, + _XXX____, ___XXX__, ________, + _XXXXXXX, XXXXXXXX, XX______, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + _______X, XXXXXXXX, X_______, + ________, ________, ________, + ________, ________, ________}; + +/* char: 5 code:0x0035 */ +static GUI_CONST_STORAGE unsigned char ac0035[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XXXX, XXXXXXXX, X_______, + ____XXXX, XXXXXXXX, X_______, + ____XX__, ________, ________, + ____XX__, ________, ________, + ___XXX__, ________, ________, + ___XX___, ________, ________, + ___XX___, ________, ________, + ___XX___, ________, ________, + ___XX___, ________, ________, + ___XX_XX, XXXXX___, ________, + ___XXXXX, ____XXX_, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ________, ______XX, X_______, + ________, ______XX, X_______, + ________, ______XX, X_______, + ________, ______XX, X_______, + ___XXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXX___, _____XXX, ________, + ___XX___, ____XXX_, ________, + ____XXX_, ___XXXX_, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 6 code:0x0036 */ +static GUI_CONST_STORAGE unsigned char ac0036[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXXXXX__, ________, + ______XX, X____XX_, ________, + _____XXX, _____XXX, ________, + ____XXX_, _____XXX, ________, + ____XX__, _____XXX, ________, + ___XXX__, ________, ________, + ___XX___, ________, ________, + ___XX___, ________, ________, + __XXX___, ________, ________, + __XXX__X, XXXXX___, ________, + __XXXXXX, ____XXX_, ________, + __XXXXX_, _____XXX, ________, + __XXXX__, _____XXX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, ________, + ____XXX_, _____XXX, ________, + _____XXX, ____XXX_, ________, + _______X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 7 code:0x0037 */ +static GUI_CONST_STORAGE unsigned char ac0037[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XXXXX, XXXXXXXX, X_______, + ___XXXXX, XXXXXXXX, X_______, + ___XXX__, ______XX, ________, + __XXX___, _____XX_, ________, + __XX____, _____XX_, ________, + __XX____, ____XX__, ________, + ________, ___XXX__, ________, + ________, ___XX___, ________, + ________, __XXX___, ________, + ________, __XX____, ________, + ________, _XXX____, ________, + ________, _XX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XX______, ________, + _______X, XX______, ________, + _______X, XX______, ________, + _______X, XX______, ________, + ______XX, XX______, ________, + ______XX, XX______, ________, + ______XX, XX______, ________, + ______XX, XX______, ________, + ______XX, XX______, ________, + ______XX, XX______, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 8 code:0x0038 */ +static GUI_CONST_STORAGE unsigned char ac0038[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXXX___, ________, + _____XXX, ____XXX_, ________, + ____XXX_, _____XXX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXXX_, ______XX, X_______, + ____XXXX, _____XXX, ________, + ____XXXX, X____XX_, ________, + _____XXX, XXXXXX__, ________, + ______XX, XXXXX___, ________, + _____XXX, _XXXXX__, ________, + ____XXX_, ___XXXX_, ________, + ___XXX__, ____XXXX, ________, + __XXX___, _____XXX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + ___XXX__, ______XX, ________, + ___XXX__, _____XXX, ________, + ____XXXX, ____XXX_, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 9 code:0x0039 */ +static GUI_CONST_STORAGE unsigned char ac0039[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXX____, ________, + ____XXXX, ___XXX__, ________, + ____XX__, ____XXX_, ________, + ___XXX__, _____XXX, ________, + ___XX___, _____XXX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, _____XXX, X_______, + ___XXX__, _____XXX, X_______, + ___XXX__, ____XXXX, X_______, + ____XXXX, ___XX_XX, X_______, + ______XX, XXXX__XX, X_______, + ________, ______XX, X_______, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ___XXX__, ________, + ____XX__, _XXXX___, ________, + _____XXX, XXX_____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: : code:0x003A */ +static GUI_CONST_STORAGE unsigned char ac003A[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + ________, XXX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + ________, XXX_____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: ; code:0x003B */ +static GUI_CONST_STORAGE unsigned char ac003B[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + ________, XXX_____, ________, + ________, XX______, ________}; + +/* char: < code:0x003C */ +static GUI_CONST_STORAGE unsigned char ac003C[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ______XX, ________, + ________, _____XX_, ________, + ________, ____XX__, ________, + ________, ___XX___, ________, + ________, __XX____, ________, + ________, _XX_____, ________, + ________, XX______, ________, + _______X, X_______, ________, + ______XX, ________, ________, + _____XX_, ________, ________, + ____XX__, ________, ________, + ___XX___, ________, ________, + ___XX___, ________, ________, + ____XX__, ________, ________, + _____XX_, ________, ________, + ______XX, ________, ________, + _______X, X_______, ________, + ________, XX______, ________, + ________, _XX_____, ________, + ________, __XX____, ________, + ________, ___XX___, ________, + ________, ____XX__, ________, + ________, _____XX_, ________, + ________, ______XX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: = code:0x003D */ +static GUI_CONST_STORAGE unsigned char ac003D[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXXXX, X_______, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXXXX, X_______, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: > code:0x003E */ +static GUI_CONST_STORAGE unsigned char ac003E[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + __XX____, ________, ________, + ___XX___, ________, ________, + ____XX__, ________, ________, + _____XX_, ________, ________, + ______XX, ________, ________, + _______X, X_______, ________, + ________, XX______, ________, + ________, _XX_____, ________, + ________, __XX____, ________, + ________, ___XX___, ________, + ________, ____XX__, ________, + ________, _____XX_, ________, + ________, _____XX_, ________, + ________, ____XX__, ________, + ________, ___XX___, ________, + ________, __XX____, ________, + ________, _XX_____, ________, + ________, XX______, ________, + _______X, X_______, ________, + ______XX, ________, ________, + _____XX_, ________, ________, + ____XX__, ________, ________, + ___XX___, ________, ________, + __XX____, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: ? code:0x003F */ +static GUI_CONST_STORAGE unsigned char ac003F[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXX___, ________, + _____XXX, ____XXX_, ________, + ____XX__, _____XXX, ________, + ___XX___, ______XX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXXX__, ______XX, X_______, + __XXXX__, ______XX, X_______, + ___XXX__, _____XXX, X_______, + ________, _____XXX, ________, + ________, ___XXXXX, ________, + ________, __XXXX__, ________, + ________, _XXX____, ________, + ________, XXX_____, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + ________, XXX_____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: @ code:0x0040 */ +static GUI_CONST_STORAGE unsigned char ac0040[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXXX___, ________, + _____XXX, X___XXX_, ________, + ____XXX_, ______XX, ________, + ___XXX__, _______X, X_______, + ___XX___, _XXXXXXX, X_______, + __XXX___, XXX_XXX_, XX______, + __XXX__X, XX__XXX_, XX______, + __XX___X, XX__XXX_, XX______, + _XXX__XX, X___XX__, XX______, + _XXX__XX, X___XX__, XX______, + _XXX_XXX, ___XXX__, XX______, + _XXX_XXX, ___XXX__, XX______, + _XXX_XXX, ___XXX__, XX______, + _XXX_XXX, ___XXX__, XX______, + _XXX_XXX, ___XXX_X, X_______, + _XXX_XXX, __XXX__X, X_______, + _XXX__XX, _XXXX_XX, ________, + __XXX_XX, XX__XXX_, ________, + __XXX___, ________, XX______, + ___XX___, _______X, X_______, + ___XXX__, ______XX, X_______, + ____XXX_, _____XXX, ________, + _____XXX, ____XXX_, ________, + _______X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: A code:0x0041 */ +static GUI_CONST_STORAGE unsigned char ac0041[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + ______XX, _XXX____, ________, + ______XX, _XXX____, ________, + ______XX, _XXX____, ________, + ______XX, _XXX____, ________, + _____XX_, __XXX___, ________, + _____XX_, __XXX___, ________, + _____XX_, __XXX___, ________, + _____XX_, __XXX___, ________, + ____XX__, ___XXX__, ________, + ____XX__, ___XXX__, ________, + ____XXXX, XXXXXX__, ________, + ___XXX__, ___XXX__, ________, + ___XX___, ___XXXX_, ________, + ___XX___, ____XXX_, ________, + ___XX___, ____XXX_, ________, + __XXX___, ____XXX_, ________, + __XX____, ____XXXX, ________, + __XX____, _____XXX, ________, + __XXX___, _____XXX, ________, + XXXXXX__, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: B code:0x0042 */ +static GUI_CONST_STORAGE unsigned char ac0042[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXX__, ________, + ___XXX__, ___XXXXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ___XXX__, ________, + ___XXXXX, XXXXX___, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ______XX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ____XXXX, ________, + _XXXXXXX, XXXXXX__, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: C code:0x0043 */ +static GUI_CONST_STORAGE unsigned char ac0043[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXXXX_X, X_______, + _____XXX, ____XXXX, X_______, + ____XXX_, ______XX, X_______, + ___XXX__, _______X, X_______, + ___XXX__, ________, XX______, + __XXX___, ________, XX______, + __XXX___, ________, ________, + __XX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + __XXX___, ________, XX______, + __XXX___, ________, XX______, + __XXX___, _______X, X_______, + ___XXX__, _______X, X_______, + ____XXX_, ______XX, ________, + _____XXX, ____XXX_, ________, + _______X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: D code:0x0044 */ +static GUI_CONST_STORAGE unsigned char ac0044[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXX____, ________, + ___XXX__, __XXXX__, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, __XXXX__, ________, + _XXXXXXX, XXXX____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: E code:0x0045 */ +static GUI_CONST_STORAGE unsigned char ac0045[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXXXX, X_______, + ___XXX__, _____XXX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _______X, XX______, + ___XXX__, ________, XX______, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ___XXX__, ________, + ___XXXXX, XXXXXX__, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, XX______, + ___XXX__, ________, XX______, + ___XXX__, _______X, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, X_______, + _XXXXXXX, XXXXXXXX, X_______, + ________, ________, ________, + ________, ________, ________}; + +/* char: F code:0x0046 */ +static GUI_CONST_STORAGE unsigned char ac0046[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXXXX, X_______, + ___XXX__, _____XXX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _______X, XX______, + ___XXX__, ________, XX______, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ___XXX__, ________, + ___XXXXX, XXXXXX__, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + _XXXXXXX, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: G code:0x0047 */ +static GUI_CONST_STORAGE unsigned char ac0047[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXX____, ________, + _____XXX, ___XXXX_, ________, + ____XXX_, ____XXX_, ________, + ___XXX__, _____XXX, ________, + ___XX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ________, ________, + __XX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ________, ________, + _XXX____, ___XXXXX, XX______, + _XXX____, _____XXX, ________, + _XXX____, _____XXX, ________, + _XXX____, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + ___XX___, _____XXX, ________, + ___XXX__, _____XXX, ________, + ____XXX_, _____XXX, ________, + _____XXX, ____XX__, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: H code:0x0048 */ +static GUI_CONST_STORAGE unsigned char ac0048[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + XXXXXXX_, ___XXXXX, XX______, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXXXXX, XXXXXXXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + XXXXXXX_, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: I code:0x0049 */ +static GUI_CONST_STORAGE unsigned char ac0049[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XXXX, XXXXXXX_, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ____XXXX, XXXXXXX_, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: J code:0x004A */ +static GUI_CONST_STORAGE unsigned char ac004A[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXXXXX, XXX_____, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + _XXXX___, ___XX___, ________, + _XXXX___, __XXX___, ________}; + +/* char: K code:0x004B */ +static GUI_CONST_STORAGE unsigned char ac004B[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, __XXXXXX, X_______, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XX__, ________, + ___XXX__, ___XX___, ________, + ___XXX__, __XXX___, ________, + ___XXX__, __XX____, ________, + ___XXX__, _XX_____, ________, + ___XXX__, XX______, ________, + ___XXX__, XX______, ________, + ___XXX_X, XX______, ________, + ___XXXXX, XX______, ________, + ___XXXXX, XXX_____, ________, + ___XXXX_, XXX_____, ________, + ___XXX__, _XXX____, ________, + ___XXX__, _XXX____, ________, + ___XXX__, __XXX___, ________, + ___XXX__, __XXX___, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ___XXXX_, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXXX, ________, + ___XXX__, _____XXX, ________, + _XXXXXXX, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: L code:0x004C */ +static GUI_CONST_STORAGE unsigned char ac004C[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, XX______, + ___XXX__, ________, XX______, + ___XXX__, _______X, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, X_______, + _XXXXXXX, XXXXXXXX, X_______, + ________, ________, ________, + ________, ________, ________}; + +/* char: M code:0x004D */ +static GUI_CONST_STORAGE unsigned char ac004D[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + XXXXXX__, _____XXX, XXX_____, + __XXXX__, _____XXX, X_______, + __XXXX__, _____XXX, X_______, + __XXXX__, _____XXX, X_______, + __XXXXX_, ____XXXX, X_______, + __XXXXX_, ____XXXX, X_______, + __XXXXX_, ____XXXX, X_______, + __XXXXX_, ____XXXX, X_______, + __XXXXX_, ___XXXXX, X_______, + __XXXXXX, ___XX_XX, X_______, + __XX_XXX, ___XX_XX, X_______, + __XX_XXX, ___XX_XX, X_______, + __XX_XXX, __XXX_XX, X_______, + __XX_XXX, X_XX__XX, X_______, + __XX__XX, X_XX__XX, X_______, + __XX__XX, X_XX__XX, X_______, + __XX__XX, XXXX__XX, X_______, + __XX__XX, XXX___XX, X_______, + __XX___X, XXX___XX, X_______, + __XX___X, XXX___XX, X_______, + __XX___X, XXX___XX, X_______, + __XX___X, XX____XX, X_______, + __XX___X, XX____XX, X_______, + XXXXXX__, XX__XXXX, XXX_____, + ________, ________, ________, + ________, ________, ________}; + +/* char: N code:0x004E */ +static GUI_CONST_STORAGE unsigned char ac004E[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXX__, ____XXXX, XX______, + ___XXXX_, ______XX, ________, + ___XXXX_, ______XX, ________, + ___XXXXX, ______XX, ________, + ___XXXXX, ______XX, ________, + ___XXXXX, X_____XX, ________, + ___XX_XX, X_____XX, ________, + ___XX_XX, X_____XX, ________, + ___XX__X, XX____XX, ________, + ___XX__X, XX____XX, ________, + ___XX___, XXX___XX, ________, + ___XX___, XXX___XX, ________, + ___XX___, _XXX__XX, ________, + ___XX___, _XXX__XX, ________, + ___XX___, __XXX_XX, ________, + ___XX___, __XXX_XX, ________, + ___XX___, ___XXXXX, ________, + ___XX___, ___XXXXX, ________, + ___XX___, ___XXXXX, ________, + ___XX___, ____XXXX, ________, + ___XX___, ____XXXX, ________, + ___XX___, _____XXX, ________, + ___XX___, _____XXX, ________, + _XXXXXX_, ______XX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: O code:0x004F */ +static GUI_CONST_STORAGE unsigned char ac004F[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXX___, ________, + _____XXX, ___XXX__, ________, + ____XXX_, _____XX_, ________, + ___XXX__, _____XXX, ________, + ___XX___, ______XX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + _XXX____, _______X, X_______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + __XXX___, _______X, X_______, + __XXX___, ______XX, X_______, + ___XX___, ______XX, ________, + ___XXX__, _____XXX, ________, + ____XXX_, _____XX_, ________, + _____XXX, ___XXX__, ________, + _______X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: P code:0x0050 */ +static GUI_CONST_STORAGE unsigned char ac0050[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXXX__, ________, + ___XXX__, ____XXXX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, _______X, XX______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, X_______, + ___XXX__, ____XXXX, ________, + ___XXXXX, XXXXXX__, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + _XXXXXXX, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: Q code:0x0051 */ +static GUI_CONST_STORAGE unsigned char ac0051[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXX___, ________, + _____XXX, ___XXX__, ________, + ____XXX_, _____XX_, ________, + ___XXX__, _____XXX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, _______X, X_______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + _XXX____, _______X, XX______, + __XX_XXX, XXX____X, X_______, + __XXXXX_, _XXX__XX, X_______, + __XXXX__, __XXX_XX, X_______, + ___XXX__, __XXX_XX, ________, + ____XX__, __XXXXX_, ________, + _____XXX, ___XXXX_, ________, + ______XX, XXXXXX__, ________, + ________, ___XXXX_, XX______, + ________, ____XXXX, X_______}; + +/* char: R code:0x0052 */ +static GUI_CONST_STORAGE unsigned char ac0052[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, XXXXX___, ________, + ___XXX__, ___XXXX_, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ___XXXX_, ________, + ___XXXXX, XXXXX___, ________, + ___XXX__, _XXX____, ________, + ___XXX__, _XXX____, ________, + ___XXX__, _XXXX___, ________, + ___XXX__, __XXX___, ________, + ___XXX__, __XXXX__, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ___XXXX_, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXXX, ________, + ___XXX__, _____XXX, ________, + _XXXXXXX, _____XXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: S code:0x0053 */ +static GUI_CONST_STORAGE unsigned char ac0053[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXX____, ________, + ____XXX_, ___XXXXX, ________, + ___XXX__, ____XXXX, ________, + ___XX___, _____XXX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ________, ________, + __XXXX__, ________, ________, + ___XXXX_, ________, ________, + ___XXXXX, ________, ________, + _____XXX, XX______, ________, + _______X, XXXXX___, ________, + ________, _XXXXX__, ________, + ________, ___XXXX_, ________, + ________, ____XXXX, ________, + ________, _____XXX, X_______, + ________, ______XX, X_______, + __XX____, ______XX, X_______, + __XX____, ______XX, X_______, + __XXX___, ______XX, X_______, + ___XX___, ______XX, ________, + ___XXX__, _____XXX, ________, + ___XXXXX, ____XXX_, ________, + ___XX__X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: T code:0x0054 */ +static GUI_CONST_STORAGE unsigned char ac0054[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + __XXXXXX, XXXXXXXX, X_______, + __XXX___, XXX___XX, X_______, + __XX____, XXX____X, X_______, + _XXX____, XXX_____, XX______, + _XX_____, XXX_____, XX______, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: U code:0x0055 */ +static GUI_CONST_STORAGE unsigned char ac0055[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + XXXXXXX_, ____XXXX, XX______, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, ______XX, ________, + __XXX___, _____XXX, ________, + ___XXX__, _____XX_, ________, + ____XXX_, ___XXX__, ________, + ______XX, XXXX____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: V code:0x0056 */ +static GUI_CONST_STORAGE unsigned char ac0056[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, ____XXXX, XX______, + ___XXX__, ______XX, ________, + ___XXX__, ______XX, ________, + ___XXXX_, _____XXX, ________, + ____XXX_, _____XX_, ________, + ____XXX_, _____XX_, ________, + ____XXX_, _____XX_, ________, + ____XXXX, ____XX__, ________, + _____XXX, ____XX__, ________, + _____XXX, ____XX__, ________, + _____XXX, ____XX__, ________, + _____XXX, ___XX___, ________, + _____XXX, X__XX___, ________, + ______XX, X__XX___, ________, + ______XX, X__XX___, ________, + ______XX, X_XX____, ________, + ______XX, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + ________, XXX_____, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: W code:0x0057 */ +static GUI_CONST_STORAGE unsigned char ac0057[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + XXXXXX_X, XXXXX_XX, XXX_____, + _XXXX___, XXX____X, XX______, + __XXX___, XXX____X, X_______, + __XXX___, XXX____X, X_______, + __XXX___, XXXX___X, X_______, + __XXX___, _XXX___X, X_______, + __XXX___, XXXX__XX, ________, + __XXX___, XXXX__XX, ________, + __XXX___, XXXX__XX, ________, + ___XXX__, XXXX__XX, ________, + ___XXX__, XXXX__XX, ________, + ___XXX_X, XXXXX_XX, ________, + ___XXX_X, X_XXXXX_, ________, + ___XXX_X, X_XXXXX_, ________, + ___XXX_X, X_XXXXX_, ________, + ____XXXX, X_XXXXX_, ________, + ____XXXX, __XXXXX_, ________, + ____XXXX, __XXXXX_, ________, + ____XXXX, ___XXX__, ________, + ____XXXX, ___XXX__, ________, + ____XXXX, ___XXX__, ________, + _____XX_, ___XXX__, ________, + _____XX_, ___XXX__, ________, + _____XX_, ___XX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: X code:0x0058 */ +static GUI_CONST_STORAGE unsigned char ac0058[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, ___XXXXX, X_______, + ___XXXX_, _____XXX, ________, + ____XXX_, _____XX_, ________, + ____XXX_, ____XX__, ________, + _____XXX, ____XX__, ________, + _____XXX, ___XX___, ________, + ______XX, X__XX___, ________, + ______XX, X_XXX___, ________, + ______XX, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + ______XX, X_XXX___, ________, + ______XX, __XXX___, ________, + ______XX, __XXXX__, ________, + _____XX_, ___XXX__, ________, + _____XX_, ___XXXX_, ________, + ____XX__, ____XXX_, ________, + ____XX__, ____XXXX, ________, + ___XXX__, _____XXX, ________, + _XXXXXX_, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: Y code:0x0059 */ +static GUI_CONST_STORAGE unsigned char ac0059[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, ____XXXX, XX______, + __XXXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXXX_, _____XX_, ________, + ____XXX_, _____XX_, ________, + ____XXX_, ____XX__, ________, + _____XXX, ____XX__, ________, + _____XXX, ___XXX__, ________, + _____XXX, X__XX___, ________, + ______XX, X__XX___, ________, + ______XX, X_XX____, ________, + _______X, XXXX____, ________, + _______X, XXXX____, ________, + _______X, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: Z code:0x005A */ +static GUI_CONST_STORAGE unsigned char ac005A[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XXXXX, XXXXXXXX, X_______, + ___XXXX_, _____XXX, ________, + ___XXX__, ____XXXX, ________, + __XXX___, ____XXX_, ________, + __XX____, ___XXXX_, ________, + ________, ___XXX__, ________, + ________, __XXXX__, ________, + ________, __XXX___, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + _______X, XX______, ________, + _______X, XX______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + _____XXX, ________, ________, + ____XXXX, ________, ________, + ____XXX_, _______X, X_______, + ___XXXX_, _______X, X_______, + ___XXX__, ______XX, ________, + __XXXX__, _____XXX, ________, + __XXX___, ____XXXX, ________, + _XXXXXXX, XXXXXXXX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: [ code:0x005B */ +static GUI_CONST_STORAGE unsigned char ac005B[96] = { + ________, ________, ________, + ________, ________, ________, + _______X, XXXXXXXX, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________}; + +/* char: \ code:0x005C */ +static GUI_CONST_STORAGE unsigned char ac005C[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XXX__, ________, ________, + ____XX__, ________, ________, + ____XXX_, ________, ________, + ____XXX_, ________, ________, + _____XX_, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + _______X, X_______, ________, + _______X, XX______, ________, + _______X, XX______, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, __XX____, ________, + ________, __XXX___, ________, + ________, __XXX___, ________, + ________, ___XXX__, ________, + ________, ___XXX__, ________, + ________, ____XX__, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, _____XXX, ________, + ________, _____XXX, ________}; + +/* char: ] code:0x005D */ +static GUI_CONST_STORAGE unsigned char ac005D[96] = { + ________, ________, ________, + ________, ________, ________, + __XXXXXX, XXXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________, + ________, _XXX____, ________}; + +/* char: ^ code:0x005E */ +static GUI_CONST_STORAGE unsigned char ac005E[96] = { + ________, ________, ________, + ________, ________, ________, + _______X, XXXX____, ________, + ______XX, XXXX____, ________, + _____XXX, __XXX___, ________, + ____XX__, ____XX__, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: _ code:0x005F */ +static GUI_CONST_STORAGE unsigned char ac005F[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: ` code:0x0060 */ +static GUI_CONST_STORAGE unsigned char ac0060[96] = { + ________, ________, ________, + ___XXXXX, ________, ________, + _____XXX, X_______, ________, + _______X, XX______, ________, + ________, _XX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: a code:0x0061 */ +static GUI_CONST_STORAGE unsigned char ac0061[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXX___, ________, + ____XXX_, ___XXX__, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + ________, ____XXX_, ________, + _______X, XXXXXXX_, ________, + _____XXX, X___XXX_, ________, + ___XXXX_, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + __XXX___, ____XXX_, ________, + __XXX___, ____XXX_, ________, + __XXX___, ____XXX_, XX______, + __XXX___, ___XXXX_, XX______, + ___XXX__, __XXXXX_, XX______, + ____XXXX, XXX__XXX, X_______, + ________, ________, ________, + ________, ________, ________}; + +/* char: b code:0x0062 */ +static GUI_CONST_STORAGE unsigned char ac0062[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XX__, ________, ________, + _XXXXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, XXXXXX__, ________, + ___XXXXX, X___XXX_, ________, + ___XXXXX, _____XXX, ________, + ___XXXX_, _____XXX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, ________, + ___XXXX_, _____XXX, ________, + ___XXXXX, ____XXX_, ________, + ___XX__X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: c code:0x0063 */ +static GUI_CONST_STORAGE unsigned char ac0063[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXXXX__, ________, + _____XXX, X___XXX_, ________, + ____XXX_, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + __XXX___, ________, ________, + __XXX___, ________, ________, + __XXX___, ________, ________, + __XXX___, ________, ________, + __XXX___, ________, ________, + __XXX___, ________, ________, + ___XX___, _______X, X_______, + ___XXX__, ______XX, ________, + ____XXX_, ______XX, ________, + _____XXX, ____XXX_, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: d code:0x0064 */ +static GUI_CONST_STORAGE unsigned char ac0064[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ______XX, ________, + ________, ___XXXXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________, + ______XX, XXXX_XXX, ________, + _____XXX, ___XXXXX, ________, + ____XXX_, ____XXXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + ___XXX__, ____XXXX, ________, + ___XXX__, ____XXXX, ________, + ____XXX_, ___XXXXX, XX______, + ______XX, XXXX_XX_, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: e code:0x0065 */ +static GUI_CONST_STORAGE unsigned char ac0065[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXXX___, ________, + _____XXX, ____XXX_, ________, + ____XXX_, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXXXXX, XXXXXXXX, X_______, + __XXX___, ________, ________, + __XXX___, ________, ________, + __XXX___, ________, ________, + ___XX___, _______X, X_______, + ___XXX__, _______X, X_______, + ____XXX_, ______XX, ________, + _____XXX, ____XXX_, ________, + _______X, XXXXXX__, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: f code:0x0066 */ +static GUI_CONST_STORAGE unsigned char ac0066[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _XXXXXXX, ________, + ________, XXX____X, XX______, + _______X, XX_____X, XX______, + ______XX, X______X, XX______, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + __XXXXXX, XXXXXXX_, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + __XXXXXX, XXXXXX__, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: g code:0x0067 */ +static GUI_CONST_STORAGE unsigned char ac0067[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXX__XX, XX______, + _____XXX, __XXXXXX, XX______, + ____XXX_, ___XXX__, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + ___XXX__, ____XXX_, ________, + ____XXX_, ___XXX__, ________, + _____XXX, ___XXX__, ________, + ____XXXX, XXXX____, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXXXX, XXX_____, ________, + _____XXX, XXXXXXX_, ________, + ___XXX__, ___XXXXX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______}; + +/* char: h code:0x0068 */ +static GUI_CONST_STORAGE unsigned char ac0068[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XX__, ________, ________, + _XXXXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, XXXXXX__, ________, + ___XXXXX, X___XXX_, ________, + ___XXXX_, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + _XXXXXXX, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: i code:0x0069 */ +static GUI_CONST_STORAGE unsigned char ac0069[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, XXX_____, ________, + _______X, XXXX____, ________, + ________, XXX_____, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _XX_____, ________, + ____XXXX, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ____XXXX, XXXXXXX_, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: j code:0x006A */ +static GUI_CONST_STORAGE unsigned char ac006A[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ____XXXX, ________, + ________, ___XXXXX, ________, + ________, ____XXX_, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _____XX_, ________, + ________, XXXXXXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ________, ____XXX_, ________, + ___XXX__, ____XX__, ________}; + +/* char: k code:0x006B */ +static GUI_CONST_STORAGE unsigned char ac006B[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XX__, ________, ________, + _XXXXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________, + ___XXX__, __XXXXXX, X_______, + ___XXX__, ___XXXX_, ________, + ___XXX__, ___XX___, ________, + ___XXX__, __XXX___, ________, + ___XXX__, _XXX____, ________, + ___XXX__, XXX_____, ________, + ___XXX_X, XXX_____, ________, + ___XXXXX, XXXX____, ________, + ___XXXXX, _XXX____, ________, + ___XXXX_, _XXXX___, ________, + ___XXX__, __XXXX__, ________, + ___XXX__, ___XXX__, ________, + ___XXX__, ___XXXX_, ________, + ___XXX__, ____XXXX, ________, + ___XXX__, _____XXX, ________, + _XXXXXXX, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: l code:0x006C */ +static GUI_CONST_STORAGE unsigned char ac006C[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, _XX_____, ________, + ____XXXX, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ________, XXX_____, ________, + ____XXXX, XXXXXXX_, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: m code:0x006D */ +static GUI_CONST_STORAGE unsigned char ac006D[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XX___, ________, ________, + _XXXXXXX, XX_XXXXX, ________, + __XXXX__, XXXX__XX, X_______, + __XXXX__, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + __XXX___, XXX___XX, X_______, + _XXXXX_X, XXXX_XXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: n code:0x006E */ +static GUI_CONST_STORAGE unsigned char ac006E[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XX__, XXXXXX__, ________, + _XXXXXXX, X___XXX_, ________, + ___XXXXX, _____XXX, ________, + ___XXXX_, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + _XXXXXXX, ___XXXXX, XX______, + ________, ________, ________, + ________, ________, ________}; + +/* char: o code:0x006F */ +static GUI_CONST_STORAGE unsigned char ac006F[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXXX___, ________, + _____XXX, ___XXX__, ________, + ____XXX_, ____XXX_, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + __XXX___, ______XX, X_______, + ___XX___, ______XX, ________, + ___XXX__, _____XXX, ________, + ____XXX_, ____XXX_, ________, + _____XXX, ___XXX__, ________, + ______XX, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: p code:0x0070 */ +static GUI_CONST_STORAGE unsigned char ac0070[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XX_X, XXXXX___, ________, + _XXXXXXX, X___XXX_, ________, + ___XXXX_, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, ______XX, X_______, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXXX_, ____XXX_, ________, + ___XXXXX, ___XXX__, ________, + ___XXX_X, XXXXX___, ________, + ___XXX__, ________, ________, + ___XXX__, ________, ________}; + +/* char: q code:0x0071 */ +static GUI_CONST_STORAGE unsigned char ac0071[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ______XX, XXXX__XX, ________, + _____XXX, ___XXXXX, ________, + ____XXX_, ____XXXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + __XXX___, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ____XXXX, ________, + ____XXX_, ___XXXXX, ________, + ______XX, XXXX_XXX, ________, + ________, _____XXX, ________, + ________, _____XXX, ________}; + +/* char: r code:0x0072 */ +static GUI_CONST_STORAGE unsigned char ac0072[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _____XXX, ___XXXXX, ________, + _XXXXXXX, __XX__XX, X_______, + _____XXX, XXX___XX, X_______, + _____XXX, XX____XX, X_______, + _____XXX, X_______, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _____XXX, ________, ________, + _XXXXXXX, XXXX____, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: s code:0x0073 */ +static GUI_CONST_STORAGE unsigned char ac0073[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, XXXXX_XX, ________, + _____XXX, ____XXXX, ________, + ____XXX_, _____XXX, ________, + ____XXX_, ______XX, ________, + ____XXX_, ______XX, ________, + ____XXXX, ________, ________, + _____XXX, XX______, ________, + ______XX, XXXX____, ________, + ________, XXXXXX__, ________, + ________, ___XXXX_, ________, + ________, ____XXXX, ________, + ___XX___, _____XXX, ________, + ___XX___, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXXXX, ____XXX_, ________, + ___XX__X, XXXXX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: t code:0x0074 */ +static GUI_CONST_STORAGE unsigned char ac0074[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _______X, X_______, ________, + _______X, X_______, ________, + _______X, X_______, ________, + ______XX, X_______, ________, + _____XXX, X_______, ________, + __XXXXXX, XXXXXXX_, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_______, ________, + ______XX, X_____XX, ________, + ______XX, X____XX_, ________, + _______X, XX___XX_, ________, + ________, XXXXXX__, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: u code:0x0075 */ +static GUI_CONST_STORAGE unsigned char ac0075[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ____XX__, ______XX, ________, + _XXXXX__, ___XXXXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, _____XXX, ________, + ___XXX__, ____XXXX, ________, + ____XXX_, ___XXXXX, XX______, + _____XXX, XXXX_XX_, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: v code:0x0076 */ +static GUI_CONST_STORAGE unsigned char ac0076[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + _XXXXXXX, ___XXXXX, X_______, + ___XXX__, _____XX_, ________, + ___XXX__, _____XX_, ________, + ____XXX_, ____XX__, ________, + ____XXX_, ____XX__, ________, + ____XXX_, ____XX__, ________, + _____XXX, ___XX___, ________, + _____XXX, ___XX___, ________, + _____XXX, __XXX___, ________, + ______XX, X_XX____, ________, + ______XX, X_XX____, ________, + ______XX, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XX______, ________, + ________, XX______, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: w code:0x0077 */ +static GUI_CONST_STORAGE unsigned char ac0077[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + XXXXXX_X, XXXX_XXX, XXX_____, + _XXXX___, XXX____X, X_______, + __XXX___, XXX____X, X_______, + __XXX___, XXX____X, X_______, + __XXX___, XXXX__XX, ________, + ___XX___, XXXX__XX, ________, + ___XXX__, XXXX__XX, ________, + ___XXX_X, XXXX__XX, ________, + ___XXX_X, X_XXXXX_, ________, + ____XX_X, X_XXXXX_, ________, + ____XXXX, X_XXXXX_, ________, + ____XXXX, __XXXXX_, ________, + ____XXXX, ___XXX__, ________, + _____XXX, ___XXX__, ________, + _____XX_, ___XXX__, ________, + _____XX_, ___XX___, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: x code:0x0078 */ +static GUI_CONST_STORAGE unsigned char ac0078[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + __XXXXXX, X_XXXXXX, ________, + ____XXXX, ____XX__, ________, + _____XXX, ___XX___, ________, + _____XXX, ___XX___, ________, + ______XX, X_XX____, ________, + ______XX, XXXX____, ________, + _______X, XXX_____, ________, + ________, XXX_____, ________, + _______X, XXX_____, ________, + _______X, XXXX____, ________, + ______XX, __XXX___, ________, + _____XXX, __XXX___, ________, + _____XX_, ___XXX__, ________, + ____XX__, ___XXX__, ________, + ___XXX__, ____XXX_, ________, + _XXXXXX_, __XXXXXX, X_______, + ________, ________, ________, + ________, ________, ________}; + +/* char: y code:0x0079 */ +static GUI_CONST_STORAGE unsigned char ac0079[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + __XXXXXX, X__XXXXX, XX______, + ____XXX_, _____XXX, ________, + ____XXX_, _____XX_, ________, + _____XXX, _____XX_, ________, + _____XXX, ____XXX_, ________, + ______XX, ____XX__, ________, + ______XX, X___XX__, ________, + ______XX, X__XXX__, ________, + _______X, XX_XX___, ________, + _______X, XX_XX___, ________, + _______X, XXXXX___, ________, + ________, XXXX____, ________, + ________, XXXX____, ________, + ________, _XXX____, ________, + ________, _XX_____, ________, + ________, _XX_____, ________, + ________, XX______, ________, + ________, XX______, ________}; + +/* char: z code:0x007A */ +static GUI_CONST_STORAGE unsigned char ac007A[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ___XXXXX, XXXXXXXX, ________, + __XXXX__, ____XXXX, ________, + __XXX___, ___XXXX_, ________, + __XX____, ___XXX__, ________, + __XX____, __XXX___, ________, + ________, _XXXX___, ________, + ________, XXXX____, ________, + ________, XXX_____, ________, + _______X, XX______, ________, + ______XX, XX______, ________, + _____XXX, X______X, X_______, + _____XXX, _______X, X_______, + ____XXX_, ______XX, X_______, + ___XXX__, ______XX, ________, + __XXXX__, ____XXXX, ________, + __XXXXXX, XXXXXXXX, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: { code:0x007B */ +static GUI_CONST_STORAGE unsigned char ac007B[96] = { + ________, ________, ________, + ________, ________, ________, + ________, _____XXX, ________, + ________, ____XX__, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, _XXX____, ________, + ________, XX______, ________, + ________, _XXX____, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ___XX___, ________, + ________, ____XX__, ________}; + +/* char: | code:0x007C */ +static GUI_CONST_STORAGE unsigned char ac007C[96] = { + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________, + ________, XX______, ________}; + +/* char: } code:0x007D */ +static GUI_CONST_STORAGE unsigned char ac007D[96] = { + ________, ________, ________, + ________, ________, ________, + ___XXX__, ________, ________, + _____XX_, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + _______X, XX______, ________, + ________, XXX_____, ________, + _______X, X_______, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + ______XX, ________, ________, + _____XX_, ________, ________}; + +/* char: ~ code:0x007E */ +static GUI_CONST_STORAGE unsigned char ac007E[96] = { + ___XXXXX, ________, ________, + __XX__XX, XX______, ________, + _XX____X, XXX_____, XX______, + _XX_____, XXXX____, XX______, + ________, __XXX__X, X_______, + ________, ___XXXXX, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char:  code:0x007F */ +static GUI_CONST_STORAGE unsigned char ac007F[96] = { + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}; + +/* char: 度 code:0xB6C8 */ +static GUI_CONST_STORAGE unsigned char acB6C8[128] = { + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + ________, + ________, + ________, + _XXX____, + ________, + ________, + ________, + _XXXX___, + ________, + ________, + ________, + __XXX___, + ________, + _____XX_, + ________, + __XXX___, + _____XXX, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + ______XX, + X_____XX, + X______X, + XX______, + ______XX, + X_____XX, + X______X, + XXX_____, + ______XX, + X_____XX, + X______X, + XX______, + ______XX, + X_____XX, + X_______, + XX___XXX, + ______XX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + ______XX, + X_____XX, + X_______, + XX______, + ______XX, + ______XX, + X_______, + XX______, + _____XXX, + ______XX, + X_______, + XX______, + _____XXX, + ______XX, + X_______, + XX______, + _____XXX, + ______XX, + XXXXXXXX, + XX______, + _____XXX, + ______XX, + X_______, + XX______, + _____XXX, + ________, + ________, + ________, + _____XXX, + ________, + ________, + _XXX____, + _____XXX, + ___XXXXX, + XXXXXXXX, + XXXXX___, + _____XXX, + ______XX, + ________, + XXXX____, + _____XXX, + _______X, + X_______, + XXX_____, + _____XX_, + ________, + XX_____X, + XX______, + ____XXX_, + ________, + XXX___XX, + X_______, + ____XXX_, + ________, + _XXX_XXX, + ________, + ____XX__, + ________, + __XXXXX_, + ________, + ____XX__, + ________, + ___XXXX_, + ________, + ___XX___, + ________, + _XXXXXXX, + X_______, + ___XX___, + _______X, + XXX___XX, + XXXX____, + __XX____, + _____XXX, + X_______, + XXXXXXXX, + __XX____, + _XXXXX__, + ________, + __XXXXXX, +}; + +/* char: 进 code:0xBDF8 */ +static GUI_CONST_STORAGE unsigned char acBDF8[128] = { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + XX______, + _____XX_, + ________, + _XXXX___, + XXXX____, + ______XX, + X_______, + _XXX____, + XXX_____, + ______XX, + XX______, + _XXX____, + XXX_____, + _______X, + XX______, + _XXX____, + XXX_____, + _______X, + XXX_____, + _XXX____, + XXX_____, + ________, + XX______, + _XXX____, + XXX__XXX, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + _XXX____, + XXX_____, + ________, + ________, + _XXX____, + XXX_____, + ________, + ________, + _XXX____, + XXX_____, + _______X, + XX______, + _XXX____, + XXX_____, + _XXXXXXX, + XXX_____, + _XXX____, + XXX_____, + _______X, + XX______, + _XXX____, + XXX_____, + _______X, + XX______, + _XXX____, + XXX___XX, + _______X, + XX_XXXXX, + XXXXXXXX, + XXXXXXXX, + _______X, + XX______, + _XXX____, + XXX_____, + _______X, + XX______, + _XXX____, + XXX_____, + _______X, + XX______, + _XX_____, + XXX_____, + _______X, + XX______, + XXX_____, + XXX_____, + _______X, + XX______, + XXX_____, + XXX_____, + _______X, + XX_____X, + XX______, + XXX_____, + _______X, + XX_____X, + X_______, + XXX_____, + _______X, + XX____XX, + ________, + XXX_____, + ______XX, + XX___XX_, + ________, + XXX_____, + _____XX_, + _XXXXX__, + ________, + XXX_____, + ___XXXX_, + __XXX___, + ________, + XX______, + __XXXX__, + ____XXXX, + X_______, + _______X, + __XXX___, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XXXXXXXX, +}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[98] = { + {14, 14, 3, (unsigned char *)&ac0020}, /*0: */ + {12, 12, 3, (unsigned char *)&ac0021}, /*1: !*/ + {15, 15, 3, (unsigned char *)&ac0022}, /*2: "*/ + {18, 18, 3, (unsigned char *)&ac0023}, /*3: #*/ + {16, 16, 3, (unsigned char *)&ac0024}, /*4: $*/ + {18, 18, 3, (unsigned char *)&ac0025}, /*5: %*/ + {18, 18, 3, (unsigned char *)&ac0026}, /*6: &*/ + {7, 7, 3, (unsigned char *)&ac0027}, /*7: '*/ + {17, 17, 3, (unsigned char *)&ac0028}, /*8: (*/ + {11, 11, 3, (unsigned char *)&ac0029}, /*9: )*/ + {17, 17, 3, (unsigned char *)&ac002A}, /*10: **/ + {18, 18, 3, (unsigned char *)&ac002B}, /*11: +*/ + {7, 7, 3, (unsigned char *)&ac002C}, /*12: ,*/ + {17, 17, 3, (unsigned char *)&ac002D}, /*13: -*/ + {7, 7, 3, (unsigned char *)&ac002E}, /*14: .*/ + {18, 18, 3, (unsigned char *)&ac002F}, /*15: /*/ + {17, 17, 3, (unsigned char *)&ac0030}, /*16: 0*/ + {15, 15, 3, (unsigned char *)&ac0031}, /*17: 1*/ + {17, 17, 3, (unsigned char *)&ac0032}, /*18: 2*/ + {17, 17, 3, (unsigned char *)&ac0033}, /*19: 3*/ + {18, 18, 3, (unsigned char *)&ac0034}, /*20: 4*/ + {17, 17, 3, (unsigned char *)&ac0035}, /*21: 5*/ + {17, 17, 3, (unsigned char *)&ac0036}, /*22: 6*/ + {17, 17, 3, (unsigned char *)&ac0037}, /*23: 7*/ + {17, 17, 3, (unsigned char *)&ac0038}, /*24: 8*/ + {17, 17, 3, (unsigned char *)&ac0039}, /*25: 9*/ + {12, 12, 3, (unsigned char *)&ac003A}, /*26: :*/ + {11, 11, 3, (unsigned char *)&ac003B}, /*27: ;*/ + {16, 16, 3, (unsigned char *)&ac003C}, /*28: <*/ + {17, 17, 3, (unsigned char *)&ac003D}, /*29: =*/ + {15, 15, 3, (unsigned char *)&ac003E}, /*30: >*/ + {17, 17, 3, (unsigned char *)&ac003F}, /*31: ?*/ + {18, 18, 3, (unsigned char *)&ac0040}, /*32: @*/ + {18, 18, 3, (unsigned char *)&ac0041}, /*33: A*/ + {18, 18, 3, (unsigned char *)&ac0042}, /*34: B*/ + {18, 18, 3, (unsigned char *)&ac0043}, /*35: C*/ + {18, 18, 3, (unsigned char *)&ac0044}, /*36: D*/ + {18, 18, 3, (unsigned char *)&ac0045}, /*37: E*/ + {18, 18, 3, (unsigned char *)&ac0046}, /*38: F*/ + {18, 18, 3, (unsigned char *)&ac0047}, /*39: G*/ + {18, 18, 3, (unsigned char *)&ac0048}, /*40: H*/ + {15, 15, 3, (unsigned char *)&ac0049}, /*41: I*/ + {19, 19, 3, (unsigned char *)&ac004A}, /*42: J*/ + {18, 18, 3, (unsigned char *)&ac004B}, /*43: K*/ + {18, 18, 3, (unsigned char *)&ac004C}, /*44: L*/ + {19, 19, 3, (unsigned char *)&ac004D}, /*45: M*/ + {18, 18, 3, (unsigned char *)&ac004E}, /*46: N*/ + {18, 18, 3, (unsigned char *)&ac004F}, /*47: O*/ + {18, 18, 3, (unsigned char *)&ac0050}, /*48: P*/ + {18, 18, 3, (unsigned char *)&ac0051}, /*49: Q*/ + {18, 18, 3, (unsigned char *)&ac0052}, /*50: R*/ + {17, 17, 3, (unsigned char *)&ac0053}, /*51: S*/ + {18, 18, 3, (unsigned char *)&ac0054}, /*52: T*/ + {18, 18, 3, (unsigned char *)&ac0055}, /*53: U*/ + {18, 18, 3, (unsigned char *)&ac0056}, /*54: V*/ + {19, 19, 3, (unsigned char *)&ac0057}, /*55: W*/ + {18, 18, 3, (unsigned char *)&ac0058}, /*56: X*/ + {18, 18, 3, (unsigned char *)&ac0059}, /*57: Y*/ + {17, 17, 3, (unsigned char *)&ac005A}, /*58: Z*/ + {16, 16, 3, (unsigned char *)&ac005B}, /*59: [*/ + {16, 16, 3, (unsigned char *)&ac005C}, /*60: \*/ + {12, 12, 3, (unsigned char *)&ac005D}, /*61: ]*/ + {14, 14, 3, (unsigned char *)&ac005E}, /*62: ^*/ + {14, 14, 3, (unsigned char *)&ac005F}, /*63: _*/ + {11, 11, 3, (unsigned char *)&ac0060}, /*64: `*/ + {18, 18, 3, (unsigned char *)&ac0061}, /*65: a*/ + {17, 17, 3, (unsigned char *)&ac0062}, /*66: b*/ + {17, 17, 3, (unsigned char *)&ac0063}, /*67: c*/ + {18, 18, 3, (unsigned char *)&ac0064}, /*68: d*/ + {17, 17, 3, (unsigned char *)&ac0065}, /*69: e*/ + {18, 18, 3, (unsigned char *)&ac0066}, /*70: f*/ + {18, 18, 3, (unsigned char *)&ac0067}, /*71: g*/ + {18, 18, 3, (unsigned char *)&ac0068}, /*72: h*/ + {15, 15, 3, (unsigned char *)&ac0069}, /*73: i*/ + {16, 16, 3, (unsigned char *)&ac006A}, /*74: j*/ + {18, 18, 3, (unsigned char *)&ac006B}, /*75: k*/ + {15, 15, 3, (unsigned char *)&ac006C}, /*76: l*/ + {18, 18, 3, (unsigned char *)&ac006D}, /*77: m*/ + {18, 18, 3, (unsigned char *)&ac006E}, /*78: n*/ + {17, 17, 3, (unsigned char *)&ac006F}, /*79: o*/ + {17, 17, 3, (unsigned char *)&ac0070}, /*80: p*/ + {16, 16, 3, (unsigned char *)&ac0071}, /*81: q*/ + {17, 17, 3, (unsigned char *)&ac0072}, /*82: r*/ + {16, 16, 3, (unsigned char *)&ac0073}, /*83: s*/ + {16, 16, 3, (unsigned char *)&ac0074}, /*84: t*/ + {18, 18, 3, (unsigned char *)&ac0075}, /*85: u*/ + {17, 17, 3, (unsigned char *)&ac0076}, /*86: v*/ + {19, 19, 3, (unsigned char *)&ac0077}, /*87: w*/ + {17, 17, 3, (unsigned char *)&ac0078}, /*88: x*/ + {18, 18, 3, (unsigned char *)&ac0079}, /*89: y*/ + {17, 17, 3, (unsigned char *)&ac007A}, /*90: z*/ + {16, 16, 3, (unsigned char *)&ac007B}, /*91: {*/ + {10, 10, 3, (unsigned char *)&ac007C}, /*92: |*/ + {11, 11, 3, (unsigned char *)&ac007D}, /*93: }*/ + {18, 18, 3, (unsigned char *)&ac007E}, /*94: ~*/ + {14, 14, 3, (unsigned char *)&ac007F}, /*95: */ + {32, 32, 4, (unsigned char *)&acB6C8}, /*96: 度*/ + {32, 32, 4, (unsigned char *)&acBDF8}, /*97: 进*/ +}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = { + 0xBDF8, /*start :进*/ + 0xBDF8, /*end :进, len=1*/ + &Cinfo[97], + (void *)0}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = { + 0xB6C8, /*start :度*/ + 0xB6C8, /*end :度, len=1*/ + &Cinfo[96], + &Prop3}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { + 0x0020, /*start : */ + 0x007F, /*end :, len=96*/ + &Cinfo[0], + &Prop2}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontHZ32x32 = { + GUI_FONTTYPE_PROP_SJIS, + 32, /* height of font */ + 32, /* space of font y */ + 1, + 1, + &Prop1}; diff --git a/User/system/lib/lcd/font/LOGO.c b/User/system/lib/lcd/font/LOGO.c new file mode 100644 index 0000000..b0e5481 --- /dev/null +++ b/User/system/lib/lcd/font/LOGO.c @@ -0,0 +1,10040 @@ +/* +********************************************************************** +* UcGUI Font +* Chinese GB2312 library +* (c) Copyright 19xx-20xx, company name +* +* +* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967) +* +********************************************************************** +*/ + +#include "GUI.H" + +/* char: code:0x0030 */ +static GUI_CONST_STORAGE unsigned char ac0030[5000] = { + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX____XX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + ____XXXX, + XX______, + ________, + _____XXX, + XXX_____, + ________, + _______X, + XXXXXXXX, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + ____XXXX, + XX______, + ________, + _____XXX, + XXX_____, + ________, + ________, + ____XXXX, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + ____XXXX, + XX______, + ________, + _____XXX, + XXX_____, + ________, + ________, + _______X, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXXXX__, + ________, + ________, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXX_____, + ________, + ________, + ________, + _XXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ____XXXX, + XXX_____, + ________, + ____XXXX, + XXX_____, + ________, + ________, + ________, + ___XXXXX, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXX_____, + ________, + ________, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ____XXXX, + XXX_____, + ________, + ____XXXX, + XXX_____, + ________, + ________, + ________, + ____XXXX, + XX______, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + X_______, + ________, + ________, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ____XXXX, + XXXX____, + ________, + ___XXXXX, + XX______, + ________, + ________, + ________, + _____XXX, + XXX_____, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + ____XXXX, + XXXXX___, + ________, + ___XXXXX, + XX______, + ________, + ________, + ________, + ______XX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + _____XXX, + XXXXXX__, + ________, + __XXXXXX, + XX______, + ________, + ________, + ________, + _______X, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + _____XXX, + XXXXXXX_, + ________, + XXXXXXXX, + X_______, + ________, + ________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXX_____, + ________, + ______XX, + XXXXXXXX, + X_____XX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXXXX___, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ______XX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ______XX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXX_____, + ________, + _______X, + XXXXXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + XXXXXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ________, + _XXXXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + __XXXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + __XXXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ______XX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ___XXXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ______XX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ____XXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ______XX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ____XXXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ______XX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + _____XXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXX__, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + XXXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + _____XXX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + _XXXXXXX, + XX______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + _XXXXXXX, + X_______, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + _XXXXXXX, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXXX___, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + __XXXXXX, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXXX____, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + __XXXXXX, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXX_____, + ________, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ___XXXXX, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XXX_____, + ________, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ____XXXX, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + XX______, + ________, + ____XXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + _____XXX, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXXX, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + _______X, + XXXXXXXX, + XX______, + ________, + _XXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XXXXXXX_, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXX_____, + ________, + ________, + _XXXXXXX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ______XX, + XXXX____, + ________, + ___XXXXX, + XX______, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + _____XXX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ______XX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ______XX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + _____XXX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXX__, + ________, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + _____XXX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ____XXXX, + XXXX____, + ________, + ________, + ________, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ___XXXXX, + XXXX____, + ________, + ________, + ________, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ___XXXXX, + XXXX____, + ________, + ________, + ________, + ________, + ______XX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + __XXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ______XX, + XX______, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ________, + ______XX, + XX______, + ________, + XXXXXXX_, + ________, + ________, + ________, + _______X, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXX_, + ________, + ______XX, + XX______, + _______X, + XXXXXXX_, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ______XX, + XX______, + _____XXX, + XXXXXXX_, + ________, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ______XX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXX___, + ______XX, + XX______, + __XXXXXX, + XXXXXX__, + ________, + ________, + ________, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + _______X, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XX____XX, + XX____XX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, +}; + +/* char: code:0x0031 */ +static GUI_CONST_STORAGE unsigned char ac0031[5000] = { + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXX____, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXX____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX_XXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX___X, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + _XXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ___XXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ____XXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ______XX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ________, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ______XX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ____XXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + ___XXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX____, + _XXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX___X, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXX_XXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXX_____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXX____, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXX____, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + X_______, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _____XXX, + XXXXXXXX, + XXXXXXXX, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____XXXX, + XXXXXXXX, + XXXXXXXX, + XX______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XXXXX, + XXXXXXXX, + XXXXXXXX, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, + XXXXXXXX, +}; + +static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[2] = { + {200, 200, 25, (unsigned char *)&ac0030}, /*0: */ + {200, 200, 25, (unsigned char *)&ac0031}, /*1: */ +}; + +static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = { + 0x0030, /*start :*/ + 0x0031, /*end :, len=2*/ + &Cinfo[0], + (void *)0}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontHZ200x200 = { + GUI_FONTTYPE_PROP_SJIS, + 200, /* height of font */ + 200, /* space of font y */ + 1, + 1, + &Prop1}; diff --git a/User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat b/User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat new file mode 100644 index 0000000..b6725d9 --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat @@ -0,0 +1,13 @@ +@ECHO OFF + +ECHO CCGUIAntiAlias.BAT: Compiling GUI\AntiAlias + +CALL CC GUIAAArc +CALL CC GUIAAChar +CALL CC GUIAAChar2 +CALL CC GUIAAChar4 +CALL CC GUIAACircle +CALL CC GUIAALib +CALL CC GUIAALine +CALL CC GUIAAPoly +CALL CC GUIAAPolyOut diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c new file mode 100644 index 0000000..36655c2 --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c @@ -0,0 +1,87 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIArcAA.C +Purpose : Draw Arc routines with Antialiasing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include +#include + +#include "GUI_Protected.h" + +#if GUI_SUPPORT_AA + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawArcAA +*/ +static void _DrawArcAA(int x0, int y0, int rx, int ry, int a0, int a1) { + int PenSizePrev = GUI_GetPenSize(); + int PenSize_AA; + int Factor; + + Factor = GUI_Context.AA_HiResEnable ? 1 : GUI_Context.AA_Factor; + /* Convert into Hires coordinates (if not already done) */ + x0 *= Factor; + y0 *= Factor; + rx *= Factor; + ry *= Factor; + PenSize_AA = PenSizePrev * GUI_Context.AA_Factor; + GUI_AA_Init_HiRes(x0 - rx - PenSize_AA, x0 + rx + PenSize_AA); + GUI_SetPenSize(PenSize_AA); + GL_DrawArc(x0, y0, rx, ry,a0,a1); + GUI_SetPenSize(PenSizePrev); /* restore former pen size */ + /* Cleanup */ + GUI_AA_Exit(); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AA_DrawArc +*/ +void GUI_AA_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG_AA(x0,y0); + WM_ITERATE_START(NULL) { + #endif + _DrawArcAA( x0, y0, rx, ry, a0, a1); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +#else /* Avoid problems with empty object modules */ + void GUIAAArc_C(void); + void GUIAAArc_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c new file mode 100644 index 0000000..99ee9dc --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c @@ -0,0 +1,167 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICharAA.C +Purpose : Display antialiased +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +#if GUI_SUPPORT_AA + +#include +#include + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef void tSetPixelAA(int x, int y, U8 Intens); + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const U8 Bit2Mask0[] = {1<<7, 1<<5, 1<<3, 1<<1}; +static const U8 Bit2Mask1[] = {1<<6, 1<<4, 1<<2, 1<<0}; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Draw +*/ +static void Draw(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) { + int x, y; + tSetPixelAA* pfSetPixelAA; + pfSetPixelAA = (GUI_Context.TextMode & GUI_TM_TRANS) + ? LCD_SetPixelAA : LCD_SetPixelAA_NoTrans; + for (y=0; yp.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) { + if ((c>=pProp->First) && (c<=pProp->Last)) + break; + } + return pProp; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIPROPAA_DispChar +*/ +void GUIPROPAA_DispChar(U16P c) { + int BytesPerLine; + GUI_DRAWMODE DrawMode = GUI_Context.TextMode; + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + if (pProp) { + GUI_DRAWMODE OldDrawMode; + const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First); + BytesPerLine = pCharInfo->BytesPerLine; + OldDrawMode = LCD_SetDrawMode(DrawMode); + Draw ( GUI_Context.DispPosX, GUI_Context.DispPosY, + (pCharInfo->XSize+1)/2, + GUI_Context.pAFont->YSize, + BytesPerLine, + (U8 const*) pCharInfo->pData + ); + LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ + GUI_Context.DispPosX += (pCharInfo->XDist+1)/2; + } +} + +/********************************************************************* +* +* GUIPROPAA_GetCharDistX +*/ +int GUIPROPAA_GetCharDistX(U16P c) { + int r; + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + r = (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0; + return (r+1)/2; +} + +/********************************************************************* +* +* GUIPROPAA_GetFontInfo +*/ +void GUIPROPAA_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) { + GUI_USE_PARA(pFont); + pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA; +} + +/********************************************************************* +* +* GUIPROPAA_IsInFont +*/ +char GUIPROPAA_IsInFont(const GUI_FONT * pFont, U16 c) { + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c); + return (pProp==NULL) ? 0 : 1; +} + +#else /* Avoid problems with empty object modules */ + void GUIAAChar_C(void); + void GUIAAChar_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c new file mode 100644 index 0000000..7291253 --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c @@ -0,0 +1,201 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICharAA2.C +Purpose : Display antialiased 2bpp +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +#if GUI_SUPPORT_AA + +#include +#include + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define MAX_CHAR_SIZE 100 + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +/* used by transparent characters */ +static const int aConvTable[4] = {0, 5, 10, 15}; + +/* used by non transparent characters */ +static LCD_COLOR aColor[4]; +static LCD_PIXELINDEX OldColorIndex, OldBkColorIndex; +static GUI_LOGPALETTE Palette = {4, 0, &aColor[0]}; +static GUI_BITMAP Bitmap = {0, 0, 0, 2, 0, &Palette, 0}; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* DrawNoTrans +*/ +static void DrawNoTrans(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) { + if ((OldColorIndex != LCD_COLORINDEX) || + (OldBkColorIndex != LCD_BKCOLORINDEX)) { + int i; + LCD_PIXELINDEX BkColorIndex = LCD_BKCOLORINDEX; + LCD_PIXELINDEX ColorIndex = LCD_COLORINDEX; + LCD_COLOR BkColor = LCD_Index2Color(BkColorIndex); + LCD_COLOR Color = LCD_Index2Color(ColorIndex); + aColor[0] = BkColor; + for (i = 1; i < 3; i++) { + U8 Intens; + Intens = 5 * i; + aColor[i] = LCD_AA_MixColors(Color, BkColor, Intens); + } + aColor[3] = Color; + LCD_GetpPalConvTableUncached(&Palette); + OldColorIndex = ColorIndex; + OldBkColorIndex = BkColorIndex; + } + Bitmap.XSize = XSize; + Bitmap.YSize = YSize; + Bitmap.BytesPerLine = BytesPerLine; + Bitmap.pData = pData; + GL_DrawBitmap(&Bitmap, x0, y0); +} + +/********************************************************************* +* +* DrawTrans +*/ +static void DrawTrans(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) { + int x, y; + for (y = 0; y < YSize; y++) { + const U8 *pData0 = pData; + U8 Rem = XSize & 3; + for (x = 0; x < XSize - 1; x += 4) { + LCD_SetPixelAA(x + x0 , y0 + y, aConvTable[((*pData0 ) >> 6) ]); + LCD_SetPixelAA(x + x0 + 1, y0 + y, aConvTable[((*pData0 ) >> 4) & 0x03]); + LCD_SetPixelAA(x + x0 + 2, y0 + y, aConvTable[((*pData0 ) >> 2) & 0x03]); + LCD_SetPixelAA(x + x0 + 3, y0 + y, aConvTable[((*pData0++) ) & 0x03]); + } + if (Rem) { + LCD_SetPixelAA(x + x0 , y0 + y, aConvTable[((*pData0 ) >> 6) ]); + if (Rem > 1) { + LCD_SetPixelAA(x + x0 + 1, y0 + y, aConvTable[((*pData0 ) >> 4) & 0x03]); + if (Rem > 2) { + LCD_SetPixelAA(x + x0 + 2, y0 + y, aConvTable[((*pData0 ) >> 2) & 0x03]); + } + } + } + pData += BytesPerLine; + } +} + +/********************************************************************* +* +* GUIPROP_FindChar +*/ +static const GUI_FONT_PROP* GUIPROP_FindChar(const GUI_FONT_PROP* pProp, U16P c) { + for (pProp = GUI_Context.pAFont->p.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) { + if ((c>=pProp->First) && (c<=pProp->Last)) + break; + } + return pProp; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIPROP_AA2_DispChar +*/ +void GUIPROP_AA2_DispChar(U16P c) { + int BytesPerLine; + GUI_DRAWMODE DrawMode = GUI_Context.TextMode; + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + if (pProp) { + GUI_DRAWMODE OldDrawMode; + const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First); + BytesPerLine = pCharInfo->BytesPerLine; + OldDrawMode = LCD_SetDrawMode(DrawMode); + if (DrawMode & GUI_TM_TRANS) { + DrawTrans(GUI_Context.DispPosX, + GUI_Context.DispPosY, + pCharInfo->XSize, + GUI_Context.pAFont->YSize, + BytesPerLine, + (U8 const*)pCharInfo->pData + ); + } else { + DrawNoTrans(GUI_Context.DispPosX, + GUI_Context.DispPosY, + pCharInfo->XSize, + GUI_Context.pAFont->YSize, + BytesPerLine, + (U8 const*)pCharInfo->pData + ); + } + LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ + GUI_Context.DispPosX += pCharInfo->XDist; + } +} + +/********************************************************************* +* +* GUIPROP_AA2_GetCharDistX +*/ +int GUIPROP_AA2_GetCharDistX(U16P c) { + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0; +} + +/********************************************************************* +* +* GUIPROP_AA2_GetFontInfo +*/ +void GUIPROP_AA2_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) { + GUI_USE_PARA(pFont); + pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA2; +} + +/********************************************************************* +* +* GUIPROP_AA2_IsInFont +*/ +char GUIPROP_AA2_IsInFont(const GUI_FONT * pFont, U16 c) { + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c); + return (pProp==NULL) ? 0 : 1; +} + +#else /* Avoid problems with empty object modules */ + void GUIAAChar2_C(void); + void GUIAAChar2_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c new file mode 100644 index 0000000..318359b --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c @@ -0,0 +1,129 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICharAA.C +Purpose : Display antialiased +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +#if GUI_SUPPORT_AA + +#include +#include + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Draw +*/ +static void Draw(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) { + int x, y; + tLCD_SetPixelAA* pfSetPixelAA; + pfSetPixelAA = (GUI_Context.TextMode && GUI_TM_TRANS) ? + LCD_SetPixelAA : LCD_SetPixelAA_NoTrans; + for (y=0; y>4); /* x0+x changed -> x+x0 to avoid problems with IAR's ICCMC80 */ + (*pfSetPixelAA)(x0+x+1,y0+y, (*pData0++)&15); + } + if (XSize&1) { + (*pfSetPixelAA)(x0+x,y0+y, (*pData0)&15); + } + pData+=BytesPerLine; + } +} + +/********************************************************************* +* +* GUIPROP_FindChar +*/ +static const GUI_FONT_PROP* GUIPROP_FindChar(const GUI_FONT_PROP* pProp, U16P c) { + for (pProp = GUI_Context.pAFont->p.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) { + if ((c>=pProp->First) && (c<=pProp->Last)) + break; + } + return pProp; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIPROP_AA4_DispChar +*/ +void GUIPROP_AA4_DispChar(U16P c) { + int BytesPerLine; + GUI_DRAWMODE DrawMode = GUI_Context.TextMode; + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + if (pProp) { + GUI_DRAWMODE OldDrawMode; + const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First); + BytesPerLine = pCharInfo->BytesPerLine; + OldDrawMode = LCD_SetDrawMode(DrawMode); + Draw ( GUI_Context.DispPosX, GUI_Context.DispPosY, + pCharInfo->XSize, + GUI_Context.pAFont->YSize, + BytesPerLine, + (U8 const*)pCharInfo->pData + ); + LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ + GUI_Context.DispPosX += pCharInfo->XDist; + } +} + +/********************************************************************* +* +* GUIPROP_AA4_GetCharDistX +*/ +int GUIPROP_AA4_GetCharDistX(U16P c) { + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0; +} + +/********************************************************************* +* +* GUIPROP_AA4_GetFontInfo +*/ +void GUIPROP_AA4_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) { + GUI_USE_PARA(pFont); + pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA4; +} + +/********************************************************************* +* +* GUIPROP_AA4_IsInFont +*/ +char GUIPROP_AA4_IsInFont(const GUI_FONT * pFont, U16 c) { + const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c); + return (pProp==NULL) ? 0 : 1; +} + +#else /* Avoid problems with empty object modules */ + void GUIAAChar4_C(void); + void GUIAAChar4_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c b/User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c new file mode 100644 index 0000000..3b6f876 --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c @@ -0,0 +1,133 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICirleAA.C +Purpose : Draw Circle routines with Antialiasing + +TBD: Circle needs to be calculated from top to bottom in order +to avoid AA problems at certain positions. + +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +#include +#include +#include + +#if GUI_SUPPORT_AA + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* FillCircle +*/ +static void FillCircle(int x0, int y0, int r) { + int i, x; + int sqmax = r*r+r/2; + int yMin, yMax; + /* First step : find uppermost and lowermost coordinates */ + yMin = y0 - r; + yMax = y0 + r; + /* Use Clipping rect to reduce calculation (if possible) */ + if (GUI_Context.pClipRect_HL) { + if (yMax > GUI_Context.pClipRect_HL->y1) + yMax = GUI_Context.pClipRect_HL->y1; + if (yMin < GUI_Context.pClipRect_HL->y0) + yMin = GUI_Context.pClipRect_HL->y0; + } + /* Draw top half */ + for (i=0, x=r; i= yMin) && (y <= yMax)) { + /* calc proper x-value */ + while ((i*i+x*x) >sqmax) + --x; + LCD_HL_DrawHLine (x0-x, y, x0+x); + } + } + /* Draw bottom half */ + for (i=0, x=r; i= yMin) && (y <= yMax)) { + /* calc proper x-value */ + while ((i*i+x*x) >sqmax) + --x; + LCD_HL_DrawHLine (x0-x, y, x0+x); + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_FillCircleAA_HiRes +*/ +void GL_FillCircleAA_HiRes(int x0, int y0, int r) { +/* Init AA Subsystem, pass horizontal limits */ + GUI_AA_Init_HiRes(x0-r, x0+r); +/* Do the actual drawing */ + FillCircle(x0, y0, r); +/* Cleanup */ + GUI_AA_Exit(); +} + +/********************************************************************* +* +* GUI_AA_FillCircle +*/ +void GUI_AA_FillCircle(int x0, int y0, int r) { + #if (GUI_WINSUPPORT) + GUI_RECT Rect; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG_AA(x0,y0); + #endif + if (!GUI_Context.AA_HiResEnable) { + x0 *= GUI_Context.AA_Factor; + y0 *= GUI_Context.AA_Factor; + r *= GUI_Context.AA_Factor; + } + #if (GUI_WINSUPPORT) + Rect.x0 = GUI_AA_HiRes2Pixel(x0 - r); + Rect.x1 = GUI_AA_HiRes2Pixel(x0 + r); + Rect.y0 = GUI_AA_HiRes2Pixel(y0 - r); + Rect.y1 = GUI_AA_HiRes2Pixel(y0 + r); + WM_ITERATE_START(&Rect); { + #endif + GL_FillCircleAA_HiRes(x0, y0, r); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +#else /* Avoid problems with empty object modules */ + void GUIAACircle_C(void); + void GUIAACircle_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAALib.c b/User/system/lib/lcd/gui/AntiAlias/GUIAALib.c new file mode 100644 index 0000000..eff811d --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAALib.c @@ -0,0 +1,280 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIAALib.C +Purpose : Antialiasing library +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "LCD_ConfDefaults.h" /* Required in order to know max. XSize so we do not waste memory */ + +#if GUI_SUPPORT_AA + +#include +#include + +/********************************************************************* +* +* Defines, config defaults +* +********************************************************************** +*/ + +#ifndef GUI_AA_LINEBUFFER_SIZE + #define GUI_AA_LINEBUFFER_SIZE LCD_XSIZE +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static U8 abAABuffer[GUI_AA_LINEBUFFER_SIZE]; /* This could be changed to dynamic memory ... */ +static U8* pabAABuffer; +static int _x0, _x1, _y, _x0_InUse, _x1_InUse; +static GUI_RECT ClipRect_HL; + +static tLCD_HL_APIList DrawAPICopy; /* Copy of device function ptr list */ +static const tLCD_HL_APIList* pLCD_HLPrev; /* Copy of device function ptr list */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _CleanLine +*/ +static void _CleanLine(void) { + GUI_MEMSET(pabAABuffer,0, _x1 - _x0+1); + _y = -16383; /* Invalidate */ + _x0_InUse = 16383; + _x1_InUse = -16383; +} + +/********************************************************************* +* +* _FlushLine +*/ +static void _FlushLine(void) { + int i; + int iEnd = _x1_InUse-_x0; + int IMax = GUI_Context.AA_Factor * GUI_Context.AA_Factor; + for (i =_x0_InUse-_x0; i<=iEnd; i++) { + int Intens = *(pabAABuffer+i); + if (Intens) { + /* Check we can use line draw */ + if (Intens == IMax) { + int j; + for (j=i; jpfDrawHLine(_x0+i, _y, _x0+j); + i = j; /*xxx*/ + } else { + LCD_HL_DrawPixel (_x0+i,_y); + } + } else { + LCD_SetPixelAA(_x0+i,_y, (15*Intens+IMax/2)/IMax); + } + } + } + _CleanLine(); +} + +/********************************************************************* +* +* _DrawHLine +* +* Purpose: +* This is the redirected DrawHLine routine which is called +* instead of the default output routine. Its job is to do +* antialiasing and then perform the drawing operations. +*/ +static void _DrawHLine (int x0, int y, int x1) { + int x0Real, x1Real; +/* Make sure there is something to do */ + if (x1 _x1_InUse) + _x1_InUse = x1Real; +/* Clip (should not be necessary ... Just to be on the safe side ! */ + if (x0Real < _x0) { + x0 = _x0 * GUI_Context.AA_Factor; + } + if (x1Real > _x1) { + x1 = (_x1+1)*GUI_Context.AA_Factor-1; + } +/* Make sure there is still something to do (after clipping) */ + if (x11; ) { + *pDest++ +=GUI_Context.AA_Factor; + } + /* Last Pixel */ + *pDest += (1+x1- (x1_Off+_x0) *GUI_Context.AA_Factor); + } + } +} + +/********************************************************************* +* +* CalcClipRectHL +*/ +static void CalcClipRectHL(void) { + ClipRect_HL.x0 = GUI_Context.ClipRect.x0 * GUI_Context.AA_Factor; + ClipRect_HL.y0 = GUI_Context.ClipRect.y0 * GUI_Context.AA_Factor; + ClipRect_HL.x1 = (GUI_Context.ClipRect.x1+1) * GUI_Context.AA_Factor -1; + ClipRect_HL.y1 = (GUI_Context.ClipRect.y1+1) * GUI_Context.AA_Factor -1; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AA_Init +*/ +int GUI_AA_Init(int x0, int x1) { + int r =0; + /* Bounds checking: + Make sure x0, x1 are in legal range ... + (The important point is that they span no more than configured as + buffer size) + */ + if (x0<0) + x0 =0; + if (x1-x0 > GUI_AA_LINEBUFFER_SIZE-1) + x1 = x0+GUI_AA_LINEBUFFER_SIZE-1; + /* Is there anything to do at all ??? */ + if (x1 < x0) { + x1 = x0; /* Not really ... */ + r =1; + } + DrawAPICopy = *GUI_Context.pLCD_HL; /* Copy API table */ + pLCD_HLPrev = GUI_Context.pLCD_HL; /* Remember list ptr (for restore) */ + DrawAPICopy.pfDrawHLine = _DrawHLine; /* modify function ptr. for hline */ + GUI_Context.pLCD_HL = &DrawAPICopy; /* Use copy of fp-list */ + pabAABuffer = abAABuffer; + _x0 = x0; + _x1 = x1; + _CleanLine(); + CalcClipRectHL(); + GUI_Context.pClipRect_HL = &ClipRect_HL; + return r; +} + +/********************************************************************* +* +* GUI_AA_Init_HiRes +*/ +int GUI_AA_Init_HiRes(int x0, int x1) { + x0 /= GUI_Context.AA_Factor; + x1 /= GUI_Context.AA_Factor; + return GUI_AA_Init(x0, x1); +} + +/********************************************************************* +* +* GUI_AA_SetFactor +*/ +void GUI_AA_SetFactor(int Factor) { + GUI_Context.AA_Factor = Factor; + CalcClipRectHL(); /* High level clipping depends on quality factor */ +} + +/********************************************************************* +* +* GUI_AA_GetFactor +*/ +int GUI_AA_GetFactor(void) { + return GUI_Context.AA_Factor; +} + +/********************************************************************* +* +* GUI_AA_DisableHiRes +*/ +void GUI_AA_DisableHiRes(void) { + GUI_Context.AA_HiResEnable = 0; +} + +/********************************************************************* +* +* GUI_AA_EnableHiRes +*/ +void GUI_AA_EnableHiRes(void) { + GUI_Context.AA_HiResEnable =1; +} + +/********************************************************************* +* +* GUI_AA_HiRes2Pixel +*/ +I16 GUI_AA_HiRes2Pixel(int HiRes) { + return GUI_Context.AA_Factor ? (HiRes / GUI_Context.AA_Factor) : HiRes; +} + +/********************************************************************* +* +* GUI_AA_Exit +*/ +void GUI_AA_Exit(void) { + _FlushLine(); + /* restore previous settings */ + GUI_Context.pLCD_HL = pLCD_HLPrev; + GUI_Context.pClipRect_HL = &GUI_Context.ClipRect; +} + +#else /* Avoid problems with empty object modules */ + void GUIAALib_C(void); + void GUIAALib_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAALine.c b/User/system/lib/lcd/gui/AntiAlias/GUIAALine.c new file mode 100644 index 0000000..a9970fd --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAALine.c @@ -0,0 +1,109 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIAALine.C +Purpose : Drawing lines with antialiasing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include + +#if GUI_SUPPORT_AA + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _AA_DrawLine +*/ +static void _AA_DrawLine(int x0, int y0, int x1, int y1) { + int xMin, xMax; + U8 PenSizeOld = GUI_GetPenSize(); + U8 PenSizeHR = PenSizeOld * GUI_Context.AA_Factor; + U8 OldPenShape = GUI_SetPenShape(GUI_PS_FLAT); + /* Calculate left and right borders for AA module */ + if (x0 < x1) { + xMin = x0; + xMax = x1; + } else { + xMin = x1; + xMax = x0; + } + if (GUI_Context.AA_HiResEnable) { + xMin -= PenSizeHR; + xMax += PenSizeHR; + xMin /= GUI_Context.AA_Factor; + xMax /= GUI_Context.AA_Factor; + } else { + xMin -= PenSizeOld; + xMax += PenSizeOld; + x0 *= GUI_Context.AA_Factor; + x1 *= GUI_Context.AA_Factor; + y0 *= GUI_Context.AA_Factor; + y1 *= GUI_Context.AA_Factor; + } + /* Do the actual drawing */ + GUI_AA_Init(xMin, xMax); + GUI_SetPenSize(PenSizeHR); + GL_DrawLine(x0 , y0 , x1 , y1 ); + GUI_AA_Exit(); + /* Draw end points (can be optimized away in future, TBD*/ + switch (OldPenShape) { + case GUI_PS_ROUND: + { + int r = GUI_Context.AA_Factor * PenSizeOld / 2; + GL_FillCircleAA_HiRes(x0 , y0 , r); + GL_FillCircleAA_HiRes(x1 , y1 , r); + } + break; + } + GUI_SetPenSize(PenSizeOld); + GUI_SetPenShape(OldPenShape); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AA_DrawLine +*/ +void GUI_AA_DrawLine(int x0, int y0, int x1, int y1) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG_AA(x0,y0); + WM_ADDORG_AA(x1,y1); + WM_ITERATE_START(NULL); { + #endif + _AA_DrawLine(x0, y0, x1, y1); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +#else /* Avoid problems with empty object modules */ + void GUIAALine_C(void); + void GUIAALine_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c new file mode 100644 index 0000000..3c0e9d1 --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c @@ -0,0 +1,112 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIPolyAA.C +Purpose : Draw Polygon routines with Antialiasing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +#include +#include +#include + +#if GUI_SUPPORT_AA + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _FillPolygonAA +*/ +static void _FillPolygonAA(GUI_POINT* paPoint, int NumPoints, int x, int y) { + int i; + int Stat; + int x0,x1; + int PosFactor = GUI_Context.AA_HiResEnable ? 1 : GUI_Context.AA_Factor; +/* Calc horizontal limits and init GUI_AA */ + x0 = x1 = paPoint[0].x; + for (i=1; i< NumPoints; i++) { + int x = paPoint[i].x; + if (xx1) + x1 = x; + } + if (!GUI_Context.AA_HiResEnable) { + Stat = GUI_AA_Init(x0+x,x1+x); + } else { + Stat = GUI_AA_Init((x0+x)/GUI_Context.AA_Factor,(x1+x)/GUI_Context.AA_Factor); + } + if (Stat ==0) { + /* Modify pointlist */ + if (!GUI_Context.AA_HiResEnable) { + for (i=0; i< NumPoints; i++) { + paPoint[i].x *= GUI_Context.AA_Factor; + paPoint[i].y *= GUI_Context.AA_Factor; + } + } + GL_FillPolygon(paPoint, NumPoints, x * PosFactor, y * PosFactor); + /* Restore pointlist */ + if (!GUI_Context.AA_HiResEnable) { + for (i=0; i< NumPoints; i++) { + paPoint[i].x /= GUI_Context.AA_Factor; + paPoint[i].y /= GUI_Context.AA_Factor; + } + } + /* Cleanup */ + } + GUI_AA_Exit(); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AA_FillPolygon +*/ +void GUI_AA_FillPolygon(/*const*/ GUI_POINT* pPoints, int NumPoints, int x0, int y0) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG_AA(x0,y0); + WM_ITERATE_START(NULL); { + #endif +/* Variables in MEMDEV module (with memory devices only) */ + #if GUI_SUPPORT_MEMDEV + if (GUI_Context.pDeviceAPI->pfFillPolygonAA) + GUI_Context.pDeviceAPI->pfFillPolygonAA(pPoints, NumPoints, x0, y0); + else + #endif + _FillPolygonAA (pPoints, NumPoints, x0, y0); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +#else /* Avoid problems with empty object modules */ + void GUIAAPoly_C(void); + void GUIAAPoly_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c new file mode 100644 index 0000000..c635a54 --- /dev/null +++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIPolyOutAA.C +Purpose : Draw Polygon outline routines with Antialiasing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "GUI.h" + +#if GUI_SUPPORT_AA + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AA_DrawPolyOutline +*/ +void GUI_AA_DrawPolyOutline(const GUI_POINT* pSrc, int NumPoints, int Thickness, int x, int y) { + U8 PrevDraw; + GUI_POINT aiTemp[10]; + GUI_EnlargePolygon(&aiTemp[0], pSrc, NumPoints, Thickness); + GUI_AA_FillPolygon( &aiTemp[0], NumPoints, x, y ); + PrevDraw = LCD_SetDrawMode(GUI_DRAWMODE_REV); +/* Copy points due to const qualifier */ + memcpy(aiTemp, pSrc, NumPoints*2*sizeof(GUI_POINT)); + GUI_AA_FillPolygon( aiTemp, NumPoints, x, y ); + LCD_SetDrawMode(PrevDraw); +} + +#else /* Avoid problems with empty object modules */ + void GUIAAPolyOut_C(void); + void GUIAAPolyOut_C(void) {} +#endif /* GUI_SUPPORT_AA */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/AntiAlias/vssver.scc b/User/system/lib/lcd/gui/AntiAlias/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..2f0c075ea5bf638d2d237a051e91742a91d8428d GIT binary patch literal 192 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WY`30}U)#KZsw%s~2W#2o)UDcLfNKoJ%ofBva? zI~%_4nGWK!0{K^k)FohiHXuJNZekUT&kp22(QnX#@i~BewXG9OVSG*?e{Nm#F&Li< d$WOa&;t1n&1NmO1%JX4-9w2{3IS(I<4*+M?H+292 literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/Config/GUIConf.h b/User/system/lib/lcd/gui/Config/GUIConf.h new file mode 100644 index 0000000..c397d32 --- /dev/null +++ b/User/system/lib/lcd/gui/Config/GUIConf.h @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* �C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIConf.h +Purpose : Configures abilities, fonts etc. +---------------------------------------------------------------------- +*/ + +#ifndef GUICONF_H +#define GUICONF_H + +#define GUI_OS (0) /* Compile with multitasking support */ +#define GUI_SUPPORT_TOUCH (0) /* Support a touch screen (req. win-manager) */ +#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */ + +#define GUI_DEFAULT_FONT &GUI_FontHZ16x16 +#define GUI_ALLOC_SIZE 5000 /* Size of dynamic memory ... For WM and memory devices*/ + +/********************************************************************* + * + * Configuration of available packages + */ + +#define GUI_WINSUPPORT 0 /* Window manager package available */ +#define GUI_SUPPORT_MEMDEV 0 /* Memory devices available */ +#define GUI_SUPPORT_AA 1 /* Anti aliasing available */ + +#endif /* Avoid multiple inclusion */ diff --git a/User/system/lib/lcd/gui/Config/GUITouchConf.h b/User/system/lib/lcd/gui/Config/GUITouchConf.h new file mode 100644 index 0000000..db2a9f6 --- /dev/null +++ b/User/system/lib/lcd/gui/Config/GUITouchConf.h @@ -0,0 +1,31 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITouch.Conf.h +Purpose : Configures touch screen module +---------------------------------------------------------------------- +*/ + + +#ifndef GUITOUCH_CONF_H +#define GUITOUCH_CONF_H + + +#define GUI_TOUCH_AD_LEFT 20 +#define GUI_TOUCH_AD_RIGHT 240 +#define GUI_TOUCH_SWAP_XY 1 +#define GUI_TOUCH_MIRROR_X 0 +#define GUI_TOUCH_MIRROR_Y 1 + +#endif /* GUITOUCH_CONF_H */ diff --git a/User/system/lib/lcd/gui/Config/GUI_X.c b/User/system/lib/lcd/gui/Config/GUI_X.c new file mode 100644 index 0000000..ce7fa4f --- /dev/null +++ b/User/system/lib/lcd/gui/Config/GUI_X.c @@ -0,0 +1,90 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_X.C +Purpose : Config / System dependent externals for GUI +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_X.h" + +/********************************************************************* + * + * Global data + */ +volatile int OS_TimeMS; + +/********************************************************************* +* +* Timing: +* GUI_X_GetTime() +* GUI_X_Delay(int) + + Some timing dependent routines require a GetTime + and delay function. Default time unit (tick), normally is + 1 ms. +*/ + +int GUI_X_GetTime(void) +{ + return OS_TimeMS; +} + +void GUI_X_Delay(int ms) +{ + int tEnd = OS_TimeMS + ms; + while ((tEnd - OS_TimeMS) > 0) + ; +} + +/********************************************************************* + * + * GUI_X_Init() + * + * Note: + * GUI_X_Init() is called from GUI_Init is a possibility to init + * some hardware which needs to be up and running before the GUI. + * If not required, leave this routine blank. + */ + +void GUI_X_Init(void) {} + +/********************************************************************* + * + * GUI_X_ExecIdle + * + * Note: + * Called if WM is in idle state + */ + +void GUI_X_ExecIdle(void) {} + +/********************************************************************* +* +* Logging: OS dependent + +Note: + Logging is used in higher debug levels only. The typical target + build does not use logging and does therefor not require any of + the logging routines below. For a release build without logging + the routines below may be eliminated to save some space. + (If the linker is not function aware and eliminates unreferenced + functions automatically) + +*/ + +void GUI_X_Log(const char *s) { GUI_USE_PARA(s); } +void GUI_X_Warn(const char *s) { GUI_USE_PARA(s); } +void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); } diff --git a/User/system/lib/lcd/gui/Config/LCDConf.h b/User/system/lib/lcd/gui/Config/LCDConf.h new file mode 100644 index 0000000..cacd1ff --- /dev/null +++ b/User/system/lib/lcd/gui/Config/LCDConf.h @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* �C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDConf_1375_C8_C320x240.h +Purpose : Sample configuration file +---------------------------------------------------------------------- +*/ + +#ifndef LCDCONF_H +#define LCDCONF_H +#include "board.h" // user defined + +/********************************************************************* + * + * General configuration of LCD + * + ********************************************************************** + */ + +#define LCD_XSIZE (400) /* X-resolution of LCD, Logical coor. */ +#define LCD_YSIZE (240) /* Y-resolution of LCD, Logical coor. */ + +#define LCD_BITSPERPIXEL (8) + +#define LCD_CONTROLLER (-1) + +#define LCD_INIT_CONTROLLER() lcd_init(); + +#endif /* LCDCONF_H */ diff --git a/User/system/lib/lcd/gui/Config/vssver.scc b/User/system/lib/lcd/gui/Config/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..7b91b539025a3ae3816b4c450d02ff9ab4ec24ec GIT binary patch literal 80 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WY)v=JBj%g6u*|A6${HjTwb+X@9hLjQq8$dOB_ Y4PW<62PV7NX*;D*uXlhPnQ05`!Ik^lez literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat b/User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat new file mode 100644 index 0000000..31cbd0f --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat @@ -0,0 +1,25 @@ +@ECHO OFF +ECHO CCConvertColor.bat: Compiling GUI\ConvertColor +CALL CC LCDP111 +CALL CC LCDP222 +CALL CC LCDP233 +CALL CC LCDP323 +CALL CC LCDP332 +CALL CC LCDP444_12 +CALL CC LCDP444_12_1 +CALL CC LCDP444_16 +CALL CC LCDP555 +CALL CC LCDP556 +CALL CC LCDP565 +CALL CC LCDP655 +CALL CC LCDP8666 +CALL CC LCDP8666_1 +CALL CC LCDPM233 +CALL CC LCDPM323 +CALL CC LCDPM332 +CALL CC LCDPM444_12 +CALL CC LCDPM444_16 +CALL CC LCDPM555 +CALL CC LCDPM556 +CALL CC LCDPM565 +CALL CC LCDPM655 diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP111.c b/User/system/lib/lcd/gui/ConvertColor/LCDP111.c new file mode 100644 index 0000000..918a7da --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP111.c @@ -0,0 +1,98 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD111.C +Purpose : Color conversion routines for 111 color mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, LCD_FIXEDPALETTE == 111, 8 basic colors +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_111 +*/ +unsigned LCD_Color2Index_111(LCD_COLOR Color) { + int r,g,b; + r = (Color>>(0+7)) &1; + g = (Color>>(8+7)) &1; + b = (Color>>(16+7)) &1; + return r+(g<<1)+(b<<2); +} + +/********************************************************************* +* +* LCD_Index2Color_111 +*/ +LCD_COLOR LCD_Index2Color_111(int Index) { + U16 r,g,b; + r = (((Index>>0)&1)*0xff); + g = (((Index>>1)&1)*0xff); + b = (Index>>2) *0xff; + return r | (g<<8) | ((U32)b<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_111 +*/ +unsigned LCD_GetIndexMask_111(void) { + return 0x0007; +} + +/********************************************************************* +* +* Public code, LCD_FIXEDPALETTE == 111, 8 basic colors, SWAP_RB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M111 +*/ +unsigned LCD_Color2Index_M111(LCD_COLOR Color) { + int r,g,b; + r = (Color>>(0+7)) &1; + g = (Color>>(8+7)) &1; + b = (Color>>(16+7)) &1; + return b+(g<<1)+(r<<2); +} + +/********************************************************************* +* +* LCD_Index2Color_M111 +*/ +LCD_COLOR LCD_Index2Color_M111(int Index) { + U16 r,g,b; + r = (((Index>>0)&1)*0xff); + g = (((Index>>1)&1)*0xff); + b = (Index>>2) *0xff; + return b | (g<<8) | ((U32)r<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M111 +*/ +unsigned LCD_GetIndexMask_M111(void) { + return 0x0007; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP222.c b/User/system/lib/lcd/gui/ConvertColor/LCDP222.c new file mode 100644 index 0000000..4dc03cf --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP222.c @@ -0,0 +1,98 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD222.C +Purpose : Color conversion routines for 222 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, LCD_FIXEDPALETTE == 222, 64 colors +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_222 +*/ +unsigned LCD_Color2Index_222(LCD_COLOR Color) { + int r,g,b; + r = ((Color&255) +0x2a)/0x55; + g = (((Color>>8)&255) +0x2a)/0x55; + b = (((Color>>16)&255)+0x2a)/0x55; + return r+(g<<2)+(b<<4); +} + +/********************************************************************* +* +* LCD_Index2Color_222 +*/ +LCD_COLOR LCD_Index2Color_222(int Index) { + U16P r,g,b; + r = ((Index>>0)&3)*0x55; + g = ((Index>>2)&3)*0x55; + b = (Index>>4) *0x55; + return (((U32)b)<<16)|(g<<8)|r; +} + +/********************************************************************* +* +* LCD_GetIndexMask_222 +*/ +unsigned LCD_GetIndexMask_222(void) { + return 0x0003f; +} + +/********************************************************************* +* +* Public code, LCD_FIXEDPALETTE == 222, 64 colors, SWAP_RB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M222 +*/ +unsigned LCD_Color2Index_M222(LCD_COLOR Color) { + int r,g,b; + r = ((Color&255) +0x2a)/0x55; + g = (((Color>>8)&255) +0x2a)/0x55; + b = (((Color>>16)&255)+0x2a)/0x55; + return b+(g<<2)+(r<<4); +} + +/********************************************************************* +* +* LCD_Index2Color_M222 +*/ +LCD_COLOR LCD_Index2Color_M222(int Index) { + U16P r,g,b; + r = ((Index>>0)&3)*0x55; + g = ((Index>>2)&3)*0x55; + b = (Index>>4) *0x55; + return (((U32)r)<<16)|(g<<8)|b; +} + +/********************************************************************* +* +* LCD_GetIndexMask_M222 +*/ +unsigned LCD_GetIndexMask_M222(void) { + return 0x003f; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP233.c b/User/system/lib/lcd/gui/ConvertColor/LCDP233.c new file mode 100644 index 0000000..a36c202 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP233.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP233.C +Purpose : Color conversion routines for 233 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 233, 256 colors, BBGGGRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_233 +*/ +unsigned LCD_Color2Index_233(LCD_COLOR Color) { + int r, g, b; + r = Color & 255; + g = (Color >> 8 ) & 255; + b = Color >> 16; + r = (r * 7 + 127) / 255; + g = (g * 7 + 127) / 255; + b = (b + 42) / 85; + return r + (g << 3) + (b << 6); +} + +/********************************************************************* +* +* LCD_Index2Color_233 +*/ +LCD_COLOR LCD_Index2Color_233(int Index) { + int r, g, b; + r = (Index & 7) * 255 / 7; + g = ((Index >> 3) & 7) * 255 / 7; + b = ((Index >> 6) & 3) * 85; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_233 +*/ +unsigned LCD_GetIndexMask_233(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP323.c b/User/system/lib/lcd/gui/ConvertColor/LCDP323.c new file mode 100644 index 0000000..36aac45 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP323.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP323.C +Purpose : Color conversion routines for 323 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 323, 256 colors, BBBGGRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_323 +*/ +unsigned LCD_Color2Index_323(LCD_COLOR Color) { + int r, g, b; + r = Color & 255; + g = (Color >> 8 ) & 255; + b = Color >> 16; + r = (r * 7 + 127) / 255; + g = (g + 42) / 85; + b = (b * 7 + 127) / 255; + return r + (g << 3) + (b << 5); +} + +/********************************************************************* +* +* LCD_Index2Color_323 +*/ +LCD_COLOR LCD_Index2Color_323(int Index) { + int r, g, b; + r = (Index & 7) * 255 / 7; + g = ((Index >> 3) & 3) * 85; + b = ((Index >> 5) & 7) * 255 / 7; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_323 +*/ +unsigned LCD_GetIndexMask_323(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP332.c b/User/system/lib/lcd/gui/ConvertColor/LCDP332.c new file mode 100644 index 0000000..4303387 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP332.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP332.C +Purpose : Color conversion routines for 332 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 332, 256 colors, BBBGGGRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_332 +*/ +unsigned LCD_Color2Index_332(LCD_COLOR Color) { + int r, g, b; + r = Color & 255; + g = (Color >> 8 ) & 255; + b = Color >> 16; + r = (r + 42) / 85; + g = (g * 7 + 127) / 255; + b = (b * 7 + 127) / 255; + return r + (g << 2) + (b << 5); +} + +/********************************************************************* +* +* LCD_Index2Color_332 +*/ +LCD_COLOR LCD_Index2Color_332(int Index) { + unsigned r, g, b; + r = (Index & 3) * 85; + g = ((Index >> 2) & 7) * 255 / 7; + b = ((Index >> 5) & 7) * 255 / 7; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_332 +*/ +unsigned LCD_GetIndexMask_332(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c new file mode 100644 index 0000000..b9b660f --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c @@ -0,0 +1,70 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP444_12.c +Purpose : Color conversion routines for LCD-drivers +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 444, 4096 colors, 0000BBBBGGGGRRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_444_12 +*/ +unsigned LCD_Color2Index_444_12(LCD_COLOR Color) { + unsigned int r,g,b; + r = Color & 255; + g = (Color >> 8) & 255; + b = (Color >> 16) & 255; + r = (r + 8) / 17; + g = (g + 8) / 17; + b = (b + 8) / 17; + return r + (g << 4) + (b << 8); +} + +/********************************************************************* +* +* LCD_Index2Color_444_12 +*/ +LCD_COLOR LCD_Index2Color_444_12(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + r = Index & 0xf; + g = (Index >> 4) & 0xf; + b = ((unsigned)Index >> 8) & 0xf; + /* Convert the color masks */ + r = r * 17; + g = g * 17; + b = b * 17; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_444_12 +*/ +unsigned LCD_GetIndexMask_444_12(void) { + return 0x0fff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c new file mode 100644 index 0000000..34d2461 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c @@ -0,0 +1,70 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP444_12_1.c +Purpose : Color conversion routines for LCD-drivers +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 444, 4096 colors, RRRRGGGGBBBB---- +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_444_12_1 +*/ +unsigned LCD_Color2Index_444_12_1(LCD_COLOR Color) { + unsigned int r,g,b; + r = Color & 255; + g = (Color >> 8) & 255; + b = (Color >> 16) & 255; + r = (r + 8) / 17; + g = (g + 8) / 17; + b = (b + 8) / 17; + return (b << 4) + (g << 8) + (r << 12); +} + +/********************************************************************* +* +* LCD_Index2Color_444_12_1 +*/ +LCD_COLOR LCD_Index2Color_444_12_1(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + r = ((unsigned)Index >> 12) & 0xf; + g = ((unsigned)Index >> 8) & 0xf; + b = ((unsigned)Index >> 4) & 0xf; + /* Convert the color masks */ + r = r * 17; + g = g * 17; + b = b * 17; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_444_12_1 +*/ +unsigned LCD_GetIndexMask_444_12_1(void) { + return 0xfff0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c b/User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c new file mode 100644 index 0000000..2ad5078 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c @@ -0,0 +1,70 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP444_16.C +Purpose : Color conversion routines for LCD-drivers +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 444, 4096 colors, 0BBBB0GGGG0RRRR0 +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_444_16 +*/ +unsigned LCD_Color2Index_444_16(LCD_COLOR Color) { + unsigned int r,g,b; + r = Color & 255; + g = (Color >> 8) & 255; + b = (Color >> 16) & 255; + r = (r + 8) / 17; + g = (g + 8) / 17; + b = (b + 8) / 17; + return (r << 1) + (g << 6) + (b << 11); +} + +/********************************************************************* +* +* LCD_Index2Color_444_16 +*/ +LCD_COLOR LCD_Index2Color_444_16(int Index) { + unsigned int r,g,b; + /* Separate the color masks */ + r = (Index >> 1) & 0xf; + g = (Index >> 6) & 0xf; + b = ((unsigned)Index >> 11) & 0xf; + /* Convert the color masks */ + r = r * 17; + g = g * 17; + b = b * 17; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_444_16 +*/ +unsigned LCD_GetIndexMask_444_16(void) { + return 0x7bde; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP555.c b/User/system/lib/lcd/gui/ConvertColor/LCDP555.c new file mode 100644 index 0000000..c95e07a --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP555.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP555.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 5 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 555, 32768 colors, 0BBBBBGGGGGRRRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_555 +*/ +unsigned LCD_Color2Index_555(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return r + (g << R_BITS) + (b << (G_BITS + R_BITS)); +} + +/********************************************************************* +* +* LCD_Index2Color_555 +*/ +LCD_COLOR LCD_Index2Color_555(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + r = Index & R_MASK; + g = (Index >> R_BITS) & G_MASK; + b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_555 +*/ +unsigned LCD_GetIndexMask_555(void) { + return 0x7fff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP556.c b/User/system/lib/lcd/gui/ConvertColor/LCDP556.c new file mode 100644 index 0000000..9cdba92 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP556.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP556.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 5 +#define R_BITS 6 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 556, 65536 colors, BBBBBGGGGGRRRRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_556 +*/ +unsigned LCD_Color2Index_556(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return r + (g << R_BITS) + (b << (G_BITS + R_BITS)); +} + +/********************************************************************* +* +* LCD_Index2Color_556 +*/ +LCD_COLOR LCD_Index2Color_556(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + r = Index & R_MASK; + g = (Index >> R_BITS) & G_MASK; + b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_556 +*/ +unsigned LCD_GetIndexMask_556(void) { + return 0xffff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP565.c b/User/system/lib/lcd/gui/ConvertColor/LCDP565.c new file mode 100644 index 0000000..97bc2a2 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP565.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP565.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 6 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 565, 65536 colors, BBBBBGGGGGGRRRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_565 +*/ +unsigned LCD_Color2Index_565(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return r + (g << R_BITS) + (b << (G_BITS + R_BITS)); +} + +/********************************************************************* +* +* LCD_GetIndexMask_565 +*/ +unsigned LCD_GetIndexMask_565(void) { + return 0xffff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP655.c b/User/system/lib/lcd/gui/ConvertColor/LCDP655.c new file mode 100644 index 0000000..0d3ff74 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP655.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP655.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 6 +#define G_BITS 5 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 655, 65536 colors, BBBBBBGGGGGRRRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_655 +*/ +unsigned LCD_Color2Index_655(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return r + (g << R_BITS) + (b << (G_BITS + R_BITS)); +} + +/********************************************************************* +* +* LCD_Index2Color_655 +*/ +LCD_COLOR LCD_Index2Color_655(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + r = Index & R_MASK; + g = (Index >> R_BITS) & G_MASK; + b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_655 +*/ +unsigned LCD_GetIndexMask_655(void) { + return 0xffff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP8666.c b/User/system/lib/lcd/gui/ConvertColor/LCDP8666.c new file mode 100644 index 0000000..5f25c1a --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP8666.c @@ -0,0 +1,104 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD866.C +Purpose : Color conversion routines for 866 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* LCD_Color2Index_8666 +* +* Purpose +* API table for this color conversion mode. Only used by memory +* devices in this mode. +*/ +const LCD_API_COLOR_CONV LCD_API_ColorConv_8666 = { + LCD_Color2Index_8666, + LCD_Index2Color_8666, + LCD_GetIndexMask_8666 +}; + +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_8666 +*/ +unsigned LCD_Color2Index_8666(LCD_COLOR Color) { + int r,g,b,Index; + r = Color&255; + g = (Color>>8)&255; + b = Color>>16; +/* Check if image is a gray scale ... */ + if ((r==g) && (g==b)) { + return 120+ (r+8)/17; /* Convert into colors from 120 - 135*/ + } +/* Convert into the 6*6*6 colors ... */ + r = (r*5+127)/255; + g = (g*5+127)/255; + b = (b*5+127)/255; + Index = r+6*g+36*b; + return (Index<108) ? Index : Index+40; +} + +/********************************************************************* +* +* LCD_Index2Color_8666 +*/ +LCD_COLOR LCD_Index2Color_8666(int Index) { + unsigned int r,g; + U32 b; + /* 16 Gray scale range ? */ + if ((Index>=120) && (Index<136)) { + return (U32)0x111111 * (U32)(Index-120); + } + if (Index>=108) { + if (Index<148) + return 0; /* Black for illegal indices */ + Index -= 40; + } + r = (Index%6)*(255/5); + g = ((Index/6)%6)*(255/5); + b = (Index/36)*(255/5); + return r+(g<<8)+((U32)b<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_8666 +*/ +unsigned LCD_GetIndexMask_8666(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c b/User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c new file mode 100644 index 0000000..e8c33da --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP8666_1.C +Purpose : Color conversion routines for 86661 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_8666_1 +*/ +unsigned LCD_Color2Index_8666_1(LCD_COLOR Color) { + int r, g, b, Index; + r = Color & 255; + g = (Color >> 8) & 255; + b = Color >> 16; +/* Check if image is a gray scale ... */ + if ((r == g) && (g == b)) { + return 120 + (r + 8) / 17; /* Convert into colors from 120 - 135 */ + } +/* Convert into the 6*6*6 colors ... */ + r = (r * 5 + 127) / 255; + g = (g * 5 + 127) / 255; + b = (b * 5 + 127) / 255; + Index = r + 6 * g + 36 * b; + return (Index < 108) ? Index + 12 : Index + 28; +} + +/********************************************************************* +* +* LCD_Index2Color_8666_1 +*/ +LCD_COLOR LCD_Index2Color_8666_1(int Index) { + unsigned int r,g; + U32 b; + /* 16 Gray scale range ? */ + if ((Index >= 120) && (Index < 136)) { + return (U32)0x111111 * (U32)(Index - 120); + } + if ((Index < 12) || (Index > 243)) { + return 0; /* Black for illegal indices */ + } + if (Index >= 120) { + Index -= 28; + } else { + Index -= 12; + } + r = (Index % 6) * (255 / 5); + g = ((Index / 6) % 6) * (255 / 5); + b = (Index / 36) * (255 / 5); + return r + (g << 8) + ((U32)b << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_8666_1 +*/ +unsigned LCD_GetIndexMask_8666_1(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM233.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM233.c new file mode 100644 index 0000000..90e2a52 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM233.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM233.C +Purpose : Color conversion routines for -233 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == -233, 256 colors, RRGGGBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M233 +*/ +unsigned LCD_Color2Index_M233(LCD_COLOR Color) { + unsigned r, g, b; + r = Color & 255; + g = (Color >> 8 ) & 255; + b = Color >> 16; + r = (r + 42 ) / 85; + g = (g * 7 + 127) / 255; + b = (b * 7 + 127) / 255; + return b + (g << 3) + (r << 6); +} + +/********************************************************************* +* +* LCD_Index2Color_M233 +*/ +LCD_COLOR LCD_Index2Color_M233(int Index) { + unsigned r, g, b; + b = (Index & 7) * 255 / 7; + g = ((Index >> 3) & 7) * 255 / 7; + r = ((Index >> 6) & 3) * 85; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M233 +*/ +unsigned LCD_GetIndexMask_M233(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM323.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM323.c new file mode 100644 index 0000000..78fc307 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM323.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM323.C +Purpose : Color conversion routines for -323 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == -323, 256 colors, RRRGGBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M323 +*/ +unsigned LCD_Color2Index_M323(LCD_COLOR Color) { + unsigned r, g, b; + r = Color & 255; + g = (Color >> 8 ) & 255; + b = Color >> 16; + r = (r * 7 + 127) / 255; + g = (g + 42) / 85; + b = (b * 7 + 127) / 255; + return b + (g << 3) + (r << 5); +} + +/********************************************************************* +* +* LCD_Index2Color_M323 +*/ +LCD_COLOR LCD_Index2Color_M323(int Index) { + unsigned r, g, b; + b = (Index & 7) * 255 / 7; + g = ((Index >> 3) & 3) * 85; + r = ((Index >> 5) & 7) * 255 / 7; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M323 +*/ +unsigned LCD_GetIndexMask_M323(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM332.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM332.c new file mode 100644 index 0000000..2917fee --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM332.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM332.C +Purpose : Color conversion routines for -332 mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == -332, 256 colors, RRRGGGBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M332 +*/ +unsigned LCD_Color2Index_M332(LCD_COLOR Color) { + unsigned r, g, b; + r = Color & 255; + g = (Color >> 8 ) & 255; + b = Color >> 16; + r = (r * 7 + 127) / 255; + g = (g * 7 + 127) / 255; + b = (b + 42) / 85; + return b + (g << 2) + (r << 5); +} + +/********************************************************************* +* +* LCD_Index2Color_M332 +*/ +LCD_COLOR LCD_Index2Color_M332(int Index) { + unsigned r, g, b; + b = (Index & 3) * 85; + g = ((Index >> 2) & 7) * 255 / 7; + r = ((Index >> 5) & 7) * 255 / 7; + return r + (g << 8) + (((U32)b) << 16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M332 +*/ +unsigned LCD_GetIndexMask_M332(void) { + return 0xff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c new file mode 100644 index 0000000..f408595 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c @@ -0,0 +1,70 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM444_12.c +Purpose : Color conversion routines for LCD-drivers +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 444, 4096 colors, RRRRGGGGBBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M444_12 +*/ +unsigned LCD_Color2Index_M444_12(LCD_COLOR Color) { + unsigned int r,g,b; + r = Color & 255; + g = (Color >> 8) & 255; + b = (Color >> 16) & 255; + r = (r + 8) / 17; + g = (g + 8) / 17; + b = (b + 8) / 17; + return b + (g << 4) + (r << 8); +} + +/********************************************************************* +* +* LCD_Index2Color_M444_12 +*/ +LCD_COLOR LCD_Index2Color_M444_12(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + b = Index & 0xf; + g = (Index >> 4) & 0xf; + r = ((unsigned)Index >> 8) & 0xf; + /* Convert the color masks */ + r = r * 17; + g = g * 17; + b = b * 17; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M444_12 +*/ +unsigned LCD_GetIndexMask_M444_12(void) { + return 0x0fff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c new file mode 100644 index 0000000..891c5e3 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c @@ -0,0 +1,70 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM444_16.C +Purpose : Color conversion routines for LCD-drivers +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 444, 4096 colors, 0RRRR0GGGG0BBBB0 +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M444_16 +*/ +unsigned LCD_Color2Index_M444_16(LCD_COLOR Color) { + unsigned int r,g,b; + r = Color & 255; + g = (Color >> 8) & 255; + b = (Color >> 16) & 255; + r = (r + 8) / 17; + g = (g + 8) / 17; + b = (b + 8) / 17; + return (b << 1) + (g << 6) + (r << 11); +} + +/********************************************************************* +* +* LCD_Index2Color_M444_16 +*/ +LCD_COLOR LCD_Index2Color_M444_16(int Index) { + unsigned int r,g,b; + /* Separate the color masks */ + b = (Index >> 1) & 0xf; + g = (Index >> 6) & 0xf; + r = ((unsigned)Index >> 11) & 0xf; + /* Convert the color masks */ + r = r * 17; + g = g * 17; + b = b * 17; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M444_16 +*/ +unsigned LCD_GetIndexMask_M444_16(void) { + return 0x7bde; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM555.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM555.c new file mode 100644 index 0000000..d08c1fb --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM555.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDM555.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 5 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 555, 32768 colors, 0RRRRRGGGGGBBBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M555 +*/ +unsigned LCD_Color2Index_M555(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return b + (g << B_BITS) + (r << (G_BITS + B_BITS)); +} + +/********************************************************************* +* +* LCD_Index2Color_M555 +*/ +LCD_COLOR LCD_Index2Color_M555(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + b = Index & B_MASK; + g = (Index >> B_BITS) & G_MASK; + r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M555 +*/ +unsigned LCD_GetIndexMask_M555(void) { + return 0x7fff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM556.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM556.c new file mode 100644 index 0000000..d6f0f00 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM556.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDM556.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 5 +#define R_BITS 6 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 556, 65536 colors, RRRRRRGGGGGBBBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M556 +*/ +unsigned LCD_Color2Index_M556(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return b + (g << B_BITS) + (r << (G_BITS + B_BITS)); +} + +/********************************************************************* +* +* LCD_Index2Color_M556 +*/ +LCD_COLOR LCD_Index2Color_M556(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + b = Index & B_MASK; + g = (Index >> B_BITS) & G_MASK; + r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M556 +*/ +unsigned LCD_GetIndexMask_M556(void) { + return 0xffff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM565.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM565.c new file mode 100644 index 0000000..b059a73 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM565.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDM565.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 6 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 565, 65536 colors, RRRRRGGGGGGBBBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M565 +*/ +unsigned LCD_Color2Index_M565(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return b + (g << B_BITS) + (r << (G_BITS + B_BITS)); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M565 +*/ +unsigned LCD_GetIndexMask_M565(void) { + return 0xffff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM655.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM655.c new file mode 100644 index 0000000..fe1b209 --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM655.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM655.C +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 6 +#define G_BITS 5 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 655, 65536 colors, RRRRRGGGGGBBBBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_M655 +*/ +unsigned LCD_Color2Index_M655(LCD_COLOR Color) { + int r,g,b; + r = (Color>> (8 - R_BITS)) & R_MASK; + g = (Color>> (16 - G_BITS)) & G_MASK; + b = (Color>> (24 - B_BITS)) & B_MASK; + return b + (g << B_BITS) + (r << (G_BITS + B_BITS)); +} + +/********************************************************************* +* +* LCD_Index2Color_M655 +*/ +LCD_COLOR LCD_Index2Color_M655(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + b = Index & B_MASK; + g = (Index >> B_BITS) & G_MASK; + r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/********************************************************************* +* +* LCD_GetIndexMask_M655 +*/ +unsigned LCD_GetIndexMask_M655(void) { + return 0xffff; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertColor/vssver.scc b/User/system/lib/lcd/gui/ConvertColor/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..a86f34e136f2e29a0c1fa10fdc7ad40923d09402 GIT binary patch literal 416 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WYGNoi^GGBJPwACTS<_f~vQO12CmP=p`IKVKs2 z)9`iAbP!(v$S>cUKLf@W1oFdF+ZMz4LLmOiJ~kL%7|5R|k?9ZPival(P4Cvj_@Y35 zz|l9nFuoX&KR-M642&-hSV2joWyomGVK<$-*kNumEntries; + int BestIndex = 0; + U32 BestDiff = 0xffffff; /* Initialize to worst match */ + const LCD_COLOR* pPalEntry; +/* Try to find perfect match */ + i=0; pPalEntry = &pPhysPal->pPalEntries[0]; + do { + if (Color==*(pPalEntry+i)) + return i; + } while (++ipPalEntries[0]; + do { + U32 Diff = GUI_CalcColorDist (Color, *(pPalEntry+i)); + if (Diff < BestDiff) { + BestDiff = Diff; + BestIndex = i; + } + } while (++i= (unsigned) pPhysPal->NumEntries) { + return 0; /* Illegal index */ + } + return *(pPhysPal->pPalEntries+Index); +} + +/********************************************************************* +* +* LCD_GetIndexMask_0 +*/ +unsigned LCD_GetIndexMask_0(void) { + return ((1 << LCD_BITSPERPIXEL) - 1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertMono/LCDP2.c b/User/system/lib/lcd/gui/ConvertMono/LCDP2.c new file mode 100644 index 0000000..ef2501e --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertMono/LCDP2.c @@ -0,0 +1,81 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD2.C +Purpose : Color conversion routines for 4 bpp gray LCDs +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* LCD_Color2Index_2 +* +* Purpose +* API table for this color conversion mode. Only used by memory +* devices in this mode. +*/ +const LCD_API_COLOR_CONV LCD_API_ColorConv_2 = { + LCD_Color2Index_2, + LCD_Index2Color_2, + LCD_GetIndexMask_2 +}; + +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_2 +*/ +unsigned LCD_Color2Index_2(LCD_COLOR Color) { + int r,g,b; + r = Color &255; + g = (Color>>8) &255; + b = Color>>16; + return (r+g+b+127) /255; +} + +/********************************************************************* +* +* LCD_Index2Color_2 +*/ +LCD_COLOR LCD_Index2Color_2(int Index) { + return ((U32)Index)*0x555555; +} + +/********************************************************************* +* +* LCD_GetIndexMask_2 +*/ +unsigned LCD_GetIndexMask_2(void) { + return 0x03; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertMono/LCDP4.c b/User/system/lib/lcd/gui/ConvertMono/LCDP4.c new file mode 100644 index 0000000..104608c --- /dev/null +++ b/User/system/lib/lcd/gui/ConvertMono/LCDP4.c @@ -0,0 +1,81 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD4.C +Purpose : Color conversion routines for 4 bpp gray LCDs +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* LCD_Color2Index_4 +* +* Purpose +* API table for this color conversion mode. Only used by memory +* devices in this mode. +*/ +const LCD_API_COLOR_CONV LCD_API_ColorConv_4 = { + LCD_Color2Index_4, + LCD_Index2Color_4, + LCD_GetIndexMask_4 +}; + +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_4 +*/ +unsigned LCD_Color2Index_4(LCD_COLOR Color) { + int r,g,b; + r = (Color>>(0+4)) &15; + g = (Color>>(8+4)) &15; + b = (Color>>(16+4)) &15; + return (r+g+b+1) /3; +} + +/********************************************************************* +* +* LCD_Index2Color_4 +*/ +LCD_COLOR LCD_Index2Color_4(int Index) { + return ((U32)Index)*0x111111; +} + +/********************************************************************* +* +* LCD_GetIndexMask_4 +*/ +unsigned LCD_GetIndexMask_4(void) { + return 0x0f; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/ConvertMono/vssver.scc b/User/system/lib/lcd/gui/ConvertMono/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..5016c4adc2f41cfc3c480b2eb3d62ce259747326 GIT binary patch literal 96 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WW!d%xj@8WRH;r~_#ZF|!?eQnF Disable memory devices -> GUI_SUPPORT_MEMDEV 0 +#endif + +/********************************************************************* + * + * macros, function replacement + * + ********************************************************************** + */ +#define GUI_COUNTOF(a) (sizeof(a) / sizeof(a[0])) + + /************************************************************ + * + * GUI_KEY_... + * + ************************************************************* + These ID values are basically meant to be used with widgets + Note that we have chosen the values to be close to existing + "standards", so do not change them unless forced to. + + */ + +#define GUI_KEY_BACKSPACE 8 /* ASCII: BACKSPACE Crtl-H */ +#define GUI_KEY_TAB 9 /* ASCII: TAB Crtl-I */ +#define GUI_KEY_ENTER 13 /* ASCII: ENTER Crtl-M */ +#define GUI_KEY_LEFT 16 +#define GUI_KEY_UP 17 +#define GUI_KEY_RIGHT 18 +#define GUI_KEY_DOWN 19 +#define GUI_KEY_HOME 23 +#define GUI_KEY_END 24 +#define GUI_KEY_SHIFT 25 +#define GUI_KEY_CONTROL 26 +#define GUI_KEY_ESCAPE 27 /* ASCII: ESCAPE 0x1b */ +#define GUI_KEY_INSERT 29 +#define GUI_KEY_DELETE 30 +#define GUI_KEY_SPACE 32 + +#define GUI_KEY_F1 40 +#define GUI_KEY_F2 41 + + /********************************************************************* + * + * Dialog item IDs + * + * The IDs below are arbitrary values. They just have to be unique + * within the dialog. + * + * If you use your own Ids, we recommend to use values above GUI_ID_USER. + */ + +#define GUI_ID_OK 1 +#define GUI_ID_CANCEL 2 +#define GUI_ID_YES 3 +#define GUI_ID_NO 4 +#define GUI_ID_CLOSE 5 +#define GUI_ID_HELP 6 +#define GUI_ID_MAXIMIZE 7 +#define GUI_ID_MINIMIZE 8 + +#define GUI_ID_VSCROLL 0xFE +#define GUI_ID_HSCROLL 0xFF + +#define GUI_ID_EDIT0 0x100 +#define GUI_ID_EDIT1 0x101 +#define GUI_ID_EDIT2 0x102 +#define GUI_ID_EDIT3 0x103 +#define GUI_ID_EDIT4 0x104 +#define GUI_ID_EDIT5 0x105 +#define GUI_ID_EDIT6 0x106 +#define GUI_ID_EDIT7 0x107 +#define GUI_ID_EDIT8 0x108 +#define GUI_ID_EDIT9 0x109 + +#define GUI_ID_LISTBOX0 0x110 +#define GUI_ID_LISTBOX1 0x111 +#define GUI_ID_LISTBOX2 0x112 +#define GUI_ID_LISTBOX3 0x113 +#define GUI_ID_LISTBOX4 0x114 +#define GUI_ID_LISTBOX5 0x115 +#define GUI_ID_LISTBOX6 0x116 +#define GUI_ID_LISTBOX7 0x117 +#define GUI_ID_LISTBOX8 0x118 +#define GUI_ID_LISTBOX9 0x119 + +#define GUI_ID_CHECK0 0x120 +#define GUI_ID_CHECK1 0x121 +#define GUI_ID_CHECK2 0x122 +#define GUI_ID_CHECK3 0x123 +#define GUI_ID_CHECK4 0x124 +#define GUI_ID_CHECK5 0x125 +#define GUI_ID_CHECK6 0x126 +#define GUI_ID_CHECK7 0x127 +#define GUI_ID_CHECK8 0x128 + +#define GUI_ID_SLIDER0 0x130 +#define GUI_ID_SLIDER1 0x131 +#define GUI_ID_SLIDER2 0x132 +#define GUI_ID_SLIDER3 0x133 +#define GUI_ID_SLIDER4 0x134 +#define GUI_ID_SLIDER5 0x135 +#define GUI_ID_SLIDER6 0x136 +#define GUI_ID_SLIDER7 0x137 +#define GUI_ID_SLIDER8 0x138 +#define GUI_ID_SLIDER9 0x139 + +#define GUI_ID_SCROLLBAR0 0x140 +#define GUI_ID_SCROLLBAR1 0x141 +#define GUI_ID_SCROLLBAR2 0x142 +#define GUI_ID_SCROLLBAR3 0x142 + +#define GUI_ID_RADIO0 0x150 +#define GUI_ID_RADIO1 0x151 +#define GUI_ID_RADIO2 0x152 +#define GUI_ID_RADIO3 0x153 +#define GUI_ID_RADIO4 0x154 +#define GUI_ID_RADIO5 0x155 +#define GUI_ID_RADIO6 0x156 +#define GUI_ID_RADIO7 0x157 + +#define GUI_ID_TEXT0 0x160 +#define GUI_ID_TEXT1 0x161 +#define GUI_ID_TEXT2 0x162 +#define GUI_ID_TEXT3 0x163 +#define GUI_ID_TEXT4 0x164 +#define GUI_ID_TEXT5 0x165 +#define GUI_ID_TEXT6 0x166 +#define GUI_ID_TEXT7 0x167 +#define GUI_ID_TEXT8 0x168 +#define GUI_ID_TEXT9 0x169 + +#define GUI_ID_BUTTON0 0x170 +#define GUI_ID_BUTTON1 0x171 +#define GUI_ID_BUTTON2 0x172 +#define GUI_ID_BUTTON3 0x173 +#define GUI_ID_BUTTON4 0x174 +#define GUI_ID_BUTTON5 0x175 +#define GUI_ID_BUTTON6 0x176 +#define GUI_ID_BUTTON7 0x177 +#define GUI_ID_BUTTON8 0x178 +#define GUI_ID_BUTTON9 0x179 + +#define GUI_ID_DROPDOWN0 0x180 +#define GUI_ID_DROPDOWN1 0x181 +#define GUI_ID_DROPDOWN2 0x182 +#define GUI_ID_DROPDOWN3 0x183 + +#define GUI_ID_MULTIEDIT0 0x190 +#define GUI_ID_MULTIEDIT1 0x191 +#define GUI_ID_MULTIEDIT2 0x192 +#define GUI_ID_MULTIEDIT3 0x193 + +#define GUI_ID_LISTVIEW0 0x200 +#define GUI_ID_LISTVIEW1 0x201 +#define GUI_ID_LISTVIEW2 0x202 +#define GUI_ID_LISTVIEW3 0x203 + +#define GUI_ID_PROGBAR0 0x210 +#define GUI_ID_PROGBAR1 0x211 +#define GUI_ID_PROGBAR2 0x212 +#define GUI_ID_PROGBAR3 0x213 + +#define GUI_ID_USER 0x800 + + /********************************************************************* + * + * Constants needed for GL + * + ********************************************************************** + */ + + /********************************** + * + * Text styles + * + *********************************** + */ + +#define GUI_TS_NORMAL (0) +#define GUI_TS_UNDERLINE (1 << 0) +#define GUI_TS_STRIKETHRU (1 << 1) +#define GUI_TS_OVERLINE (1 << 2) + + /********************************** + * + * Line styles + * + *********************************** + */ + +#define GUI_LS_SOLID (0) +#define GUI_LS_DASH (1) +#define GUI_LS_DOT (2) +#define GUI_LS_DASHDOT (3) +#define GUI_LS_DASHDOTDOT (4) + + /********************************** + * + * Pen shapes + * + *********************************** + */ + +#define GUI_PS_ROUND (0) +#define GUI_PS_FLAT (1) +#define GUI_PS_SQUARE (2) + + /* ********************************* + * + * Standard colors + * + ********************************* + */ + +#define GUI_BLUE 0xFF0000 +#define GUI_GREEN 0x00FF00 +#define GUI_RED 0x0000FF +#define GUI_CYAN 0xFFFF00 +#define GUI_MAGENTA 0xFF00FF +#define GUI_YELLOW 0x00FFFF +#define GUI_LIGHTBLUE 0xFF8080 +#define GUI_LIGHTGREEN 0x80FF80 +#define GUI_LIGHTRED 0x8080FF +#define GUI_LIGHTCYAN 0xFFFF80 +#define GUI_LIGHTMAGENTA 0xFF80FF +#define GUI_LIGHTYELLOW 0x80FFFF +#define GUI_DARKBLUE 0x800000 +#define GUI_DARKGREEN 0x008000 +#define GUI_DARKRED 0x000080 +#define GUI_DARKCYAN 0x808000 +#define GUI_DARKMAGENTA 0x800080 +#define GUI_DARKYELLOW 0x008080 +#define GUI_WHITE 0xFFFFFF +#define GUI_LIGHTGRAY 0xD3D3D3 +#define GUI_GRAY 0x808080 +#define GUI_DARKGRAY 0x404040 +#define GUI_BLACK 0x000000 + +#define GUI_BROWN 0x2A2AA5 + +#define GUI_INVALID_COLOR 0xFFFFFFF /* Invalid color - more than 24 bits */ + +/* ********************************* + * + * Coordinates + * + ********************************* + */ +#define GUI_COORD_X 0 +#define GUI_COORD_Y 1 + + /********************************************************************* + * + * Standard Fonts + * + ********************************************************************** + + Note: The external declarations for the fonts are now also included in + this file. + */ + extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ200x200; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16x16; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ18x18; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ20x20; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24x24; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ32x32; + + /* Proportional fonts */ + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8_ASCII, GUI_Font8_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font10S_ASCII, GUI_Font10S_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font10_ASCII, GUI_Font10_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font13_ASCII, GUI_Font13_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font13B_ASCII, GUI_Font13B_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font13H_ASCII, GUI_Font13H_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font13HB_ASCII, GUI_Font13HB_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font16_ASCII, GUI_Font16_1, GUI_Font16_HK, GUI_Font16_1HK; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font16B_ASCII, GUI_Font16B_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font24_ASCII, GUI_Font24_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font24B_ASCII, GUI_Font24B_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font32_ASCII, GUI_Font32_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font32B_ASCII, GUI_Font32B_1; + + /* Monospaced */ + extern GUI_CONST_STORAGE GUI_FONT GUI_Font4x6; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font6x8, GUI_Font6x9; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x8, GUI_Font8x9; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x10_ASCII; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x12_ASCII; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x13_ASCII, GUI_Font8x13_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x15B_ASCII, GUI_Font8x15B_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x16, GUI_Font8x17, GUI_Font8x18; + extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x16x1x2, GUI_Font8x16x2x2, GUI_Font8x16x3x3; + + /* Digits */ + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD24x32; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD32; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD36x48; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD48; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD48x64; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD64; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD60x80; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontD80; + + /* Comic fonts */ + extern GUI_CONST_STORAGE GUI_FONT GUI_FontComic18B_ASCII, GUI_FontComic18B_1; + extern GUI_CONST_STORAGE GUI_FONT GUI_FontComic24B_ASCII, GUI_FontComic24B_1; + + /* + ********************************* + * * + * Text and drawing mode defines * + * * + ********************************* + + These defines come in two flavors: the long version (.._DRAWMODE_..) + and the short ones (.._DM_..). They are identical, feel free to use + which ever one you like best. + + */ + +#define GUI_DRAWMODE_NORMAL LCD_DRAWMODE_NORMAL +#define GUI_DRAWMODE_XOR LCD_DRAWMODE_XOR +#define GUI_DRAWMODE_TRANS LCD_DRAWMODE_TRANS +#define GUI_DRAWMODE_REV LCD_DRAWMODE_REV +#define GUI_DM_NORMAL LCD_DRAWMODE_NORMAL +#define GUI_DM_XOR LCD_DRAWMODE_XOR +#define GUI_DM_TRANS LCD_DRAWMODE_TRANS +#define GUI_DM_REV LCD_DRAWMODE_REV + +#define GUI_TEXTMODE_NORMAL LCD_DRAWMODE_NORMAL +#define GUI_TEXTMODE_XOR LCD_DRAWMODE_XOR +#define GUI_TEXTMODE_TRANS LCD_DRAWMODE_TRANS +#define GUI_TEXTMODE_REV LCD_DRAWMODE_REV +#define GUI_TM_NORMAL LCD_DRAWMODE_NORMAL +#define GUI_TM_XOR LCD_DRAWMODE_XOR +#define GUI_TM_TRANS LCD_DRAWMODE_TRANS +#define GUI_TM_REV LCD_DRAWMODE_REV + +/* Text alignment flags, horizontal */ +#define GUI_TA_HORIZONTAL (3 << 0) +#define GUI_TA_LEFT (0 << 0) +#define GUI_TA_RIGHT (1 << 0) +#define GUI_TA_CENTER (2 << 0) +#define GUI_TA_HCENTER GUI_TA_CENTER /* easier to remember :-) */ + +/* Text alignment flags, vertical */ +#define GUI_TA_VERTICAL (3 << 2) +#define GUI_TA_TOP (0 << 2) +#define GUI_TA_BOTTOM (1 << 2) +#define GUI_TA_BASELINE (2 << 2) +#define GUI_TA_VCENTER (3 << 2) + +/* ********************************* + * + * Min/Max coordinates + * + ********************************* + */ +/* Define minimum and maximum coordinates in x and y */ +#define GUI_XMIN -4095 +#define GUI_XMAX 4095 +#define GUI_YMIN -4095 +#define GUI_YMAX 4095 + + /********************************************************************* + * + * Support for multitasking systems (locking) + * + ********************************************************************** + */ + +#if !GUI_OS +#define GUI_LOCK() +#define GUI_UNLOCK() +#define GUITASK_INIT() +#define GUITASK_COPY_CONTEXT() +#else +void GUI_Lock(void); +void GUI_Unlock(void); +void GUITASK_Init(void); +void GUITASK_CopyContext(void); +#define GUI_LOCK() GUI_Lock() +#define GUI_UNLOCK() GUI_Unlock() +#define GUITASK_INIT() GUITASK_Init() +#define GUITASK_COPY_CONTEXT() GUITASK_CopyContext() +#endif + + /********************************************************************* + * + * GUI_CONTEXT + * + ********************************************************************** + + This structure is public for one reason only: + To allow the application to save and restore the context. + */ + + typedef union + { + U8 aColorIndex8[2]; + U16 aColorIndex16[2]; + } LCD_COLORINDEX_UNION; + + typedef struct + { + /* Variables in LCD module */ + LCD_COLORINDEX_UNION GLCD; + LCD_RECT ClipRect; + U8 DrawMode; + U8 SelLayer; + U8 TextStyle; + /* Variables in GL module */ + GUI_RECT *pClipRect_HL; /* High level clip rectangle ... Speed optimization so drawing routines can optimize */ + U8 PenSize; + U8 PenShape; + U8 LineStyle; + U8 FillStyle; + /* Variables in GUICHAR module */ + const GUI_FONT GUI_UNI_PTR *pAFont; + const GUI_UC_ENC_APILIST *pUC_API; /* Unicode encoding API */ + I16P LBorder; + I16P DispPosX, DispPosY; + I16P DrawPosX, DrawPosY; + I16P TextMode, TextAlign; + GUI_COLOR Color, BkColor; /* Required only when changing devices and for speed opt (caching) */ + /* Variables in WM module */ +#if GUI_WINSUPPORT + const GUI_RECT *WM__pUserClipRect; + GUI_HWIN hAWin; + int xOff, yOff; +#endif + /* Variables in MEMDEV module (with memory devices only) */ +#if GUI_SUPPORT_DEVICES + const tLCDDEV_APIList *pDeviceAPI; /* function pointers only */ + GUI_HMEM hDevData; + GUI_RECT ClipRectPrev; +#endif + /* Variables in Anitaliasing module */ +#if GUI_SUPPORT_AA + const tLCD_HL_APIList *pLCD_HL; /* Required to reroute drawing (HLine & Pixel) to the AA module */ + U8 AA_Factor; + U8 AA_HiResEnable; +#endif + } GUI_CONTEXT; + +/* Rename GUI_SaveContext in order to avoid crashes if wrong GUIConf is used */ +#if (GUI_WINSUPPORT && GUI_SUPPORT_DEVICES) +#define GUI_SaveContext GUI_SaveContext_W_M +#elif (!GUI_WINSUPPORT && GUI_SUPPORT_DEVICES) +#define GUI_SaveContext GUI_SaveContext_M +#elif (GUI_WINSUPPORT && !GUI_SUPPORT_DEVICES) +#define GUI_SaveContext GUI_SaveContext_W +#else +#define GUI_SaveContext GUI_SaveContext_ +#endif + + /********************************************************************* + * + * General routines + * + ********************************************************************** + */ + int GUI_Init(void); + void GUI_SetDefault(void); + GUI_DRAWMODE GUI_SetDrawMode(GUI_DRAWMODE dm); + const char *GUI_GetVersionString(void); + void GUI_SaveContext(GUI_CONTEXT *pContext); + void GUI_RestoreContext(const GUI_CONTEXT *pContext); + + /********************************************************************* + * + * Rectangle helper functions + * + ********************************************************************** + */ + + int GUI_RectsIntersect(const GUI_RECT *pr0, const GUI_RECT *pr1); + void GUI_MoveRect(GUI_RECT *pRect, int x, int y); + void GUI_MergeRect(GUI_RECT *pDest, const GUI_RECT *pr0, const GUI_RECT *pr1); + int GUI__IntersectRects(GUI_RECT *pDest, const GUI_RECT *pr0, const GUI_RECT *pr1); + void GUI__IntersectRect(GUI_RECT *pDest, const GUI_RECT *pr0); + void GUI__ReduceRect(GUI_RECT *pDest, const GUI_RECT *pRect, int Dist); + + /********************************************************************* + * + * Misc helper functions + * + ********************************************************************** + */ + + int GUI__DivideRound(int a, int b); + I32 GUI__DivideRound32(I32 a, I32 b); + int GUI__SetText(GUI_HMEM *phText, const char *s); + + /********************************************************************* + * + * Get / Set Attributes + * + ********************************************************************** + */ + + GUI_COLOR GUI_GetBkColor(void); + GUI_COLOR GUI_GetColor(void); + int GUI_GetBkColorIndex(void); + int GUI_GetColorIndex(void); + U8 GUI_GetPenSize(void); + U8 GUI_GetPenShape(void); + U8 GUI_GetLineStyle(void); + U8 GUI_GetFillStyle(void); + + void GUI_SetBkColor(GUI_COLOR); + void GUI_SetColor(GUI_COLOR); + void GUI_SetBkColorIndex(int Index); + void GUI_SetColorIndex(int Index); + + U8 GUI_SetPenSize(U8 Size); + U8 GUI_SetPenShape(U8 Shape); + U8 GUI_SetLineStyle(U8 Style); + U8 GUI_SetFillStyle(U8 Style); + + /* Get/Set Character used as decimal point (usually '.' or ',') */ + char GUI_GetDecChar(void); + char GUI_SetDecChar(char c); + + /********************************************************************* + * + * Color / Index related functions + * + ********************************************************************** + */ + + int GUI_Color2Index(GUI_COLOR color); + GUI_COLOR GUI_Color2VisColor(GUI_COLOR color); + char GUI_ColorIsAvailable(GUI_COLOR color); + GUI_COLOR GUI_Index2Color(int Index); + void GUI_InitLUT(void); + void GUI_SetLUTEntry(U8 Pos, GUI_COLOR Color); + void GUI_SetLUTColor(U8 Pos, GUI_COLOR Color); + void GUI_SetLUTColorEx(U8 Pos, LCD_COLOR Color, unsigned int LayerIndex); + U32 GUI_CalcColorDist(GUI_COLOR Color0, GUI_COLOR Color1); + U32 GUI_CalcVisColorError(GUI_COLOR color); + + /********************************************************************* + * + * Logging (for debugging primarily) + * + ********************************************************************** + */ + void GUI_Log(const char *s); + void GUI_Log1(const char *s, int p0); + void GUI_Log2(const char *s, int p0, int p1); + void GUI_Log3(const char *s, int p0, int p1, int p2); + void GUI_Log4(const char *s, int p0, int p1, int p2, int p3); + void GUI_Warn(const char *s); + void GUI_Warn1(const char *s, int p0); + void GUI_Warn2(const char *s, int p0, int p1); + void GUI_Warn3(const char *s, int p0, int p1, int p2); + void GUI_Warn4(const char *s, int p0, int p1, int p2, int p3); + void GUI_ErrorOut(const char *s); + void GUI_ErrorOut1(const char *s, int p0); + void GUI_ErrorOut2(const char *s, int p0, int p1); + void GUI_ErrorOut3(const char *s, int p0, int p1, int p2); + void GUI_ErrorOut4(const char *s, int p0, int p1, int p2, int p3); + + /********************************************************************* + * + * 2d - GL + * + ********************************************************************** + */ + + int GUI_BMP_Draw(const void *pFileData, int x0, int y0); + int GUI_BMP_GetXSize(const void *pFileData); + int GUI_BMP_GetYSize(const void *pFileData); + void GUI_Clear(void); + void GUI_ClearRect(int x0, int y0, int x1, int y1); + void GUI_ClearRectEx(const GUI_RECT *pRect); + void GUI_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1); + void GUI_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR *pBM, int x0, int y0); + void GUI_DrawBitmapMag(const GUI_BITMAP GUI_UNI_PTR *pBM, int x0, int y0, int XMul, int YMul); + void GUI_DrawBitmapEx(const GUI_BITMAP GUI_UNI_PTR *pBitmap, int x0, int y0, int xCenter, int yCenter, int xMag, int yMag); + void GUI_DrawBitmapExp(int x0, int y0, int XSize, int YSize, int XMul, int YMul, int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR *pData, const GUI_LOGPALETTE GUI_UNI_PTR *pPal); + void GUI_DrawCircle(int x0, int y0, int r); + void GUI_DrawEllipse(int x0, int y0, int rx, int ry); + void GUI_DrawGraph(I16 *pay, int NumPoints, int x0, int y0); + void GUI_DrawHLine(int y0, int x0, int x1); + void GUI_DrawLine(int x0, int y0, int x1, int y1); + void GUI_DrawLineRel(int dx, int dy); + void GUI_DrawLineTo(int x, int y); + void GUI_DrawPie(int x0, int y0, int r, int a0, int a1, int Type); + void GUI_DrawPixel(int x, int y); + void GUI_DrawPoint(int x, int y); + void GUI_DrawPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0); + void GUI_DrawPolyLine(const GUI_POINT *pPoints, int NumPoints, int x0, int y0); + void GUI_DrawFocusRect(const GUI_RECT *pRect, int Dist); + void GUI_DrawRect(int x0, int y0, int x1, int y1); // 画矩形 + void GUI_DrawRectEx(const GUI_RECT *pRect); + void GUI_DrawVLine(int x0, int y0, int y1); + void GUI_FillCircle(int x0, int y0, int r); + void GUI_FillEllipse(int x0, int y0, int rx, int ry); + void GUI_FillPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0); + void GUI_FillRect(int x0, int y0, int x1, int y1); + void GUI_FillRectEx(const GUI_RECT *pRect); + void GUI_GetClientRect(GUI_RECT *pRect); + void GUI_InvertRect(int x0, int y0, int x1, int y1); + void GUI_MoveRel(int dx, int dy); + void GUI_MoveTo(int x, int y); + + /********************************************************************* + * + * JPEG support + * + ********************************************************************** + */ + typedef struct + { + int XSize; + int YSize; + } GUI_JPEG_INFO; + + int GUI_JPEG_Draw(const void *pFileData, int DataSize, int x0, int y0); + int GUI_JPEG_GetInfo(const void *pFileData, int DataSize, GUI_JPEG_INFO *pInfo); + + /********************************************************************* + * + * Cursor routines + * + ********************************************************************** + */ + + typedef struct + { + const GUI_UNI_PTR GUI_BITMAP *pBitmap; + int xHot, yHot; + } GUI_CURSOR; + +#if GUI_SUPPORT_CURSOR + void GUI_CURSOR_Activate(void); + void GUI_CURSOR_Deactivate(void); + void GUI_CURSOR_Hide(void); + void GUI_CURSOR_SetXor(const GUI_BITMAP *pBM, int x, int y); + void GUI_CURSOR_SetPosition(int x, int y); + const GUI_CURSOR GUI_UNI_PTR *GUI_CURSOR_Select(const GUI_CURSOR GUI_UNI_PTR *pCursor); + void GUI_CURSOR_Show(void); +#else +#define GUI_CURSOR_Show() +#define GUI_CURSOR_Clear() ; +#endif + + /********************************************************************* + * + * Cursors and their bitmaps + * + ********************************************************************** + */ + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowS, GUI_CursorArrowSI; + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowM, GUI_CursorArrowMI; + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowL, GUI_CursorArrowLI; + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossS, GUI_CursorCrossSI; + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossM, GUI_CursorCrossMI; + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossL, GUI_CursorCrossLI; + extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorHeaderM, GUI_CursorHeaderMI; + + extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowS, GUI_BitmapArrowSI; + extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowM, GUI_BitmapArrowMI; + extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowL, GUI_BitmapArrowLI; + extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossS, GUI_BitmapCrossSI; + extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossM, GUI_BitmapCrossMI; + extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossL, GUI_BitmapCrossLI; + + /********************************************************************* + * + * Text related routines + * + ********************************************************************** + */ + + void GUI_DispCEOL(void); + void GUI_DispChar(U16 c); + void GUI_DispChars(U16 c, int Cnt); + void GUI_DispCharAt(U16 c, I16P x, I16P y); + void GUI_DispString(const char GUI_UNI_PTR *s); + void GUI_DispStringAt(const char GUI_UNI_PTR *s, int x, int y); + void GUI_DispStringAtCEOL(const char GUI_UNI_PTR *s, int x, int y); + void GUI_DispStringHCenterAt(const char GUI_UNI_PTR *s, int x, int y); + void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxNumChars); + void GUI_DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int Flags); +#if GUI_SUPPORT_ROTATION + void GUI_DispStringInRectEx(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen, const GUI_ROTATION *pLCD_Api); +#endif + void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen); /* Not to be doc. */ + void GUI_DispStringLen(const char GUI_UNI_PTR *s, int Len); + void GUI_GetTextExtend(GUI_RECT *pRect, const char GUI_UNI_PTR *s, int Len); + int GUI_GetYAdjust(void); + int GUI_GetDispPosX(void); + int GUI_GetDispPosY(void); + const GUI_FONT GUI_UNI_PTR *GUI_GetFont(void); + int GUI_GetCharDistX(U16 c); + int GUI_GetStringDistX(const char GUI_UNI_PTR *s); + int GUI_GetFontDistY(void); + int GUI_GetFontSizeY(void); + void GUI_GetFontInfo(const GUI_FONT GUI_UNI_PTR *pFont, GUI_FONTINFO *pfi); + int GUI_GetYSizeOfFont(const GUI_FONT GUI_UNI_PTR *pFont); + int GUI_GetYDistOfFont(const GUI_FONT GUI_UNI_PTR *pFont); + int GUI_GetTextAlign(void); + int GUI_GetTextMode(void); + char GUI_IsInFont(const GUI_FONT GUI_UNI_PTR *pFont, U16 c); + int GUI_SetTextAlign(int Align); + int GUI_SetTextMode(int Mode); + char GUI_SetTextStyle(char Style); + int GUI_SetLBorder(int x); + void GUI_SetOrg(int x, int y); + const GUI_FONT GUI_UNI_PTR *GUI_SetFont(const GUI_FONT GUI_UNI_PTR *pNewFont); + char GUI_GotoXY(int x, int y); + char GUI_GotoX(int x); + char GUI_GotoY(int y); + void GUI_DispNextLine(void); + + /********************************************************************* + * + * Position independent fonts + * + ********************************************************************** + */ + void GUI_SIF_CreateFont(void *pFontData, GUI_FONT *pFont, const GUI_SIF_TYPE *pFontType); + void GUI_SIF_DeleteFont(GUI_FONT *pFont); + + /********************************************************************* + * + * Unicode support + * + ********************************************************************** + */ + + int GUI_UC_Encode(char *s, U16 Char); + int GUI_UC_GetCharSize(const char GUI_UNI_PTR *s); + U16 GUI_UC_GetCharCode(const char GUI_UNI_PTR *s); + void GUI_UC_SetEncodeNone(void); + void GUI_UC_SetEncodeUTF8(void); + + void GUI_UC_DispString(const U16 GUI_UNI_PTR *s); + void GUI_UC2DB(U16 Code, U8 *pOut); + U16 GUI_DB2UC(U8 Byte0, U8 Byte1); + + /* ********************************* + * * + * GUIVAL.C * + * * + ********************************* + */ + + void GUI_DispBin(U32 v, U8 Len); + void GUI_DispBinAt(U32 v, I16P x, I16P y, U8 Len); + void GUI_DispDec(I32 v, U8 Len); // 十进制显示 + void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len); + void GUI_DispDecMin(I32 v); + void GUI_DispDecShift(I32 v, U8 Len, U8 Shift); + void GUI_DispDecSpace(I32 v, U8 MaxDigits); + void GUI_DispHex(U32 v, U8 Len); + void GUI_DispHexAt(U32 v, I16P x, I16P y, U8 Len); + void GUI_DispSDec(I32 v, U8 Len); // 显示加减号 + void GUI_DispSDecShift(I32 v, U8 Len, U8 Shift); + + /* ********************************* + * * + * GUIVALF.C * + * * + ********************************* + + Routines to display floating point values. These routines use the routines + defined in the module GUIVAL.C as base routines. + + */ + + void GUI_DispFloat(float v, char Len); + void GUI_DispFloatFix(float v, char Len, char Fract); + void GUI_DispFloatMin(float v, char Fract); + void GUI_DispSFloatFix(float v, char Len, char Fract); + void GUI_DispSFloatMin(float v, char Fract); + + /********************************************************************* + * + * Dynamic memory management + * + ********************************************************************** + */ + +#if !defined(GUI_ALLOC_ALLOC) + /* diagnostics */ + GUI_ALLOC_DATATYPE GUI_ALLOC_GetUsed(void); + GUI_ALLOC_DATATYPE GUI_ALLOC_GetNumFreeBytes(void); +#endif + + GUI_HMEM GUI_ALLOC_AllocInit(const void *pInitData, GUI_ALLOC_DATATYPE Size); + GUI_HMEM GUI_ALLOC_AllocNoInit(GUI_ALLOC_DATATYPE size); + GUI_HMEM GUI_ALLOC_AllocZero(GUI_ALLOC_DATATYPE size); + void GUI_ALLOC_Free(GUI_HMEM hMem); + void GUI_ALLOC_FreePtr(GUI_HMEM *phMem); + GUI_ALLOC_DATATYPE GUI_ALLOC_GetSize(GUI_HMEM hMem); + GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void); + void *GUI_ALLOC_h2p(GUI_HMEM hMem); + void GUI_ALLOC_Init(void); + GUI_HMEM GUI_ALLOC_Realloc(GUI_HMEM hOld, int NewSize); + + /********************************************************************* + * + * Memory device: GUI_MEMDEV + * + ********************************************************************** + */ + +#define GUI_MEMDEV_HASTRANS 0 +#define GUI_MEMDEV_NOTRANS (1 << 0) + +#if GUI_SUPPORT_DEVICES + typedef GUI_HMEM GUI_MEMDEV_Handle; + typedef void GUI_CALLBACK_VOID_P(void *p); + + typedef struct + { + GUI_RECT rView, rPrev; + char FirstCall; + } GUI_AUTODEV; + + typedef struct + { + char DrawFixed; + char IsMeasurement; + } GUI_AUTODEV_INFO; + + int GUI_MEMDEV_CreateAuto(GUI_AUTODEV *pAutoDev); + void GUI_MEMDEV_DeleteAuto(GUI_AUTODEV *pAutoDev); + int GUI_MEMDEV_DrawAuto(GUI_AUTODEV *pAutoDev, GUI_AUTODEV_INFO *pAutoDevInfo, GUI_CALLBACK_VOID_P *pfDraw, void *pData); + + /* Create a memory device which is compatible to the selected LCD */ + GUI_MEMDEV_Handle GUI_MEMDEV_Create(int x0, int y0, int XSize, int YSize); + GUI_MEMDEV_Handle GUI_MEMDEV_CreateEx(int x0, int y0, int XSize, int YSize, int Flags); + GUI_MEMDEV_Handle GUI_MEMDEV_CreateFixed(int x0, int y0, int xsize, int ysize, int Flags, + const tLCDDEV_APIList *pMemDevAPI, + const LCD_API_COLOR_CONV *pColorConvAPI); + void GUI_MEMDEV_Clear(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_CopyFromLCDAA(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_CopyToLCD(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_CopyToLCDAt(GUI_MEMDEV_Handle hMem, int x, int y); + int GUI_MEMDEV_CompareWithLCD(GUI_MEMDEV_Handle hMem, int *px, int *py, int *pExp, int *pAct); + void GUI_MEMDEV_Delete(GUI_MEMDEV_Handle MemDev); + int GUI_MEMDEV_GetXSize(GUI_MEMDEV_Handle hMem); + int GUI_MEMDEV_GetYSize(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_ReduceYSize(GUI_MEMDEV_Handle hMem, int YSize); + GUI_MEMDEV_Handle GUI_MEMDEV_Select(GUI_MEMDEV_Handle hMem); /* Select (activate) a particular memory device. */ + void GUI_MEMDEV_SetOrg(GUI_MEMDEV_Handle hMem, int x0, int y0); + void GUI_MEMDEV_WriteAt(GUI_MEMDEV_Handle hMem, int x, int y); + void GUI_MEMDEV_Write(GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV_WriteAlphaAt(GUI_MEMDEV_Handle hMem, int Alpha, int x, int y); + void GUI_MEMDEV_WriteAlpha(GUI_MEMDEV_Handle hMem, int Alpha); + void GUI_MEMDEV_WriteExAt(GUI_MEMDEV_Handle hMem, int x, int y, int xMag, int yMag, int Alpha); + void GUI_MEMDEV_WriteEx(GUI_MEMDEV_Handle hMem, int xMag, int yMag, int Alpha); + int GUI_MEMDEV_Draw(GUI_RECT *pRect, GUI_CALLBACK_VOID_P *pfDraw, void *pData, int MemSize, int Flags); + void *GUI_MEMDEV_GetDataPtr(GUI_MEMDEV_Handle hMem); +#endif + + void GUI_SelectLCD(void); + unsigned int GUI_SelectLayer(unsigned int Index); + + /************************************************************** + * + * Measure device: GUI_MEASDEV + * + *************************************************************** + */ + + typedef GUI_HMEM GUI_MEASDEV_Handle; + + GUI_MEASDEV_Handle GUI_MEASDEV_Create(void); + void GUI_MEASDEV_Delete(GUI_MEASDEV_Handle hMemDev); + void GUI_MEASDEV_Select(GUI_MEASDEV_Handle hMem); + void GUI_MEASDEV_GetRect(GUI_MEASDEV_Handle hMem, GUI_RECT *pRect); + void GUI_MEASDEV_ClearRect(GUI_MEASDEV_Handle hMem); + + /************************************************************ + * + * Polygon helpers + * + ************************************************************* + */ + void GUI_RotatePolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, float Angle); + void GUI_MagnifyPolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, int Mag); + void GUI_EnlargePolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, int Len); + + /************************************************************ + * + * Streamed bitmap + * + ************************************************************* + */ + void GUI_DrawStreamedBitmap(const GUI_BITMAP_STREAM *pBitmapStream, int x, int y); + + /************************************************************ + * + * BMP-export + * + ************************************************************* + */ + typedef void GUI_CALLBACK_VOID_U8_P(U8 Data, void *p); + + void GUI_BMP_SerializeEx(GUI_CALLBACK_VOID_U8_P *pfSerialize, int x0, int y0, int xSize, int ySize, void *p); + void GUI_BMP_Serialize(GUI_CALLBACK_VOID_U8_P *pfSerialize, void *p); + + /********************************************************************* + * + * Time / execution related routines + * + ********************************************************************** + */ + void GUI_Delay(int Period); + int GUI_GetTime(void); + int GUI_Exec(void); /* Execute all jobs ... Return 0 if nothing was done. */ + int GUI_Exec1(void); /* Execute one job ... Return 0 if nothing was done. */ + + /********************************************************************* + * + * MessageBox + * + ********************************************************************** + + Note: These should be moved into a separate file. + */ + int GUI_MessageBox(const char *sMessage, const char *sCaption, int Flags); +#define GUI_MESSAGEBOX_CF_MOVEABLE (1 << 4) + +#define GUI_MB_OK 20 +#define GUI_MB_WARNING 21 + + /********************************************************************* + * + * GUI_TIMER module + * + ********************************************************************** + */ + + typedef struct + { + GUI_TIMER_TIME Time; + U32 Context; + } GUI_TIMER_MESSAGE; + + typedef GUI_HMEM GUI_TIMER_HANDLE; + typedef void GUI_TIMER_CALLBACK(/*const*/ GUI_TIMER_MESSAGE *pTM); + + GUI_TIMER_HANDLE GUI_TIMER_Create(GUI_TIMER_CALLBACK *cb, int Time, U32 Context, int Flags); + void GUI_TIMER_Delete(GUI_TIMER_HANDLE hObj); + + /* Methods changing properties */ + void GUI_TIMER_SetPeriod(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Period); + void GUI_TIMER_SetTime(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Period); + void GUI_TIMER_SetDelay(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Delay); + void GUI_TIMER_Restart(GUI_TIMER_HANDLE hObj); + int GUI_TIMER_Exec(void); + + void GUI_TIMER_Context(GUI_TIMER_HANDLE hObj, U32 Context); // houhh 20061020 + + /****************************************************************** + * + * Anti Aliasing + * + ******************************************************************* + */ + + void GUI_AA_DisableHiRes(void); + void GUI_AA_EnableHiRes(void); + int GUI_AA_GetFactor(void); + void GUI_AA_SetFactor(int Factor); + void GUI_AA_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1); + void GUI_AA_DrawLine(int x0, int y0, int x1, int y1); + void GUI_AA_DrawPolyOutline(const GUI_POINT *pSrc, int NumPoints, int Thickness, int x, int y); + void GUI_AA_FillCircle(int x0, int y0, int r); + void GUI_AA_FillPolygon(GUI_POINT *pPoints, int NumPoints, int x0, int y0); + + /****************************************************************** + * + * Keyboard + * + ******************************************************************* + */ + + /* Message layer */ + void GUI_StoreKeyMsg(int Key, int Pressed); + void GUI_SendKeyMsg(int Key, int Pressed); + int GUI_PollKeyMsg(void); + + /* Message hook */ + typedef int GUI_KEY_MSG_HOOK(int Key, int Pressed); + extern GUI_KEY_MSG_HOOK *GUI_pfKeyMsgHook; + GUI_KEY_MSG_HOOK *GUI_SetKeyMsgHook(GUI_KEY_MSG_HOOK *pHook); + + /* Application layer */ + int GUI_GetKey(void); + int GUI_WaitKey(void); + void GUI_StoreKey(int c); + void GUI_ClearKeyBuffer(void); + + /********************************************************************* + * + * Task syncronisation (depends on configuration) + */ + void GUI_WaitEvent(void); + + /********************************************************************* + * + * PID (Pointer input device ... mouse/touch) + */ + + void GUI_PID_StoreState(const GUI_PID_STATE *pState); + int GUI_PID_GetState(GUI_PID_STATE *pState); + + /********************************************************************* + * + * Mouse, generic + */ + int GUI_MOUSE_GetState(GUI_PID_STATE *pState); + void GUI_MOUSE_StoreState(const GUI_PID_STATE *pState); + + /********************************************************************* + * + * TOUCH screen, generic + */ + + int GUI_TOUCH_GetState(GUI_PID_STATE *pState); + void GUI_TOUCH_GetUnstable(int *px, int *py); /* for diagnostics only */ + void GUI_TOUCH_StoreState(int x, int y); + void GUI_TOUCH_StoreStateEx(const GUI_PID_STATE *pState); + void GUI_TOUCH_StoreUnstable(int x, int y); + + /********************************************************************* + * + * Mouse, PS2 driver + */ + void GUI_MOUSE_DRIVER_PS2_Init(void); /* optional */ + void GUI_MOUSE_DRIVER_PS2_OnRx(unsigned char Data); + + /********************************************************************* + * + * TOUCH screen, analog driver + */ + void GUI_TOUCH_Exec(void); + int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1); + void GUI_TOUCH_SetDefaultCalibration(void); + int GUI_TOUCH_GetxPhys(void); /* for diagnostics only */ + int GUI_TOUCH_GetyPhys(void); /* for diagnostics only */ + void GUI_TOUCH_GetCalData(int Coord, int *pMin, int *pMax); + + /********************************************************************* + * + * TOUCH + * + * imports + * + ********************************************************************** + + Please note: The following functions are required by the module. + They need to be part of your application software (or rather, part + of the hardware-layer of your software). + */ + + void GUI_TOUCH_X_ActivateX(void); + void GUI_TOUCH_X_ActivateY(void); + void GUI_TOUCH_X_Disable(void); + int GUI_TOUCH_X_MeasureX(void); + int GUI_TOUCH_X_MeasureY(void); + + /************************************************************** + * + * Constants for fonts and bitmaps + * + *************************************************************** + */ + + extern const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE4; + extern const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE8; + extern const GUI_BITMAP_METHODS GUI_BitmapMethods565; + extern const GUI_BITMAP_METHODS GUI_BitmapMethodsM565; + +#define GUI_COMPRESS_RLE4 0 +#define GUI_COMPRESS_RLE8 0 + +#define GUI_DRAW_RLE4 &GUI_BitmapMethodsRLE4 /* Method table ! */ +#define GUI_DRAW_RLE8 &GUI_BitmapMethodsRLE8 /* Method table ! */ +#define GUI_DRAW_BMP565 &GUI_BitmapMethods565 /* Method table ! */ +#define GUI_DRAW_BMPM565 &GUI_BitmapMethodsM565 /* Method table ! */ + + /************************************************************** + * + * Defines for constants + * + *************************************************************** + */ + +#define ________ 0x0 +#define _______X 0x1 +#define ______X_ 0x2 +#define ______XX 0x3 +#define _____X__ 0x4 +#define _____X_X 0x5 +#define _____XX_ 0x6 +#define _____XXX 0x7 +#define ____X___ 0x8 +#define ____X__X 0x9 +#define ____X_X_ 0xa +#define ____X_XX 0xb +#define ____XX__ 0xc +#define ____XX_X 0xd +#define ____XXX_ 0xe +#define ____XXXX 0xf +#define ___X____ 0x10 +#define ___X___X 0x11 +#define ___X__X_ 0x12 +#define ___X__XX 0x13 +#define ___X_X__ 0x14 +#define ___X_X_X 0x15 +#define ___X_XX_ 0x16 +#define ___X_XXX 0x17 +#define ___XX___ 0x18 +#define ___XX__X 0x19 +#define ___XX_X_ 0x1a +#define ___XX_XX 0x1b +#define ___XXX__ 0x1c +#define ___XXX_X 0x1d +#define ___XXXX_ 0x1e +#define ___XXXXX 0x1f +#define __X_____ 0x20 +#define __X____X 0x21 +#define __X___X_ 0x22 +#define __X___XX 0x23 +#define __X__X__ 0x24 +#define __X__X_X 0x25 +#define __X__XX_ 0x26 +#define __X__XXX 0x27 +#define __X_X___ 0x28 +#define __X_X__X 0x29 +#define __X_X_X_ 0x2a +#define __X_X_XX 0x2b +#define __X_XX__ 0x2c +#define __X_XX_X 0x2d +#define __X_XXX_ 0x2e +#define __X_XXXX 0x2f +#define __XX____ 0x30 +#define __XX___X 0x31 +#define __XX__X_ 0x32 +#define __XX__XX 0x33 +#define __XX_X__ 0x34 +#define __XX_X_X 0x35 +#define __XX_XX_ 0x36 +#define __XX_XXX 0x37 +#define __XXX___ 0x38 +#define __XXX__X 0x39 +#define __XXX_X_ 0x3a +#define __XXX_XX 0x3b +#define __XXXX__ 0x3c +#define __XXXX_X 0x3d +#define __XXXXX_ 0x3e +#define __XXXXXX 0x3f +#define _X______ 0x40 +#define _X_____X 0x41 +#define _X____X_ 0x42 +#define _X____XX 0x43 +#define _X___X__ 0x44 +#define _X___X_X 0x45 +#define _X___XX_ 0x46 +#define _X___XXX 0x47 +#define _X__X___ 0x48 +#define _X__X__X 0x49 +#define _X__X_X_ 0x4a +#define _X__X_XX 0x4b +#define _X__XX__ 0x4c +#define _X__XX_X 0x4d +#define _X__XXX_ 0x4e +#define _X__XXXX 0x4f +#define _X_X____ 0x50 +#define _X_X___X 0x51 +#define _X_X__X_ 0x52 +#define _X_X__XX 0x53 +#define _X_X_X__ 0x54 +#define _X_X_X_X 0x55 +#define _X_X_XX_ 0x56 +#define _X_X_XXX 0x57 +#define _X_XX___ 0x58 +#define _X_XX__X 0x59 +#define _X_XX_X_ 0x5a +#define _X_XX_XX 0x5b +#define _X_XXX__ 0x5c +#define _X_XXX_X 0x5d +#define _X_XXXX_ 0x5e +#define _X_XXXXX 0x5f +#define _XX_____ 0x60 +#define _XX____X 0x61 +#define _XX___X_ 0x62 +#define _XX___XX 0x63 +#define _XX__X__ 0x64 +#define _XX__X_X 0x65 +#define _XX__XX_ 0x66 +#define _XX__XXX 0x67 +#define _XX_X___ 0x68 +#define _XX_X__X 0x69 +#define _XX_X_X_ 0x6a +#define _XX_X_XX 0x6b +#define _XX_XX__ 0x6c +#define _XX_XX_X 0x6d +#define _XX_XXX_ 0x6e +#define _XX_XXXX 0x6f +#define _XXX____ 0x70 +#define _XXX___X 0x71 +#define _XXX__X_ 0x72 +#define _XXX__XX 0x73 +#define _XXX_X__ 0x74 +#define _XXX_X_X 0x75 +#define _XXX_XX_ 0x76 +#define _XXX_XXX 0x77 +#define _XXXX___ 0x78 +#define _XXXX__X 0x79 +#define _XXXX_X_ 0x7a +#define _XXXX_XX 0x7b +#define _XXXXX__ 0x7c +#define _XXXXX_X 0x7d +#define _XXXXXX_ 0x7e +#define _XXXXXXX 0x7f +#define X_______ 0x80 +#define X______X 0x81 +#define X_____X_ 0x82 +#define X_____XX 0x83 +#define X____X__ 0x84 +#define X____X_X 0x85 +#define X____XX_ 0x86 +#define X____XXX 0x87 +#define X___X___ 0x88 +#define X___X__X 0x89 +#define X___X_X_ 0x8a +#define X___X_XX 0x8b +#define X___XX__ 0x8c +#define X___XX_X 0x8d +#define X___XXX_ 0x8e +#define X___XXXX 0x8f +#define X__X____ 0x90 +#define X__X___X 0x91 +#define X__X__X_ 0x92 +#define X__X__XX 0x93 +#define X__X_X__ 0x94 +#define X__X_X_X 0x95 +#define X__X_XX_ 0x96 +#define X__X_XXX 0x97 +#define X__XX___ 0x98 +#define X__XX__X 0x99 +#define X__XX_X_ 0x9a +#define X__XX_XX 0x9b +#define X__XXX__ 0x9c +#define X__XXX_X 0x9d +#define X__XXXX_ 0x9e +#define X__XXXXX 0x9f +#define X_X_____ 0xa0 +#define X_X____X 0xa1 +#define X_X___X_ 0xa2 +#define X_X___XX 0xa3 +#define X_X__X__ 0xa4 +#define X_X__X_X 0xa5 +#define X_X__XX_ 0xa6 +#define X_X__XXX 0xa7 +#define X_X_X___ 0xa8 +#define X_X_X__X 0xa9 +#define X_X_X_X_ 0xaa +#define X_X_X_XX 0xab +#define X_X_XX__ 0xac +#define X_X_XX_X 0xad +#define X_X_XXX_ 0xae +#define X_X_XXXX 0xaf +#define X_XX____ 0xb0 +#define X_XX___X 0xb1 +#define X_XX__X_ 0xb2 +#define X_XX__XX 0xb3 +#define X_XX_X__ 0xb4 +#define X_XX_X_X 0xb5 +#define X_XX_XX_ 0xb6 +#define X_XX_XXX 0xb7 +#define X_XXX___ 0xb8 +#define X_XXX__X 0xb9 +#define X_XXX_X_ 0xba +#define X_XXX_XX 0xbb +#define X_XXXX__ 0xbc +#define X_XXXX_X 0xbd +#define X_XXXXX_ 0xbe +#define X_XXXXXX 0xbf +#define XX______ 0xc0 +#define XX_____X 0xc1 +#define XX____X_ 0xc2 +#define XX____XX 0xc3 +#define XX___X__ 0xc4 +#define XX___X_X 0xc5 +#define XX___XX_ 0xc6 +#define XX___XXX 0xc7 +#define XX__X___ 0xc8 +#define XX__X__X 0xc9 +#define XX__X_X_ 0xca +#define XX__X_XX 0xcb +#define XX__XX__ 0xcc +#define XX__XX_X 0xcd +#define XX__XXX_ 0xce +#define XX__XXXX 0xcf +#define XX_X____ 0xd0 +#define XX_X___X 0xd1 +#define XX_X__X_ 0xd2 +#define XX_X__XX 0xd3 +#define XX_X_X__ 0xd4 +#define XX_X_X_X 0xd5 +#define XX_X_XX_ 0xd6 +#define XX_X_XXX 0xd7 +#define XX_XX___ 0xd8 +#define XX_XX__X 0xd9 +#define XX_XX_X_ 0xda +#define XX_XX_XX 0xdb +#define XX_XXX__ 0xdc +#define XX_XXX_X 0xdd +#define XX_XXXX_ 0xde +#define XX_XXXXX 0xdf +#define XXX_____ 0xe0 +#define XXX____X 0xe1 +#define XXX___X_ 0xe2 +#define XXX___XX 0xe3 +#define XXX__X__ 0xe4 +#define XXX__X_X 0xe5 +#define XXX__XX_ 0xe6 +#define XXX__XXX 0xe7 +#define XXX_X___ 0xe8 +#define XXX_X__X 0xe9 +#define XXX_X_X_ 0xea +#define XXX_X_XX 0xeb +#define XXX_XX__ 0xec +#define XXX_XX_X 0xed +#define XXX_XXX_ 0xee +#define XXX_XXXX 0xef +#define XXXX____ 0xf0 +#define XXXX___X 0xf1 +#define XXXX__X_ 0xf2 +#define XXXX__XX 0xf3 +#define XXXX_X__ 0xf4 +#define XXXX_X_X 0xf5 +#define XXXX_XX_ 0xf6 +#define XXXX_XXX 0xf7 +#define XXXXX___ 0xf8 +#define XXXXX__X 0xf9 +#define XXXXX_X_ 0xfa +#define XXXXX_XX 0xfb +#define XXXXXX__ 0xfc +#define XXXXXX_X 0xfd +#define XXXXXXX_ 0xfe +#define XXXXXXXX 0xff + + /************************************************************** + * + * Compatibility with older versions + * + *************************************************************** + */ + +#define GUI_DispString_UC GUI_UC_DispString +#define TOUCH_X_ActivateX GUI_TOUCH_X_ActivateX +#define TOUCH_X_ActivateY GUI_TOUCH_X_ActivateY +#define TOUCH_X_Disable GUI_TOUCH_X_Disable +#define TOUCH_X_MeasureX GUI_TOUCH_X_MeasureX +#define TOUCH_X_MeasureY GUI_TOUCH_X_MeasureY +#define GUI_SelLayer GUI_SelectLayer +#if defined(__cplusplus) +} +#endif + +#endif /* ifdef GUI_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI2DLib.c b/User/system/lib/lcd/gui/Core/GUI2DLib.c new file mode 100644 index 0000000..bc67448 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI2DLib.c @@ -0,0 +1,768 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI2DLib.C +Purpose : Main part of the 2D graphics library +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* + * + * defines + * + ********************************************************************** + */ + +#define ABS(v) ((v > 0) ? v : -v) + +/********************************************************************* + * + * static code, helper functions + * + ********************************************************************** + */ +/********************************************************************* + * + * _SwapInt + */ +static void _SwapInt(int *pa, int *pb) +{ + int t; + t = *pa; + *pa = *pb; + *pb = t; +} + +/********************************************************************* + * + * Abs + */ +static int Abs(int v) +{ + return ABS(v); +} + +/********************************************************************* + * + * trigonometric functions + * + * NOTE: + * All trigonometric functions are for internal usage only and + * use the following conventions: + * + * Angles: 4096 <==> 360 + * + ********************************************************************** + */ + +#if GUI_45DEG != 512 +#error Wrong define for this library ! +#endif + +/********************************************************************* + * + * sin / cos (internal) + * + * Angle : 90/1024 + * Data : 1/1024 + */ +static const U16 aSin[] = { + 0, /* 1/16 *90 */ + 100, /* 1/16 *90 */ + 200, /* 2/16 *90 */ + 297, /* 3/16 *90 */ + 392, /* 4/16 *90 */ + 483, /* 5/16 *90 */ + 569, /* 6/16 *90 */ + 650, /* 7/16 *90 */ + 724, /* 8/16 *90 */ + 792, /* 9/16 *90 */ + 851, /* 10/16 *90 */ + 903, /* 11/16 *90 */ + 946, /* 12/16 *90 */ + 980, /* 13/16 *90 */ + 1004, /* 14/16 *90 */ + 1019, /* 15/16 *90 */ + 1024 /* 16/16 *90 */ +}; + +/********************************************************************* + * + * GUI_sin + */ +int GUI_sin(int angle) +{ + char IsNeg = 0; + int i; + U16 Faktor; + U32 t; + angle &= ((1 << 12) - 1); /* reduce to 0-360 degrees */ + if (angle > 2 * GUI_90DEG) + { + angle -= 2 * GUI_90DEG; + IsNeg = 1; + } + if (angle > GUI_90DEG) + { /* between 90-180 */ + angle = 2 * GUI_90DEG - angle; /* use sine symetry */ + } + /* Now angle is reduced to 0 <= <= 90 */ +#if 0 + angle >>=2; /* make sure we do not exceed 16 bits in calculations */ + i = angle>>4; + Faktor = (1<<4)-(angle&((1<<4)-1)); + r = aSin[i]*Faktor; + if (Faktor !=(1<<4)) { + r += aSin[i+1]*((1<<4)-Faktor); + } + r = (r+(1<<3)) >>4; /* divide,incl. rounding */ +#else + i = angle >> 6; + { + Faktor = (U16)((1 << 6) - (angle & ((1 << 6) - 1))); + t = aSin[i] * (U32)Faktor; + if (Faktor != (1 << 6)) + { + t += aSin[i + 1] * ((1 << 6) - Faktor); + } + } + t = (t + (1 << 5)) >> 6; /* divide,incl. rounding */ +#endif + return (IsNeg) ? 0 - t : t; +} + +/********************************************************************* + * + * GUI_cos + */ +int GUI_cos(int angle) +{ + return GUI_sin(angle + GUI_90DEG); +} + +/********************************************************************* + * + * atan() (internal) + * + * Angle : 360/4096 + */ +const I16 aTan[] = { + 0, /* atan(0/16) */ + 41, /* atan(1/16) */ + 81, /* atan(2/16) */ + 121, /* atan(3/16) */ + 160, /* atan(4/16) */ + 197, /* atan(5/16) */ + 234, /* atan(6/16) */ + 269, /* atan(7/16) */ + 302, /* atan(8/16) */ + 334, /* atan(9/16) */ + 364, /* atan(10/16) */ + 393, /* atan(11/16) */ + 419, /* atan(12/16) */ + 445, /* atan(13/16) */ + 469, /* atan(14/16) */ + 491, /* atan(15/16) */ + 512 /* atan(1) = 45 = 512/1024 */ +}; + +/********************************************************************* + * + * _atan0_45 + * + * Calculate arctan of q, where q is any where between 0 and 1024 + */ +static int _atan0_45(int q) +{ + int r; + int i, Faktor; + /* Now angle is reduced to 0 <= <= 90 ==> 0 <= <= 256*/ + q >>= 2; /* make sure we do not exceed 16 bits in calculations */ + i = q >> 4; + Faktor = (1 << 4) - (q & ((1 << 4) - 1)); + r = aTan[i] * Faktor; + if (Faktor != (1 << 4)) + { + r += aTan[i + 1] * ((1 << 4) - Faktor); + } + r = (r + (1 << 3)) / (1 << 4); /* divide incl. rounding */ + return r; +} + +/********************************************************************* + * + * _atan2 + */ +static int _atan2(I32 x, I32 y) +{ + U8 q = 0; + int angle; + /* first make sure we are in angle between 0 and 45 */ + if (x < 0) + { + q = 1; + x = -x; + } + if (y < 0) + { + q |= (1 << 1); + y = -y; + } + if (y > x) + { + int t = y; + y = x; + x = t; + q |= (1 << 2); + } + y <<= 10; + y += (x / 2); + y /= x; + angle = _atan0_45(y); + if (q & (1 << 2)) + { /* y/x reverse ? */ + angle = GUI_90DEG - angle; + } + if (q & 1) + { /* xreverse ? */ + angle = GUI_180DEG - angle; + } + if (q & (1 << 1)) + { /* y-reverse ? */ + angle = GUI_360DEG - angle; + } + return angle; +} + +/********************************************************************* + * + * _SetLineColor + */ +static int _SetLineColor(int i) +{ + switch (GUI_Context.LineStyle) + { + case GUI_LS_DASH: + i = (i + 6) % 16; + return (i < 12); + case GUI_LS_DOT: + i %= 4; + return (i < 2); + case GUI_LS_DASHDOT: + i %= 20; + if (i < 12) + return 1; + else if ((i >= 16) && (i < 18)) + return 1; + return 0; + case GUI_LS_DASHDOTDOT: + i %= 24; + if (i < 12) + return 1; + else if ((i >= 16) && (i < 18)) + return 1; + else if ((i >= 20) && (i < 22)) + return 1; + else + return 0; + } + return 0; +} + +/********************************************************************* + * + * _atan2 + */ +#if 0 +int _atan2(int xDiff, int yDiff) { + double atanf = atan2(xDiff, yDiff); + return (int)(atanf*(16384.0/6.2831852)); +} +#endif + +/********************************************************************* + * + * _CalcOrto + */ +static void _CalcOrto(int xDiff, int yDiff, I32 r, int *px, int *py) +{ + I32 x, y; +/* + int Angle = _atan2(xDiff, yDiff); +*/ +#if 0 + double Angle = atan2(xDiff, yDiff); + x = (int)(-r*cos(Angle)); + y = (int)(r*sin(Angle)); +#else + int Angle = _atan2(xDiff, yDiff); + Angle += GUI_90DEG; + x = (r * (I32)GUI_cos(Angle)); + y = (r * (I32)GUI_sin(Angle)); +#endif + x = (x < 0) ? -((-x + 512) >> 10) : ((x + 512) >> 10); + y = (y < 0) ? -((-y + 512) >> 10) : ((y + 512) >> 10); + *px = x; + *py = y; +} + +/********************************************************************* + * + * DrawLine, public + * + * Draw end points of the line. + * In most cases, this is a circle. + * + ********************************************************************** + */ +/********************************************************************* + * + * _DrawLineEnd + */ +static void _DrawLineEnd(int x0, int y0) +{ + switch (GUI_Context.PenShape) + { + case GUI_PS_ROUND: + GL_DrawPoint(x0, y0); + break; + case GUI_PS_FLAT: + break; + } +} + +/********************************************************************* + * + * DrawLine, public + * + ********************************************************************** + */ + +/** + * @brief ???? + * + * ???????????????????? + * + * @param x0 ????? + * @param y0 ????? + * @param x1 ????? + * @param y1 ????? + */ +void GL_DrawLine(int x0, int y0, int x1, int y1) +{ + if (GUI_Context.PenSize == 1) + { + GL_DrawLine1(x0, y0, x1, y1); + } + else + { + int xdiff, ydiff; + xdiff = x0 - x1; + ydiff = y0 - y1; + if (xdiff | ydiff) + { + GUI_POINT Poly[4]; + int xOff, yOff; + int xOffP, yOffP, xOffM, yOffM; + _CalcOrto(x0 - x1, y0 - y1, (I32)(GUI_Context.PenSize - 1), &xOff, &yOff); + /* Do rounding for offsets */ + if (xOff > 0) + { + xOffP = (xOff + 1) / 2; + xOffM = xOff / 2; + } + else + { + xOffP = xOff / 2; + xOffM = (xOff - 1) / 2; + } + if (yOff > 0) + { + yOffP = (yOff + 1) / 2; + yOffM = yOff / 2; + } + else + { + yOffP = yOff / 2; + yOffM = (yOff - 1) / 2; + } + Poly[0].x = x0 + xOffP; + Poly[0].y = y0 + yOffP; + Poly[1].x = x0 - xOffM; + Poly[1].y = y0 - yOffM; + Poly[2].x = x1 - xOffM; + Poly[2].y = y1 - yOffM; + Poly[3].x = x1 + xOffP; + Poly[3].y = y1 + yOffP; + GL_FillPolygon(&Poly[0], 4, 0, 0); + _DrawLineEnd(x0, y0); + _DrawLineEnd(x1, y1); + } + } +} + +/********************************************************************* + * + * GUI_DrawLine + */ +void GUI_DrawLine(int x0, int y0, int x1, int y1) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ADDORG(x0, y0); + WM_ADDORG(x1, y1); + WM_ITERATE_START(NULL); + { +#endif + GL_DrawLine(x0, y0, x1, y1); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GUI_UNLOCK(); +} + +/********************************************************************* + * + * GL_DrawPolygon + */ +void GL_DrawPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0) +{ + const GUI_POINT *pPoint = pPoints; + GL_MoveTo(pPoint->x + x0, pPoint->y + y0); + while (--NumPoints > 0) + { + pPoint++; + GL_DrawLineTo(pPoint->x + x0, pPoint->y + y0); + } + /* Now draw closing line unless it has already been closed */ + if ((pPoint->x != pPoints->x) || (pPoint->y != pPoints->y)) + { + GL_DrawLineTo(pPoints->x + x0, pPoints->y + y0); + } +} + +/********************************************************************* + * + * GUI_DrawPolygon + */ +void GUI_DrawPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ADDORG(x0, y0); + WM_ITERATE_START(NULL); + { +#endif + GL_DrawPolygon(pPoints, NumPoints, x0, y0); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GUI_UNLOCK(); +} + +/********************************************************************* + * + * Draw Line to group + * + ********************************************************************** + */ +/********************************************************************* + * + * GL_DrawLineRelNM + */ +static void GL_DrawLineRelNM(int dx, int dy) +{ + GL_DrawLine(GUI_Context.DrawPosX, GUI_Context.DrawPosY, + GUI_Context.DrawPosX + dx, GUI_Context.DrawPosY + dy); +} + +/********************************************************************* + * + * GUI_DrawLineRel + */ +void GUI_DrawLineRel(int dx, int dy) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ITERATE_START(NULL); + { +#endif + GL_DrawLineRelNM(dx, dy); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GUI_MoveRel(dx, dy); + GUI_UNLOCK(); +} + +/********************************************************************* + * + * GL_DrawLineTo + */ +void GL_DrawLineTo(int x, int y) +{ + GL_DrawLine(GUI_Context.DrawPosX, GUI_Context.DrawPosY, x, y); + GUI_Context.DrawPosX = x; + GUI_Context.DrawPosY = y; +} + +/********************************************************************* + * + * GL_DrawLineToNM + */ +static void GL_DrawLineToNM(int x, int y) +{ + GL_DrawLine(GUI_Context.DrawPosX, GUI_Context.DrawPosY, x, y); +} + +/********************************************************************* + * + * GUI_DrawLineTo + */ +void GUI_DrawLineTo(int x, int y) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ADDORG(x, y); + WM_ITERATE_START(NULL); + { +#endif + GL_DrawLineToNM(x, y); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GL_MoveTo(x, y); + GUI_UNLOCK(); +} + +/********************************************************************* + * + * GUI_MoveRel + */ +void GUI_MoveRel(int dx, int dy) +{ /*tbd: GL_LinePos. */ + GUI_LOCK(); + GUI_Context.DrawPosX += dx; + GUI_Context.DrawPosY += dy; + GUI_UNLOCK(); +} + +/********************************************************************* + * + * GL_MoveTo + */ +void GL_MoveTo(int x, int y) +{ + GUI_Context.DrawPosX = x; + GUI_Context.DrawPosY = y; +} + +/********************************************************************* + * + * GUI_MoveTo + */ +void GUI_MoveTo(int x, int y) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ADDORG(x, y); +#endif + GL_MoveTo(x, y); + GUI_UNLOCK(); +} + +/********************************************************************* + * + * Rectangle filling / inverting + * + ********************************************************************** + */ +/********************************************************************* + * + * _DrawRect + */ +static void _DrawRect(int x0, int y0, int x1, int y1) +{ + LCD_DrawHLine(x0, y0, x1); + LCD_DrawHLine(x0, y1, x1); + LCD_DrawVLine(x0, y0 + 1, y1 - 1); + LCD_DrawVLine(x1, y0 + 1, y1 - 1); +} + +/********************************************************************* + * + * GUI_DrawRect + */ +void GUI_DrawRect(int x0, int y0, int x1, int y1) +{ +#if (GUI_WINSUPPORT) + int Off; + GUI_RECT r; +#endif + GUI_LOCK(); +#if (GUI_WINSUPPORT) + Off = GUI_Context.PenSize - 1; + WM_ADDORG(x0, y0); + WM_ADDORG(x1, y1); + r.x0 = x0 - Off; + r.x1 = x1 + Off; + r.y0 = y0 - Off; + r.y1 = y1 + Off; + WM_ITERATE_START(&r); + { +#endif + _DrawRect(x0, y0, x1, y1); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GUI_UNLOCK(); +} + +/********************************************************************* + * + * DrawLine, internal, 1 pixel + * + ********************************************************************** + */ +/********************************************************************* + * + * GL_DrawLine1 + */ +void GL_DrawLine1(int x0, int y0, int x1, int y1) +{ + int xdiff = x1 - x0; + int ydiff = y1 - y0; + int xdiffby2; + int i; + char Swapped = 0; + /* check if no line */ + if (!(xdiff | ydiff)) + { + GL_DrawPoint(x0, y0); + return; + } +#if 0 +/* check if horizontal line */ + if (!xdiff) { + GL_DrawVLine(x0,y0,y1); + return; + } +/* check if vertical line */ + if (!ydiff) { + GL_DrawHLine(y0,x0,x1); + return; + } +#endif + /* check if we swap x and y for calculation */ + if (Abs(xdiff) < Abs(ydiff)) + { + _SwapInt(&xdiff, &ydiff); + _SwapInt(&x0, &y0); + _SwapInt(&x1, &y1); + Swapped = 1; + } + /* make sure line direction is positive */ + if (xdiff != Abs(xdiff)) + { + xdiff = -xdiff; + ydiff = -ydiff; + _SwapInt(&x0, &x1); + _SwapInt(&y0, &y1); + } + xdiffby2 = xdiff / 2; + if (ydiff < 0) + xdiffby2 = -xdiffby2; + /* Draw pixel by pixel solid*/ + if (GUI_Context.LineStyle == GUI_LS_SOLID) + { + for (i = 0; i <= xdiff; i++) + { + I32 l = ((I32)ydiff) * i + xdiffby2; + int y = (ABS(l) < 32767) ? (y0 + ((int)l) / xdiff) : (y0 + l / xdiff); + if (!Swapped) + LCD_HL_DrawPixel(x0 + i, y); + else + LCD_HL_DrawPixel(y, x0 + i); + } + /* Draw pixel by pixel with fill style */ + } + else + { + for (i = 0; i <= xdiff; i++) + { + long l = ((long)ydiff) * i + xdiffby2; + int y = (ABS(l) < 32767) ? (y0 + ((int)l) / xdiff) : (y0 + l / xdiff); + if (!_SetLineColor(i)) + { + if (!Swapped) + LCD_HL_DrawPixel(x0 + i, y); + else + LCD_HL_DrawPixel(y, x0 + i); + } + } + } +} + +/********************************************************************* + * + * Draw point + * + ********************************************************************** + */ +/********************************************************************* + * + * GL_DrawPoint + */ +void GL_DrawPoint(int x, int y) +{ + if (GUI_Context.PenSize == 1) + { + LCD_HL_DrawPixel(x, y); + } + else + { + GL_FillCircle(x, y, (GUI_Context.PenSize - 1) / 2); + } +} + +/********************************************************************* + * + * GUI_DrawPoint + */ +void GUI_DrawPoint(int x, int y) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ADDORG(x, y); + WM_ITERATE_START(NULL); + { +#endif + GL_DrawPoint(x, y); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIAlloc.c b/User/system/lib/lcd/gui/Core/GUIAlloc.c new file mode 100644 index 0000000..b28b498 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIAlloc.c @@ -0,0 +1,548 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIAlloc.C +Purpose : Dynamic memory management +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include /* for memcpy, memset */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Internal memory management +* +********************************************************************** +*/ + +#ifndef GUI_ALLOC_ALLOC + +#if GUI_ALLOC_SIZE==0 + #error GUI_ALLOC_SIZE needs to be > 0 when using this module +#endif + +/********************************************************************* +* +* Defines, config defaults +* +********************************************************************** +*/ + +/* Permit automatic defragmentation when necessary */ +#ifndef GUI_ALLOC_AUTDEFRAG + #define GUI_ALLOC_AUTDEFRAG 1 +#endif + +#ifndef GUI_BLOCK_ALIGN /* 2 means 4 bytes, 1 means 2 bytes */ + #define GUI_BLOCK_ALIGN 2 /* 1 can be used on 16-bit CPUs and CPUs */ +#endif /* which do not require aligned 32-bit */ + /* values (such as x86) */ + +#ifndef GUI_MAXBLOCKS + #define GUI_MAXBLOCKS (2 + GUI_ALLOC_SIZE / 32) +#endif + +#ifndef GUI_ALLOC_LOCATION + #define GUI_ALLOC_LOCATION +#endif + +#ifndef GUI_MEM_ALLOC /* Allows us in some systems to place the GUI memory */ + #define GUI_MEM_ALLOC /* in a different memory space ... eg "__far" */ +#endif + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define Min(v0,v1) ((v0>v1) ? v1 : v0) +#define Max(v0,v1) ((v0>v1) ? v0 : v1) +#define ASSIGN_IF_LESS(v0,v1) if (v1= 256 + #define HANDLE U16 +#else + #define HANDLE U8 +#endif + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef union { + int aintHeap[GUI_ALLOC_SIZE / 4]; /* required for proper alignement */ + U8 abHeap[GUI_ALLOC_SIZE]; +} GUI_HEAP; + +typedef struct { + GUI_ALLOC_DATATYPE Off; /* Offset of memory area */ + GUI_ALLOC_DATATYPE Size; /* usable size of allocated block */ + HANDLE Next; /* next handle in linked list */ + HANDLE Prev; +} tBlock; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +GUI_MEM_ALLOC GUI_HEAP GUI_Heap GUI_ALLOC_LOCATION; /* Public for debugging only */ + +static tBlock aBlock[GUI_MAXBLOCKS]; + +struct { + int NumUsedBlocks, NumFreeBlocks, NumFreeBlocksMin; /* For statistical purposes only */ + GUI_ALLOC_DATATYPE NumUsedBytes, NumFreeBytes, NumFreeBytesMin; +} GUI_ALLOC; + +static char IsInitialized =0; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Size2LegalSize +* +* Return value: +* Legal allocation size +*/ +static GUI_ALLOC_DATATYPE _Size2LegalSize(GUI_ALLOC_DATATYPE size) { + return (size + ((1 << GUI_BLOCK_ALIGN) - 1)) & ~((1 << GUI_BLOCK_ALIGN) - 1); +} + +/********************************************************************* +* +* _GetSize +*/ +static GUI_ALLOC_DATATYPE _GetSize(GUI_HMEM hMem) { + return aBlock[hMem].Size; +} + +/********************************************************************* +* +* _Free +*/ +static void _Free(GUI_HMEM hMem) { + GUI_ALLOC_DATATYPE Size; + GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem); + /* Do some error checking ... */ + #if GUI_DEBUG_LEVEL>0 + /* Block not allocated ? */ + if (aBlock[hMem].Size == 0) { + GUI_DEBUG_ERROROUT("GUI_ALLOC_Free(): Invalid hMem"); + return; + } + #endif + Size = aBlock[hMem].Size; + #ifdef WIN32 + GUI_MEMSET(&GUI_Heap.abHeap[aBlock[hMem].Off], 0xcc, Size); + #endif + GUI_ALLOC.NumFreeBytes += Size; + GUI_ALLOC.NumUsedBytes -= Size; + aBlock[hMem].Size = 0; + { + int Next = aBlock[hMem].Next; + int Prev = aBlock[hMem].Prev; + aBlock[Prev].Next = Next; + if (Next) { + aBlock[Next].Prev = Prev; + } + } + GUI_ALLOC.NumFreeBlocks++; + GUI_ALLOC.NumUsedBlocks--; +} + +/********************************************************************* +* +* _FindFreeHandle +* +* Return value: +* Free handle +*/ +static GUI_HMEM _FindFreeHandle(void) { + int i; + for (i=1; i< GUI_MAXBLOCKS; i++) { + if (aBlock[i].Size ==0) + return i; + } + GUI_DEBUG_ERROROUT1("Insufficient memory handles configured (GUI_MAXBLOCKS == %d (See GUIConf.h))", GUI_MAXBLOCKS); + return GUI_HMEM_NULL; +} + +/********************************************************************* +* +* _FindHole +* +* Return value: +* Offset to the memory hole (if available) +* -1 if not available +*/ +static GUI_HMEM _FindHole(GUI_ALLOC_DATATYPE Size) { + int i, iNext; + for (i=0; (iNext = aBlock[i].Next) != 0; i = iNext) { + int NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size); + if (NumFreeBytes>=Size) { + return i; + } + } + /* Check last block */ + if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size) { + return i; + } + return -1; +} + +/********************************************************************* +* +* _CreateHole +* +* Return value: +* Offset to the memory hole (if available) +* -1 if not available +*/ +static GUI_HMEM _CreateHole(GUI_ALLOC_DATATYPE Size) { + int i, iNext; + int r = -1; + for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) { + GUI_ALLOC_DATATYPE NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size); + if (NumFreeBytes < Size) { + GUI_ALLOC_DATATYPE NumBytesBeforeBlock = aBlock[iNext].Off - (aBlock[i].Off+aBlock[i].Size); + if (NumBytesBeforeBlock) { + U8* pData = &GUI_Heap.abHeap[aBlock[iNext].Off]; + memmove(pData-NumBytesBeforeBlock, pData, aBlock[iNext].Size); + aBlock[iNext].Off -=NumBytesBeforeBlock; + } + } + } + /* Check last block */ + if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size) { + r = i; + } + return r; +} + +/********************************************************************* +* +* _CheckInit +*/ +static void _CheckInit(void) { + if (!IsInitialized) { + GUI_ALLOC_Init(); + } +} + +/********************************************************************* +* +* _Alloc +*/ +static GUI_HMEM _Alloc(GUI_ALLOC_DATATYPE size) { + GUI_HMEM hMemNew, hMemIns; + _CheckInit(); + size = _Size2LegalSize(size); + /* Check if memory is available at all ...*/ + if (size > GUI_ALLOC.NumFreeBytes) { + GUI_DEBUG_WARN1("GUI_ALLOC_Alloc: Insufficient memory configured (Trying to alloc % bytes)", size); + return 0; + } + /* Locate free handle */ + if ((hMemNew = _FindFreeHandle()) == 0) + return 0; + /* Locate or Create hole of sufficient size */ + hMemIns = _FindHole(size); + #if GUI_ALLOC_AUTDEFRAG + if (hMemIns == -1) { + hMemIns = _CreateHole(size); + } + #endif + /* Occupy hole */ + if (hMemIns==-1) { + GUI_DEBUG_ERROROUT1("GUI_ALLOC_Alloc: Could not allocate %d bytes",size); + return 0; + } + { + GUI_ALLOC_DATATYPE Off = aBlock[hMemIns].Off + aBlock[hMemIns].Size; + int Next = aBlock[hMemIns].Next; + aBlock[hMemNew].Size = size; + aBlock[hMemNew].Off = Off; + if ((aBlock[hMemNew].Next = Next) >0) { + aBlock[Next].Prev = hMemNew; + } + aBlock[hMemNew].Prev = hMemIns; + aBlock[hMemIns].Next = hMemNew; + } + /* Keep track of number of blocks and av. memory */ + GUI_ALLOC.NumUsedBlocks++; + GUI_ALLOC.NumFreeBlocks--; + if (GUI_ALLOC.NumFreeBlocksMin > GUI_ALLOC.NumFreeBlocks) { + GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks; + } + GUI_ALLOC.NumUsedBytes += size; + GUI_ALLOC.NumFreeBytes -= size; + if (GUI_ALLOC.NumFreeBytesMin > GUI_ALLOC.NumFreeBytes) { + GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes; + } + return hMemNew; +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ALLOC_Init +*/ +void GUI_ALLOC_Init(void) { + GUI_DEBUG_LOG("\nGUI_ALLOC_Init..."); + GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks = GUI_MAXBLOCKS-1; + GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes = GUI_ALLOC_SIZE; + GUI_ALLOC.NumUsedBlocks = 0; + GUI_ALLOC.NumUsedBytes = 0; + aBlock[0].Size = (1< 0 + if (!hMem) { + GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)"); + return 0; + } + if (aBlock[hMem].Size == 0) { + GUI_DEBUG_ERROROUT("Dereferencing free block"); + } + + #endif + return HMEM2PTR(hMem); +} + +/********************************************************************* +* +* GUI_ALLOC_GetNumFreeBytes +*/ +GUI_ALLOC_DATATYPE GUI_ALLOC_GetNumFreeBytes(void) { + _CheckInit(); + return GUI_ALLOC.NumFreeBytes; +} + +/********************************************************************* +* +* GUI_ALLOC_GetMaxSize +* +* Purpose: +* Returns the biggest available blocksize (without relocation). +*/ +GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void) { + GUI_ALLOC_DATATYPE r = 0; + GUI_ALLOC_DATATYPE NumFreeBytes; + int i, iNext; + + GUI_LOCK(); + _CheckInit(); + for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) { + NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size); + if (NumFreeBytes > r) { + r = NumFreeBytes; + } + } + /* Check last block */ + NumFreeBytes = (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size)); + if (NumFreeBytes > r) { + r = NumFreeBytes; + } + GUI_UNLOCK(); + return r; +} + +#else + +/********************************************************************* +* +* External memory management functions +* +* The functions below will generate code only if the GUI memory +* management is not used (GUI_ALLOC_ALLOC defined). +* +* Note: +* The memory block allocated is bigger than the requested one, as we +* store some add. information (size of the memory block) there. +* +********************************************************************** +*/ + +typedef struct { + union { + GUI_ALLOC_DATATYPE Size; + int Dummy; /* Needed to guarantee alignment on 32 / 64 bit CPUs */ + } Info; /* Unnamed would be best, but is not supported by all compilers */ +} INFO; + +/********************************************************************* +* +* _GetSize +*/ +static GUI_ALLOC_DATATYPE _GetSize(GUI_HMEM hMem) { + INFO * pInfo; + pInfo = (INFO *)GUI_ALLOC_H2P(hMem); + return pInfo->Info.Size; +} + +/********************************************************************* +* +* _Free +*/ +static void _Free(GUI_HMEM hMem) { + GUI_ALLOC_FREE(hMem); +} + +/********************************************************************* +* +* GUI_ALLOC_AllocNoInit +*/ +GUI_HMEM GUI_ALLOC_AllocNoInit(GUI_ALLOC_DATATYPE Size) { + GUI_HMEM hMem; + if (Size == 0) { + return (GUI_HMEM)0; + } + hMem= GUI_ALLOC_ALLOC(Size + sizeof(INFO)); + /* Init info structure */ + if (hMem) { + INFO * pInfo; + pInfo = (INFO *)GUI_ALLOC_H2P(hMem); + pInfo->Info.Size = Size; + } + return hMem; +} + +/********************************************************************* +* +* GUI_ALLOC_h2p +*/ +void* GUI_ALLOC_h2p(GUI_HMEM hMem) { + U8* p = (U8*)GUI_ALLOC_H2P(hMem); /* Pointer to memory block from memory manager */ + p += sizeof(INFO); /* Convert to pointer to usable area */ + return p; +} + +/********************************************************************* +* +* GUI_ALLOC_GetMaxSize +*/ +GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void) { + return GUI_ALLOC_GETMAXSIZE(); +} + +/********************************************************************* +* +* GUI_ALLOC_Init +*/ +void GUI_ALLOC_Init(void) { + #ifdef GUI_ALLOC_INIT + GUI_ALLOC_INIT(); + #endif +} + +#endif + +/********************************************************************* +* +* Public code, common memory management functions +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ALLOC_GetSize +*/ +GUI_ALLOC_DATATYPE GUI_ALLOC_GetSize(GUI_HMEM hMem) { + /* Do the error checking first */ + #if GUI_DEBUG_LEVEL>0 + if (!hMem) { + GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)"); + return 0; + } + #endif + return _GetSize(hMem); +} + +/********************************************************************* +* +* GUI_ALLOC_Free +*/ +void GUI_ALLOC_Free(GUI_HMEM hMem) { + if (hMem == GUI_HMEM_NULL) { /* Note: This is not an error, it is permitted */ + return; + } + GUI_LOCK(); + GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem); + _Free(hMem); + GUI_UNLOCK(); +} + + +/********************************************************************* +* +* GUI_ALLOC_FreePtr +*/ +void GUI_ALLOC_FreePtr(GUI_HMEM *ph) { + GUI_LOCK(); + GUI_ALLOC_Free(*ph); + *ph =0; + GUI_UNLOCK(); +} + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIArc.c b/User/system/lib/lcd/gui/Core/GUIArc.c new file mode 100644 index 0000000..4b5fc82 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIArc.c @@ -0,0 +1,262 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIARCFloat.C +Purpose : Draw Arc routines based on floating point +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +2.00.00 000325 RS First release of the new algorithm +---------------------------------------------------------------------- +Known problems or limitations with current version +---------------------------------------------------------------------- +None. +---------------------------------------------------------------------- +Open issues +---------------------------------------------------------------------- +None +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "arm_math.h" +#include "GUI_Protected.h" + +/********************************************************************* + * + * Static code + * + ********************************************************************** + */ +/********************************************************************* + * + * _CalcX + */ +static void _CalcX(int *px, int y, U32 r2) +{ + int x = *px; + U32 y2 = (U32)y * (U32)y; + U32 r2y2 = r2 - y2; + U32 x2; + if (y2 >= r2) + { + *px = 0; + return; + } + /* x2 = r2-y2 */ + do + { + x++; + x2 = (U32)x * (U32)x; + } while (x2 < r2y2); + *px = x - 1; +} + +/********************************************************************* + * + * _CalcInterSectLin + */ +static float _CalcInterSectLin(float y, float y0, float y1, float x0, float x1) +{ + if (y1 == y0) + { + return y0; + } + else + { + float Slope = (x1 - x0) / (y1 - y0); + return (y - y0) * Slope + x0; + } +} + +/********************************************************************* + * + * _DrawArc + */ +static void _DrawArc(int x0, int y0, int rx, int ry, int Angle0, int Angle1, int xMul, int yMul) +{ + float afx[4]; + float afy[4]; + float ri = rx - (GUI_Context.PenSize + 1.5) / 2; + float ro = rx + (GUI_Context.PenSize + 1.5) / 2; + float fAngle0 = Angle0 * 3.1415926 / 180; + float fAngle1 = Angle1 * 3.1415926 / 180; + float sin0 = arm_sin_f32(fAngle0); + float sin1 = arm_sin_f32(fAngle1); + float cos0 = arm_cos_f32(fAngle0); + float cos1 = arm_cos_f32(fAngle1); + U32 ri2 = ri * ri; + U32 ro2 = ro * ro; + int y, yMax, yMin; + afy[0] = ri * sin0; + afy[1] = ro * sin0; + afy[2] = ri * sin1; + afy[3] = ro * sin1; + afx[0] = ri * cos0; + afx[1] = ro * cos0; + afx[2] = ri * cos1; + afx[3] = ro * cos1; + yMin = ceil(afy[0]); + yMax = floor(afy[3]); + /* Use Clipping rect to reduce calculation (if possible) */ + if (GUI_Context.pClipRect_HL) + { + if (yMul == 1) + { + if (yMax > (GUI_Context.pClipRect_HL->y1 - y0)) + yMax = (GUI_Context.pClipRect_HL->y1 - y0); + if (yMin < (GUI_Context.pClipRect_HL->y0 - y0)) + yMin = (GUI_Context.pClipRect_HL->y0 - y0); + } + if (yMul == -1) + { + if (yMin > (GUI_Context.pClipRect_HL->y1 - y0)) + yMin = (GUI_Context.pClipRect_HL->y1 - y0); + if (yMax < (GUI_Context.pClipRect_HL->y0 - y0)) + yMax = (GUI_Context.pClipRect_HL->y0 - y0); + } + } + /* Start drawing lines ... */ + { + int xMinDisp, xMaxDisp, xMin = 0, xMax = 0; + for (y = yMax; y >= yMin; y--) + { + _CalcX(&xMin, y, ri2); + _CalcX(&xMax, y, ro2); + if ((float)y < afy[1]) + { + xMaxDisp = _CalcInterSectLin(y, afy[0], afy[1], afx[0], afx[1]); + } + else + { + xMaxDisp = xMax; + } + if ((float)y > afy[2]) + { + xMinDisp = _CalcInterSectLin(y, afy[2], afy[3], afx[2], afx[3]); + } + else + { + xMinDisp = xMin; + } + if (xMul > 0) + LCD_HL_DrawHLine(xMinDisp + x0, yMul * y + y0, xMaxDisp + x0); + else + LCD_HL_DrawHLine(-xMaxDisp + x0, yMul * y + y0, -xMinDisp + x0); + } + } +#if 0 /* Test code */ +{ + int i; + GUI_SetColor( GUI_WHITE ); + for (i=0; i<4; i++) + LCD_HL_DrawPixel(afx[i]+x0, afy[i]+y0); +} +#endif + GUI_USE_PARA(ry); +} + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * GL_DrawArc + */ +void GL_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1) +{ + int aEnd; + a0 += 360; + a1 += 360; + while (a0 >= 360) + { + a0 -= 360; + a1 -= 360; + } +/* Do first quadrant 0-90 degree */ +DoFirst: + if (a1 <= 0) + return; + if (a0 < 90) + { + if (a0 < 0) + a0 = 0; + aEnd = (a1 < 90) ? a1 : 90; + _DrawArc(x0, y0, rx, ry, a0, aEnd, 1, -1); + } + a1 -= 90; + a0 -= 90; + /* Do second quadrant 90-180 degree */ + if (a1 <= 0) + return; + if (a0 < 90) + { + if (a0 < 0) + a0 = 0; + aEnd = (a1 < 90) ? a1 : 90; + _DrawArc(x0, y0, rx, ry, 90 - aEnd, 90 - a0, -1, -1); + } + a1 -= 90; + a0 -= 90; + /* Do third quadrant 180-270 degree */ + if (a1 <= 0) + return; + if (a0 < 90) + { + if (a0 < 0) + a0 = 0; + aEnd = (a1 < 90) ? a1 : 90; + _DrawArc(x0, y0, rx, ry, a0, aEnd, -1, 1); + } + a1 -= 90; + a0 -= 90; + /* Do last quadrant 270-360 degree */ + if (a1 <= 0) + return; + if (a0 < 90) + { + if (a0 < 0) + a0 = 0; + aEnd = (a1 < 90) ? a1 : 90; + _DrawArc(x0, y0, rx, ry, 90 - aEnd, 90 - a0, 1, 1); + } + a1 -= 90; + a0 -= 90; + goto DoFirst; +} + +/********************************************************************* + * + * GUI_DrawArc + */ +void GUI_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1) +{ + GUI_LOCK(); +#if (GUI_WINSUPPORT) + WM_ADDORG(x0, y0); + WM_ITERATE_START(NULL) + { +#endif + GL_DrawArc(x0, y0, rx, ry, a0, a1); +#if (GUI_WINSUPPORT) + } + WM_ITERATE_END(); +#endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIChar.c b/User/system/lib/lcd/gui/Core/GUIChar.c new file mode 100644 index 0000000..f7328e6 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIChar.c @@ -0,0 +1,113 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIChar.C +Purpose : Implementation of character and string services +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispNextLine +*/ +void GUI_DispNextLine(void) { + GUI_LOCK(); + GUI_Context.DispPosY += GUI_GetFontDistY(); + GUI_Context.DispPosX = GUI_Context.LBorder; + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GL_DispChar +*/ +void GL_DispChar(U16 c) { + /* check for control characters */ + if (c == '\n') { + GUI_DispNextLine(); + } else { + if (c != '\r') { + GUI_LOCK(); + GUI_Context.pAFont->pfDispChar(c); + if (GUI_pfDispCharStyle) { + GUI_pfDispCharStyle(c); + } + GUI_UNLOCK(); + } + } +} + +/********************************************************************* +* +* GUI_GetYAdjust +* +* Returns adjustment in vertical (Y) direction +* +* Note: The return value needs to be subtracted from +* the y-position of the character. +*/ +int GUI_GetYAdjust(void) { + int r = 0; + GUI_LOCK(); + switch (GUI_Context.TextAlign & GUI_TA_VERTICAL) { + case GUI_TA_BOTTOM: + r = GUI_Context.pAFont->YSize - 1; + break; + case GUI_TA_VCENTER: + r = GUI_Context.pAFont->YSize / 2; + break; + case GUI_TA_BASELINE: + r = GUI_Context.pAFont->YSize / 2; + } + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetFontDistY +*/ +int GUI_GetFontDistY(void) { + int r; + GUI_LOCK(); +// r = GUI_Context.pAFont->YDist; + r = GUI_Context.pAFont->YDist * GUI_Context.pAFont->YMag; + + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetCharDistX +*/ +int GUI_GetCharDistX(U16 c) { + int r; + GUI_LOCK(); + r = GUI_Context.pAFont->pfGetCharDistX(c); + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUICharLine.c b/User/system/lib/lcd/gui/Core/GUICharLine.c new file mode 100644 index 0000000..7666fda --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUICharLine.c @@ -0,0 +1,145 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICharLine.C +Purpose : Implementation of character and string services +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DispLine +*/ +static void _DispLine(const char GUI_UNI_PTR *s, int MaxNumChars, const GUI_RECT *pRect) { + /* Check if we have anything to do at all ... */ + if (GUI_Context.pClipRect_HL) { + if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0) + return; + } + #if GUI_COMPILER_SUPPORTS_FP + if (GUI_Context.pAFont->pafEncode) { + GUI_Context.pAFont->pafEncode->pfDispLine(s, MaxNumChars); + } else { + #else + { + #endif + U16 Char; + while (--MaxNumChars >= 0) { + Char = GUI_UC__GetCharCodeInc(&s); + GUI_Context.pAFont->pfDispChar(Char); + if (GUI_pfDispCharStyle) { + GUI_pfDispCharStyle(Char); + } + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__GetLineNumChars +*/ +int GUI__GetLineNumChars(const char GUI_UNI_PTR *s, int MaxNumChars) { + int NumChars = 0; + if (s) { + #if GUI_COMPILER_SUPPORTS_FP + if (GUI_Context.pAFont->pafEncode) { + return GUI_Context.pAFont->pafEncode->pfGetLineLen(s, MaxNumChars); + } + #endif + for (; NumChars < MaxNumChars; NumChars++) { + U16 Data = GUI_UC__GetCharCodeInc(&s); + if ((Data == 0) || (Data == '\n')) { + break; + } + } + } + return NumChars; +} + +/********************************************************************* +* +* GUI_GetLineDistX +* +* This routine is used to calculate the length of a line in pixels. +*/ +int GUI__GetLineDistX(const char GUI_UNI_PTR *s, int MaxNumChars) { + int Dist = 0; + if (s) { + U16 Char; + #if GUI_COMPILER_SUPPORTS_FP + if (GUI_Context.pAFont->pafEncode) { + return GUI_Context.pAFont->pafEncode->pfGetLineDistX(s, MaxNumChars); + } + #endif + while (--MaxNumChars >= 0) { + Char = GUI_UC__GetCharCodeInc(&s); + Dist += GUI_GetCharDistX(Char); + } + } + return Dist; +} + +/********************************************************************* +* +* GUI__DispLine +*/ +void GUI__DispLine(const char GUI_UNI_PTR *s, int MaxNumChars, const GUI_RECT* pr) { + GUI_RECT r; + #if GUI_SUPPORT_ROTATION + if (GUI_pLCD_APIList) { + #if GUI_WINSUPPORT + WM_ITERATE_START(NULL) { + #endif + /* Do the actual drawing via routine call. */ + _DispLine(s, MaxNumChars, &r); + #if GUI_WINSUPPORT + } WM_ITERATE_END(); + #endif + } else + #endif + { + r = *pr; + #if GUI_WINSUPPORT + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + WM_ITERATE_START(&r) { + #endif + GUI_Context.DispPosX = r.x0; + GUI_Context.DispPosY = r.y0; + /* Do the actual drawing via routine call. */ + _DispLine(s, MaxNumChars, &r); + #if GUI_WINSUPPORT + } WM_ITERATE_END(); + WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY); + #endif + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUICharM.c b/User/system/lib/lcd/gui/Core/GUICharM.c new file mode 100644 index 0000000..38a04ee --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUICharM.c @@ -0,0 +1,167 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIChar.C +Purpose : Implementation of memory devices +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIMONO_DispChar +* +* Purpose: +* This is the routine that displays a character. It is used by all +* other routines which display characters as a subroutine. +*/ +void GUIMONO_DispChar(U16P c) { + int c0, c1; + const unsigned char GUI_UNI_PTR * pd; + int x = GUI_Context.DispPosX; + int y = GUI_Context.DispPosY; + /* do some checking if drawing is actually necessary ... */ + const GUI_FONT_MONO GUI_UNI_PTR * pMono = GUI_Context.pAFont->p.pMono; + unsigned int FirstChar = pMono->FirstChar; + /* translate character into 2 characters to display : c0,c1 */ + /* Check if regular character first. */ + if ((c >= (U16P)FirstChar) &&(c <= (U16P)pMono->LastChar)) { + pd = pMono->pData; + c0 = ((int)c) - FirstChar; + c1 = -1; + } else { + /* Check if character is in translation table */ + GUI_FONT_TRANSINFO const GUI_UNI_PTR * pti = pMono->pTrans; + pd = pMono->pTransData; + if (pti) { + FirstChar = pti->FirstChar; + if ((c >= (U16P)FirstChar) && (c <= (U16P)pti->LastChar)) { + GUI_FONT_TRANSLIST const GUI_UNI_PTR * ptl; + c -= pti->FirstChar; + ptl = pti->pList; + ptl += c; + c0 = ptl->c0; + c1 = ptl->c1; + } else { + c0 = c1 = -1; + } + } else { + c0 = c1 = -1; + } + } + /* Draw first character if it is valid */ + if (c0!=-1) { + int BytesPerChar = GUI_Context.pAFont->YSize*pMono->BytesPerLine; + GUI_DRAWMODE DrawMode; + int XSize = pMono->XSize; + int YSize = GUI_Context.pAFont->YSize; + /* Select the right drawing mode */ + DrawMode = GUI_Context.TextMode; + /* call drawing routine */ + { + U8 OldMode = LCD_SetDrawMode(DrawMode); + LCD_DrawBitmap( x, y, + XSize, YSize, + GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag, + 1, /* Bits per Pixel */ + pMono->BytesPerLine, + pd + c0* BytesPerChar, + &LCD_BKCOLORINDEX + ); + if (c1 != -1) { + LCD_SetDrawMode(DrawMode | LCD_DRAWMODE_TRANS); + LCD_DrawBitmap( x, y, + XSize, YSize, + GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag, + 1, /* Bits per Pixel */ + pMono->BytesPerLine, + pd + c1* BytesPerChar, + &LCD_BKCOLORINDEX + ); + } + /* Fill empty pixel lines */ + if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) { + if (DrawMode != LCD_DRAWMODE_TRANS) { + LCD_SetDrawMode(DrawMode ^ LCD_DRAWMODE_REV); /* Reverse so we can fill with BkColor */ + LCD_FillRect(x, + y + GUI_Context.pAFont->YSize * GUI_Context.pAFont->YDist, + x + XSize * GUI_Context.pAFont->XMag, + y + GUI_Context.pAFont->YDist); + } + } + LCD_SetDrawMode(OldMode); + } + } +//houhh 20061119... +// GUI_Context.DispPosX+=pMono->XDist; + GUI_Context.DispPosX+=pMono->XDist * GUI_Context.pAFont->XMag; + +} + +/********************************************************************* +* +* GUIMONO_GetCharDistX +*/ +int GUIMONO_GetCharDistX(U16P c) { + const GUI_FONT_MONO GUI_UNI_PTR * pMono = GUI_Context.pAFont->p.pMono; + GUI_USE_PARA(c); +// return pMono->XDist; +//houhh 20061119... + return pMono->XDist*GUI_Context.pAFont->XMag; + +} + +/********************************************************************* +* +* GUIMONO_GetFontInfo +*/ +void GUIMONO_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO* pfi) { + GUI_USE_PARA(pFont); + pfi->Flags = GUI_FONTINFO_FLAG_MONO; +} + +/********************************************************************* +* +* GUIMONO_IsInFont +*/ +char GUIMONO_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) { + const GUI_FONT_MONO GUI_UNI_PTR * pMono = pFont->p.pMono; + unsigned int FirstChar = pMono->FirstChar; + /* Check if regular character first. */ + if ((c >= (U16P)FirstChar) &&(c <= (U16P)pMono->LastChar)) { + return 1; /* Yes, we have it ! */ + } else { + /* Check if character is in translation table */ + GUI_FONT_TRANSINFO const GUI_UNI_PTR * pti; + pti = pMono->pTrans; + if (pti) { + if ((c >= pti->FirstChar) && (c <= pti->LastChar)) { + return 1; /* Yes, we have it ! */ + } + } + } + return 0; /* No, we can not display this character */ +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUICharP.c b/User/system/lib/lcd/gui/Core/GUICharP.c new file mode 100644 index 0000000..ddd6143 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUICharP.c @@ -0,0 +1,121 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICharP.C +Purpose : Implementation of Proportional fonts +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIPROP_FindChar +*/ +static const GUI_FONT_PROP GUI_UNI_PTR * GUIPROP_FindChar(const GUI_FONT_PROP GUI_UNI_PTR* pProp, U16P c) { + for (; pProp; pProp = pProp->pNext) { + if ((c>=pProp->First) && (c<=pProp->Last)) + break; + } + return pProp; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIPROP_DispChar +* +* Purpose: +* This is the routine that displays a character. It is used by all +* other routines which display characters as a subroutine. +*/ +void GUIPROP_DispChar(U16P c) { + int BytesPerLine; + GUI_DRAWMODE DrawMode = GUI_Context.TextMode; + const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + if (pProp) { + GUI_DRAWMODE OldDrawMode; + const GUI_CHARINFO GUI_UNI_PTR * pCharInfo = pProp->paCharInfo+(c-pProp->First); + BytesPerLine = pCharInfo->BytesPerLine; + OldDrawMode = LCD_SetDrawMode(DrawMode); + LCD_DrawBitmap( GUI_Context.DispPosX, GUI_Context.DispPosY, + pCharInfo->XSize, + GUI_Context.pAFont->YSize, + GUI_Context.pAFont->XMag, + GUI_Context.pAFont->YMag, + 1, /* Bits per Pixel */ + BytesPerLine, + pCharInfo->pData, + &LCD_BKCOLORINDEX + ); + /* Fill empty pixel lines */ + if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) { + int YMag = GUI_Context.pAFont->YMag; + int YDist = GUI_Context.pAFont->YDist * YMag; + int YSize = GUI_Context.pAFont->YSize * YMag; + if (DrawMode != LCD_DRAWMODE_TRANS) { + LCD_COLOR OldColor = GUI_GetColor(); + GUI_SetColor(GUI_GetBkColor()); + LCD_FillRect(GUI_Context.DispPosX, + GUI_Context.DispPosY + YSize, + GUI_Context.DispPosX + pCharInfo->XSize, + GUI_Context.DispPosY + YDist); + GUI_SetColor(OldColor); + } + } + LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ + GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag; + } +} + +/********************************************************************* +* +* GUIPROP_GetCharDistX +*/ +int GUIPROP_GetCharDistX(U16P c) { + const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); + return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_Context.pAFont->XMag : 0; +} + +/********************************************************************* +* +* GUIPROP_GetFontInfo +*/ +void GUIPROP_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO* pfi) { + GUI_USE_PARA(pFont); + pfi->Flags = GUI_FONTINFO_FLAG_PROP; +} + +/********************************************************************* +* +* GUIPROP_IsInFont +*/ +char GUIPROP_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) { + const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(pFont->p.pProp, c); + return (pProp==NULL) ? 0 : 1; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUICirc.c b/User/system/lib/lcd/gui/Core/GUICirc.c new file mode 100644 index 0000000..dd3488c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUICirc.c @@ -0,0 +1,271 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICirc.C +Purpose : Circle and ellipse drawing functions +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +1.00.02 011115 JE a) GL_FillEllipse, GL_FillCircle, GL_DrawCircle changed +1.00.01 011113 JE a) GL_DrawEllipse changed +1.00.00 991206 RS First release +---------------------------------------------------------------------- +Known problems or limitations with current version +---------------------------------------------------------------------- +None. +---------------------------------------------------------------------- +Open issues +---------------------------------------------------------------------- +None +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Draw8Point +*/ +static void Draw8Point(int x0,int y0, int xoff, int yoff) { + LCD_HL_DrawPixel(x0+xoff,y0+yoff); + LCD_HL_DrawPixel(x0-xoff,y0+yoff); + LCD_HL_DrawPixel(x0+yoff,y0+xoff); + LCD_HL_DrawPixel(x0+yoff,y0-xoff); + if (yoff) { + LCD_HL_DrawPixel(x0+xoff,y0-yoff); + LCD_HL_DrawPixel(x0-xoff,y0-yoff); + LCD_HL_DrawPixel(x0-yoff,y0+xoff); + LCD_HL_DrawPixel(x0-yoff,y0-xoff); + } +} + +/********************************************************************* +* +* Public code, circle +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_DrawCircle +*/ +void GL_DrawCircle(int x0, int y0, int r) { + I32 i; + int imax = ((I32)((I32)r*707))/1000+1; + I32 sqmax = (I32)r*(I32)r+(I32)r/2; + I32 y=r; + Draw8Point(x0,y0,r,0); + for (i=1; i<= imax; i++) { + if ((i*i+y*y) >sqmax) { + Draw8Point(x0,y0,i,y); + y--; + } + Draw8Point(x0,y0,i,y); + } +} + +/********************************************************************* +* +* GUI_DrawCircle +*/ +void GUI_DrawCircle(int x0, int y0, int r) { + #if (GUI_WINSUPPORT) + GUI_RECT Rect; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + Rect.x0 = x0-r; + Rect.x1 = x0+r; + Rect.y0 = y0-r; + Rect.y1 = y0+r; + WM_ITERATE_START(&Rect); { + #endif + GL_DrawCircle( x0, y0, r); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GL_FillCircle +*/ +void GL_FillCircle(int x0, int y0, int r) { + I32 i; + int imax = ((I32)((I32)r*707))/1000+1; + I32 sqmax = (I32)r*(I32)r+(I32)r/2; + I32 x=r; + LCD_HL_DrawHLine(x0-r,y0,x0+r); + for (i=1; i<= imax; i++) { + if ((i*i+x*x) >sqmax) { + /* draw lines from outside */ + if (x>imax) { + LCD_HL_DrawHLine (x0-i+1,y0+x, x0+i-1); + LCD_HL_DrawHLine (x0-i+1,y0-x, x0+i-1); + } + x--; + } + /* draw lines from inside (center) */ + LCD_HL_DrawHLine(x0-x,y0+i, x0+x); + LCD_HL_DrawHLine(x0-x,y0-i, x0+x); + } +} + +/********************************************************************* +* +* GUI_FillCircle +*/ +void GUI_FillCircle(int x0, int y0, int r) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + WM_ITERATE_START(NULL); { + #endif + GL_FillCircle(x0,y0,r); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/********************************************************************* +* +* Public code, ellipse +* +* The most efficient way to calculate the ellipse positions is using +* the knowledge that the ellipse is just circle which has compressed +* (or stretched) in one direction. For a circle, the following +* equation holds true for all points located on the border of it: +* +* x^2 + y(x)^2 = r^2 = const +* +* Therefor, for an ellipse we can make use of the following equation: +* +* (ry*x)^2 + (rx*y(x))^2 = (ry*rx)^2 = const +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_FillEllipse +*/ +void GL_FillEllipse(int x0, int y0, int rx, int ry) { + I32 OutConst, Sum, SumY; + int x,y; + U32 _rx = rx; + U32 _ry = ry; + OutConst = _rx*_rx*_ry*_ry /* Constant as explaint above */ + +(_rx*_rx*_ry>>1); /* To compensate for rounding */ + x = rx; + for (y=0; y<=ry; y++) { + SumY =((I32)(rx*rx))*((I32)(y*y)); /* Does not change in loop */ + while (Sum = SumY + ((I32)(ry*ry))*((I32)(x*x)), + (x>0) && (Sum>OutConst)) + { + x--; + } + LCD_HL_DrawHLine(x0-x, y0+y, x0+x); + if (y) + LCD_HL_DrawHLine(x0-x, y0-y, x0+x); + } +} + +/********************************************************************* +* +* GUI_FillEllipse +*/ +void GUI_FillEllipse(int x0, int y0, int rx, int ry) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + /* Calc rectangle in order to avoid unnecessary drawing ops. */ + r.x0 = x0-rx; r.x1 = x0+rx; r.y0 = y0-ry; r.y1 = y0+ry; + WM_ITERATE_START(&r); { + #endif + GL_FillEllipse (x0,y0, rx, ry); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GL_DrawEllipse +*/ +void GL_DrawEllipse(int x0, int y0, int rx, int ry) { + I32 OutConst, Sum, SumY; + int x,y; + int xOld; + U32 _rx = rx; + U32 _ry = ry; + OutConst = _rx*_rx*_ry*_ry /* Constant as explaint above */ + +(_rx*_rx*_ry>>1); /* To compensate for rounding */ + xOld = x = rx; + for (y=0; y<=ry; y++) { + if (y==ry) { + x=0; + } else { + SumY =((I32)(rx*rx))*((I32)(y*y)); /* Does not change in loop */ + while (Sum = SumY + ((I32)(ry*ry))*((I32)(x*x)), + (x>0) && (Sum>OutConst)) x--; + } + /* Since we draw lines, we can not draw on the first + iteration + */ + if (y) { + GL_DrawLine1(x0-xOld,y0-y+1,x0-x,y0-y); + GL_DrawLine1(x0-xOld,y0+y-1,x0-x,y0+y); + GL_DrawLine1(x0+xOld,y0-y+1,x0+x,y0-y); + GL_DrawLine1(x0+xOld,y0+y-1,x0+x,y0+y); + } + xOld = x; + } +} + +/********************************************************************* +* +* GUI_DrawEllipse +*/ +void GUI_DrawEllipse(int x0, int y0, int rx, int ry) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + /* Calc rectangle in order to avoid unnecessary drawing ops. */ + r.x0 = x0-rx; r.x1 = x0+rx; r.y0 = y0-ry; r.y1 = y0+ry; + WM_ITERATE_START(&r); { + #endif + GL_DrawEllipse(x0, y0, rx, ry); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIColor2Index.c b/User/system/lib/lcd/gui/Core/GUIColor2Index.c new file mode 100644 index 0000000..ad83be0 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIColor2Index.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIColor2Index.C +Purpose : Converts a RGB-value to a color index +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Color2Index +*/ +int GUI_Color2Index(GUI_COLOR Color) { + int Index; + GUI_LOCK(); + Index = LCD_Color2Index(Color); + GUI_UNLOCK(); + return Index; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUICore.c b/User/system/lib/lcd/gui/Core/GUICore.c new file mode 100644 index 0000000..9619f24 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUICore.c @@ -0,0 +1,179 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICore.C +Purpose : Core routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ + +#define GL_CORE_C + +#include "GUI_Private.h" +#include "GUIDebug.h" + +#if GUI_WINSUPPORT +#include "WM_GUI.h" +#include "WM.h" +#endif + +/********************************************************************* + * + * Static data + * + ********************************************************************** + */ +#if GUI_SUPPORT_AA +static const tLCD_HL_APIList _HL_APIList = { + LCD_DrawHLine, + LCD_DrawPixel}; +#endif + +/********************************************************************* + * + * Static code + * + ********************************************************************** + */ +/********************************************************************* + * + * _InitContext + * + * Purpose + * Initializes the given context. + * + * Special considerations + * Make sure that no GUI functions are called, because locking is + * not allowed here (GUITASK_INIT not yet called). + */ +static void _InitContext(GUI_CONTEXT *pContext) +{ +/* memset(..,0,..) is not required, as this function is called only at startup of the GUI when data is 0 */ +#if GUI_SUPPORT_DEVICES + pContext->pDeviceAPI = LCD_aAPI[0]; /* &LCD_L0_APIList; */ +#endif + pContext->pClipRect_HL = &GUI_Context.ClipRect; + LCD_L0_GetRect(&pContext->ClipRect); +#if GUI_SUPPORT_AA + pContext->pLCD_HL = &_HL_APIList; +#endif + pContext->pAFont = GUI_DEFAULT_FONT; + pContext->pClipRect_HL = &GUI_Context.ClipRect; + pContext->PenSize = 1; +/* Variables in WM module */ +#if GUI_WINSUPPORT + pContext->hAWin = WM_GetDesktopWindow(); +#endif +/* Variables in GUI_AA module */ +#if GUI_SUPPORT_AA + pContext->AA_Factor = 3; +#endif + pContext->Color = GUI_INVALID_COLOR; + pContext->BkColor = GUI_INVALID_COLOR; + LCD_SetBkColor(GUI_DEFAULT_BKCOLOR); + LCD_SetColor(GUI_DEFAULT_COLOR); + pContext->pUC_API = &GUI__API_TableNone; +} + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * GUI_ClearRect + */ +void GUI_ClearRect(int x0, int y0, int x1, int y1) +{ + GUI_DRAWMODE PrevDraw; +#if GUI_WINSUPPORT + GUI_RECT r; +#endif + GUI_LOCK(); + PrevDraw = LCD_SetDrawMode(GUI_DRAWMODE_REV); +#if GUI_WINSUPPORT + WM_ADDORG(x0, y0); + WM_ADDORG(x1, y1); + r.x0 = x0; + r.x1 = x1; + r.y0 = y0; + r.y1 = y1; + WM_ITERATE_START(&r) + { +#endif + LCD_FillRect(x0, y0, x1, y1); +#if GUI_WINSUPPORT + } + WM_ITERATE_END(); +#endif + LCD_SetDrawMode(PrevDraw); + GUI_UNLOCK(); +} + +/********************************************************************* + * + * GUI_Clear + */ +void GUI_Clear(void) +{ + GUI_GotoXY(0, 0); /* Reset text cursor to upper left */ + GUI_ClearRect(GUI_XMIN, GUI_YMIN, GUI_XMAX, GUI_YMAX); +} + +/********************************************************************* + * + * GUI_Init + * + * Purpose: + * Init of GUI internal data structures & variables + */ +int GUI_Init(void) +{ + int r; + GUI_DEBUG_LOG("\nGUI_Init()"); + /* Init system wide globals first */ + GUI_DecChar = '.'; + GUI_X_Init(); + /* Init context */ + _InitContext(&GUI_Context); + GUITASK_INIT(); + r = LCD_Init(); +#if GUI_WINSUPPORT + WM_Init(); +#endif + GUITASK_COPY_CONTEXT(); +#if defined(GUI_TRIAL_VERSION) + { + int i; + for (i = 0; i < 10; i++) + { + GUI_DispString("This uC-GUI library\n" + "is for evaluation\n" + "purpose only.\n" + "A license is\n" + "required to use\n" + "it in a product\n\n" + "www.micrium.com\n"); + GUI_GotoXY(0, 0); + } + } + GUI_Clear(); +#endif + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUICurs.c b/User/system/lib/lcd/gui/Core/GUICurs.c new file mode 100644 index 0000000..0f43a54 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUICurs.c @@ -0,0 +1,423 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUICurs.C +Purpose : Cursor routines of the graphics library +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +#if GUI_SUPPORT_CURSOR + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +static GUI_HMEM _hBuffer; +static GUI_RECT _Rect; +static char _CursorIsVis; /* Currently visible ? */ +static char _CursorOn; +static const GUI_CURSOR GUI_UNI_PTR * _pCursor; +static U8 _CursorDeActCnt; +static int _AllocSize; +static int _x, _y; /* Position of hot spot */ +static GUI_RECT _ClipRect; +static LCD_PIXELINDEX _ColorIndex[4]; /* Color-Cache */ + +/********************************************************************* +* +* static code, helper functions +* +********************************************************************** +*/ +/********************************************************************* +* +* _SetPixelIndex +* +* Purpose +* Sets the pixel index for the Cursor. +* Note the following: +* - We do the clipping in this routine +* - We do NOT call the driver directly, but thru its API table. +* This allows others (e.g. the VNC server) to be in the loop- +*/ +static void _SetPixelIndex(int x, int y, int Index) { + if ((y >= _ClipRect.y0) && (y <= _ClipRect.y1)) { + if ((x >= _ClipRect.x0) && (x <= _ClipRect.x1)) { + LCD_aAPI[0]->pfSetPixelIndex(x, y, Index); + } + } +} + +/********************************************************************* +* +* _GetPixelIndex +* +* Purpose +* Gets a pixel index for the Cursor. +*/ +static int _GetPixelIndex(int x, int y) { + if ((y >= _ClipRect.y0) && (y <= _ClipRect.y1)) { + if ((x >= _ClipRect.x0) && (x <= _ClipRect.x1)) { + return LCD_L0_GetPixelIndex(x, y); + } + } + return 0; +} + +/********************************************************************* +* +* _Undraw +* +* Purpose +* Remove the cursors +*/ +static void _Undraw(void) { + int x, y, xSize, ySize; + LCD_PIXELINDEX* pData; + /* Save bitmap data */ + GUI_LOCK(); + if (_hBuffer) { + pData = (LCD_PIXELINDEX*)GUI_ALLOC_h2p(_hBuffer); + xSize = _Rect.x1 - _Rect.x0 + 1; + ySize = _Rect.y1 - _Rect.y0 + 1; + for (y = 0; y < ySize; y++) { + for (x = 0; x < xSize; x++) { + _SetPixelIndex(x + _Rect.x0, y + _Rect.y0, *(pData + x)); + } + pData += _pCursor->pBitmap->XSize; + } + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* _Log2Phys +*/ +static int _Log2Phys(int Index) { + if (Index < 4) { + return _ColorIndex[Index]; + } else { + LCD_COLOR Color = *(_pCursor->pBitmap->pPal->pPalEntries + Index); + return LCD_Color2Index(Color); + } +} + +/********************************************************************* +* +* _Draw +*/ +static void _Draw(void) { + int x, y, xSize, ySize; + LCD_PIXELINDEX* pData; + const GUI_BITMAP GUI_UNI_PTR * pBM; + GUI_LOCK(); + if (_hBuffer) { + /* Save bitmap data */ + pBM = _pCursor->pBitmap; + pData = (LCD_PIXELINDEX*)GUI_ALLOC_h2p(_hBuffer); + xSize = _Rect.x1 - _Rect.x0 + 1; + ySize = _Rect.y1 - _Rect.y0 + 1; + for (y = 0; y < ySize; y++) { + for (x = 0; x < xSize; x++) { + int BitmapPixel; + *(pData + x) = _GetPixelIndex(_Rect.x0 + x, _Rect.y0 + y); + BitmapPixel = GUI_GetBitmapPixelIndex(pBM, x, y); + if (BitmapPixel) { + _SetPixelIndex(_Rect.x0 + x, _Rect.y0 + y, _Log2Phys(BitmapPixel)); + } + } + pData += pBM->XSize; + } + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* _CalcRect +*/ +static void _CalcRect(void) { + if (_pCursor) { + _Rect.x0 = _x - _pCursor->xHot; + _Rect.y0 = _y - _pCursor->yHot; + _Rect.x1 = _Rect.x0 + _pCursor->pBitmap->XSize - 1; + _Rect.y1 = _Rect.y0 + _pCursor->pBitmap->YSize - 1; + } +} + +/********************************************************************* +* +* _Hide +*/ +static void _Hide(void) { + if (_CursorIsVis) { + _Undraw(); + _CursorIsVis = 0; + } +} + +/********************************************************************* +* +* _Show +*/ +static void _Show(void) { + if (_CursorOn && (_CursorDeActCnt==0)) { + _CursorIsVis = 1; + _Draw(); + } +} + +/********************************************************************* +* +* _TempHide +* +* Purpose: +* Hide cursor if a part of the given rectangle is located in the +* rectangle used for the cursor. This routine is called automatically +* by the window manager. This way the window manager can +* automatically make sure that the cursor is always displayed +* correctly. +* +* Params: +* pRect Rectangle under consideration +* +* Return value: +* 0: No action taken +* Cursor was not visible or not affected because rectangles +* did not overlap +* 1: Cursor hidden -> WM needs to restore cursor after +* drawing operation +*/ +static char _TempHide(const GUI_RECT* pRect) { + if (!_CursorIsVis) { + return 0; /* Cursor not visible -> nothing to do */ + } + if ((pRect == NULL) || GUI_RectsIntersect(pRect, &_Rect)) { + _Hide(); /* Cursor needs to be hidden */ + return 1; + } + return 0; /* Cursor not affected -> nothing to do */ +} + +/********************************************************************* +* +* _TempUnhide +*/ +static void _TempUnhide(void) { + _Show(); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_CURSOR_Activate +*/ +void GUI_CURSOR_Activate(void) { + GUI_LOCK(); + if ((--_CursorDeActCnt) ==0) { + _Show(); + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_CURSOR_Deactivate +*/ +void GUI_CURSOR_Deactivate(void) { + GUI_LOCK(); + if (_CursorDeActCnt++ ==0) + _Hide(); + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_CURSOR_Select +*/ +const GUI_CURSOR GUI_UNI_PTR * GUI_CURSOR_Select(const GUI_CURSOR GUI_UNI_PTR * pCursor) { + int AllocSize; + const GUI_BITMAP GUI_UNI_PTR * pBM; + const GUI_CURSOR GUI_UNI_PTR * pOldCursor; + GUI_LOCK(); + pOldCursor = _pCursor; + if (pCursor != _pCursor) { + int i; + pBM = pCursor->pBitmap; + i = pBM->pPal->NumEntries > 4 ? 4 : pBM->pPal->NumEntries; + while (i--) { + LCD_COLOR Color = *(pBM->pPal->pPalEntries + i); + _ColorIndex[i] = LCD_Color2Index(Color); + } + _Hide(); + AllocSize = pBM->XSize * pBM->YSize * sizeof(LCD_PIXELINDEX); + if (AllocSize != _AllocSize) { + GUI_ALLOC_Free(_hBuffer); + _hBuffer = 0; + } + _hBuffer = GUI_ALLOC_AllocZero(AllocSize); + _CursorOn = 1; + _pCursor = pCursor; + _CalcRect(); + _Show(); + } + GUI_UNLOCK(); + return pOldCursor; +} + +/********************************************************************* +* +* GUI_CURSOR_Hide +*/ +void GUI_CURSOR_Hide(void) { + GUI_LOCK(); + _Hide(); + _CursorOn = 0; + /* Set function pointer which window manager can use */ + GUI_CURSOR_pfTempHide = NULL; + GUI_CURSOR_pfTempUnhide = NULL; + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_CURSOR_Show +*/ +void GUI_CURSOR_Show(void) { + GUI_LOCK(); + LCDDEV_L0_GetRect(&_ClipRect); + _Hide(); + _CursorOn = 1; + /* Set function pointer which window manager can use */ + GUI_CURSOR_pfTempHide = _TempHide; + GUI_CURSOR_pfTempUnhide = _TempUnhide; + if (!_pCursor) { + GUI_CURSOR_Select(GUI_DEFAULT_CURSOR); + } else { + _Show(); + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_CURSOR_SetPosition +*/ +void GUI_CURSOR_SetPosition(int xNewPos, int yNewPos) { + int x, xStart, xStep, xEnd, xOff, xOverlapMin, xOverlapMax; + int y, yStart, yStep, yEnd, yOff, yOverlapMin, yOverlapMax; + int xSize; + LCD_PIXELINDEX* pData; + GUI_LOCK(); + if (_hBuffer) { + if ((_x != xNewPos) | (_y != yNewPos)) { + if (_CursorOn) { + const GUI_BITMAP GUI_UNI_PTR * pBM = _pCursor->pBitmap; + /* Save & set clip rect */ + /* Compute helper variables */ + pData = (LCD_PIXELINDEX*)GUI_ALLOC_h2p(_hBuffer); + xSize = _pCursor->pBitmap->XSize; + xOff = xNewPos - _x; + if (xOff > 0) { + xStep = 1; + xStart = 0; + xEnd = _pCursor->pBitmap->XSize; + xOverlapMax = xEnd -1; + xOverlapMin = xOff; + } else { + xStep = -1; + xStart = xSize - 1; + xEnd = -1; + xOverlapMin = 0; + xOverlapMax = xStart + xOff; + } + yOff = yNewPos - _y; + if (yOff > 0) { + yStep = 1; + yStart = 0; + yEnd = _pCursor->pBitmap->YSize; + yOverlapMax = yEnd -1; + yOverlapMin = yOff; + } else { + yStep = -1; + yStart = _pCursor->pBitmap->YSize - 1; + yEnd = -1; + yOverlapMin = 0; + yOverlapMax = yStart + yOff; + } + /* Restore & Draw */ + for (y = yStart; y != yEnd; y += yStep) { + char yOverlaps; + char yNewOverlaps; + int yNew = y + yOff; + yOverlaps = (y >= yOverlapMin) && (y <= yOverlapMax); + yNewOverlaps = (yNew >= yOverlapMin) && (yNew <= yOverlapMax); + for (x= xStart; x != xEnd; x += xStep) { + char xyOverlaps, xyNewOverlaps; + int BitmapPixel; + LCD_PIXELINDEX Pixel; + LCD_PIXELINDEX* pSave = pData + x + y * xSize; + int xNew = x + xOff; + BitmapPixel = GUI_GetBitmapPixelIndex(pBM, x, y); + xyOverlaps = (x >= xOverlapMin) && (x <= xOverlapMax) && yOverlaps; + xyNewOverlaps = (xNew >= xOverlapMin) && (xNew <= xOverlapMax) && yNewOverlaps; + /* Restore old pixel if it was not transparent */ + if (BitmapPixel) { + if (!xyOverlaps || (GUI_GetBitmapPixelIndex(pBM, x - xOff, y - yOff) == 0)) { + _SetPixelIndex(x + _Rect.x0, y + _Rect.y0, *(pSave)); + } + } + /* Save */ + if (xyNewOverlaps) { + Pixel = *(pData + xNew + yNew * xSize); + } else { + Pixel = _GetPixelIndex(_Rect.x0 + xNew, _Rect.y0 + yNew); + } + *pSave = Pixel; + /* Write new ... We could write pixel by pixel here */ + if (BitmapPixel) { + LCD_PIXELINDEX NewPixel = _Log2Phys(BitmapPixel); + _SetPixelIndex(_Rect.x0 + xNew, _Rect.y0 + yNew, NewPixel); + } + } + } + } + _x = xNewPos; + _y = yNewPos; + _CalcRect(); + } + } + GUI_UNLOCK(); +} + +#else + +void GUICurs_C(void); +void GUICurs_C(void) {} /* avoid empty object files */ + +#endif /* GUI_SUPPORT_CURSOR */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIDebug.h b/User/system/lib/lcd/gui/Core/GUIDebug.h new file mode 100644 index 0000000..044f3d0 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIDebug.h @@ -0,0 +1,173 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDebug.h +Purpose : Debug macros +---------------------------------------------------------------------- + Debug macros for logging + + In the GUI Simulation, all output is transferred into the log window. +*/ + +#ifndef GUI_DEBUG_H +#define GUI_DEBUG_H + +#include "GUI.h" +#include "GUI_X.h" + +#define GUI_DEBUG_LEVEL_NOCHECK 0 /* No run time checks are performed */ +#define GUI_DEBUG_LEVEL_CHECK_PARA 1 /* Parameter checks are performed to avoid crashes */ +#define GUI_DEBUG_LEVEL_CHECK_ALL 2 /* Parameter checks and consistency checks are performed */ +#define GUI_DEBUG_LEVEL_LOG_ERRORS 3 /* Errors are recorded */ +#define GUI_DEBUG_LEVEL_LOG_WARNINGS 4 /* Errors & Warnings are recorded */ +#define GUI_DEBUG_LEVEL_LOG_ALL 5 /* Errors, Warnings and Messages are recorded. */ + +#ifndef GUI_DEBUG_LEVEL + #ifdef WIN32 + // #define GUI_DEBUG_LEVEL GUI_DEBUG_LEVEL_LOG_WARNINGS /* Simulation should log all warnings */ + #define GUI_DEBUG_LEVEL GUI_DEBUG_LEVEL_LOG_ALL /* Simulation should log all warnings */ + #else + #define GUI_DEBUG_LEVEL GUI_DEBUG_LEVEL_CHECK_PARA /* For most targets, min. size is important */ + #endif +#endif + +/******************************************************************* +* +* Commandline +* +******************************************************************** +*/ + +#ifdef WIN32 + #define GUI_DEBUG_GETCMDLINE() SIM_GetCmdLine() +#else + #define GUI_DEBUG_GETCMDLINE() 0 +#endif + +/******************************************************************* +* +* Error macros +* +******************************************************************** +*/ + +/* Make sure the macros are actually defined */ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_ERRORS + #define GUI_DEBUG_ERROROUT(s) GUI_ErrorOut(s) + #define GUI_DEBUG_ERROROUT1(s,p0) GUI_ErrorOut1(s,p0) + #define GUI_DEBUG_ERROROUT2(s,p0,p1) GUI_ErrorOut2(s,p0,p1) + #define GUI_DEBUG_ERROROUT3(s,p0,p1,p2) GUI_ErrorOut3(s,p0,p1,p2) + #define GUI_DEBUG_ERROROUT4(s,p0,p1,p2,p3) GUI_ErrorOut4(s,p0,p1,p2,p3) + #define GUI_DEBUG_ERROROUT_IF(exp,s) { if (exp) GUI_DEBUG_ERROROUT(s); } + #define GUI_DEBUG_ERROROUT1_IF(exp,s,p0) { if (exp) GUI_DEBUG_ERROROUT1(s,p0); } + #define GUI_DEBUG_ERROROUT2_IF(exp,s,p0,p1) { if (exp) GUI_DEBUG_ERROROUT2(s,p0,p1); } + #define GUI_DEBUG_ERROROUT3_IF(exp,s,p0,p1,p2) { if (exp) GUI_DEBUG_ERROROUT3(s,p0,p1,p2); } + #define GUI_DEBUG_ERROROUT4_IF(exp,s,p0,p1,p2,p3) { if (exp) GUI_DEBUG_ERROROUT4(s,p0,p1,p2,p3); } +#else + #define GUI_DEBUG_ERROROUT(s) + #define GUI_DEBUG_ERROROUT1(s,p0) + #define GUI_DEBUG_ERROROUT2(s,p0,p1) + #define GUI_DEBUG_ERROROUT3(s,p0,p1,p2) + #define GUI_DEBUG_ERROROUT4(s,p0,p1,p2,p3) + #define GUI_DEBUG_ERROROUT_IF(exp,s) + #define GUI_DEBUG_ERROROUT1_IF(exp,s,p0) + #define GUI_DEBUG_ERROROUT2_IF(exp,s,p0,p1) + #define GUI_DEBUG_ERROROUT3_IF(exp,s,p0,p1,p2) + #define GUI_DEBUG_ERROROUT4_IF(exp,s,p0,p1,p2,p3) +#endif + +/******************************************************************* +* +* Warning macros +* +******************************************************************** +*/ + +/* Make sure the macros are actually defined */ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_WARNINGS + #define GUI_DEBUG_WARN(s) GUI_Warn(s) + #define GUI_DEBUG_WARN1(s,p0) GUI_Warn1(s,p0) + #define GUI_DEBUG_WARN2(s,p0,p1) GUI_Warn2(s,p0,p1) + #define GUI_DEBUG_WARN3(s,p0,p1,p2) GUI_Warn3(s,p0,p1,p2) + #define GUI_DEBUG_WARN4(s,p0,p1,p2,p3) GUI_Warn4(s,p0,p1,p2,p3) + #define GUI_DEBUG_WARN_IF(exp,s) { if (exp) GUI_DEBUG_WARN(s); } + #define GUI_DEBUG_WARN1_IF(exp,s,p0) { if (exp) GUI_DEBUG_WARN1(s,p0); } + #define GUI_DEBUG_WARN2_IF(exp,s,p0,p1) { if (exp) GUI_DEBUG_WARN2(s,p0,p1); } + #define GUI_DEBUG_WARN3_IF(exp,s,p0,p1,p2) { if (exp) GUI_DEBUG_WARN3(s,p0,p1,p2); } + #define GUI_DEBUG_WARN4_IF(exp,s,p0,p1,p2,p3) { if (exp) GUI_DEBUG_WARN4(s,p0,p1,p2,p3); } +#else + #define GUI_DEBUG_WARN(s) + #define GUI_DEBUG_WARN1(s,p0) + #define GUI_DEBUG_WARN2(s,p0,p1) + #define GUI_DEBUG_WARN3(s,p0,p1,p2) + #define GUI_DEBUG_WARN4(s,p0,p1,p2,p3) + #define GUI_DEBUG_WARN_IF(exp,s) + #define GUI_DEBUG_WARN1_IF(exp,s,p0) + #define GUI_DEBUG_WARN2_IF(exp,s,p0,p1) + #define GUI_DEBUG_WARN3_IF(exp,s,p0,p1,p2) + #define GUI_DEBUG_WARN4_IF(exp,s,p0,p1,p2,p3) +#endif + +/******************************************************************* +* +* Logging macros +* +******************************************************************** +*/ +/* Make sure the macros are actually defined */ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_ALL + #define GUI_DEBUG_LOG(s) GUI_Log(s) + #define GUI_DEBUG_LOG1(s,p0) GUI_Warn1(s,p0) + #define GUI_DEBUG_LOG2(s,p0,p1) GUI_Warn2(s,p0,p1) + #define GUI_DEBUG_LOG3(s,p0,p1,p2) GUI_Warn3(s,p0,p1,p2) + #define GUI_DEBUG_LOG4(s,p0,p1,p2,p3) GUI_Warn4(s,p0,p1,p2,p3) + #define GUI_DEBUG_LOG_IF(exp,s) { if (exp) GUI_DEBUG_LOG(s); } + #define GUI_DEBUG_LOG1_IF(exp,s,p0) { if (exp) GUI_DEBUG_LOG1(s,p0); } + #define GUI_DEBUG_LOG2_IF(exp,s,p0,p1) { if (exp) GUI_DEBUG_LOG2(s,p0,p1); } + #define GUI_DEBUG_LOG3_IF(exp,s,p0,p1,p2) { if (exp) GUI_DEBUG_LOG3(s,p0,p1,p2); } + #define GUI_DEBUG_LOG4_IF(exp,s,p0,p1,p2,p3) { if (exp) GUI_DEBUG_LOG4(s,p0,p1,p2,p3); } +#else + #define GUI_DEBUG_LOG(s) + #define GUI_DEBUG_LOG1(s,p0) + #define GUI_DEBUG_LOG2(s,p0,p1) + #define GUI_DEBUG_LOG3(s,p0,p1,p2) + #define GUI_DEBUG_LOG4(s,p0,p1,p2,p3) + #define GUI_DEBUG_LOG_IF(exp,s) + #define GUI_DEBUG_LOG1_IF(exp,s,p0) + #define GUI_DEBUG_LOG2_IF(exp,s,p0,p1) + #define GUI_DEBUG_LOG3_IF(exp,s,p0,p1,p2) + #define GUI_DEBUG_LOG4_IF(exp,s,p0,p1,p2,p3) +#endif + +/******************************************************************* +* +* Asserts +* +******************************************************************** +*/ +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_ERRORS + #define GUI_DEBUG_ASSERT(exp) { if (!exp) GUI_DEBUG_ERROROUT(#exp); } +#else + #define GUI_DEBUG_ASSERT(exp) +#endif + +#endif /* LCD_H */ + + + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIEncJS.c b/User/system/lib/lcd/gui/Core/GUIEncJS.c new file mode 100644 index 0000000..7c8a73f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIEncJS.c @@ -0,0 +1,116 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIEncSJ.C +Purpose : Implementation of Shift JIS decoding +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* DB2SJIS +*/ +static U16 DB2SJIS(U8 Byte0, U8 Byte1) { + return Byte1 | (((U16)Byte0)<<8); +} + +/********************************************************************* +* +* _GetLineDistX_SJIS +*/ +static int _GetLineDistX_SJIS(const char GUI_UNI_PTR *s, int Len) { + int Dist =0; + if (s) { + U8 c0; + while (((c0=*(const U8*)s) !=0) && Len >=0) { + s++; Len--; + if (c0 > 127) { + U8 c1 = *(const U8*)s++; + Len--; + Dist += GUI_GetCharDistX(DB2SJIS(c0, c1)); + } else { + Dist += GUI_GetCharDistX(c0); + } + } + } + return Dist; +} + +/********************************************************************* +* +* _GetLineLen_SJIS +* Purpose: +* Returns the number of characters in a string. +* +* NOTE: +* The return value can be used as offset into the +* string, which means that double characters count double +*/ +static int _GetLineLen_SJIS(const char GUI_UNI_PTR *s, int MaxLen) { + int Len =0; + U8 c0; + while (((c0=*(const U8*)s) !=0) && Len < MaxLen) { + s++; + if (c0 > 127) { + Len++; s++; + } else { + switch (c0) { + case '\n': return Len; + } + } + Len++; + } + return Len; +} + +/********************************************************************* +* +* _DispLine_SJIS +*/ +static void _DispLine_SJIS(const char GUI_UNI_PTR *s, int Len) { + U8 c0; + while (--Len >=0) { + c0=*(const U8*)s++; + if (c0 > 127) { + U8 c1 = *(const U8*)s++; + Len--; + GL_DispChar (DB2SJIS(c0, c1)); + } else { + GL_DispChar(c0); + } + } +} + +/********************************************************************* +* +* GUI_ENC_APIList_SJIS, API list +*/ +const tGUI_ENC_APIList GUI_ENC_APIList_SJIS = { + _GetLineDistX_SJIS, + _GetLineLen_SJIS, + _DispLine_SJIS +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIIndex2Color.c b/User/system/lib/lcd/gui/Core/GUIIndex2Color.c new file mode 100644 index 0000000..6a664e0 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIIndex2Color.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIIndex2Color.C +Purpose : Converts a color index to a RGB-value +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Index2Color +*/ +GUI_COLOR GUI_Index2Color(int Index) { + GUI_COLOR Color; + GUI_LOCK(); + Color = LCD_Index2Color(Index); + GUI_UNLOCK(); + return Color; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIPolyE.c b/User/system/lib/lcd/gui/Core/GUIPolyE.c new file mode 100644 index 0000000..a84f2de --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIPolyE.c @@ -0,0 +1,152 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIPolyE.c +Purpose : Polygon enlarge +---------------------------------------------------------------------- +*/ + +#include +#include "GUI.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + float x, y; +} tfPoint; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _fround +*/ +static int _fround(float f) { + if (f>0) + return f+0.5f; + return f-0.5f; +} + +/********************************************************************* +* +* _Normalize +*/ +static void _Normalize(tfPoint* pfPoint) { + float fx = pfPoint->x; + float fy = pfPoint->y; + float r = sqrt(fx*fx + fy*fy); + if (r > 0) { + pfPoint->x = fx/r; + pfPoint->y = fy/r; + } +} + +/********************************************************************* +* +* _ReverseLen +*/ +static void _ReverseLen(tfPoint* pfPoint) { + float fx = pfPoint->x; + float fy = pfPoint->y; + float r = sqrt(fx*fx/2 + fy*fy/2); + if (r > 0) { + pfPoint->x = fx/r/r; + pfPoint->y = fy/r/r; + } +} + +/********************************************************************* +* +* _GetVect +*/ +static void _GetVect(tfPoint* pfPoint, const GUI_POINT* pSrc, int NumPoints, int Index) { + int Off0 = (Index + NumPoints-1) % NumPoints; + int Off1 = Index % NumPoints; + pfPoint->x = pSrc[Off1].x - pSrc[Off0].x; + pfPoint->y = pSrc[Off1].y - pSrc[Off0].y; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_EnlargePolygon +*/ +#if 0 +void GUI_EnlargePolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, int Len) { + int j; + /* Calc destination points */ + for (j=0; jx = (pSrc+j)->x + x; + (pDest+j)->y = (pSrc+j)->y + y; + } +} + +#else + +void GUI_EnlargePolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, int Len) { + int j; + /* Calc destination points */ + for (j=0; jx = (pSrc+j)->x + x; + (pDest+j)->y = (pSrc+j)->y + y; + } +} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIPolyM.c b/User/system/lib/lcd/gui/Core/GUIPolyM.c new file mode 100644 index 0000000..338e927 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIPolyM.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIPolyR.c +Purpose : Polygon rotation +---------------------------------------------------------------------- +*/ + +#include +#include "GUI.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MagnifyPolygon +*/ +void GUI_MagnifyPolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, int Mag) { + int j; + for (j=0; jx = (pSrc+j)->x * Mag; + (pDest+j)->y = (pSrc+j)->y * Mag; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIPolyR.c b/User/system/lib/lcd/gui/Core/GUIPolyR.c new file mode 100644 index 0000000..34734b7 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIPolyR.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIPolyR.c +Purpose : Polygon rotation +---------------------------------------------------------------------- +*/ + +#include "arm_math.h" +#include "GUI.h" + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * GUI_RotatePolygon + */ +void GUI_RotatePolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, float Angle) +{ + int j; + float fcos = arm_cos_f32(Angle); + float fsin = arm_sin_f32(Angle); + for (j = 0; j < NumPoints; j++) + { + int x = (pSrc + j)->x; + int y = (pSrc + j)->y; + (pDest + j)->x = x * fcos + y * fsin; + (pDest + j)->y = -x * fsin + y * fcos; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIRealloc.c b/User/system/lib/lcd/gui/Core/GUIRealloc.c new file mode 100644 index 0000000..44b9859 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIRealloc.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIRealloc.C +Purpose : Dynamic memory management +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include /* for memcpy, memset */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public routines: Using internal memory management +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ALLOC_Realloc +* +* Purpose: +* Reallocate a memory block. This is typically used to grow memory +* blocks. The contents of the old memory block are copied into the +* new block (or as much as fits in case of shrinkage). +* In case of error the old memory block (and its handle) remain +* unchanged. +* +* Return value: +* On success: Handle of newly allocated memory block +* On error: 0 +*/ +GUI_HMEM GUI_ALLOC_Realloc(GUI_HMEM hOld, int NewSize) { + GUI_HMEM hNew; + hNew = GUI_ALLOC_AllocNoInit(NewSize); + if (hNew && hOld) { + void *pNew, *pOld; + int Size, OldSize; + OldSize = GUI_ALLOC_GetSize(hOld); + Size = (OldSize < NewSize) ? OldSize : NewSize; + GUI_LOCK(); + pNew = GUI_ALLOC_h2p(hNew); + pOld = GUI_ALLOC_h2p(hOld); + memcpy(pNew, pOld, Size); + GUI_UNLOCK(); + GUI_ALLOC_Free(hOld); + } + return hNew; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIStream.c b/User/system/lib/lcd/gui/Core/GUIStream.c new file mode 100644 index 0000000..c4d5eab --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIStream.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIStream.c +Purpose : Support for streamed bitmaps +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "GUI.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawStreamedBitmap +*/ +void GUI_DrawStreamedBitmap(const GUI_BITMAP_STREAM *pBitmapHeader, int x, int y) { + GUI_BITMAP Bitmap = {0}; + GUI_LOGPALETTE Palette; + Bitmap.BitsPerPixel = pBitmapHeader->BitsPerPixel; + Bitmap.BytesPerLine = pBitmapHeader->BytesPerLine; + Bitmap.pData = ((const U8*)pBitmapHeader)+16+4*pBitmapHeader->NumColors; + Bitmap.pPal = &Palette; + Bitmap.XSize = pBitmapHeader->XSize; + Bitmap.YSize = pBitmapHeader->YSize; + Palette.HasTrans = pBitmapHeader->HasTrans; + Palette.NumEntries = pBitmapHeader->NumColors; + Palette.pPalEntries = (const LCD_COLOR*)((const U8*)pBitmapHeader+16); + GUI_DrawBitmap(&Bitmap, x, y); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUITask.c b/User/system/lib/lcd/gui/Core/GUITask.c new file mode 100644 index 0000000..9679f45 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUITask.c @@ -0,0 +1,231 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITASK.C +Purpose : Saves/Restores task context with supported OSs. + It also uses a resource semaphore. + + The following externals are used and should typically be defined + in GUI_X.c: + + U32 GUI_X_GetTaskId(); + void GUI_X_Unlock(); + void GUI_X_Lock(); + +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +3.70 031016 TQ GUI_MAXTASK set to 4 +3.60 030902 TQ GUI_MAXTASK increased to 6 +3.52 030618 RS GUI_MAX_LOCK_NESTING increased +3.40 030228 RS GUI_MAX_LOCK_NESTING introduced +3.02a 020722 RS Use of macro GUI_DEBUG_ERROROUT_IF in order + to simplify th code. +3.02 020514 RS Avoided nested calls of GUI_X_Lock, GUI_X_Unlock + (because some RTOSes, such as CMX and u/C-OS + could not handle this easily) +3.00 010425 RS Cleanup for Version 3.00 + a) Dummy routines added to avoid link errors + in case some modules are compiled with + different settings +1.00.01 990926 RS Fix in order to make sure init task has no + context of its own (_CurrentTaskNo =-1) +1.00.00 990918 RS Initial version for version control purposes. +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Configuration defaults +* +********************************************************************** +*/ + +#ifndef GUI_MAXTASK + #define GUI_MAXTASK (4) +#endif + +#ifndef GUI_MAX_LOCK_NESTING + #define GUI_MAX_LOCK_NESTING 48 /* If a lot of nested dialogs are used, this may not be sufficient. */ +#endif + +#if GUI_OS + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static struct { + U32 TaskID; + GUI_CONTEXT Context; +} _Save[GUI_MAXTASK]; + +static int _CurrentTaskNo = -1; +static int _EntranceCnt = 0; +static U32 _TaskIDLock = 0; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetTaskNo +*/ +static int _GetTaskNo(void) { + int i; + for (i=0; i< GUI_MAXTASK; i++) { + U32 TaskId = GUI_X_GetTaskId(); + if (_Save[i].TaskID == TaskId) + return i; + if (_Save[i].TaskID == 0) { + _Save[i].TaskID = TaskId; + return i; + } + } + GUI_DEBUG_ERROROUT("No Context available for task ... (increase GUI_MAXTASK)"); + return 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Unlock +*/ +void GUI_Unlock(void) { + if (--_EntranceCnt == 0) { + GUI_X_Unlock(); + } + /* Test if _EntranceCnt is in reasonable range ... Not required in release builds */ + GUI_DEBUG_ERROROUT_IF((_EntranceCnt < 0), "GUITASK.c: GUI_Unlock() _EntranceCnt underflow "); +} + +/********************************************************************* +* +* GUI_Lock +*/ +void GUI_Lock(void) { + if (_EntranceCnt == 0) { + GUI_X_Lock(); + _TaskIDLock = GUI_X_GetTaskId(); /* Save task ID */ + } else { + if (_TaskIDLock != GUI_X_GetTaskId()) { + GUI_X_Lock(); + _TaskIDLock = GUI_X_GetTaskId(); /* Save task ID */ + } + } + if (++_EntranceCnt == 1) { + int TaskNo = _GetTaskNo(); + if (TaskNo != _CurrentTaskNo) { + /* Save data of current task */ + if (_CurrentTaskNo>=0) { /* Make sure _CurrentTaskNo is valid */ + _Save[_CurrentTaskNo].Context = GUI_Context; + /* Load data of this task */ + GUI_Context = _Save[TaskNo].Context; + } + _CurrentTaskNo = TaskNo; + } + } + /* Test if _EntranceCnt is in reasonable range ... Not required in release builds */ + GUI_DEBUG_ERROROUT_IF((_EntranceCnt > GUI_MAX_LOCK_NESTING), "GUITASK.c: GUI_Lock() _EntranceCnt overflow "); +} + +/********************************************************************* +* +* GUITASK_Init +*/ +void GUITASK_Init(void) { + _CurrentTaskNo =-1; /* Invalidate */ + GUI_X_InitOS(); +} + + +/********************************************************************* +* +* GUITASK_CopyContext +*/ +void GUITASK_CopyContext(void) { + int i; + for (i = 0; i < GUI_MAXTASK; i++) { + _Save[i].Context = GUI_Context; + _Save[i].TaskID = 0; + } +} + + +#if defined(WIN32) && defined(_DEBUG) + +/********************************************************************* +* +* GUITASK_AssertLock +* +*/ +void GUITASK_AssertLock(void) { + if (!_EntranceCnt) { + GUI_DEBUG_ERROROUT("GUITASK.c: GUITASK_AssertLock failed!"); + } +} + +/********************************************************************* +* +* GUITASK_AssertNoLock +* +*/ +void GUITASK_AssertNoLock(void) { + GUI_Lock(); + if (_EntranceCnt > 1) { + GUI_DEBUG_ERROROUT("GUITASK.c: GUITASK_AssertNoLock failed!"); + } + GUI_Unlock(); +} + +#endif + +#else + +/********************************************************************* +* +* Dummy Kernel routines +* +* The routines below are dummies in case configuration tells us not +* to use any kernel. In this case the routines below should +* not be required, but it can not hurt to have them. The linker +* will eliminate them anyhow. +*/ +void GUI_Unlock(void); +void GUI_Unlock(void) {} +void GUI_Lock(void); +void GUI_Lock(void) {} +void GUITASK_Init(void); +void GUITASK_Init(void) {} +void GUITASK_StoreDefaultContext(void); +void GUITASK_StoreDefaultContext(void) {} + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUITime.c b/User/system/lib/lcd/gui/Core/GUITime.c new file mode 100644 index 0000000..5669d6f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUITime.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITime.C +Purpose : Time related routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetTime +*/ +int GUI_GetTime(void) { + return GUI_X_GetTime(); +} + +/********************************************************************* +* +* GUI_Delay +*/ +void GUI_Delay(int Period) { + int EndTime = GUI_GetTime()+Period; + int tRem; /* remaining Time */ + GUI_ASSERT_NO_LOCK(); + while (tRem = EndTime- GUI_GetTime(), tRem>0) { + GUI_Exec(); + GUI_X_Delay((tRem >5) ? 5 : tRem); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUITimer.c b/User/system/lib/lcd/gui/Core/GUITimer.c new file mode 100644 index 0000000..8cbb749 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUITimer.c @@ -0,0 +1,273 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITimer.c +Purpose : Supplies timers +---------------------------------------------------------------------- +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define GUI_TIMER_H2P(h) (GUI_TIMER_Obj*)GUI_ALLOC_h2p(h) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + GUI_TIMER_CALLBACK* cb; + GUI_TIMER_HANDLE hNext; + int Flags; + U32 Context; + GUI_TIMER_TIME t0; + GUI_TIMER_TIME Period; +} GUI_TIMER_Obj; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +GUI_TIMER_HANDLE hFirstTimer; +GUI_TIMER_HANDLE _hActiveTimer; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Unlink +*/ +static void _Unlink(GUI_TIMER_HANDLE hTimer) { + GUI_TIMER_Obj* pTimer = GUI_TIMER_H2P(hTimer); + GUI_TIMER_HANDLE hi; + GUI_TIMER_Obj* pi; +/* Check if it is the first element */ + if (hFirstTimer == hTimer) { + hFirstTimer = pTimer->hNext; + return; + } + hi = hFirstTimer; +/* Try to find it in the list ... */ + while(hi) { + /* GUI_ASSERT(hi<1000,0); */ + pi = GUI_TIMER_H2P(hi); + if (pi->hNext == hTimer) { + pi->hNext = pTimer->hNext; + break; + } + hi = pi->hNext; + } +} + +/********************************************************************* +* +* _Link +* +* Purpose: +* This routine inserts the new timer (referenced by its handle) into +* the linked list. The linked list is sorted according to timestamps. +* The first element is the timer which expires first. +*/ +static void _Link(GUI_TIMER_HANDLE hNew) { + GUI_TIMER_Obj* pNew = GUI_TIMER_H2P(hNew); + GUI_TIMER_Obj* pTimer; + GUI_TIMER_Obj* pNext; + GUI_TIMER_HANDLE hNext; + if (hFirstTimer ==0) { /* List is empty, make it the only element */ + hFirstTimer = hNew; + pNew->hNext = 0; + } else { + GUI_TIMER_Obj* pFirstTimer = GUI_TIMER_H2P(hFirstTimer); +/* Check if we have to make it the first element */ + if ((pNew->t0 - pFirstTimer->t0) <=0) { + pNew->hNext = hFirstTimer; + hFirstTimer = hNew; + return; + } else { + GUI_TIMER_HANDLE hTimer = hFirstTimer; +/* Put it into the list */ + do { + pTimer = GUI_TIMER_H2P(hTimer); + hNext = pTimer->hNext; + if (hNext ==0) + goto Append; + pNext = GUI_TIMER_H2P(hNext); + if ((pNew->t0 - pNext->t0) <=0) { + pNew->hNext = hNext; + pTimer->hNext= hNew; + return; + } + } while(1); +/* Put it at the end of the list */ +Append: + pNew->hNext = hNext; + pTimer->hNext= hNew; + return; + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_TIMER_Exec +*/ +int GUI_TIMER_Exec(void) { + int r = 0; + GUI_TIMER_TIME t = GUI_GetTime(); + GUI_LOCK(); { + while (hFirstTimer) { + GUI_TIMER_Obj* pTimer = GUI_TIMER_H2P(hFirstTimer); + if ((pTimer->t0-t) <=0) { + GUI_TIMER_MESSAGE tm; + tm.Time = t; + tm.Context = pTimer->Context; + _hActiveTimer = hFirstTimer; + hFirstTimer = pTimer->hNext; + pTimer->cb(&tm); + r = 1; + } else + break; + } + /* + GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj); + pObj->t0 = Time; + */ + } GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_TIMER_Create +*/ +GUI_TIMER_HANDLE GUI_TIMER_Create(GUI_TIMER_CALLBACK* cb, int Time, U32 Context, int Flags) { + GUI_TIMER_HANDLE hObj; + GUI_TIMER_Obj* pObj; + GUI_LOCK(); + GUI_USE_PARA(Flags); + GUI_USE_PARA(Time); + GUI_pfTimerExec = GUI_TIMER_Exec; + { + /* Alloc memory for obj */ + hObj = GUI_ALLOC_AllocZero(sizeof(GUI_TIMER_Obj)); + pObj = GUI_TIMER_H2P(hObj); + /* init member variables */ + pObj->cb = cb; + pObj->Context = Context; + pObj->t0 = Time; //houhh 20061018... + /* Link it */ + _Link(hObj); + } GUI_UNLOCK(); + return hObj; +} + +/********************************************************************* +* +* GUI_TIMER_Delete +*/ +void GUI_TIMER_Delete(GUI_TIMER_HANDLE hObj) { +/* Unlink Timer */ + GUI_LOCK(); + _Unlink(hObj); + GUI_ALLOC_Free(hObj); + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_TIMER_SetPeriod +*/ +void GUI_TIMER_SetPeriod(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Period) { + GUI_LOCK(); { + GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj); + pObj->Period = Period; + } GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_TIMER_SetTime +*/ +void GUI_TIMER_SetTime(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Time) { + GUI_LOCK(); { + GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj); + pObj->t0 = Time; + } GUI_UNLOCK(); +} + +////// +void GUI_TIMER_Context(GUI_TIMER_HANDLE hObj, U32 Context) { + GUI_LOCK(); { + GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj); + pObj->Context = Context; + } GUI_UNLOCK(); +} +////// + +/********************************************************************* +* +* GUI_TIMER_SetDelay +*/ +void GUI_TIMER_SetDelay(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Delay) { + GUI_LOCK(); { + GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj); + pObj->t0 = Delay; + _Unlink(hObj); + _Link(hObj); + } GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_TIMER_Restart +*/ +void GUI_TIMER_Restart(GUI_TIMER_HANDLE hObj) { + GUI_TIMER_Obj* pObj; + GUI_LOCK(); + { + if (hObj == 0) { + hObj = _hActiveTimer; + } + pObj = GUI_TIMER_H2P(hObj); + pObj->t0 = GUI_GetTime() +pObj->Period; + _Unlink(hObj); + _Link(hObj); + } GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIType.h b/User/system/lib/lcd/gui/Core/GUIType.h new file mode 100644 index 0000000..de22bc3 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIType.h @@ -0,0 +1,385 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIType.h +Purpose : Include file define the types used for GUI +---------------------------END-OF-HEADER------------------------------ + +Attention : Do not modify this file ! If you do, you will not + be able do update to a later GUI version ! + +*/ + +#ifndef GUITYPE_H_INCLUDED +#define GUITYPE_H_INCLUDED + +#include "LCD.h" +#include "GUIConf.h" + +/* ************************************************************* + * * + * Simple types * + * * + ************************************************************* +*/ + +typedef const char * GUI_ConstString; + + +/* ************************************************************* + * * + * Structures * + * * + ************************************************************* +*/ + +typedef LCD_COLOR GUI_COLOR; +typedef LCD_LOGPALETTE GUI_LOGPALETTE; +typedef LCD_DRAWMODE GUI_DRAWMODE; +typedef LCD_RECT GUI_RECT; + +typedef struct { + void (* pfDraw)(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag); + GUI_COLOR (* pfIndex2Color)(int Index); +} GUI_BITMAP_METHODS; + +typedef struct { + U16P XSize; + U16P YSize; + U16P BytesPerLine; + U16P BitsPerPixel; + const U8 GUI_UNI_PTR * pData; + const GUI_LOGPALETTE GUI_UNI_PTR * pPal; + const GUI_BITMAP_METHODS * pMethods; +} GUI_BITMAP; + +/* This structure may not be changed because the data that it + expects is read in binary form (via any kind of interface, + at runtime). + This structure should therefor not be changed. +*/ +typedef struct { + U16 ID; /* Version 1.00 => 100*/ + U16 Version; + U16 XSize; + U16 YSize; + U16 BytesPerLine; + U16 BitsPerPixel; + U16 NumColors; + U16 HasTrans; +} GUI_BITMAP_STREAM; + +typedef struct { + int x,y; + unsigned char Pressed; +} GUI_PID_STATE; + +/* + **************************************** + * * + * FONT structures (new in V1.10) * + * * + **************************************** +*/ + +/* Translation list. Translates a character code into up to 2 + indices of images to display on top of each other; + '' -> index('a'), index('') */ +typedef struct { + I16P c0; + I16P c1; +} GUI_FONT_TRANSLIST; + +typedef struct { + U16P FirstChar; + U16P LastChar; + const GUI_FONT_TRANSLIST GUI_UNI_PTR * pList; +} GUI_FONT_TRANSINFO; + +typedef struct { + U8 XSize; + U8 XDist; + U8 BytesPerLine; + const unsigned char GUI_UNI_PTR * pData; +} GUI_CHARINFO; + +typedef struct GUI_FONT_PROP { + U16P First; /* first character */ + U16P Last; /* last character */ + const GUI_CHARINFO GUI_UNI_PTR * paCharInfo; /* address of first character */ + const struct GUI_FONT_PROP GUI_UNI_PTR * pNext; /* pointer to next */ +} GUI_FONT_PROP; + +typedef struct { + const unsigned char GUI_UNI_PTR * pData; + const U8 GUI_UNI_PTR * pTransData; + const GUI_FONT_TRANSINFO GUI_UNI_PTR * pTrans; + U16P FirstChar; + U16P LastChar; + U8 XSize; + U8 XDist; + U8 BytesPerLine; +} GUI_FONT_MONO; + + +typedef struct GUI_FONT_INFO { + U16P First; /* first character */ + U16P Last; /* last character */ + const GUI_CHARINFO* paCharInfo; /* address of first character */ + const struct GUI_FONT_INFO* pNext; /* pointer to next */ +} GUI_FONT_INFO; + +/* + **************************************** + * * + * FONT info structure * + * * + **************************************** + +This structure is used when retrieving information about a font. +It is designed for future expansion without incompatibilities. +*/ +typedef struct { + U16 Flags; + U8 Baseline; + U8 LHeight; /* height of a small lower case character (a,x) */ + U8 CHeight; /* height of a small upper case character (A,X) */ +} GUI_FONTINFO; + +#define GUI_FONTINFO_FLAG_PROP (1<<0) /* Is proportional */ +#define GUI_FONTINFO_FLAG_MONO (1<<1) /* Is monospaced */ +#define GUI_FONTINFO_FLAG_AA (1<<2) /* Is an antialiased font */ +#define GUI_FONTINFO_FLAG_AA2 (1<<3) /* Is an antialiased font, 2bpp */ +#define GUI_FONTINFO_FLAG_AA4 (1<<4) /* Is an antialiased font, 4bpp */ + + +/********************************************************************** +* +* UNICODE Encoding +* +*********************************************************************** +*/ +typedef U16 tGUI_GetCharCode(const char GUI_UNI_PTR *s); +typedef int tGUI_GetCharSize(const char GUI_UNI_PTR *s); +typedef int tGUI_CalcSizeOfChar(U16 Char); +typedef int tGUI_Encode(char *s, U16 Char); + +typedef struct { + tGUI_GetCharCode* pfGetCharCode; + tGUI_GetCharSize* pfGetCharSize; + tGUI_CalcSizeOfChar* pfCalcSizeOfChar; + tGUI_Encode* pfEncode; +} GUI_UC_ENC_APILIST; + +/********************************************************************** +* +* FONT Encoding +* +*********************************************************************** +*/ + +typedef int tGUI_GetLineDistX(const char GUI_UNI_PTR *s, int Len); +typedef int tGUI_GetLineLen(const char GUI_UNI_PTR *s, int MaxLen); +typedef void tGL_DispLine(const char GUI_UNI_PTR *s, int Len); + +typedef struct { + tGUI_GetLineDistX* pfGetLineDistX; + tGUI_GetLineLen* pfGetLineLen; + tGL_DispLine* pfDispLine; +} tGUI_ENC_APIList; + +extern const tGUI_ENC_APIList GUI_ENC_APIList_SJIS; + + +/* + **************************************** + * * + * FONT methods * + * * + **************************************** + +The parameter to the methods called pFont should be of type +GUI_FONT, but unfortunately a lot of compilers can not handle +forward declarations right ... +So it ends up to be a void pointer. +*/ + +typedef struct GUI_FONT GUI_FONT; + +typedef void GUI_DISPCHAR(U16 c); +typedef int GUI_GETCHARDISTX(U16P c); +typedef void GUI_GETFONTINFO(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pfi); +typedef char GUI_ISINFONT (const GUI_FONT GUI_UNI_PTR * pFont, U16 c); + +#define DECLARE_FONT(Type) \ +void GUI##Type##_DispChar (U16P c); \ +int GUI##Type##_GetCharDistX(U16P c); \ +void GUI##Type##_GetFontInfo (const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pfi); \ +char GUI##Type##_IsInFont (const GUI_FONT GUI_UNI_PTR * pFont, U16 c) + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/* MONO: Monospaced fonts */ +DECLARE_FONT(MONO); +#define GUI_FONTTYPE_MONO \ + GUIMONO_DispChar, \ + GUIMONO_GetCharDistX, \ + GUIMONO_GetFontInfo, \ + GUIMONO_IsInFont, \ + (tGUI_ENC_APIList*)0 + +/* PROP: Proportional fonts */ +DECLARE_FONT(PROP); +#define GUI_FONTTYPE_PROP \ + GUIPROP_DispChar, \ + GUIPROP_GetCharDistX, \ + GUIPROP_GetFontInfo, \ + GUIPROP_IsInFont, \ + (tGUI_ENC_APIList*)0 + +/* PROP: Proportional fonts SJIS */ +DECLARE_FONT(PROP); +#define GUI_FONTTYPE_PROP_SJIS \ + GUIPROP_DispChar, \ + GUIPROP_GetCharDistX, \ + GUIPROP_GetFontInfo, \ + GUIPROP_IsInFont, \ + &GUI_ENC_APIList_SJIS + +/* PROPAA: Proportional, antialiased fonts */ +DECLARE_FONT(PROPAA); +#define GUI_FONTTYPE_PROPAA \ + GUIPROPAA_DispChar, \ + GUIPROPAA_GetCharDistX, \ + GUIPROPAA_GetFontInfo, \ + GUIPROPAA_IsInFont, \ + (tGUI_ENC_APIList*)0 + +/* PROPAA: Proportional, antialiased fonts, 2bpp */ +DECLARE_FONT(PROP_AA2); +#define GUI_FONTTYPE_PROP_AA2 \ + GUIPROP_AA2_DispChar, \ + GUIPROP_AA2_GetCharDistX, \ + GUIPROP_AA2_GetFontInfo, \ + GUIPROP_AA2_IsInFont, \ + (tGUI_ENC_APIList*)0 + +/* PROPAA: Proportional, antialiased fonts, 2bpp, SJIS encoding */ +DECLARE_FONT(PROP_AA2); +#define GUI_FONTTYPE_PROP_AA2_SJIS \ + GUIPROP_AA2_DispChar, \ + GUIPROP_AA2_GetCharDistX, \ + GUIPROP_AA2_GetFontInfo, \ + GUIPROP_AA2_IsInFont, \ + GUI_ENCODE_SJIS + +/* PROPAA: Proportional, antialiased fonts, 4bpp */ +DECLARE_FONT(PROP_AA4); +#define GUI_FONTTYPE_PROP_AA4 \ + GUIPROP_AA4_DispChar, \ + GUIPROP_AA4_GetCharDistX, \ + GUIPROP_AA4_GetFontInfo, \ + GUIPROP_AA4_IsInFont, \ + (tGUI_ENC_APIList*)0 + +/* PROPAA: Proportional, antialiased fonts, 4bpp, SJIS encoding */ +DECLARE_FONT(PROP_AA4); +#define GUI_FONTTYPE_PROP_AA4_SJIS \ + GUIPROP_AA4_DispChar, \ + GUIPROP_AA4_GetCharDistX, \ + GUIPROP_AA4_GetFontInfo, \ + GUIPROP_AA4_IsInFont, \ + GUI_ENCODE_SJIS + +#if defined(__cplusplus) + } +#endif + +struct GUI_FONT { + GUI_DISPCHAR* pfDispChar; + GUI_GETCHARDISTX* pfGetCharDistX; + GUI_GETFONTINFO* pfGetFontInfo; + GUI_ISINFONT* pfIsInFont; + const tGUI_ENC_APIList* pafEncode; + U8 YSize; + U8 YDist; + char XMag; + char YMag; + union { + const void GUI_UNI_PTR * pFontData; + const GUI_FONT_MONO GUI_UNI_PTR * pMono; + const GUI_FONT_PROP GUI_UNI_PTR * pProp; + } p; + U8 Baseline; + U8 LHeight; /* height of a small lower case character (a,x) */ + U8 CHeight; /* height of a small upper case character (A,X) */ +}; + +/********************************************************************* +* +* Position independent font structures +*/ +typedef struct { + U32 ID; /* Font file ID */ + U16 YSize; /* Height of font */ + U16 YDist; /* Space of font Y */ + U16 Baseline; /* Index of baseline */ + U16 LHeight; /* Height of a small lower case character (a) */ + U16 CHeight; /* Height of a upper case character (A) */ + U16 NumAreas; /* Number of character areas */ +} GUI_SI_FONT; + +typedef struct { + U16 First; /* Index of first character */ + U16 Last; /* Index of last character */ +} GUI_SIF_CHAR_AREA; + +typedef struct { + U16 XSize; /* Size of bitmap data in X */ + U16 XDist; /* Number of pixels for increment cursor in X */ + U16 BytesPerLine; /* Number of bytes per line */ + U16 Dummy; + U32 OffData; /* Offset of pixel data */ +} GUI_SIF_CHARINFO; + +typedef struct tGUI_SIF_APIList_struct { + GUI_DISPCHAR * pDispChar; + GUI_GETCHARDISTX * pGetCharDistX; + GUI_GETFONTINFO * pGetFontInfo; + GUI_ISINFONT * pIsInFont; +} tGUI_SIF_APIList; + +#define GUI_SIF_TYPE tGUI_SIF_APIList +#define GUI_SIF_TYPE_PROP &GUI_SIF_APIList_Prop + +extern const tGUI_SIF_APIList GUI_SIF_APIList_Prop; + +/* + ********************************* + * * + * Typedefs * + * * + ********************************* +*/ + +#ifndef GUI_HMEM + #define GUI_HMEM I16P +#endif +#define GUI_HMEM_NULL (0) +typedef GUI_HMEM GUI_HWIN; +#endif /* GUITYPE_H_INCLUDED */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIUC0.c b/User/system/lib/lcd/gui/Core/GUIUC0.c new file mode 100644 index 0000000..87059c9 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIUC0.c @@ -0,0 +1,74 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIUC0.C +Purpose : Implementation of character and string services +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_UC2DB +* +* Purpose: +* Convert Convert UNICODE 16-bit value into double byte version +* - Byte0: First byte, msb +* - Byte1: Last byte, lsb +*/ +void GUI_UC2DB(U16 Code, U8* pOut) { +/* move regular ASCII to (unused) 0xE000-0xE0ff area */ + if (Code < 0x100) { + if (Code !=0) /* end marker ? */ + Code += 0xe000; + } else { +/* If Low byte 0: Move to (unused) 0xE100-0xE1ff area */ + if ((Code&0xff) == 0) { + Code = (Code>>8) +0xe100; + } + } +/* Convert into double byte, putting msb first*/ + *pOut++ = Code >> 8; /* Save msb first */ + *pOut = Code & 0xff; +} + +/********************************************************************* +* +* GUI_DB2UC +* +* Purpose: +* Convert Unicode double byte into UNICODE. +* - Byte0: First byte, msb +* - Byte1: Last byte, lsb +*/ +U16 GUI_DB2UC(U8 Byte0, U8 Byte1) { + if (Byte0==0) + return 0; + if ((Byte0&0xfe) == 0xe0) { + if (Byte0 == 0xe0) /* ASCII */ + return Byte1; + return ((U16)Byte1)<<8; /* low byte was zero */ + } + return Byte1 | (((U16)Byte0)<<8); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIVal.c b/User/system/lib/lcd/gui/Core/GUIVal.c new file mode 100644 index 0000000..b845481 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIVal.c @@ -0,0 +1,111 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIVAL.C +Purpose : Routines to display values as dec, binary or hex +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include "string.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispDecShift +*/ +void GUI_DispDecShift(I32 v, U8 Len, U8 Shift) { + char ac[12]; + char* s = ac; + GUI_AddDecShift(v, Len, Shift, &s); + GUI_DispString(ac); +} + +/********************************************************************* +* +* GUI_DispSDecShift +*/ +void GUI_DispSDecShift(I32 v, U8 Len, U8 Shift) { + char ac[12]; + char* s = ac; + v = GUI_AddSign(v, &s); + GUI_AddDecShift(v, --Len, Shift, &s); + GUI_DispString(ac); +} + +/********************************************************************* +* +* GUI_DispDecMin +*/ +void GUI_DispDecMin(I32 v) { + char ac[12]; + char* s = ac; + GUI_AddDecMin(v, &s); + GUI_DispString(ac); +} + +/********************************************************************* +* +* GUI_DispDecSpace +*/ +void GUI_DispDecSpace(I32 v, U8 MaxDigits) { + char ac[12]; + char* s = ac; + U8 Len; + if (v < 0) { + v = GUI_AddSign(v, &s); + MaxDigits--; + } + Len = GUI_Long2Len(v); + while (Len++ < MaxDigits) { + *s++ = ' '; + } + GUI_AddDecMin(v, &s); + GUI_DispString(ac); +} + +/********************************************************************* +* +* GUI_DispSDec +*/ +void GUI_DispSDec(I32 v, U8 Len) { + GUI_DispSDecShift(v,Len,0); +} + +/********************************************************************* +* +* GUI_DispDec +*/ +void GUI_DispDec(I32 v, U8 Len) { + GUI_DispDecShift(v, Len,0); +} + +/********************************************************************* +* +* GUI_DispDecAt +*/ +void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len) { + char ac[12]; + char* s = ac; + GUI_AddDecShift(v, Len, 0, &s); + GUI_DispStringAt(ac, x, y); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIValf.c b/User/system/lib/lcd/gui/Core/GUIValf.c new file mode 100644 index 0000000..9e714f6 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIValf.c @@ -0,0 +1,110 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIValF.C +Purpose : Displaying floating point values +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "math.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DispFloatFix +*/ +static void _DispFloatFix(float f, char Len, char Decs, int DrawPlusSign) { + f *= GUI_Pow10[(unsigned)Decs]; + f += 0.5f; + f = (float) floor (f); + if (DrawPlusSign) { + GUI_DispSDecShift((long)f, Len, Decs); + } else { + GUI_DispDecShift((long)f, Len, Decs); + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispFloatFix +*/ +void GUI_DispFloatFix(float f, char Len, char Decs) { + _DispFloatFix(f, Len, Decs, 0); +} + +/********************************************************************* +* +* GUI_DispFloatMin +*/ +void GUI_DispFloatMin(float f, char Fract) { + char Len; + Len = GUI_Long2Len((long)f); + if ((f < 0) && (f > -1)) { /* If value < 0 and > -1 (e.g. -0.123) increment length by 1 */ + Len++; + } + _DispFloatFix(f, (char)(Len + Fract + (Fract ? 1 : 0)), (char)Fract, 0); +} + +/********************************************************************* +* +* GUI_DispFloat +*/ +void GUI_DispFloat(float f, char Len) { + int Decs; + Decs = Len - GUI_Long2Len((long)f)-1; + if ((f < 0) && (f > -1)) { /* If value < 0 and > -1 (e.g. -0.123) decrement Decs */ + Decs--; + } + if (Decs<0) + Decs =0; + _DispFloatFix(f, Len, (char)Decs, 0); +} + +/********************************************************************* +* +* GUI_DispSFloatFix +*/ +void GUI_DispSFloatFix(float f, char Len, char Fract) { + _DispFloatFix (f, Len, Fract, 1); +} + +/********************************************************************* +* +* GUI_DispSFloatMin +*/ +void GUI_DispSFloatMin(float f, char Fract) { + char Len; + Len = GUI_Long2Len((long)f); + if ((f < 0) && (f > -1)) { /* If value < 0 and > -1 (e.g. -0.123) increment length by 1 */ + Len++; + } + if (f>0) { + Len++; + } + _DispFloatFix(f, (char)(Len + Fract + (Fract ? 1 : 0)), (char)Fract, 1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUIVersion.h b/User/system/lib/lcd/gui/Core/GUIVersion.h new file mode 100644 index 0000000..bb3fa3b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUIVersion.h @@ -0,0 +1,27 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIVersion.h +Purpose : Include file defining current GUI version +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef GUI_VERSION_H +#define GUI_VERSION_H + +#define GUI_VERSION 39001 + +#endif /* Avoid multiple inclusion */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c new file mode 100644 index 0000000..5f44ff4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c @@ -0,0 +1,61 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIAlloc.C +Purpose : Dynamic memory management +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include /* for memcpy, memset */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Internal memory management +* +********************************************************************** +*/ + +/********************************************************************* +* +* GUI_ALLOC_AllocInit +* +* Purpose: +* Alloc memory block of the given size and initialize from the given pointer. +* If the pointer is a NULL pointer, zeroinit +*/ +GUI_HMEM GUI_ALLOC_AllocInit(const void *pInitData, GUI_ALLOC_DATATYPE Size) { + GUI_HMEM hMem; + GUI_LOCK(); + if (Size == 0) { + return (GUI_HMEM)0; + } + hMem = GUI_ALLOC_AllocNoInit(Size); + if (hMem) { + void *pMem; + pMem = GUI_ALLOC_h2p(hMem); + if (pInitData) { + memcpy(pMem, pInitData, Size); + } else { + GUI_MEMSET((U8*)pMem, 0, Size); + } + } + GUI_UNLOCK(); + return hMem; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c new file mode 100644 index 0000000..69bc100 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIAlloc.C +Purpose : Dynamic memory management +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include /* for memcpy, memset */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Internal memory management +* +********************************************************************** +*/ + +/********************************************************************* +* +* GUI_ALLOC_AllocZero +*/ +GUI_HMEM GUI_ALLOC_AllocZero(GUI_ALLOC_DATATYPE Size) { + GUI_HMEM hMem; + GUI_LOCK(); + GUI_DEBUG_LOG2("\nGUI_ALLOC_Alloc... requesting %d, %d avail", Size, GUI_ALLOC_GetMaxSize()); + hMem = GUI_ALLOC_AllocNoInit(Size); + if (hMem) { + GUI_MEMSET((U8*)GUI_ALLOC_h2p(hMem), 0, Size); /* Zeroinit ! */ + } + GUI_UNLOCK(); + return hMem; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_AddBin.c b/User/system/lib/lcd/gui/Core/GUI_AddBin.c new file mode 100644 index 0000000..6159e7e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_AddBin.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_AddBin.c +Purpose : Converts binary value 2 string +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AddBin +*/ +void GUI_AddBin(U32 v, U8 Len, char** ps) { + char *s = *ps; +#if GUI_DEBUG_LEVEL >1 + if (Len > 32) { + GUI_DEBUG_WARN("Can not display more than 32 bin. digits"); + Len = 32; + } +#endif + (*ps) += Len; + **ps = '\0'; /* Make sure string is 0-terminated */ + while(Len--) { + *(s + Len) = (char)('0' + (v & 1)); + v >>= 1; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_AddDec.c b/User/system/lib/lcd/gui/Core/GUI_AddDec.c new file mode 100644 index 0000000..aecc5f5 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_AddDec.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_AddDec.c +Purpose : Routines to display values in decimal form +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include "string.h" + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AddDec +*/ +void GUI_AddDec(I32 v, U8 Len, char**ps) { + GUI_AddDecShift(v, Len, 0, ps); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_AddDecMin.c b/User/system/lib/lcd/gui/Core/GUI_AddDecMin.c new file mode 100644 index 0000000..81cf36a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_AddDecMin.c @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_AddDecMin.c +Purpose : Routines to display values in decimal form +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include "string.h" + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AddDecMin +*/ +void GUI_AddDecMin(I32 v, char**ps) { + U8 Len = GUI_Long2Len(v); + GUI_AddDecShift(v, Len, 0, ps); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_AddDecShift.c b/User/system/lib/lcd/gui/Core/GUI_AddDecShift.c new file mode 100644 index 0000000..1471e96 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_AddDecShift.c @@ -0,0 +1,137 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_AddDecShift.c +Purpose : Routines to display values as dec +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include "string.h" + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +const U32 GUI_Pow10[10] = { + 1 , 10, 100, 1000, 10000, + 100000, 1000000, 10000000, 100000000, 1000000000 +}; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _Check_NegLong +*/ +static int _Check_NegLong(I32 *pv, char**ps) { + if (*pv < 0) { + *(*ps)++ = '-'; + *pv = -*pv; + return 1; + } + return 0; +} + +/********************************************************************* +* +* Module internal routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Long2Len +*/ +int GUI_Long2Len(I32 vSign) { + int Len = 1; + I32 v = (vSign > 0) ? vSign : -vSign; + while (( ((U32)v) >= GUI_Pow10[Len]) && (Len < 9)) { + Len++; + } + if (vSign < 0) { + Len++; + } + return Len; +} + +/********************************************************************* +* +* GUI_AddSign +*/ +long GUI_AddSign(long v, char**ps) { + char c; + if (v < 0) { + c = '-'; + v = -v; + } else { + c = '+'; + } + *(*ps)++ = c; + **ps = '\0'; + return v; +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AddDecShift +*/ +void GUI_AddDecShift(I32 v, U8 Len, U8 Shift, char**ps) { + char c; + long d; + #ifndef _CM16C + Len -= _Check_NegLong(&v, ps); /* TASKING: Tool internal error S003: asertion failed - please report */ + #else + if (v < 0) { + *(*ps)++ = '-'; + v = -v; + } + #endif + if (Shift) { + Len--; + } +#if GUI_DEBUG_LEVEL >1 + if (Len > 9) { + Len = 9; + GUI_DEBUG_ERROROUT("Can not display more than 9 dec. digits"); + } +#endif + if ((U32)v >= GUI_Pow10[Len]) + v = GUI_Pow10[Len] - 1; + while (Len) { + if (Len-- == Shift) + *(*ps)++ = GUI_DecChar; + d = GUI_Pow10[Len]; + c = (char) (v / d); + v -= c * d; + *(*ps)++ = c + '0'; + } + **ps = 0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_AddHex.c b/User/system/lib/lcd/gui/Core/GUI_AddHex.c new file mode 100644 index 0000000..90a54ab --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_AddHex.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_AddHex.c +Purpose : Converts hex value 2 string +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const char acHex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_AddHex +*/ +void GUI_AddHex(U32 v, U8 Len, char**ps) { + char *s = *ps; + if (Len > 8) { + return; + } + (*ps) += Len; + **ps = '\0'; /* Make sure string is 0-terminated */ + while(Len--) { + *(s + Len) = acHex[v & 15]; + v >>= 4; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c b/User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c new file mode 100644 index 0000000..57bef5d --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetKeyMsgHook.c +Purpose : Implementation of GUI_SetKeyMsgHook +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetKeyMsgHook +*/ +GUI_KEY_MSG_HOOK* GUI_SetKeyMsgHook(GUI_KEY_MSG_HOOK* pHook) { + GUI_KEY_MSG_HOOK* r; + r = GUI_pfKeyMsgHook; + GUI_pfKeyMsgHook = pHook; + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_BMP.c b/User/system/lib/lcd/gui/Core/GUI_BMP.c new file mode 100644 index 0000000..52a6852 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_BMP.c @@ -0,0 +1,214 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_BMP.c +Purpose : Implementation of GUI_BMP... functions +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "GUI_Private.h" + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetStep +*/ +static int _GetStep(int * pYSize, int * pY) { + if (*pYSize > 0) { + *pY = *pYSize - 1; + return -1; + } else if (*pYSize < 0) { + *pYSize = -*pYSize; + *pY = 0; + return 1; + } else { + return 0; + } +} + +/********************************************************************* +* +* _DrawBitmap_Pal +*/ +static int _DrawBitmap_Pal(const U8 * pData, int x0, int y0, int XSize, int YSize, int Bpp, int NumColors) { + int i, y, Step; + int BytesPerLine = 0; + Step = _GetStep(&YSize, &y); + if (!Step) { + return 1; + } + for (i = 0; i < NumColors; i++) { + U8 r, g, b; + b = *(pData); + g = *(pData + 1); + r = *(pData + 2); + pData += 4; + LCD__aConvTable[i] = LCD_Color2Index(((U32)b << 16) | (g << 8) | r); + } + switch (Bpp) { + case 1: + BytesPerLine = ((XSize + 31) >> 5) << 2; + break; + case 4: + BytesPerLine = (((XSize << 2) + 31) >> 5) << 2; + break; + case 8: + BytesPerLine = ((XSize + 3) >> 2) << 2; + break; + } + for (; (y < YSize) && (y >= 0); y += Step) { + LCD_DrawBitmap(x0, y0 + y, XSize, 1, 1, 1, Bpp, XSize, pData, LCD__aConvTable); + pData += BytesPerLine; + } + return 0; +} + +/********************************************************************* +* +* _DrawBitmap_24bpp +*/ +static int _DrawBitmap_24bpp(const U8 * pData, int x0, int y0, int XSize, int YSize) { + int x, y, BytesPerLine, Step; + Step = _GetStep(&YSize, &y); + if (!Step) { + return 1; + } + BytesPerLine = ((24 * XSize + 31) >> 5) << 2; + for (; (y < YSize) && (y >= 0); y += Step) { + for (x = 0; x < XSize; x++) { + const U8 * pColor = pData + 3 * x; + U8 r, g, b; + b = *(pColor); + g = *(pColor + 1); + r = *(pColor + 2); + LCD_SetPixelIndex(x0 + x, y0 + y, LCD_Color2Index(((U32)b << 16) | (g << 8) | r)); + } + pData += BytesPerLine; + } + return 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_BMP_GetXSize +*/ +int GUI_BMP_GetXSize(const void * pBMP) { + const U8 * pSrc = (const U8 *)pBMP; + if (!pBMP) { + return 0; + } + pSrc += 18; /* skip rest of BITMAPFILEHEADER */ + return GUI__Read32(&pSrc); +} + +/********************************************************************* +* +* GUI_BMP_GetYSize +*/ +int GUI_BMP_GetYSize(const void * pBMP) { + const U8 * pSrc = (const U8 *)pBMP; + if (!pBMP) { + return 0; + } + pSrc += 22; + return labs((int)GUI__Read32(&pSrc)); +} + +/********************************************************************* +* +* GUI_BMP_Draw +*/ +int GUI_BMP_Draw(const void * pBMP, int x0, int y0) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + int Ret = 0; + I32 Width, Height; + U16 BitCount, Type; + U32 ClrUsed, Compression; + int NumColors; + const U8 * pSrc = (const U8 *)pBMP; + Type = GUI__Read16(&pSrc); /* get type from BITMAPFILEHEADER */ + pSrc += 12; /* skip rest of BITMAPFILEHEADER */ + /* get values from BITMAPINFOHEADER */ + pSrc += 4; + Width = GUI__Read32(&pSrc); + Height = GUI__Read32(&pSrc); + pSrc += 2; + BitCount = GUI__Read16(&pSrc); + Compression = GUI__Read32(&pSrc); + pSrc += 12; + ClrUsed = GUI__Read32(&pSrc); + pSrc += 4; + /* calculate number of colors */ + switch (BitCount) { + case 0: return 1; /* biBitCount = 0 (JPEG format) not supported. Please convert image ! */ + case 1: NumColors = 2; break; + case 4: NumColors = 16; break; + case 8: NumColors = 256; break; + case 24: NumColors = 0; break; + default: + return 1; /* biBitCount should be 1, 4, 8 or 24 */ + } + if (NumColors && ClrUsed) { + NumColors = ClrUsed; + } + /* check validity of bmp */ + if ((NumColors > LCD_MAX_LOG_COLORS) || + (Type != 0x4d42) || /* 'BM' */ + (Compression) || /* only uncompressed bitmaps */ + (Width > 1024) || + (Height > 1024)) { + return 1; + } + /* start output */ + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + r.x1 = (r.x0 = x0) + Width - 1; + r.y1 = (r.y0 = y0) + Height - 1; + WM_ITERATE_START(&r) { + #endif + /* Show bitmap */ + switch (BitCount) { + case 1: + case 4: + case 8: + Ret = _DrawBitmap_Pal(pSrc, x0, y0, Width, Height, BitCount, NumColors); + break; + case 24: + Ret = _DrawBitmap_24bpp(pSrc, x0, y0, Width, Height); + break; + } + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); + return Ret; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c b/User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c new file mode 100644 index 0000000..dc2824e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c @@ -0,0 +1,133 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_BMP_Serialize.c +Purpose : Implementation of GUI_BMP_Serialize +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define DIB_HEADER_MARKER ((U16) ('M' << 8) | 'B') /* DIB Header Marker - used in writing DIBs to files */ + +#define SIZEOF_BITMAPFILEHEADER 14 +#define SIZEOF_BITMAPINFOHEADER 40 + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _SendU16 +*/ +static void _SendU16(GUI_CALLBACK_VOID_U8_P * pfSerialize, U16 Data, void * p) { + (*pfSerialize)((U8)Data, p); + (*pfSerialize)(Data >> 8, p); +} + +/********************************************************************* +* +* _SendU32 +*/ +static void _SendU32(GUI_CALLBACK_VOID_U8_P * pfSerialize, U32 Data, void * p) { + _SendU16(pfSerialize, (U16)Data, p); + _SendU16(pfSerialize, Data >> 16, p); +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_BMP_SerializeEx +*/ +void GUI_BMP_SerializeEx(GUI_CALLBACK_VOID_U8_P * pfSerialize, int x0, int y0, int xSize, int ySize, void * p) { + int x, y, i; + U32 BitmapOffset, FileSize; + int BPP = LCD_GetBitsPerPixel(); + int BytesPerLine = ((BPP > 8) ? (2 * xSize + 2) : (xSize + 3)) & ~3; + int NumColors = (BPP > 8) ? 0 : (1 << BPP); + /* Write BITMAPFILEHEADER */ + BitmapOffset = SIZEOF_BITMAPFILEHEADER + + SIZEOF_BITMAPINFOHEADER + + NumColors * 4; + FileSize = BitmapOffset + + ySize * BytesPerLine; + _SendU16(pfSerialize, DIB_HEADER_MARKER, p); /* bfType */ + _SendU32(pfSerialize, FileSize, p); /* bfSize */ + _SendU32(pfSerialize, 0, p); /* bfReserved1, bfReserved2 */ + _SendU32(pfSerialize, BitmapOffset, p); /* bfOffBits */ + /* Write BITMAPINFOHEADER */ + _SendU32(pfSerialize, SIZEOF_BITMAPINFOHEADER, p); /* biSize */ + _SendU32(pfSerialize, xSize, p); /* biWidth */ + _SendU32(pfSerialize, ySize, p); /* biHeighth */ + _SendU16(pfSerialize, 1, p); /* biPlanes */ + _SendU16(pfSerialize, (BPP <= 8) ? 8 : 16, p); /* biBitCount */ + _SendU32(pfSerialize, 0, p); /* biCompression */ + _SendU32(pfSerialize, 0, p); /* biSizeImage */ + _SendU32(pfSerialize, 0, p); /* biXPelsPerMeter */ + _SendU32(pfSerialize, 0, p); /* biYPelsPerMeter */ + _SendU32(pfSerialize, NumColors, p); /* biClrUsed */ + _SendU32(pfSerialize, 0, p); /* biClrImportant */ + /* Write palette */ + for (i = 0; i < NumColors; i++) { + U32 Color; + Color = GUI_Index2Color(i); + Color = ((Color >> 16) & 255) | (Color & 0xff00) | ((Color & 0xff) << 16); + _SendU32(pfSerialize, Color, p); + } + /* Write pixels */ + for (y = ySize - 1; y >= 0; y--) { + for (x = 0; x < xSize; x++) { + if (BPP <= 8) { + pfSerialize(LCD_GetPixelIndex(x0 + x, y0 + y), p); + } else { + U16 Color16; + U32 Color = LCD_GetPixelColor(x0 + x, y0 + y); + int b = ((Color >> 16) * 31 + 127) / 255; + int g = (((Color >> 8) & 255) * 31 + 127) / 255; + int r = ((Color & 255) * 31 + 127) / 255; + Color16 = (r << 10) | (g << 5) | b; /* 16 bpp Bitmaps in windows are 555: rrrrrgggggbbbbb */ + _SendU16(pfSerialize, Color16, p); + } + } + /* Align pointer to next U32 */ + for (i = BytesPerLine & 3; i > 0; i--) { + pfSerialize(0, p); + } + } +} + +/********************************************************************* +* +* GUI_BMP_Serialize +*/ +void GUI_BMP_Serialize(GUI_CALLBACK_VOID_U8_P * pfSerialize, void * p) { + GUI_BMP_SerializeEx(pfSerialize, 0, 0, LCD_GetXSize(), LCD_GetYSize(), p); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c b/User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c new file mode 100644 index 0000000..bc957dd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c @@ -0,0 +1,81 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CalcColorDist +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI.h" + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#if 1 /* Normaly calculate square values */ + + #define SQUARE(Dist) ((U16)Dist) * ((U16)Dist) + +#else + + #define S(x) ((x)*(x)) + #define SQUARES(Base) S(Base+0), S(Base+1), S(Base+2), S(Base+3), S(Base+4), S(Base+5), \ + S(Base+6), S(Base+7), S(Base+8), S(Base+9), S(Base+10), S(Base+11), \ + S(Base+12), S(Base+13), S(Base+14), S(Base+15) + + static const U16 aSquare[] = { + SQUARES(0*16) + ,SQUARES(1*16), SQUARES(2*16), SQUARES(3*16) + ,SQUARES(4*16) ,SQUARES(5*16), SQUARES(6*16), SQUARES(7*16) + ,SQUARES(8*16) ,SQUARES(9*16), SQUARES(10*16),SQUARES(11*16) + ,SQUARES(12*16),SQUARES(13*16),SQUARES(14*16),SQUARES(15*16) + }; + + #define SQUARE(Dist) aSquare[Dist] + +#endif + +/********************************************************************* +* +* public code, color conversions for palette based displays +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_CalcColorDist +*/ +U32 GUI_CalcColorDist (LCD_COLOR PalColor, LCD_COLOR Color) { +/* This routine does not use abs() because we are optimizing for speed ! */ + I16 Dist; + U32 Sum; + Dist = (PalColor&0xff) - (Color&0xff); + if (Dist < 0) + Dist = -Dist; + Sum = SQUARE(Dist); + Dist = ((PalColor>>8)&0xff) - ((Color>>8)&0xff); + if (Dist < 0) + Dist = -Dist; + Sum += SQUARE(Dist); + Dist = (PalColor>>16) - (Color>>16); + if (Dist < 0) + Dist = -Dist; + return Sum + SQUARE(Dist); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c b/User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c new file mode 100644 index 0000000..48d3410 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ClearRectEx.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ClearRectEx +*/ +void GUI_ClearRectEx(const GUI_RECT* pRect) { + GUI_ClearRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c b/User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c new file mode 100644 index 0000000..450dad8 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Color2VisColor.C +Purpose : Implementation of GUI_Color2VisColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Color2VisColor +*/ +GUI_COLOR GUI_Color2VisColor(GUI_COLOR color) { + I16 Index; + GUI_COLOR r; + GUI_LOCK(); + Index = LCD_Color2Index(color); + r = LCD_Index2Color(Index); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_ColorIsAvailable +*/ +char GUI_ColorIsAvailable(GUI_COLOR color) { + return (GUI_Color2VisColor(color) == color) ? 1 : 0; +} + +/********************************************************************* +* +* GUI_CalcVisColorError +*/ +U32 GUI_CalcVisColorError(GUI_COLOR color) { + return GUI_CalcColorDist(color, GUI_Color2VisColor(color)); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h b/User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h new file mode 100644 index 0000000..19655c6 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h @@ -0,0 +1,155 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ConfDefaults.h +Purpose : Defaults for GUI config switches. +---------------------------END-OF-HEADER------------------------------ + +Attention : Do not modify this file ! If you do, you will not + be able do update to a later GUI version ! + +*/ + +#ifndef GUI_CONFDEFAULTS_H +#define GUI_CONFDEFAULTS_H + +#include "GUIConf.h" + +/********************************************************************** +* +* Defaults for config switches +* +*********************************************************************** +*/ + +/* Define "universal pointer". Normally, this is not needed (define will expand to nothing) + However, on some systems (AVR - IAR compiler) it can be necessary ( -> __generic), + since a default pointer can access RAM only, not the built-in Flash +*/ +#ifndef GUI_UNI_PTR + #define GUI_UNI_PTR + #define GUI_UNI_PTR_USED 0 +#else + #define GUI_UNI_PTR_USED 1 +#endif + +/* Define const storage. Normally, this is not needed (define will expand to const) + However, on some systems (AVR - IAR compiler) it can be necessary ( -> __flash const), + since otherwise constants are copied into RAM +*/ +#ifndef GUI_ALLOC_SIZE + #define GUI_ALLOC_SIZE 1000 +#endif + +#ifndef GUI_CONST_STORAGE + #define GUI_CONST_STORAGE const +#endif + +#ifndef GUI_SUPPORT_TOUCH + #define GUI_SUPPORT_TOUCH 0 +#endif + +#ifndef GUI_SUPPORT_MOUSE + #define GUI_SUPPORT_MOUSE 0 +#endif + +#ifndef GUI_SUPPORT_MEMDEV + #define GUI_SUPPORT_MEMDEV 0 +#endif + +#ifndef GUI_SUPPORT_AA + #define GUI_SUPPORT_AA 0 +#endif + +#ifndef GUI_OS + #define GUI_OS 0 +#endif + +#ifndef GUI_SUPPORT_LARGE_BITMAPS + #if GUI_ALLOC_SIZE > 65535 + #define GUI_SUPPORT_LARGE_BITMAPS 1 + #else + #define GUI_SUPPORT_LARGE_BITMAPS 0 + #endif +#endif + +#ifndef GUI_COMPATIBLE_MODE + #define GUI_COMPATIBLE_MODE 1 +#endif + +#ifndef GUI_NUM_LAYERS + #define GUI_NUM_LAYERS 1 +#endif + +#ifndef GUI_SUPPORT_CURSOR + #define GUI_SUPPORT_CURSOR (GUI_SUPPORT_MOUSE | GUI_SUPPORT_TOUCH) +#endif + +#ifndef GUI_SUPPORT_DEVICES + #ifdef __C51__ /* Keil C51 limitation ... Indirect function calls are limited */ + #define GUI_SUPPORT_DEVICES 0 + #else + #define GUI_SUPPORT_DEVICES (GUI_SUPPORT_MEMDEV | (GUI_NUM_LAYERS > 1)) + #endif +#endif + +/* Some compilers for very simple chips can not generate code for function pointers +with parameters. In this case, we do not use function pointers, but limit the functionality slightly */ +#ifndef GUI_COMPILER_SUPPORTS_FP + #ifdef __C51__ + #define GUI_COMPILER_SUPPORTS_FP 0 + #else + #define GUI_COMPILER_SUPPORTS_FP 1 + #endif +#endif + +#ifndef GUI_SUPPORT_ROTATION + #if GUI_COMPILER_SUPPORTS_FP + #define GUI_SUPPORT_ROTATION 1 + #else + #define GUI_SUPPORT_ROTATION 0 + #endif +#endif + +/* In order to avoid warnings for undefined parameters */ +#ifndef GUI_USE_PARA + #if defined (__BORLANDC__) || defined(NC30) || defined(NC308) + #define GUI_USE_PARA(para) + #else + #define GUI_USE_PARA(para) para=para; + #endif +#endif + +/* Default for types */ +#ifndef GUI_TIMER_TIME + #define GUI_TIMER_TIME int /* default is to use 16 bits for 16 bit CPUs, + 32 bits on 32 bit CPUs for timing */ +#endif + +/* Types used for memory allocation */ +#if GUI_ALLOC_SIZE <32767 + #define GUI_ALLOC_DATATYPE I16 + #define GUI_ALLOC_DATATYPE_U U16 +#else + #define GUI_ALLOC_DATATYPE I32 + #define GUI_ALLOC_DATATYPE_U U32 +#endif + +#ifndef GUI_MEMSET + #define GUI_MEMSET GUI__memset +#endif + + +#endif /* ifdef GUI_CONFDEFAULTS_H */ +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c new file mode 100644 index 0000000..546e047 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowL.C +Purpose : Defines the arrow cursor, large +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowL = { + 18, /* XSize */ + 30, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_ArrowL, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowL = { + &GUI_BitmapArrowL, 0, 0 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c new file mode 100644 index 0000000..1bf8e8b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowLI.c +Purpose : Defines the arrow cursor, large inverted +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowLI = { + 18, /* XSize */ + 30, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_ArrowL, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowLI = { + &GUI_BitmapArrowLI, 0, 0 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c new file mode 100644 index 0000000..e4bc95b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowLPx.C +Purpose : Defines the pixel offset of the arrow cursor, large +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowL[150] = { + 0x40, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x00, + 0x69, 0x00, 0x00, 0x00, 0x00, + 0x6A, 0x40, 0x00, 0x00, 0x00, + 0x6A, 0x90, 0x00, 0x00, 0x00, + 0x6A, 0xA4, 0x00, 0x00, 0x00, + 0x6A, 0xA9, 0x00, 0x00, 0x00, + 0x6A, 0xAA, 0x40, 0x00, 0x00, + 0x6A, 0xAA, 0x90, 0x00, 0x00, + 0x6A, 0xAA, 0xA4, 0x00, 0x00, + 0x6A, 0xAA, 0xA9, 0x00, 0x00, + 0x6A, 0xAA, 0xAA, 0x40, 0x00, + 0x6A, 0xAA, 0xAA, 0x90, 0x00, + 0x6A, 0xAA, 0xAA, 0xA4, 0x00, + 0x6A, 0xAA, 0xAA, 0xA9, 0x00, + 0x6A, 0xAA, 0xAA, 0xAA, 0x40, + 0x6A, 0xAA, 0x95, 0x55, 0x50, + 0x6A, 0x9A, 0x90, 0x00, 0x00, + 0x6A, 0x46, 0xA4, 0x00, 0x00, + 0x69, 0x06, 0xA4, 0x00, 0x00, + 0x64, 0x01, 0xA9, 0x00, 0x00, + 0x50, 0x01, 0xA9, 0x00, 0x00, + 0x40, 0x00, 0x6A, 0x40, 0x00, + 0x00, 0x00, 0x6A, 0x40, 0x00, + 0x00, 0x00, 0x1A, 0x90, 0x00, + 0x00, 0x00, 0x1A, 0x90, 0x00, + 0x00, 0x00, 0x06, 0xA4, 0x00, + 0x00, 0x00, 0x06, 0xA4, 0x00, + 0x00, 0x00, 0x01, 0x50, 0x00 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c new file mode 100644 index 0000000..61a1c50 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowM.C +Purpose : Defines the arrow cursor, medium +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowM = { + 12, /* XSize */ + 20, /* YSize */ + 3, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_ArrowM, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowM = { + &GUI_BitmapArrowM, 0, 0 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c new file mode 100644 index 0000000..db0c4bd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowMI.C +Purpose : Defines the arrow cursor, medium inverted +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowMI = { + 12, /* XSize */ + 20, /* YSize */ + 3, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_ArrowM, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowMI = { + &GUI_BitmapArrowMI, 0, 0 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c new file mode 100644 index 0000000..fb6d532 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowMPx.C +Purpose : Defines the pixel offset of the arrow cursor, medium +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowM[60] = { + 0x40, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x64, 0x00, 0x00, + 0x69, 0x00, 0x00, + 0x6A, 0x40, 0x00, + 0x6A, 0x90, 0x00, + 0x6A, 0xA4, 0x00, + 0x6A, 0xA9, 0x00, + 0x6A, 0xAA, 0x40, + 0x6A, 0xAA, 0x90, + 0x6A, 0xAA, 0xA4, + 0x6A, 0xA9, 0x55, + 0x69, 0xA9, 0x00, + 0x64, 0x6A, 0x40, + 0x50, 0x6A, 0x40, + 0x40, 0x1A, 0x90, + 0x00, 0x1A, 0x90, + 0x00, 0x06, 0xA4, + 0x00, 0x06, 0xA4, + 0x00, 0x01, 0x50 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c new file mode 100644 index 0000000..0f7fb59 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowS.C +Purpose : Defines the arrow cursor, small +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowS = { + 9, /* XSize */ + 15, /* YSize */ + 3, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_ArrowS, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowS = { + &GUI_BitmapArrowS, 0, 0 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c new file mode 100644 index 0000000..b7ccc9a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowSI.c +Purpose : Defines the arrow cursor, small inverted +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowSI = { + 9, /* XSize */ + 15, /* YSize */ + 3, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_ArrowS, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowSI = { + &GUI_BitmapArrowSI, 0, 0 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c new file mode 100644 index 0000000..ad36d77 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorArrowSPx.C +Purpose : Defines the pixel offset of the arrow cursor, small +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowS[45] = { + 0x40, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x64, 0x00, 0x00, + 0x69, 0x00, 0x00, + 0x6A, 0x40, 0x00, + 0x6A, 0x90, 0x00, + 0x6A, 0xA4, 0x00, + 0x6A, 0xA9, 0x00, + 0x6A, 0x95, 0x40, + 0x66, 0x90, 0x00, + 0x51, 0xA4, 0x00, + 0x41, 0xA4, 0x00, + 0x00, 0x69, 0x00, + 0x00, 0x69, 0x00, + 0x00, 0x14, 0x00 +}; +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c new file mode 100644 index 0000000..179e2fa --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossL.c +Purpose : Defines the cross cursor, large +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossL = { + 31, /* XSize */ + 31, /* YSize */ + 8, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_CrossL, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossL = { + &GUI_BitmapCrossL, 15, 15 +}; + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c new file mode 100644 index 0000000..26c75be --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossLI.c +Purpose : Defines the cross cursor, large +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossLI = { + 31, /* XSize */ + 31, /* YSize */ + 8, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_CrossL, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossLI = { + &GUI_BitmapCrossLI, 15, 15 +}; + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c new file mode 100644 index 0000000..c80feaa --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c @@ -0,0 +1,57 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossLPx.C +Purpose : Defines the pixel offset of the cross cursor, large +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossL[248] = { + 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x55, 0x55, 0x55, 0x56, 0x55, 0x55, 0x55, 0x54, + 0x6A, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xA4, + 0x55, 0x55, 0x55, 0x56, 0x55, 0x55, 0x55, 0x54, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c new file mode 100644 index 0000000..0f89417 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossM.C +Purpose : Defines the cross cursor, medium +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossM = { + 21, /* XSize */ + 21, /* YSize */ + 6, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_CrossM, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossM = { + &GUI_BitmapCrossM, 10, 10 +}; + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c new file mode 100644 index 0000000..f8979e3 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossMI.c +Purpose : Defines the cross cursor, medium +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossMI = { + 21, /* XSize */ + 21, /* YSize */ + 6, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_CrossM, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossMI = { + &GUI_BitmapCrossMI, 10, 10 +}; + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c new file mode 100644 index 0000000..aca8897 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossMPx.C +Purpose : Defines the pixel offset of the cross cursor, large +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossM[126] = { + 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x55, 0x55, 0x59, 0x55, 0x55, 0x40, + 0x6A, 0xAA, 0xA6, 0xAA, 0xAA, 0x40, + 0x55, 0x55, 0x59, 0x55, 0x55, 0x40, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x15, 0x00, 0x00, 0x00 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c new file mode 100644 index 0000000..b5f2867 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossS.C +Purpose : Defines the cross cursor, small +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossS = { + 11, /* XSize */ + 11, /* YSize */ + 3, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_CrossS, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossS = { + &GUI_BitmapCrossS, 5, 5 +}; + + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c new file mode 100644 index 0000000..2cb8b34 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossSI.c +Purpose : Defines the cross cursor, small inverted +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossSI = { + 11, /* XSize */ + 11, /* YSize */ + 3, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_Pixels_CrossS, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + + +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossSI = { + &GUI_BitmapCrossSI, 5, 5 +}; + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c new file mode 100644 index 0000000..660db8a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c @@ -0,0 +1,37 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorCrossSPx.C +Purpose : Defines the pixel offset of the cross cursor, small +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossS[33] = { + 0x00, 0x54, 0x00, + 0x00, 0x64, 0x00, + 0x00, 0x64, 0x00, + 0x00, 0x64, 0x00, + 0x55, 0x65, 0x54, + 0x6A, 0x9A, 0xA4, + 0x55, 0x65, 0x54, + 0x00, 0x64, 0x00, + 0x00, 0x64, 0x00, + 0x00, 0x64, 0x00, + 0x00, 0x54, 0x00 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c new file mode 100644 index 0000000..438a0ea --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorHeaderM.c +Purpose : Defines the header cursor, medium size +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* static data, cursor bitmap +* +********************************************************************** +*/ + +static GUI_CONST_STORAGE GUI_BITMAP _BitmapHeaderM = { + 17, /* XSize */ + 17, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_PixelsHeaderM, /* Pointer to picture data (indices) */ + &GUI_CursorPal /* Pointer to palette */ +}; + + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorHeaderM = { + &_BitmapHeaderM, 8, 8 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c new file mode 100644 index 0000000..77bb62b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorHeaderMI.c +Purpose : Defines the header cursor, medium size, invers +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* static data, cursor bitmap +* +********************************************************************** +*/ + +static GUI_CONST_STORAGE GUI_BITMAP _Bitmap = { + 17, /* XSize */ + 17, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + GUI_PixelsHeaderM, /* Pointer to picture data (indices) */ + &GUI_CursorPalI /* Pointer to palette */ +}; + + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +GUI_CONST_STORAGE GUI_CURSOR GUI_CursorHeaderMI = { + &_Bitmap, 8, 8 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c new file mode 100644 index 0000000..2bf796b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorHeaderMPx.c +Purpose : Defines the pixels of the header cursor, medium +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public (internal) data +* +********************************************************************** +*/ + +GUI_CONST_STORAGE unsigned char GUI_PixelsHeaderM[5 * 17] = { + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x04, 0x01, 0x90, 0x04, 0x00, + 0x19, 0x55, 0x95, 0x59, 0x00, + 0x6a, 0xaa, 0xaa, 0xaa, 0x40, + 0x19, 0x55, 0x95, 0x59, 0x00, + 0x04, 0x01, 0x90, 0x04, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorPal.c b/User/system/lib/lcd/gui/Core/GUI_CursorPal.c new file mode 100644 index 0000000..6614c6f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorPal.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorPal.C +Purpose : Defines the colors for most cursors +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_CONST_STORAGE GUI_COLOR _aColor[] = { + 0x0000FF, 0x000000, 0xFFFFFF +}; + +GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPal = { + 3, /* number of entries */ + 1, /* Has transparency */ + &_aColor[0] +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorPalI.c b/User/system/lib/lcd/gui/Core/GUI_CursorPalI.c new file mode 100644 index 0000000..b499ada --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_CursorPalI.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_CursorPalI.C +Purpose : Defines the colors for most inverted cursors +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_CONST_STORAGE GUI_COLOR _aColor[] = { + 0x0000FF, 0xFFFFFF, 0x000000 +}; + +GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPalI = { + 3, /* number of entries */ + 1, /* Has transparency */ + &_aColor[0] +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispBin.c b/User/system/lib/lcd/gui/Core/GUI_DispBin.c new file mode 100644 index 0000000..ec57ff7 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispBin.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispBin.c +Purpose : Routines to display values as binary +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include "string.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispBin +*/ +void GUI_DispBin(U32 v, U8 Len) { + char ac[33]; + char* s = ac; + GUI_AddBin(v, Len, &s); + GUI_DispString(ac); +} + +/********************************************************************* +* +* GUI_DispBinAt +*/ +void GUI_DispBinAt(U32 v, I16P x, I16P y, U8 Len) { + char ac[33]; + char* s = ac; + GUI_AddBin(v, Len, &s); + GUI_DispStringAt(ac, x, y); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispCEOL.c b/User/system/lib/lcd/gui/Core/GUI_DispCEOL.c new file mode 100644 index 0000000..c316302 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispCEOL.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispBin.c +Purpose : Routines to display values as binary +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include "string.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispCEOL +*/ +void GUI_DispCEOL(void) { + int y = GUI_Context.DispPosY - GUI_GetYAdjust(); + GUI_ClearRect(GUI_Context.DispPosX, y, 4000, /* Max pos x */ + y + GUI_Context.pAFont->YDist - 1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispChar.c b/User/system/lib/lcd/gui/Core/GUI_DispChar.c new file mode 100644 index 0000000..6eb2914 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispChar.c @@ -0,0 +1,84 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispChar.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* CL_DispChar +*/ +#if (GUI_WINSUPPORT) +static void CL_DispChar(U16 c) { + GUI_RECT r; + WM_ADDORG(GUI_Context.DispPosX, GUI_Context.DispPosY); + r.x1 = (r.x0 = GUI_Context.DispPosX) + GUI_GetCharDistX(c) - 1; + r.y1 = (r.y0 = GUI_Context.DispPosY) + GUI_GetFontSizeY() - 1; + WM_ITERATE_START(&r) { + GL_DispChar(c); + } WM_ITERATE_END(); + if (c != '\n') { + GUI_Context.DispPosX = r.x1 + 1; + } + WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY); +} +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispChar +*/ +void GUI_DispChar(U16 c) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + CL_DispChar(c); + #else + GL_DispChar(c); + #endif + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_DispCharAt +*/ +void GUI_DispCharAt(U16 c, I16P x, I16P y) { + GUI_LOCK(); + GUI_Context.DispPosX = x; + GUI_Context.DispPosY = y; + #if (GUI_WINSUPPORT) + CL_DispChar(c); + #else + GL_DispChar(c); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispChars.c b/User/system/lib/lcd/gui/Core/GUI_DispChars.c new file mode 100644 index 0000000..866fdc7 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispChars.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispChars.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispChars +*/ +void GUI_DispChars(U16P c, int NumChars) { + while (--NumChars >= 0) { + GUI_DispChar(c); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispHex.c b/User/system/lib/lcd/gui/Core/GUI_DispHex.c new file mode 100644 index 0000000..b7f75a6 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispHex.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispHex.C +Purpose : Routines to display hex +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispHex +*/ +void GUI_DispHex(U32 v, U8 Len) { + char ac[9]; + char* s = ac; + GUI_AddHex(v, Len, &s); + GUI_DispString(ac); +} + +/********************************************************************* +* +* GUI_DispHexAt +*/ +void GUI_DispHexAt(U32 v, I16P x, I16P y, U8 Len) { + char ac[9]; + char* s = ac; + GUI_AddHex(v, Len, &s); + GUI_DispStringAt(ac, x, y); +} + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Core/GUI_DispString.c b/User/system/lib/lcd/gui/Core/GUI_DispString.c new file mode 100644 index 0000000..926f0b1 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispString.c @@ -0,0 +1,85 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispString.C +Purpose : Implementation of GUI_DispString function. +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispString +*/ +void GUI_DispString(const char GUI_UNI_PTR *s) { + int xAdjust, yAdjust, xOrg; + int FontSizeY; + if (!s) + return; + GUI_LOCK(); + FontSizeY = GUI_GetFontDistY(); + xOrg = GUI_Context.DispPosX; + /* Adjust vertical position */ + yAdjust = GUI_GetYAdjust(); + GUI_Context.DispPosY -= yAdjust; + for (; *s; s++) { + GUI_RECT r; + int LineNumChars = GUI__GetLineNumChars(s, 0x7fff); + int xLineSize = GUI__GetLineDistX(s, LineNumChars); + /* Check if x-position needs to be changed due to h-alignment */ + switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { + case GUI_TA_CENTER: xAdjust = xLineSize / 2; break; + case GUI_TA_RIGHT: xAdjust = xLineSize; break; + default: xAdjust = 0; + } + r.x0 = GUI_Context.DispPosX -= xAdjust; + r.x1 = r.x0 + xLineSize - 1; + r.y0 = GUI_Context.DispPosY; + r.y1 = r.y0 + FontSizeY - 1; + GUI__DispLine(s, LineNumChars, &r); + GUI_Context.DispPosY = r.y0; + s += GUI_UC__NumChars2NumBytes(s, LineNumChars); + if ((*s == '\n') || (*s == '\r')) { + switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { + case GUI_TA_CENTER: + case GUI_TA_RIGHT: + GUI_Context.DispPosX = xOrg; + break; + default: + GUI_Context.DispPosX = GUI_Context.LBorder; + break; + } + if (*s == '\n') + GUI_Context.DispPosY += FontSizeY; + } else { + GUI_Context.DispPosX = r.x0 + xLineSize; + } + if (*s == 0) /* end of string (last line) reached ? */ + break; + } + GUI_Context.DispPosY += yAdjust; + GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL; + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringAt.c b/User/system/lib/lcd/gui/Core/GUI_DispStringAt.c new file mode 100644 index 0000000..93d357e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringAt.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringAt.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispStringAt +*/ +void GUI_DispStringAt(const char GUI_UNI_PTR *s, int x, int y) { + GUI_LOCK(); + GUI_Context.DispPosX = x; + GUI_Context.DispPosY = y; + GUI_DispString(s); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c b/User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c new file mode 100644 index 0000000..cbea15b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c @@ -0,0 +1,37 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringAtCEOL.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispStringAtCEOL +*/ +void GUI_DispStringAtCEOL(const char GUI_UNI_PTR *s, int x, int y) { + GUI_DispStringAt(s,x,y); + GUI_DispCEOL(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c b/User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c new file mode 100644 index 0000000..f584398 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringHCenter.c +Purpose : Implementation of optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispStringHCenterAt +*/ +void GUI_DispStringHCenterAt(const char GUI_UNI_PTR *s, int x, int y) { + int Align; + Align = GUI_SetTextAlign((GUI_Context.TextAlign & ~GUI_TA_LEFT) | GUI_TA_CENTER); + GUI_DispStringAt(s, x, y); + GUI_SetTextAlign(Align); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c b/User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c new file mode 100644 index 0000000..49b0613 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c @@ -0,0 +1,169 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringInRect.c +Purpose : Implementation of GUI_DispStringInRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" +#if GUI_WINSUPPORT +#include "WM.h" +#endif + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * GUI__DispStringInRect + */ +void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxNumChars) +{ + GUI_RECT r; + GUI_RECT rLine; + int y = 0; + const char GUI_UNI_PTR *sOrg = s; + int FontYSize; + int xLine = 0; + int LineLen; + int NumCharsRem; /* Number of remaining characters */ + FontYSize = GUI_GetFontSizeY(); + if (pRect) + { + r = *pRect; + } + else + { + GUI_GetClientRect(&r); + } + /* handle vertical alignment */ + if ((TextAlign & GUI_TA_VERTICAL) == GUI_TA_TOP) + { + y = r.y0; + } + else + { + int NumLines; + /* Count the number of lines */ + for (NumCharsRem = MaxNumChars, NumLines = 1; NumCharsRem; NumLines++) + { + LineLen = GUI__GetLineNumChars(s, NumCharsRem); + NumCharsRem -= LineLen; + s += GUI_UC__NumChars2NumBytes(s, LineLen); + if (GUI__HandleEOLine(&s)) + break; + } + /* Do the vertical alignment */ + switch (TextAlign & GUI_TA_VERTICAL) + { + case GUI_TA_BASELINE: + case GUI_TA_BOTTOM: + y = r.y1 - NumLines * FontYSize + 1; + break; + case GUI_TA_VCENTER: + y = r.y0 + (r.y1 - r.y0 + 1 - NumLines * FontYSize) / 2; + break; + } + } + /* Output string */ + for (NumCharsRem = MaxNumChars, s = sOrg; NumCharsRem;) + { + int xLineSize; + LineLen = GUI__GetLineNumChars(s, NumCharsRem); + NumCharsRem -= LineLen; + xLineSize = GUI__GetLineDistX(s, LineLen); + switch (TextAlign & GUI_TA_HORIZONTAL) + { + case GUI_TA_HCENTER: + xLine = r.x0 + (r.x1 - r.x0 - xLineSize) / 2; + break; + case GUI_TA_LEFT: + xLine = r.x0; + break; + case GUI_TA_RIGHT: + xLine = r.x1 - xLineSize + 1; + } + rLine.x0 = GUI_Context.DispPosX = xLine; + rLine.x1 = rLine.x0 + xLineSize - 1; + rLine.y0 = GUI_Context.DispPosY = y; + rLine.y1 = y + FontYSize - 1; + GUI__DispLine(s, LineLen, &rLine); + s += GUI_UC__NumChars2NumBytes(s, LineLen); + y += GUI_GetFontDistY(); + if (GUI__HandleEOLine(&s)) + break; + } +} + +/********************************************************************* + * + * GUI_DispStringInRectMax + */ +#if (GUI_WINSUPPORT) +void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen) +{ + if (s) + { + const GUI_RECT *pOldClipRect = NULL; + GUI_RECT r; + GUI_LOCK(); + if (pRect) + { + pOldClipRect = WM_SetUserClipRect(pRect); + if (pOldClipRect) + { + GUI__IntersectRects(&r, pRect, pOldClipRect); + WM_SetUserClipRect(&r); + } + } + GUI__DispStringInRect(s, pRect, TextAlign, MaxLen); + WM_SetUserClipRect(pOldClipRect); + GUI_UNLOCK(); + } +} + +#else + +void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen) +{ + GUI_RECT Rect_Old, r; + if (s && pRect) + { + GUI_LOCK(); + Rect_Old = GUI_Context.ClipRect; + GUI__IntersectRects(&r, pRect, &Rect_Old); + LCD_SetClipRectEx(&r); + GUI__DispStringInRect(s, pRect, TextAlign, MaxLen); + LCD_SetClipRectEx(&Rect_Old); + GUI_UNLOCK(); + } +} +#endif + +/********************************************************************* + * + * GUI_DispStringInRect + */ +void GUI_DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign) +{ + GUI_DispStringInRectMax(s, pRect, TextAlign, 0x7fff); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c new file mode 100644 index 0000000..dda6c93 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c @@ -0,0 +1,115 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringInRectEx.c +Purpose : Implementation of GUI_DispStringInRectEx +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +#if GUI_SUPPORT_ROTATION + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ + +GUI_RECT GUI_RectDispString; /* Used by LCD_Rotate... */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +static const GUI_ROTATION * _SetRotation(const GUI_ROTATION* pLCD_Api) { + const GUI_ROTATION * pLCD_ApiOld; + GUI_LOCK(); + pLCD_ApiOld = GUI_pLCD_APIList; + if (pLCD_Api) { + GUI_Context.pClipRect_HL = NULL; /* Do not perform high level clipping in rotated mode */ + } else { + GUI_Context.pClipRect_HL = &GUI_Context.ClipRect; + } + GUI_pLCD_APIList = pLCD_Api; + GUI_UNLOCK(); + return pLCD_ApiOld; +} + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispStringInRectEx +*/ +void GUI_DispStringInRectEx(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxLen, const GUI_ROTATION * pLCD_Api) { + const GUI_ROTATION * pLCD_ApiOld; + if (pLCD_Api == GUI_ROTATE_0) { + /* Do nothing else but calling GUI_DispStringInRectMax if pLCD_Api == GUI_ROTATE_0 */ + GUI_DispStringInRectMax(s, pRect, TextAlign, MaxLen); + } else { + #if (!GUI_WINSUPPORT) + GUI_RECT Rect_Old; + #else + const GUI_RECT * pOldClipRect = NULL; + #endif + GUI_RECT rClip, rText = {0}; + GUI_LOCK(); + /* Set the clip rectangle */ + if (pRect) { + rText = *pRect; + GUI_RectDispString = rText; + #if (GUI_WINSUPPORT) + pOldClipRect = WM_SetUserClipRect(pRect); + if (pOldClipRect) { + GUI__IntersectRects(&rClip, pRect, pOldClipRect); + WM_SetUserClipRect(&rClip); + } + #else + Rect_Old = GUI_Context.ClipRect; + GUI__IntersectRects(&rClip, pRect, &Rect_Old); + LCD_SetClipRectEx(&rClip); + #endif + } + pLCD_ApiOld = _SetRotation(pLCD_Api); /* Set the new function pointer for rotating text */ + pLCD_Api->pfRect2TextRect(&rText); /* Calculate the text rectangle */ + GUI__DispStringInRect(s, &rText, TextAlign, MaxLen); /* Display the string */ + /* Restore old clipping rectangle */ + #if (GUI_WINSUPPORT) + WM_SetUserClipRect(pOldClipRect); + #else + LCD_SetClipRectEx(&Rect_Old); + #endif + _SetRotation(pLCD_ApiOld); + GUI_UNLOCK(); + } +} + +#else /* Avoid empty object files */ +void GUI_DispStringInRectEx_C(void); +void GUI_DispStringInRectEx_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c new file mode 100644 index 0000000..0c9dadd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringInRectMax.c +Purpose : Implementation of GUI_DispStringInRectMax +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringLen.c b/User/system/lib/lcd/gui/Core/GUI_DispStringLen.c new file mode 100644 index 0000000..b4a12c3 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DispStringLen.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DispStringLen.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DispStringLen +*/ +void GUI_DispStringLen(const char GUI_UNI_PTR *s, int MaxNumChars) { + U16 Char; + GUI_LOCK(); + while (MaxNumChars && ((Char = GUI_UC__GetCharCodeInc(&s)) != 0)) { + GUI_DispChar(Char); + MaxNumChars--; + } + while (MaxNumChars--) { + GUI_DispChar(' '); + } + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c new file mode 100644 index 0000000..9c6c893 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c @@ -0,0 +1,88 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawBitmap.C +Purpose : Implementation of GUI_DrawBitmap +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_DrawBitmap +* +* Purpose: +* Translates the external bitmap format into an internal +* format. This turned out to be necessary as the internal +* format is easier to create and more flexible for routines +* that draw text-bitmaps. +*/ +void GL_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0) { + GUI_DRAWMODE PrevDraw; + const GUI_LOGPALETTE GUI_UNI_PTR * pPal; + pPal = pBitmap->pPal; + PrevDraw = GUI_SetDrawMode(0); /* No Get... at this point */ + GUI_SetDrawMode((pPal && pPal->HasTrans) ? (PrevDraw|GUI_DRAWMODE_TRANS) : PrevDraw &(~GUI_DRAWMODE_TRANS)); + if (pBitmap->pMethods) { + #if GUI_COMPILER_SUPPORTS_FP /* Do not support this on VERY simple chips and compilers */ + pBitmap->pMethods->pfDraw(x0, y0, pBitmap->XSize ,pBitmap->YSize, (U8 const *)pBitmap->pData, pBitmap->pPal, 1, 1); + #endif + } else { + const LCD_PIXELINDEX* pTrans; + pTrans = LCD_GetpPalConvTable(pBitmap->pPal); + if (!pTrans) { + pTrans = (pBitmap->BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX; + } + LCD_DrawBitmap( x0,y0 + ,pBitmap->XSize ,pBitmap->YSize + ,1,1 + ,pBitmap->BitsPerPixel + ,pBitmap->BytesPerLine + ,pBitmap->pData + ,pTrans); + } + GUI_SetDrawMode(PrevDraw); +} + +/********************************************************************* +* +* GUI_DrawBitmap +*/ +void GUI_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + r.x1 = (r.x0 = x0) + pBitmap->XSize-1; + r.y1 = (r.y0 = y0) + pBitmap->YSize-1; + WM_ITERATE_START(&r) { + #endif + GL_DrawBitmap(pBitmap, x0, y0); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c new file mode 100644 index 0000000..708da4d --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c @@ -0,0 +1,155 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawBitmapEx.c +Purpose : Draws a bitmap with free magnification +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "stdlib.h" + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_DrawBitmapEx +*/ +static void GL_DrawBitmapEx(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0, + int xCenter, int yCenter, int xMag, int yMag) { + LCD_PIXELINDEX Index, IndexPrev = 0; + LCD_COLOR Color; + int x, y, xi, yi, xSize, ySize, xAct, xStart, xMagAbs, xiMag, yMin, yMax, yEnd, yPrev, yStep; + char Cached, HasTrans = 0; + /* Use clipping rect to reduce calculation */ + yMin = GUI_Context.ClipRect.y0; + yMax = GUI_Context.ClipRect.y1; + /* Init some values */ + xSize = pBitmap->XSize; + ySize = pBitmap->YSize; + xMagAbs = ((xMag < 0) ? -xMag : xMag); + x0 -= (I32)((xMag < 0) ? xSize - xCenter - 1 : xCenter) * (I32)(xMagAbs) / (I32)(1000); + yEnd = y0 + GUI__DivideRound32(((I32)(-yCenter) * (I32)(yMag)), 1000); + yPrev = yEnd + 1; + yStep = (yMag < 0) ? -1 : 1; + if (pBitmap->pPal) { + if (pBitmap->pPal->HasTrans) { + HasTrans = 1; + } + } + for (yi = 0; yi < ySize; yi++) { + y = yEnd; + yEnd = y0 + GUI__DivideRound32(((I32)(yi + 1 - yCenter) * (I32)(yMag)), 1000); + if (y != yPrev) { + yPrev = y; + do { + if ((y >= yMin) && (y <= yMax)) { + xStart = -1; + x = 0; + xiMag = 0; + Cached = 0; + for (xi = 0; xi < xSize; xi++) { + xiMag += xMagAbs; + if (xiMag >= 1000) { + xAct = (xMag > 0) ? xi : xSize - xi - 1; + Index = GUI_GetBitmapPixelIndex(pBitmap, xAct, yi); + if (Index != IndexPrev || xStart == -1) { + if ((Index == 0) && HasTrans) { + /* Transparent color ... clear cache */ + if (Cached) { + LCD_DrawHLine(x0 + xStart, y, x0 + x - 1); + Cached = 0; + } + } else { + /* Another color ... draw contents of cache */ + if (Cached && xStart != -1) { + LCD_DrawHLine(x0 + xStart, y, x0 + x - 1); + } + xStart = x; + Cached = 1; + if (pBitmap->pMethods) { + Color = pBitmap->pMethods->pfIndex2Color(Index); + } else { + Color = pBitmap->pPal->pPalEntries[Index]; + } + LCD_SetColorIndex(LCDDEV_L0_Color2Index(Color)); + } + IndexPrev = Index; + } + do { + x++; + xiMag -= 1000; + } while (xiMag >= 1000); + } + } + /* Clear cache */ + if (Cached) { + LCD_DrawHLine(x0 + xStart, y, x0 + x - 1); + } + } + y += yStep; + } while ((yMag < 0) ? (y > yEnd) : (y < yEnd)); + } + } +} + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawBitmapEx +*/ +void GUI_DrawBitmapEx(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0, + int xCenter, int yCenter, int xMag, int yMag) { + GUI_COLOR OldColor; + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + OldColor = GUI_GetColor(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0, y0); + if (xMag >= 0) { + r.x0 = x0 + GUI__DivideRound32(((I32)(-xCenter) * (I32)(xMag)), 1000); + r.x1 = x0 + GUI__DivideRound32(((I32)(pBitmap->XSize - xCenter - 1) * (I32)(xMag)), 1000); + } else { + r.x1 = x0 + GUI__DivideRound32(((I32)(-xCenter) * (I32)(xMag)), 1000); + r.x0 = x0 + GUI__DivideRound32(((I32)(pBitmap->XSize - xCenter - 1) * (I32)(xMag)), 1000); + } + if (yMag >= 0) { + r.y0 = y0 + GUI__DivideRound32(((I32)(-yCenter) * (I32)(yMag)), 1000); + r.y1 = y0 + GUI__DivideRound32(((I32)(pBitmap->YSize - yCenter - 1) * (I32)(yMag)), 1000); + } else { + r.y1 = y0 + GUI__DivideRound32(((I32)(-yCenter) * (I32)(yMag)), 1000); + r.y0 = y0 + GUI__DivideRound32(((I32)(pBitmap->YSize - yCenter - 1) * (I32)(yMag)), 1000); + } + WM_ITERATE_START(&r) { + #endif + GL_DrawBitmapEx(pBitmap, x0, y0, xCenter, yCenter, xMag, yMag); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_SetColor(OldColor); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c new file mode 100644 index 0000000..4996d8a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawBitmapExp.C +Purpose : Implementation of GUI_DrawBitmapExp +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawBitmapExp +*/ +void GUI_DrawBitmapExp(int x0, int y0, int XSize, int YSize, int XMul, int YMul, + int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR * pData, + const GUI_LOGPALETTE GUI_UNI_PTR * pPal) +{ + GUI_DRAWMODE PrevDraw; + const LCD_PIXELINDEX* pTrans; + GUI_LOCK(); + pTrans = LCD_GetpPalConvTable(pPal); + PrevDraw = GUI_SetDrawMode((pPal && pPal->HasTrans) ? GUI_DRAWMODE_TRANS : 0); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + { + GUI_RECT r; + r.x0 = x0; + r.x1 = x0 + XSize * XMul -1; + r.y0 = y0; + r.y1 = y0 + YSize * YMul -1; + WM_ITERATE_START(&r); { + #endif + LCD_DrawBitmap( x0, y0 ,XSize ,YSize, XMul, YMul + ,BitsPerPixel, BytesPerLine, pData, pTrans); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + } + #endif + GUI_SetDrawMode(PrevDraw); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c new file mode 100644 index 0000000..901a1de --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c @@ -0,0 +1,74 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawBitmapMag.C +Purpose : Implementation file for GUI_DrawBitmapMag +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawBitmapMag +*/ +void GUI_DrawBitmapMag(const GUI_BITMAP GUI_UNI_PTR *pBitmap, int x0, int y0, int xMul, int yMul) { + GUI_DRAWMODE PrevDraw; + int xSize, ySize; + const GUI_LOGPALETTE GUI_UNI_PTR * pPal; + const LCD_PIXELINDEX* pTrans; + GUI_LOCK(); + pPal = pBitmap->pPal; + xSize = pBitmap->XSize; + ySize = pBitmap->YSize; + pTrans = LCD_GetpPalConvTable(pPal); + if (!pTrans) { + pTrans = (pBitmap->BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX; + } + PrevDraw = GUI_SetDrawMode((pPal && pPal->HasTrans) ? GUI_DRAWMODE_TRANS : 0); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + { + GUI_RECT r; + r.x0 = x0; + r.x1 = x0 + xSize * xMul -1; + r.y0 = y0; + r.y1 = y0 + ySize * yMul -1; + WM_ITERATE_START(&r); + #endif + if (pBitmap->pMethods) { + #if GUI_COMPILER_SUPPORTS_FP /* Do not support this on VERY simple chips and compilers */ + pBitmap->pMethods->pfDraw(x0, y0, pBitmap->XSize ,pBitmap->YSize, (U8 const *)pBitmap->pData, pBitmap->pPal, xMul, yMul); + #endif + } else { + LCD_DrawBitmap(x0, y0, xSize, ySize, xMul, yMul + ,pBitmap->BitsPerPixel, pBitmap->BytesPerLine + ,pBitmap->pData, pTrans); + } + #if (GUI_WINSUPPORT) + WM_ITERATE_END(); + } + #endif + GUI_SetDrawMode(PrevDraw); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c b/User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c new file mode 100644 index 0000000..57d9dcc --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawFocusRect.C +Purpose : Implementation of GUI_DrawFocusRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawFocusRect +*/ +static void _DrawFocusRect(const GUI_RECT* pr) { + int i; + for (i = pr->x0; i <= pr->x1; i += 2) { + LCD_DrawPixel(i, pr->y0); + LCD_DrawPixel(i, pr->y1); + } + for (i = pr->y0; i <= pr->y1; i += 2) { + LCD_DrawPixel(pr->x0, i); + LCD_DrawPixel(pr->x1, i); + } +} +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawFocusRect +*/ +void GUI_DrawFocusRect(const GUI_RECT *pRect, int Dist) { + GUI_RECT r; + GUI__ReduceRect(&r, pRect, Dist); + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + WM_ITERATE_START(&r); { + #endif + _DrawFocusRect(&r); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawGraph.c b/User/system/lib/lcd/gui/Core/GUI_DrawGraph.c new file mode 100644 index 0000000..9de2c48 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawGraph.c @@ -0,0 +1,95 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawPolyline.c +Purpose : Implementation of GUI_DrawPolyline +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawGraph +*/ +static void _DrawGraph(I16 *pay, int NumPoints, int xOff, int yOff) { + int i; + int y0, y1; + int yClip0, yClip1; + /* Perform high level clipping in x */ + yClip0 = GUI_Context.pClipRect_HL->y0; + yClip1 = GUI_Context.pClipRect_HL->y1; + i=0; + if (GUI_Context.pClipRect_HL) { + if (xOff < GUI_Context.pClipRect_HL->x0) + i = GUI_Context.pClipRect_HL->x0 - xOff; + if (xOff+NumPoints-1 > GUI_Context.pClipRect_HL->x1) + NumPoints = GUI_Context.pClipRect_HL->x1 - xOff + 1; + } + /* Start drawing if there is something left to do after x-clipping */ + if (i < NumPoints) { + y0 = *(pay + i++) + yOff; + /* Iterate */ + for (; i < NumPoints; i++) { + /* Perform high level clipping in y */ + y1 = *(pay + i) + yOff; + if ((y0 >= yClip0) || (y1 >= yClip0)) { + if ((y0 <= yClip1) || (y1 <= yClip1)) { + int y01; + y01 = (y1 + y0) / 2; + if (y0 <= y1) { + LCD_DrawVLine(i + xOff - 1, y0, y01); + LCD_DrawVLine(i + xOff, y01, y1); + } else { + LCD_DrawVLine(i + xOff - 1, y01, y0); + LCD_DrawVLine(i + xOff, y1, y01); + } + } + } + y0 = y1; + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawGraph +*/ +void GUI_DrawGraph(I16 *pay, int NumPoints, int x0, int y0) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + WM_ITERATE_START(NULL); { + #endif + _DrawGraph(pay, NumPoints, x0, y0); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawHLine.c b/User/system/lib/lcd/gui/Core/GUI_DrawHLine.c new file mode 100644 index 0000000..07c3259 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawHLine.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawHLine.C +Purpose : Implementation of GUI_DrawHLine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawHLine +*/ +void GUI_DrawHLine(int y0, int x0, int x1) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + WM_ADDORGX(x1); + r.x0 = x0; + r.x1 = x1; + r.y1 = r.y0 = y0; + WM_ITERATE_START(&r) { + #endif + LCD_HL_DrawHLine(x0, y0, x1); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawPie.c b/User/system/lib/lcd/gui/Core/GUI_DrawPie.c new file mode 100644 index 0000000..2dbfd25 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawPie.c @@ -0,0 +1,66 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIARCFloat.C +Purpose : Draw Arc routines based on floating point +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawPie +*/ +static void _DrawPie(int x0, int y0, unsigned int r, int Angle0, int Angle1, int Type) { + int PenSizeOld; + PenSizeOld = GUI_GetPenSize(); + GUI_SetPenSize(r); + r /= 2; + GL_DrawArc(x0,y0,r,r,Angle0, Angle1); + GUI_SetPenSize(PenSizeOld); + GUI_USE_PARA(Type); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawPie +*/ +void GUI_DrawPie(int x0, int y0, int r, int a0, int a1, int Type) { + GUI_LOCK(); + #if GUI_WINSUPPORT + WM_ADDORG(x0,y0); + WM_ITERATE_START(NULL) { + #endif + _DrawPie( x0, y0, r, a0, a1, Type); + #if GUI_WINSUPPORT + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawPixel.c b/User/system/lib/lcd/gui/Core/GUI_DrawPixel.c new file mode 100644 index 0000000..171f7de --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawPixel.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawPixel.c +Purpose : Implementation of GUI_DrawPixel +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawPixel +*/ +void GUI_DrawPixel(int x, int y) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x,y); + r.x0 = r.x1 = x; + r.y0 = r.y1 = y; + WM_ITERATE_START(&r); { + #endif + LCD_HL_DrawPixel(x,y); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c b/User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c new file mode 100644 index 0000000..d2cf6ac --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c @@ -0,0 +1,66 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawPolyLine.c +Purpose : Implementation of GUI_DrawPolyline +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawPolyLine +* +* Draw Poly line, which does not have to be a closed shape +*/ +static void _DrawPolyLine(const GUI_POINT*pPoints, int NumPoints, int x0, int y0) { + GL_MoveTo(pPoints->x+x0, pPoints->y+y0); + while (--NumPoints >0) { + pPoints++; + GL_DrawLineTo(pPoints->x+x0, pPoints->y+y0); + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawPolyLine +*/ +void GUI_DrawPolyLine(const GUI_POINT* pPoints, int NumPoints, int x0, int y0) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + WM_ITERATE_START(NULL); { + #endif + _DrawPolyLine (pPoints, NumPoints, x0, y0); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c b/User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c new file mode 100644 index 0000000..d242c6c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawRectEx.C +Purpose : Implementation of GUI_DrawRectEx +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawRectEx +*/ +void GUI_DrawRectEx(const GUI_RECT* pRect) { + GUI_DrawRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawVLine.c b/User/system/lib/lcd/gui/Core/GUI_DrawVLine.c new file mode 100644 index 0000000..a413273 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_DrawVLine.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawVLine.C +Purpose : Implementation of GUI_DrawVLine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DrawVLine +*/ +void GUI_DrawVLine(int x0, int y0, int y1) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + WM_ADDORGY(y1); + r.x1 = r.x0 = x0; + r.y0 = y0; + r.y1 = y1; + WM_ITERATE_START(&r); { + #endif + LCD_DrawVLine(x0, y0, y1); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_ErrorOut.c b/User/system/lib/lcd/gui/Core/GUI_ErrorOut.c new file mode 100644 index 0000000..749e61b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_ErrorOut.c @@ -0,0 +1,126 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ErrorOut.C +Purpose : Logging (used only at higher debug levels) +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "GUI_X.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define MAXLEN 50 + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _CopyString +*/ +static void _CopyString(char*d, const char*s, int MaxLen) { + while ((MaxLen > 0) && *s) { + *d++ = *s++; + MaxLen--; + } + *d = 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ErrorOut +*/ +void GUI_ErrorOut(const char *s) { GUI_X_ErrorOut(s); } + +/********************************************************************* +* +* GUI_ErrorOut1 +*/ +void GUI_ErrorOut1(const char *s, int p0) { + char ac[MAXLEN + 10]; + char* sOut = ac; + GUI_MEMSET((U8*)ac, 0, sizeof(ac)); + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI_ErrorOut(ac); +} + +/********************************************************************* +* +* GUI_ErrorOut2 +*/ +void GUI_ErrorOut2(const char *s, int p0, int p1) { + char ac[MAXLEN + 20]; + char* sOut = ac; + GUI_MEMSET((U8*)ac, 0, sizeof(ac)); + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI_ErrorOut(ac); +} + +/********************************************************************* +* +* GUI_ErrorOut3 +*/ +void GUI_ErrorOut3(const char *s, int p0, int p1, int p2) { + char ac[MAXLEN + 30]; + char* sOut = ac; + GUI_MEMSET((U8*)ac, 0, sizeof(ac)); + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI__AddSpaceHex(p2, 8, &sOut); + GUI_ErrorOut(ac); +} + +/********************************************************************* +* +* GUI_ErrorOut4 +*/ +void GUI_ErrorOut4(const char *s, int p0, int p1, int p2, int p3) { + char ac[MAXLEN + 40] = {0}; + char* sOut = ac; + GUI_MEMSET((U8*)ac, 0, sizeof(ac)); + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI__AddSpaceHex(p2, 8, &sOut); + GUI__AddSpaceHex(p3, 8, &sOut); + GUI_ErrorOut(ac); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Exec.c b/User/system/lib/lcd/gui/Core/GUI_Exec.c new file mode 100644 index 0000000..9a1210e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Exec.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Exec.c +Purpose : Implementation of GUI_Exec +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#if GUI_WINSUPPORT +#include "WM.h" +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Exec1 +*/ +int GUI_Exec1(void) { + int r = 0; + /* Execute background jobs */ + if (GUI_pfTimerExec) { + if ((*GUI_pfTimerExec)()) { + r = 1; /* We have done something */ + } + } + #if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + if (WM_Exec()) + r = 1; + #endif + return r; +} + +/********************************************************************* +* +* GUI_Exec +*/ +int GUI_Exec(void) { + int r = 0; + while (GUI_Exec1()) { + r = 1; /* We have done something */ + } + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_FillPolygon.c b/User/system/lib/lcd/gui/Core/GUI_FillPolygon.c new file mode 100644 index 0000000..10ed2e3 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_FillPolygon.c @@ -0,0 +1,275 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_FillPolygon.C +Purpose : Fill polygon routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* defines, Configs +* +********************************************************************** +*/ + +#define GUI_FP_MAXCOUNT 12 + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +static int GL_FP_Cnt; +static I16 _aX[GUI_FP_MAXCOUNT]; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawHLine +*/ +static void _DrawHLine(int x0, int y, int x1) { + if (x0 < x1) { + LCD_HL_DrawHLine(x0, y, x1); + } else { + LCD_HL_DrawHLine(x1, y, x0); + } +} + +/********************************************************************* +* +* _CheckYInterSect +* +* This function returns the x-coordinate of the intersection +* of the given line at the given y-coordinate. +* If there is no intersection, GUI_XMAX is returned. +* This routine does not work for horizontal lines, as there +* would be more than a single point as intersection. This situation +* needs to be checked prior to calling the routine. +* Returns: +* 0 if no intersection +* 1 if we have an intersection +*/ +static int _CheckYInterSect(int y, int* px, const GUI_POINT*paPoint0, const GUI_POINT*paPoint1) { + int x0, y0, x1, y1; + if (paPoint0->y <= (paPoint1)->y) { + y0 = paPoint0->y; + if (y0 > y) /* Check if there is an intersection ... (early out) */ + return 0; + y1 = paPoint1->y; + if (y1 < y) /* Check if there is an intersection ... (early out) */ + return 0; + x0 = paPoint0->x; + x1 = paPoint1->x; + } else { + y0 = paPoint1->y; + if (y0 > y) /* Check if there is an intersection ... (early out) */ + return 0; + y1 = paPoint0->y; + if (y1 < y) /* Check if there is an intersection ... (early out) */ + return 0; + x0 = paPoint1->x; + x1 = paPoint0->x; + } +/* Calculate intersection */ + { + I32 Mul = (I32)(x1 - x0) * (I32)(y - y0); + if (Mul > 0) { + Mul += (y1 - y0) >> 1; /* for proper rounding */ + } else { + Mul -= ((y1 - y0) >> 1) - 1; /* for proper rounding */ + } + x0 += Mul / (y1 - y0); + } + *px = x0; + return 1; +} + +/********************************************************************* +* +* _Add +* +* This function adds a point into the sorted array +*/ +static void _Add(int x) { + if (GL_FP_Cnt < GUI_FP_MAXCOUNT) { + int i; + /* Move all entries to the right (bigger x-value) */ + for (i=GL_FP_Cnt; i ; i--) { + if (_aX[i-1] < x) + break; + _aX[i] = _aX[i-1]; + } + /* Insert new entry */ + _aX[i] = x; + GL_FP_Cnt++; + } +} + +/********************************************************************* +* +* _Init +* +* This function initialise the sorted array +*/ +static void _Init(void) { + GL_FP_Cnt = 0; +} + +/********************************************************************* +* +* _Flush +* +* This function draw lines between points in the array +*/ +static void _Flush(int x0, int y) { + int i, x = 0; + char On=0; + for (i=0; i= 0) { + x += xOff; + LCD_HL_DrawHLine(x, y + yOff, x); /* V-point, not crossing the polygon */ + } else { + _Add(x); + } +} + +/********************************************************************* +* +* _GetPrevPointDiffy +* +* Find previous point which is not on the same height +*/ +static int _GetPrevPointDiffy(const GUI_POINT* paPoint, int i, + const int NumPoints, const int y0) { + int j, y1; + for (j = 0; j < (NumPoints - 1) ; j++) { + i = (i != 0) ? i - 1 : NumPoints - 1; + y1 = (paPoint + i)->y; + if (y1 != y0) { + return y1; + } + } + return y0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_FillPolygon +* +* This function calculates the polygon +*/ +void GL_FillPolygon (const GUI_POINT*paPoint, int NumPoints, int xOff, int yOff) { + int i, y; + int yMin = GUI_YMAX; + int yMax = GUI_YMIN; +/* First step : find uppermost and lowermost coordinates */ + for (i=0; iy; + if (y < yMin) + yMin = y; + if (y > yMax) + yMax = y; + } +/* Use Clipping rect to reduce calculation (if possible) */ + if (GUI_Context.pClipRect_HL) { + if (yMax > (GUI_Context.pClipRect_HL->y1 - yOff)) + yMax = (GUI_Context.pClipRect_HL->y1 - yOff); + if (yMin < (GUI_Context.pClipRect_HL->y0 - yOff)) + yMin = (GUI_Context.pClipRect_HL->y0 - yOff); + } +/* Second step: Calculate and draw horizontal lines */ + for (y=yMin; y<=yMax; y++) { + _Init(); + /* find next intersection and count lines*/ + for (i=0; iy; + int y1 = (paPoint + i1)->y; + /* Check if starting point is on line */ + if (y0 == y) { + if (y1 == y) { /* Add the entire line */ + _DrawHLine((paPoint + i )->x + xOff , y + yOff, (paPoint + i1)->x + xOff); + } else { /* Add only one point */ + int yPrev = _GetPrevPointDiffy(paPoint, i, NumPoints, y); + if (yPrev != y) { + _AddPoint((paPoint + i)->x, y, yPrev - y, y1 - y, xOff, yOff); + } + } + } else if (y1 != y) { /* Ignore if end-point is on the line */ + if (((y1 >= y) && (y0 <= y)) || ((y0 >= y) && (y1 <= y))) { + int xIntersect; + if (_CheckYInterSect(y, &xIntersect, paPoint + i, paPoint + i1)) { + _Add(xIntersect); + } + } + } + } + _Flush(xOff, y + yOff); + } +} + +/********************************************************************* +* +* GUI_FillPolygon +*/ +void GUI_FillPolygon(const GUI_POINT* pPoints, int NumPoints, int x0, int y0) { + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0, y0); + WM_ITERATE_START(NULL); { + #endif + GL_FillPolygon (pPoints, NumPoints, x0, y0); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_FillRect.c b/User/system/lib/lcd/gui/Core/GUI_FillRect.c new file mode 100644 index 0000000..acb370d --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_FillRect.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_FillRect.C +Purpose : Implementation of GUI_FillRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_FillRect +*/ +void GUI_FillRect(int x0, int y0, int x1, int y1) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + WM_ADDORG(x1,y1); + r.x0 = x0; r.x1 = x1; + r.y0 = y0; r.y1 = y1; + WM_ITERATE_START(&r); { + #endif + LCD_FillRect(x0,y0,x1,y1); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_FillRectEx.c b/User/system/lib/lcd/gui/Core/GUI_FillRectEx.c new file mode 100644 index 0000000..d38cc7a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_FillRectEx.c @@ -0,0 +1,37 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_FillRectEx.c +Purpose : Implementation of GUI_FillRectEx +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_FillRectEx +*/ +void GUI_FillRectEx(const GUI_RECT* pRect) { + GUI_FillRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_FontIntern.h b/User/system/lib/lcd/gui/Core/GUI_FontIntern.h new file mode 100644 index 0000000..96a9c2c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_FontIntern.h @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_FontIntern.h +Purpose : Internal decalrations used in font files +---------------------------END-OF-HEADER------------------------------ + +Attention : Do not modify this file ! If you do, you will not + be able do update to a later GUI version ! + +*/ + + +#ifndef GUI_FONTINTERN_H /* Guard against multiple inclusion */ +#define GUI_FONTINTERN_H + +#include "GUI.h" + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + + +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font8ASCII_Prop; +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font10S_ASCII_FontProp1; +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font10ASCIIProp1; +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16ASCIIProp1; + +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_1_FontProp1; +extern GUI_CONST_STORAGE GUI_FONT_PROP FontComic24BProp_ASCII; + +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24B_ASCII_CharInfo[95]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24_ASCII_CharInfo[95]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32B_ASCII_CharInfo[95]; + +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32_ASCII_CharInfo[95]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x13_ASCII[96]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x15B_ASCII[96]; +extern GUI_CONST_STORAGE GUI_CHARINFO CharInfo18B_ASCII[97]; +extern GUI_CONST_STORAGE GUI_CHARINFO CharInfo24B_ASCII[96]; +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13ASCII_Prop1; +extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13B_ASCII_Prop1; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13H_ASCII_CharInfo[95]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13HB_ASCII_CharInfo[95]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16_HK_CharInfo[169]; +extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16B_ASCII_CharInfo[95]; + + +#if defined(__cplusplus) + } +#endif + + +#endif /* Guard against multiple inclusion */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c new file mode 100644 index 0000000..90daa8e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetBitmapPixelColor.c +Purpose : Gets the color from one pixel of a bitmap +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetBitmapPixelColor +*/ +GUI_COLOR GUI_GetBitmapPixelColor(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y) { + int Index = GUI_GetBitmapPixelIndex(pBMP, x, y); + if (pBMP->pPal->HasTrans && (Index == 0)) { + return GUI_INVALID_COLOR; + } + return pBMP->pPal->pPalEntries[Index]; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c new file mode 100644 index 0000000..df28f4a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c @@ -0,0 +1,64 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetBitmapPixelIndex.c +Purpose : Implementation of GUI_GetBitmapPixelIndex +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetBitmapPixelIndex +*/ +int GUI_GetBitmapPixelIndex(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y) { + unsigned Off, Value; + switch (pBMP->BitsPerPixel) { + case 1: + Off = (x >> 3) + (y * pBMP->BytesPerLine); + Value = *(pBMP->pData + Off); + Value = Value >> (7 - (x & 0x7)) & 0x1; + break; + case 2: + Off = (x >> 2) + (y * pBMP->BytesPerLine); + Value = *(pBMP->pData + Off); + Value = Value >> (6 - ((x << 1) & 0x6)) & 0x3; + break; + case 4: + Off = (x >> 1) + (y * pBMP->BytesPerLine); + Value = *(pBMP->pData + Off); + Value = (x & 1) ? (Value & 0xF) : (Value >> 4); + break; + case 8: + Off = x + y * pBMP->BytesPerLine; + Value = *(pBMP->pData + Off); + break; + case 16: + Off = (x << 1) + y * pBMP->BytesPerLine; + Value = *(pBMP->pData + Off) | (*(pBMP->pData + Off + 1) << 8); + break; + default: + Value = 0; + } + return Value; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetClientRect.c b/User/system/lib/lcd/gui/Core/GUI_GetClientRect.c new file mode 100644 index 0000000..8ce6c2b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetClientRect.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetClientRect.c +Purpose : Implementation of GUI_GetClientRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" +#include "GUIDebug.h" + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetClientRect +*/ +void GUI_GetClientRect(GUI_RECT* pRect) { + if (!pRect) + return; + #if GUI_WINSUPPORT + WM_GetClientRect(pRect); + #else + pRect->x0 = 0; + pRect->y0 = 0; + pRect->x1 = LCD_GET_XSIZE(); + pRect->y1 = LCD_GET_YSIZE(); + #endif +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetColor.c b/User/system/lib/lcd/gui/Core/GUI_GetColor.c new file mode 100644 index 0000000..988d11c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetColor.c @@ -0,0 +1,76 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetColor.C +Purpose : Implementation of different GUI_GetColor routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetBkColorIndex +*/ +int GUI_GetBkColorIndex(void) { + int r; + GUI_LOCK(); + r = LCD_GetBkColorIndex(); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetBkColor +*/ +GUI_COLOR GUI_GetBkColor(void) { + GUI_COLOR r; + GUI_LOCK(); + r = LCD_Index2Color(LCD_GetBkColorIndex()); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetColorIndex +*/ +int GUI_GetColorIndex(void) { + int r; + GUI_LOCK(); + r = LCD_GetColorIndex(); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetColor +*/ +GUI_COLOR GUI_GetColor(void) { + GUI_COLOR r; + GUI_LOCK(); + r = LCD_Index2Color(LCD_GetColorIndex()); + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetDispPos.c b/User/system/lib/lcd/gui/Core/GUI_GetDispPos.c new file mode 100644 index 0000000..e185498 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetDispPos.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetDispPos.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetDispPosX +* +* Purpose: +* Return X-component of current display position +*/ +int GUI_GetDispPosX(void) { + int r; + GUI_LOCK(); + r = GUI_Context.DispPosX; + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetDispPosY +* +* Purpose: +* Return Y-component of current display position +*/ +int GUI_GetDispPosY(void) { + int r; + GUI_LOCK(); + r = GUI_Context.DispPosY; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetFont.c b/User/system/lib/lcd/gui/Core/GUI_GetFont.c new file mode 100644 index 0000000..b481a23 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetFont.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetFont.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetFont +*/ +const GUI_FONT GUI_UNI_PTR* GUI_GetFont(void) { + const GUI_FONT GUI_UNI_PTR * r; + GUI_LOCK(); + r = GUI_Context.pAFont; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c b/User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c new file mode 100644 index 0000000..fff4402 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetFontInfo.C +Purpose : Get GUI_FONTINFO structure +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include + +#if GUI_COMPILER_SUPPORTS_FP + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetFontInfo +*/ +void GUI_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pFontInfo) { + GUI_LOCK(); + if (pFont == NULL) { + pFont = GUI_Context.pAFont; + } + pFontInfo->Baseline = pFont->Baseline; + pFontInfo->CHeight = pFont->CHeight; + pFontInfo->LHeight = pFont->LHeight; + pFont->pfGetFontInfo(pFont, pFontInfo); + GUI_UNLOCK(); +} + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c b/User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c new file mode 100644 index 0000000..d0ae9bd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetFontSizeY.c +Purpose : Implementation of optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetFontSizeY +*/ +int GUI_GetFontSizeY(void) { + int r; + GUI_LOCK(); + r = GUI__GetFontSizeY(); + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c b/User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c new file mode 100644 index 0000000..e8f814a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetLineStyle.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetLineStyle +*/ +U8 GUI_GetLineStyle(void) { + U8 r; + GUI_LOCK(); + r = GUI_Context.LineStyle; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c b/User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c new file mode 100644 index 0000000..391a11a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c @@ -0,0 +1,37 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetStringDistX.C +Purpose : Implementation of optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetStringDistX +*/ +int GUI_GetStringDistX(const char GUI_UNI_PTR * s) { + return GUI__GetLineDistX(s, GUI__strlen(s)); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c b/User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c new file mode 100644 index 0000000..36752b2 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetTextAlign.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetTextAlign +*/ +int GUI_GetTextAlign(void) { + int r; + GUI_LOCK(); + r = GUI_Context.TextAlign; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c b/User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c new file mode 100644 index 0000000..5258c8e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c @@ -0,0 +1,64 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetTextExtend.c +Purpose : Implementation of GUI_GetTextExtend +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetTextExtend +*/ +void GUI_GetTextExtend(GUI_RECT* pRect, const char GUI_UNI_PTR * s, int MaxNumChars) { + int xMax = 0; + int NumLines = 0; + int LineSizeX = 0; + U16 Char; + pRect->x0 = GUI_Context.DispPosX; + pRect->y0 = GUI_Context.DispPosY; + while (MaxNumChars--) { + Char = GUI_UC__GetCharCodeInc(&s); + if ((Char == '\n') || (Char == 0)) { + if (LineSizeX > xMax) { + xMax = LineSizeX; + } + LineSizeX = 0; + NumLines++; + if (!Char) { + break; + } + } else { + LineSizeX += GUI_GetCharDistX(Char); + } + } + if (LineSizeX > xMax) { + xMax = LineSizeX; + } + if (!NumLines) { + NumLines = 1; + } + pRect->x1 = pRect->x0 + xMax - 1; + pRect->y1 = pRect->y0 + GUI__GetFontSizeY() * NumLines - 1; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetTextMode.c b/User/system/lib/lcd/gui/Core/GUI_GetTextMode.c new file mode 100644 index 0000000..3cab5e4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetTextMode.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetTextMode.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetTextMode +*/ +int GUI_GetTextMode(void) { + int r; + GUI_LOCK(); + r = GUI_Context.TextMode; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetVersionString.c b/User/system/lib/lcd/gui/Core/GUI_GetVersionString.c new file mode 100644 index 0000000..eb0359c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetVersionString.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetVersionString.c +Purpose : Version information functions +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static char _acVersion[] = {"X.XX\0\0"}; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetVersionString +*/ +const char* GUI_GetVersionString(void) { + _acVersion[0] = '0' + (GUI_VERSION / 10000); + _acVersion[2] = '0' + (GUI_VERSION / 1000) % 10; + _acVersion[3] = '0' + (GUI_VERSION / 100) % 10; + #if GUI_VERSION%100 + _acVersion[4] = 'a' - 1 + (GUI_VERSION % 100); + #endif + return _acVersion; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c b/User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c new file mode 100644 index 0000000..0b7f3d7 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_GetYSizeOfFont.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetYSizeOfFont +*/ +int GUI_GetYSizeOfFont(const GUI_FONT GUI_UNI_PTR * pFont) { + return pFont->YSize * pFont->YMag; +} + +/********************************************************************* +* +* GUI_GetYDistOfFont +*/ +int GUI_GetYDistOfFont(const GUI_FONT GUI_UNI_PTR * pFont) { + return pFont->YDist * pFont->YMag; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Goto.c b/User/system/lib/lcd/gui/Core/GUI_Goto.c new file mode 100644 index 0000000..975eb19 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Goto.c @@ -0,0 +1,92 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Goto.c +Purpose : Implementation of GUI_Goto... routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GotoY +*/ +static char _GotoY(int y) { + GUI_Context.DispPosY = y; + return 0; +} + +/********************************************************************* +* +* _GotoX +*/ +static char _GotoX(int x) { + GUI_Context.DispPosX = x; + return 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GotoY +*/ +char GUI_GotoY(int y) { + char r; + GUI_LOCK(); + r = _GotoY(y); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GotoX +*/ +char GUI_GotoX(int x) { + char r; + GUI_LOCK(); + r = _GotoX(x); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GotoXY +*/ +char GUI_GotoXY(int x, int y) { + char r; + GUI_LOCK(); + r = _GotoX(x); + r |= _GotoY(y); + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_InitLUT.c b/User/system/lib/lcd/gui/Core/GUI_InitLUT.c new file mode 100644 index 0000000..5a87efd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_InitLUT.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_InitLUT.c +Purpose : Implementation of GUI_InitLUT +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_InitLUT +*/ +void GUI_InitLUT(void) { + GUI_LOCK(); + LCD_InitLUT(); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_InvertRect.c b/User/system/lib/lcd/gui/Core/GUI_InvertRect.c new file mode 100644 index 0000000..e3cef40 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_InvertRect.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_InvertRect.C +Purpose : Implementation file for GUI_InvertRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_InvertRect +*/ +void GUI_InvertRect(int x0, int y0, int x1, int y1) { + GUI_DRAWMODE PrevDraw; + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + PrevDraw = GUI_SetDrawMode(GUI_DRAWMODE_XOR); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0, y0); + WM_ADDORG(x1, y1); + r.x0 = x0; + r.x1 = x1; + r.y0 = y0; + r.y1 = y1; + WM_ITERATE_START(&r); { + #endif + LCD_FillRect(x0, y0, x1, y1); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_SetDrawMode(PrevDraw); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_IsInFont.c b/User/system/lib/lcd/gui/Core/GUI_IsInFont.c new file mode 100644 index 0000000..7ff850f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_IsInFont.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_IsInFont.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_IsInFont +*/ +char GUI_IsInFont(const GUI_FONT GUI_UNI_PTR *pFont, U16 c) { + if (pFont == NULL) { + pFont = GUI_Context.pAFont; + } + return pFont->pfIsInFont(pFont, c); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Log.c b/User/system/lib/lcd/gui/Core/GUI_Log.c new file mode 100644 index 0000000..4e88f56 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Log.c @@ -0,0 +1,126 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Log.C +Purpose : Logging (used only at higher debug levels) +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "GUI_X.h" + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define MAXLEN 50 + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _CopyString +*/ +static void _CopyString(char* d, const char* s, int MaxLen) { + while ((MaxLen > 0) && *s) { + *d++ = *s++; + MaxLen--; + } + *d = 0; +} + +/********************************************************************* +* +* Public code +* +* Note: These routines are needed only in higher debug levels. +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Log +*/ +void GUI_Log(const char *s) { + GUI_X_Log(s); +} + +/********************************************************************* +* +* GUI_Log1 +*/ +void GUI_Log1(const char *s, int p0) { + char ac[MAXLEN + 10]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI_Log(ac); +} + +/********************************************************************* +* +* GUI_Log2 +*/ +void GUI_Log2(const char *s, int p0, int p1) { + char ac[MAXLEN + 20]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI_Log(ac); +} + +/********************************************************************* +* +* GUI_Log3 +*/ +void GUI_Log3(const char *s, int p0, int p1, int p2) { + char ac[MAXLEN + 30]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI__AddSpaceHex(p2, 8, &sOut); + GUI_Log(ac); +} + +/********************************************************************* +* +* GUI_Log4 +*/ +void GUI_Log4(const char *s, int p0, int p1, int p2, int p3) { + char ac[MAXLEN + 40]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI__AddSpaceHex(p2, 8, &sOut); + GUI__AddSpaceHex(p3, 8, &sOut); + GUI_Log(ac); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_MOUSE.c b/User/system/lib/lcd/gui/Core/GUI_MOUSE.c new file mode 100644 index 0000000..98e5da3 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_MOUSE.c @@ -0,0 +1,60 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_MOUSE.C +Purpose : Generic mouse routines +---------------------------------------------------------------------- +*/ + +#include /* memcmp */ +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_PID_STATE _State; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MOUSE_GetState +*/ +int GUI_MOUSE_GetState(GUI_PID_STATE *pState) { + *pState = _State; + return (_State.Pressed != 0) ? 1 : 0; +} + +/********************************************************************* +* +* GUI_MOUSE_StoreState +*/ +void GUI_MOUSE_StoreState(const GUI_PID_STATE *pState) { + if (memcmp(pState, &_State, sizeof(_State))) { + _State = *pState; + GUI_PID_StoreState(pState); + } +} + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c b/User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c new file mode 100644 index 0000000..682e8ba --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c @@ -0,0 +1,135 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITOUCH.C +Purpose : Touch screen manager +---------------------------------------------------------------------- +This module handles the touch screen. It is configured in the file +GUITouch.conf.h (Should be located in the Config\ directory). +---------------------------------------------------------------------- +*/ + +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static int _ScreenX = 0; /* x-pos */ +static int _ScreenY = 0; /* y-pos */ +static int _NumBytesInBuffer = 0; /* bytes in rx buffer */ +static U8 _Buttons = 0; /* button status */ +static U8 _abInBuffer[3]; /* mouse rx buffer */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _EvaPacket +* +* Purpose: +* Process data packet from mouse: +* +* | D7 D6 D5 D4 D3 D2 D1 D0 +* ----------+---------------------------------------------- +* 1st byte | -- -- Y- X- 1 -- LB RB +* 2nd byte | X7 X6 X5 X4 X3 X2 X1 X0 +* 3rd byte | Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 +*/ +static void _EvaPacket(void) { + char a; + GUI_PID_STATE State; + _Buttons = _abInBuffer[0] & 0x03; + a = _abInBuffer[1]; + /* test x move sign. */ + if(_abInBuffer[0] & 0x10) { + a=-a; + _ScreenX -= a; + } /* direction is negative, move left */ + else { + _ScreenX += a; + } + a = _abInBuffer[2]; + /* test y move sign. */ + if(_abInBuffer[0] & 0x20) { + a=-a; + _ScreenY += a; + } /* direction is negative, move down */ else { + _ScreenY -= a; + } + /* check min/max positions */ + if (_ScreenX < 0) { + _ScreenX = 0; + } else if (_ScreenX > LCD_XSIZE-1) { + _ScreenX = LCD_XSIZE-1; + } if (_ScreenY < 0) { + _ScreenY = 0; + } else if (_ScreenY > LCD_YSIZE-1) { + _ScreenY = LCD_YSIZE-1; + } + /* signal new mouse data */ + State.x = _ScreenX; + State.y = _ScreenY; + State.Pressed = _Buttons; + GUI_MOUSE_StoreState(&State); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MOUSE_DRIVER_PS2_OnRx +* +* Purpose: +* Mouse receive interrupt handler. The PS2 mouse interrupt gets +* in three bytes from the mouse, then wakes up the mouse LSR. +*/ +void GUI_MOUSE_DRIVER_PS2_OnRx(unsigned char Data) { + if (!_NumBytesInBuffer) { + /* check for start frame */ + if ((Data & 0x0c) == 0x08) { + _abInBuffer[0] = Data; + _NumBytesInBuffer++; + } + } else { + _abInBuffer[_NumBytesInBuffer] = Data; + _NumBytesInBuffer++; + if (_NumBytesInBuffer >= 3) { + _EvaPacket(); + _NumBytesInBuffer = 0; + } + } +} + +/********************************************************************* +* +* GUI_MOUSE_DRIVER_PS2_Init +*/ +void GUI_MOUSE_DRIVER_PS2_Init(void) { + _NumBytesInBuffer = 0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_MergeRect.c b/User/system/lib/lcd/gui/Core/GUI_MergeRect.c new file mode 100644 index 0000000..88caea5 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_MergeRect.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_MergeRect.c +Purpose : Implementation of GUI_MergeRect +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define Min(v0,v1) ((v0>v1) ? v1 : v0) +#define Max(v0,v1) ((v0>v1) ? v0 : v1) + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MergeRect +* +* Purpose: +* Calc smalles rectangles containing both rects. +*/ +void GUI_MergeRect(GUI_RECT* pDest, const GUI_RECT* pr0, const GUI_RECT* pr1) { + if (pDest) { + if (pr0 && pr1) { + pDest->x0 = Min(pr0->x0, pr1->x0); + pDest->y0 = Min(pr0->y0, pr1->y0); + pDest->x1 = Max(pr0->x1, pr1->x1); + pDest->y1 = Max(pr0->y1, pr1->y1); + return; + } + *pDest = *(pr0 ? pr0 : pr1); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_MoveRect.c b/User/system/lib/lcd/gui/Core/GUI_MoveRect.c new file mode 100644 index 0000000..1c8aac5 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_MoveRect.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_MoveRect.c +Purpose : Implementation of GUI_MoveRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MoveRect +*/ +void GUI_MoveRect(GUI_RECT *pRect, int dx, int dy) { + if (pRect) { + pRect->x0 += dx; + pRect->x1 += dx; + pRect->y0 += dy; + pRect->y1 += dy; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_OnKey.c b/User/system/lib/lcd/gui/Core/GUI_OnKey.c new file mode 100644 index 0000000..d64bd70 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_OnKey.c @@ -0,0 +1,147 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_OnKey.c +Purpose : Implementation of GUI_StoreKeyMsg +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +#if GUI_WINSUPPORT + +static int _KeyMsgCnt; +static struct { + int Key; + int PressedCnt; +} _KeyMsg; + +#endif + +static int _Key; + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +GUI_KEY_MSG_HOOK* GUI_pfKeyMsgHook; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetKey +*/ +int GUI_GetKey(void) { + int r = _Key; + _Key = 0; + return r; +} + +/********************************************************************* +* +* GUI_StoreKey +*/ +void GUI_StoreKey(int Key) { + if (!_Key) { + _Key = Key; + } + GUI_X_SIGNAL_EVENT(); +} + +/********************************************************************* +* +* GUI_ClearKeyBuffer +*/ +void GUI_ClearKeyBuffer(void) { + while (GUI_GetKey()); +} + +/********************************************************************* +* +* GUI_StoreKeyMsg +*/ +void GUI_StoreKeyMsg(int Key, int PressedCnt) { + #if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + _KeyMsg.Key = Key; + _KeyMsg.PressedCnt = PressedCnt; + _KeyMsgCnt = 1; + GUI_X_SIGNAL_EVENT(); + #else + GUI_USE_PARA(PressedCnt); + GUI_StoreKey(Key); + #endif +} + +/********************************************************************* +* +* GUI_PollKeyMsg +*/ +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +int GUI_PollKeyMsg(void) { + int r = 0; + GUI_LOCK(); + if (_KeyMsgCnt) { + int Key; + _KeyMsgCnt--; + Key = _KeyMsg.Key; + WM_OnKey(Key, _KeyMsg.PressedCnt); + if (_KeyMsg.PressedCnt == 1) { + GUI_StoreKey(Key); + } + r = 1; /* We have done something */ + } + GUI_UNLOCK(); + return r; +} +#endif + +/********************************************************************* +* +* GUI_SendKeyMsg +* +* Purpose: +* Send the key to a window using the window manager (if available). +* If no window is ready to take the input, we call the store routine +* and wait for somebody to poll the buffer. +*/ +void GUI_SendKeyMsg(int Key, int PressedCnt) { + #if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + if (!WM_OnKey(Key, PressedCnt)) { + GUI_StoreKeyMsg(Key, PressedCnt); + } + #else + GUI_StoreKeyMsg(Key, PressedCnt); + #endif +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_PID.c b/User/system/lib/lcd/gui/Core/GUI_PID.c new file mode 100644 index 0000000..ed7c974 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_PID.c @@ -0,0 +1,86 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_PID.C +Purpose : PID (Pointer input device) management +---------------------------------------------------------------------- +*/ + +#include +#include +#include +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_PID_STATE _State; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _PID_Load +* +* Purpose: +* If the window manager is available, write the function pointer for +* the PID handler. +*/ +static void _PID_Load(void) { + #if (GUI_WINSUPPORT) + WM_pfHandlePID = WM_HandlePID; + #endif +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_PID_GetState +*/ +int GUI_PID_GetState(GUI_PID_STATE *pState) { + *pState = _State; + return (pState->Pressed != 0) ? 1 : 0; +} + +/********************************************************************* +* +* GUI_PID_StoreState +*/ +void GUI_PID_StoreState(const GUI_PID_STATE *pState) { + _PID_Load(); + if (memcmp(&_State, pState, sizeof(_State))) { + _State = *pState; + GUI_X_SIGNAL_EVENT(); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Pen.c b/User/system/lib/lcd/gui/Core/GUI_Pen.c new file mode 100644 index 0000000..615c3d6 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Pen.c @@ -0,0 +1,78 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Pen.C +Purpose : Getting / Setting pen attributes +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetPenSize +*/ +U8 GUI_GetPenSize(void) { + U8 r; + GUI_LOCK(); + r = GUI_Context.PenSize; + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_GetPenShape +*/ +U8 GUI_GetPenShape(void) { + U8 r; + GUI_LOCK(); + r = GUI_Context.PenShape; + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_SetPenSize +*/ +U8 GUI_SetPenSize(U8 PenSize) { + U8 r; + GUI_LOCK(); + r = GUI_Context.PenSize; + GUI_Context.PenSize = PenSize; + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_SetPenShape +*/ +U8 GUI_SetPenShape(U8 PenShape) { + U8 r; + GUI_LOCK(); + r = GUI_Context.PenShape; + GUI_Context.PenShape = PenShape; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Private.h b/User/system/lib/lcd/gui/Core/GUI_Private.h new file mode 100644 index 0000000..0cf3dc1 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Private.h @@ -0,0 +1,94 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Private.h +Purpose : GUI internal declarations +---------------------------END-OF-HEADER------------------------------ + +Attention : Do not modify this file ! If you do, you will not + be able do update to a later GUI version ! + +*/ + +#ifndef GUI_PRIVATE_H +#define GUI_PRIVATE_H + +#include "GUI_Protected.h" +#include "LCD_Private.h" /* Required because of LCD_PIXELINDEX, which depends on LCDConf */ + +#if GUI_SUPPORT_DEVICES + #define LCDDEV_L0_Color2Index GUI_Context.pDeviceAPI->pfColor2Index + #define LCDDEV_L0_DrawBitmap GUI_Context.pDeviceAPI->pfDrawBitmap + #define LCDDEV_L0_DrawHLine GUI_Context.pDeviceAPI->pfDrawHLine + #define LCDDEV_L0_DrawVLine GUI_Context.pDeviceAPI->pfDrawVLine + #define LCDDEV_L0_DrawPixel GUI_Context.pDeviceAPI->pfDrawPixel + #define LCDDEV_L0_FillRect GUI_Context.pDeviceAPI->pfFillRect + #define LCDDEV_L0_GetPixel GUI_Context.pDeviceAPI->pfGetPixel + #define LCDDEV_L0_GetRect GUI_Context.pDeviceAPI->pfGetRect + #define LCDDEV_L0_GetPixelIndex GUI_Context.pDeviceAPI->pfGetPixelIndex + #define LCDDEV_L0_Index2Color GUI_Context.pDeviceAPI->pfIndex2Color + #define LCDDEV_L0_SetPixelIndex GUI_Context.pDeviceAPI->pfSetPixelIndex + #define LCDDEV_L0_XorPixel GUI_Context.pDeviceAPI->pfXorPixel +#else + #define LCDDEV_L0_Color2Index LCD_L0_Color2Index + #define LCDDEV_L0_DrawBitmap LCD_L0_DrawBitmap + #define LCDDEV_L0_DrawHLine LCD_L0_DrawHLine + #define LCDDEV_L0_DrawVLine LCD_L0_DrawVLine + #define LCDDEV_L0_DrawPixel LCD_L0_DrawPixel + #define LCDDEV_L0_FillRect LCD_L0_FillRect + #define LCDDEV_L0_GetPixel LCD_L0_GetPixel + #define LCDDEV_L0_GetRect LCD_L0_GetRect + #define LCDDEV_L0_GetPixelIndex LCD_L0_GetPixelIndex + #define LCDDEV_L0_Index2Color LCD_L0_Index2Color + #define LCDDEV_L0_SetPixelIndex LCD_L0_SetPixelIndex + #define LCDDEV_L0_XorPixel LCD_L0_XorPixel +#endif + +void LCD_L0_DrawBitmap (int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); +void LCD_L0_1_DrawBitmap (int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); +void LCD_L0_2_DrawBitmap (int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); +void LCD_L0_3_DrawBitmap (int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); +void LCD_L0_4_DrawBitmap (int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); +void LCD_L0_MAG_DrawBitmap(int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); +void LCD_L0_DELTA_DrawBitmap(int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans); + +LCD_PIXELINDEX* LCD_GetpPalConvTable(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal); +LCD_PIXELINDEX* LCD_GetpPalConvTableUncached(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal); + + +#define GUI_POS_AUTO -4095 /* Position value for auto-pos */ + +#if GUI_SUPPORT_MEMDEV + void* GUI_MEMDEV__XY2PTR (int x,int y); + void* GUI_MEMDEV__XY2PTREx(GUI_MEMDEV* pDev, int x,int y); + void GUI_MEMDEV__WriteToActiveAt(GUI_MEMDEV_Handle hMem,int x, int y); +#endif + +#endif /* ifdef GUI_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Protected.h b/User/system/lib/lcd/gui/Core/GUI_Protected.h new file mode 100644 index 0000000..7ca0876 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Protected.h @@ -0,0 +1,404 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Protected.h +Purpose : GUI internal declarations +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef GUI_PROTECTED_H +#define GUI_PROTECTED_H + +#include "GUI.h" +#include "LCD_Protected.h" +#include "GUIDebug.h" +#if GUI_WINSUPPORT + #include "WM_GUI.h" +#endif + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************** +* +* Defaults for config switches +* +*********************************************************************** + + The config switches below do not affect the interface in GUI.h and + are therefor not required to be in GUI.h. +*/ + +/* Short address area. + For most compilers, this is "near" or "__near" + We do not use this except for some CPUs which we know to always have some + near memory, because the GUI_Context ans some other data will be declared + to be in this short address (near) memory area as it has a major effect + on performance. + Please define in GUIConf.h (if you want to use it) +*/ +#ifndef GUI_SADDR + #define GUI_SADDR +#endif + +#ifndef GUI_DEFAULT_FONT + #define GUI_DEFAULT_FONT &GUI_Font6x8 +#endif + +#ifndef GUI_DEFAULT_CURSOR + #define GUI_DEFAULT_CURSOR &GUI_CursorArrowM +#endif + +#ifndef GUI_DEFAULT_BKCOLOR + #define GUI_DEFAULT_BKCOLOR GUI_BLACK +#endif + +#ifndef GUI_DEFAULT_COLOR + #define GUI_DEFAULT_COLOR GUI_WHITE +#endif + +#ifndef GUI_X_SIGNAL_EVENT + #define GUI_X_SIGNAL_EVENT() +#endif + +#ifndef GUI_X_WAIT_EVENT + #define GUI_X_WAIT_EVENT() GUI_X_ExecIdle() +#endif + + +/* ********************************* + * * + * Angles * + * * + ********************************* +*/ + +#define GUI_45DEG 512 +#define GUI_90DEG (2*GUI_45DEG) +#define GUI_180DEG (4*GUI_45DEG) +#define GUI_360DEG (8*GUI_45DEG) + + + + + +/***************************************************** +* +* Locking checks +* +****************************************************** +*/ + +#if defined (WIN32) && defined (_DEBUG) && GUI_OS + #define GUI_ASSERT_LOCK() GUITASK_AssertLock() + #define GUI_ASSERT_NO_LOCK() GUITASK_AssertNoLock() + void GUITASK_AssertLock(void); + void GUITASK_AssertNoLock(void); +#else + #define GUI_ASSERT_LOCK() + #define GUI_ASSERT_NO_LOCK() +#endif + +/***************************************************** +* +* Usage internals +* +****************************************************** +*/ + +typedef enum { GUI_WRAPMODE_NONE, GUI_WRAPMODE_WORD, GUI_WRAPMODE_CHAR } GUI_WRAPMODE; + +typedef GUI_HMEM GUI_USAGE_Handle; +typedef struct tsUSAGE_APIList tUSAGE_APIList; +typedef struct GUI_Usage GUI_USAGE; +#define GUI_USAGE_h GUI_USAGE_Handle + + + +typedef GUI_USAGE_h tUSAGE_CreateCompatible(GUI_USAGE* p); +typedef void tUSAGE_AddPixel (GUI_USAGE* p, int x, int y); +typedef void tUSAGE_AddHLine (GUI_USAGE* p, int x0, int y0, int len); +typedef void tUSAGE_Clear (GUI_USAGE* p); +typedef void tUSAGE_Delete (GUI_USAGE_h h); +typedef int tUSAGE_GetNextDirty (GUI_USAGE* p, int *pxOff, int yOff); +#define GUI_USAGE_H2P(h) ((GUI_USAGE*)GUI_ALLOC_h2p(h)) + + +void GUI_USAGE_DecUseCnt(GUI_USAGE_Handle hUsage); + +GUI_USAGE_Handle GUI_USAGE_BM_Create(int x0, int y0, int xsize, int ysize, int Flags); +void GUI_USAGE_Select(GUI_USAGE_Handle hUsage); +void GUI_USAGE_AddRect(GUI_USAGE* pUsage, int x0, int y0, int xSize, int ySize); +#define GUI_USAGE_AddPixel(p, x,y) p->pAPI->pfAddPixel(p,x,y) +#define GUI_USAGE_AddHLine(p,x,y,len) p->pAPI->pfAddHLine(p,x,y,len) +#define GUI_USAGE_Clear(p) p->pAPI->pfClear(p) +#define GUI_USAGE_Delete(p) p->pAPI->pfDelete(p) +#define GUI_USAGE_GetNextDirty(p,pxOff, yOff) p->pAPI->pfGetNextDirty(p,pxOff, yOff) + +struct tsUSAGE_APIList { + tUSAGE_AddPixel* pfAddPixel; + tUSAGE_AddHLine* pfAddHLine; + tUSAGE_Clear* pfClear; + tUSAGE_CreateCompatible* pfCreateCompatible; + tUSAGE_Delete* pfDelete; + tUSAGE_GetNextDirty* pfGetNextDirty; +} ; + +struct GUI_Usage { + I16P x0, y0, XSize, YSize; + const tUSAGE_APIList *pAPI; + I16 UseCnt; +}; + +/***************************************************** +* +* GUI_MEMDEV +* +****************************************************** +*/ + +#if GUI_SUPPORT_MEMDEV + typedef struct /*GUI_MEMDEV*/ { + I16P x0, y0, XSize, YSize; + int NumColors; + unsigned BytesPerLine; + unsigned BitsPerPixel; + unsigned LayerIndex; + GUI_HMEM hUsage; + tLCDDEV_Color2Index* pfColor2Index; + tLCDDEV_Index2Color* pfIndex2Color; + tLCDDEV_GetIndexMask* pfGetIndexMask; + const tLCDDEV_APIList* pAPIList; + } GUI_MEMDEV; + + #define GUI_MEMDEV_H2P(h) ((GUI_MEMDEV*)GUI_ALLOC_h2p(h)) + + void GUI_MEMDEV__CopyFromLCD (GUI_MEMDEV_Handle hMem); + void GUI_MEMDEV__GetRect (GUI_RECT* pRect); + unsigned GUI_MEMDEV__Color2Index (LCD_COLOR Color); + LCD_COLOR GUI_MEMDEV__Index2Color (int Index); + unsigned int GUI_MEMDEV__GetIndexMask(void); + + GUI_MEMDEV_Handle GUI_MEMDEV__CreateFixed(int x0, int y0, int xsize, int ysize, int Flags + ,const tLCDDEV_APIList * pMemDevAPI + ,tLCDDEV_Color2Index* pfColor2Index + ,tLCDDEV_Index2Color* pfIndex2Color + ,tLCDDEV_GetIndexMask* pfGetIndexMask); + +#endif + +/******************************************************************* +* +* LCD_HL_ level defines +* +******************************************************************** +*/ + +#if GUI_SUPPORT_AA + #define LCD_HL_DrawHLine GUI_Context.pLCD_HL->pfDrawHLine + #define LCD_HL_DrawPixel GUI_Context.pLCD_HL->pfDrawPixel +#else + #define LCD_HL_DrawHLine LCD_DrawHLine + #define LCD_HL_DrawPixel LCD_DrawPixel +#endif + + +/********************************************************************* +* +* Helper functions +* +*********************************************************************** +*/ + +#define GUI_ZEROINIT(Obj) GUI_MEMSET(Obj, 0, sizeof(Obj)) +int GUI_cos(int angle); +int GUI_sin(int angle); +void GL_DrawLine1(int x0, int y0, int x1, int y1); +extern const U32 GUI_Pow10[10]; + +/* GUIAALib.c --- direct anti-aliased drawing */ +int GUI_AA_Init(int x0, int x1); +int GUI_AA_Init_HiRes(int x0, int x1); +void GUI_AA_Exit(void); +I16 GUI_AA_HiRes2Pixel(int HiRes); + +void GL_FillCircleAA_HiRes(int x0, int y0, int r); + +/* Conversion routines */ +void GUI_AddHex (U32 v, U8 Len, char**ps); +void GUI_AddBin (U32 v, U8 Len, char**ps); +void GUI_AddDecMin (I32 v, char**ps); +void GUI_AddDec (I32 v, U8 Len, char**ps); +void GUI_AddDecShift(I32 v, U8 Len, U8 Shift, char**ps); +long GUI_AddSign (long v, char**ps); +int GUI_Long2Len (I32 v); + +#define GUI_UC__GetCharSize(sText) GUI_Context.pUC_API->pfGetCharSize(sText) +#define GUI_UC__GetCharCode(sText) GUI_Context.pUC_API->pfGetCharCode(sText) + +int GUI_UC__CalcSizeOfChar (U16 Char); +U16 GUI_UC__GetCharCodeInc (const char GUI_UNI_PTR ** ps); +int GUI_UC__NumChars2NumBytes(const char GUI_UNI_PTR * s, int NumChars); +int GUI_UC__NumBytes2NumChars(const char GUI_UNI_PTR * s, int NumBytes); + +int GUI__GetLineNumChars (const char GUI_UNI_PTR *s, int MaxNumChars); +int GUI__GetNumChars (const char GUI_UNI_PTR *s); +int GUI__GetLineDistX (const char GUI_UNI_PTR *s, int Len); +int GUI__GetFontSizeY (void); +int GUI__HandleEOLine (const char GUI_UNI_PTR **ps); +void GUI__DispLine (const char GUI_UNI_PTR *s, int Len, const GUI_RECT* pr); +void GUI__AddSpaceHex (U32 v, U8 Len, char**ps); +void GUI__CalcTextRect (const char GUI_UNI_PTR* pText, const GUI_RECT* pTextRectIn, GUI_RECT* pTextRectOut, int TextAlign); + +int GUI__WrapGetNumCharsDisp (const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode); +int GUI__WrapGetNumCharsToNextLine (const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode); +int GUI__WrapGetNumBytesToNextLine (const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode); +void GUI__memset (U8 * p, U8 Fill, int NumBytes); +void GUI__memset16 (U16* p, U16 Fill, int NumWords); +int GUI__strlen (const char GUI_UNI_PTR * s); +int GUI__strcmp (const char GUI_UNI_PTR * s0, const char GUI_UNI_PTR * s1); +int GUI__strcmp_hp (GUI_HMEM hs0, const char GUI_UNI_PTR * s1); + +/* Reading data routines */ +U16 GUI__Read16(const U8 ** ppData); +U32 GUI__Read32(const U8 ** ppData); + +/********************************************************************* +* +* 2d - GL +* +********************************************************************** +*/ + +void GL_DispChar (U16 c); +void GL_DrawArc (int x0, int y0, int rx, int ry, int a0, int a1); +void GL_DrawBitmap (const GUI_BITMAP GUI_UNI_PTR * pBM, int x0, int y0); +void GL_DrawCircle (int x0, int y0, int r); +void GL_DrawEllipse (int x0, int y0, int rx, int ry); +void GL_DrawHLine (int y0, int x0, int x1); +void GL_DrawPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0); +void GL_DrawPoint (int x, int y); +void GL_DrawLineRel (int dx, int dy); +void GL_DrawLineTo (int x, int y); +void GL_DrawLine (int x0, int y0, int x1, int y1); +void GL_MoveTo (int x, int y); +void GL_FillCircle (int x0, int y0, int r); +void GL_FillCircleAA (int x0, int y0, int r); +void GL_FillEllipse (int x0, int y0, int rx, int ry); +void GL_FillPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0); +void GL_SetDefault (void); + +/************************************************************ +* +* Callback pointers for dynamic linkage +* +************************************************************* +Dynamic linkage pointers reduces configuration hassles. +*/ +typedef int GUI_tfTimer(void); +typedef char GUI_CURSOR_tfTempHide (const GUI_RECT* pRect); +typedef void GUI_CURSOR_tfTempUnhide(void); +typedef int WM_tfHandlePID(void); + + +/************************************************************ +* +* Cursors +* +************************************************************* +*/ + +extern GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowS[45]; +extern GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowM[60]; +extern GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowL[150]; +extern GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossS[33]; +extern GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossM[126]; +extern GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossL[248]; +extern GUI_CONST_STORAGE unsigned char GUI_PixelsHeaderM[5 * 17]; + + +extern GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPal; +extern GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPalI; + +/************************************************************ +* +* Text rotation +* +************************************************************* +*/ + +extern GUI_RECT GUI_RectDispString; /* Used by LCD_Rotate...() and GUI_DispStringInRect() */ + +/********************************************************************* +* +* Bitmap related functions +* +********************************************************************** +*/ + +int GUI_GetBitmapPixelIndex(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y); +GUI_COLOR GUI_GetBitmapPixelColor(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y); + +#if defined(__cplusplus) +} +#endif + +#endif /* Avoid multiple inclusion */ + +/************************************************************ +* +* GUI_EXTERN declartions/definitions +* +************************************************************* +*/ + +#ifdef GL_CORE_C + #define GUI_EXTERN +#else + #if defined(__cplusplus) + #define GUI_EXTERN extern "C" + #else + #define GUI_EXTERN extern + #endif +#endif + +GUI_EXTERN GUI_SADDR GUI_CONTEXT GUI_Context; /* Thread wide globals */ +GUI_EXTERN GUI_SADDR char GUI_DecChar; +GUI_EXTERN GUI_tfTimer* GUI_pfTimerExec; +GUI_EXTERN WM_tfHandlePID* WM_pfHandlePID; +GUI_EXTERN void (*GUI_pfDispCharStyle)(U16 Char); + +#if GUI_COMPILER_SUPPORTS_FP && GUI_SUPPORT_ROTATION + GUI_EXTERN const tLCD_APIList * GUI_pLCD_APIList; /* Used for rotating text */ +#endif + +#if GUI_SUPPORT_CURSOR + GUI_EXTERN GUI_CURSOR_tfTempHide* GUI_CURSOR_pfTempHide; + GUI_EXTERN GUI_CURSOR_tfTempUnhide* GUI_CURSOR_pfTempUnhide; +#endif + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +extern const GUI_UC_ENC_APILIST GUI__API_TableNone; + +#if defined(__cplusplus) + } +#endif + +#undef GUI_EXTERN + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c b/User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c new file mode 100644 index 0000000..25036a4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_RectsIntersect.C +Purpose : Implementation of GUI_RectsIntersect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_RectsIntersect +* +* Purpose: +* Check if rectangle do intersect. +* +* Return value: +* 0 if they do not. +* 1 if they do. +*/ +int GUI_RectsIntersect(const GUI_RECT* pr0, const GUI_RECT* pr1) { + if (pr0->y0 <= pr1->y1) { + if (pr1->y0 <= pr0->y1) { + if (pr0->x0 <= pr1->x1) { + if (pr1->x0 <= pr0->x1) { + return 1; + } + } + } + } + return 0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SIF.c b/User/system/lib/lcd/gui/Core/GUI_SIF.c new file mode 100644 index 0000000..e36f039 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SIF.c @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SIF.c +Purpose : Implementation of system independend fonts +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ + +/********************************************************************* +* +* GUI_SIF_CreateFont +*/ +void GUI_SIF_CreateFont(void * pFontData, GUI_FONT * pFont, const GUI_SIF_TYPE * pFontType) { + const U8 * pSrc = (const U8 *)pFontData; + U32 ID; + /* Set pFontData of GUI_FONT structure to the first byte */ + pFont->p.pFontData = pFontData; + /* Check ID */ + ID = GUI__Read32(&pSrc); + if (ID != 0x50495547) { /* 'GUIP' */ + GUI_DEBUG_ERROROUT("ID of downloaded font wrong!"); + return; + } + /* Read properties of the font */ + pFont->YSize = GUI__Read16(&pSrc); + pFont->YDist = GUI__Read16(&pSrc); + pFont->Baseline = GUI__Read16(&pSrc); + pFont->LHeight = GUI__Read16(&pSrc); + pFont->CHeight = GUI__Read16(&pSrc); + /* Magnification is always 1 */ + pFont->XMag = 1; + pFont->YMag = 1; + /* Set function pointers */ + pFont->pfDispChar = pFontType->pDispChar; + pFont->pfGetCharDistX = pFontType->pGetCharDistX; + pFont->pfGetFontInfo = pFontType->pGetFontInfo; + pFont->pfIsInFont = pFontType->pIsInFont; + pFont->pafEncode = 0; + /* Use the new font */ + GUI_SetFont(pFont); +} + +/********************************************************************* +* +* GUI_SIF_DeleteFont +*/ +void GUI_SIF_DeleteFont(GUI_FONT * pFont) { + GUI_USE_PARA(pFont); +} diff --git a/User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c b/User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c new file mode 100644 index 0000000..21b92bf --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c @@ -0,0 +1,168 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SIF_Prop.c +Purpose : Implementation of system independend fonts +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +/********************************************************************* +* +* _GetNumCharAreas +*/ +static int _GetNumCharAreas(const GUI_FONT GUI_UNI_PTR * pFont) { + U16 NumCharAreas; + const U8 * pData; + pData = (const U8 *)pFont->p.pFontData + 14 /* Skip ID, YSize, YDist, Baseline, LHeight and CHeight */; + NumCharAreas = GUI__Read16(&pData); + return NumCharAreas; +} + +/********************************************************************* +* +* _GetpCharInfo +*/ +static const U8 * _GetpCharInfo(const GUI_FONT GUI_UNI_PTR * pFont, U16P c) { + const U8 * pCharArea, * pCharInfo; + int NumCharAreas; + NumCharAreas = _GetNumCharAreas(pFont); /* Get # of char areas */ + pCharArea = (const U8 *)pFont->p.pFontData + + sizeof(GUI_SI_FONT); /* Set char area pointer to first char area */ + pCharInfo = pCharArea + + sizeof(GUI_SIF_CHAR_AREA) * NumCharAreas; /* Set char info pointer to first character info */ + do { + GUI_SIF_CHAR_AREA CharArea; + CharArea.First = GUI__Read16(&pCharArea); + CharArea.Last = GUI__Read16(&pCharArea); + if ((c >= CharArea.First) && (c <= CharArea.Last)) { + pCharInfo += sizeof(GUI_SIF_CHARINFO) * (c - CharArea.First); + return pCharInfo; + } + pCharInfo += sizeof(GUI_SIF_CHARINFO) * (CharArea.Last - CharArea.First + 1); + } while(--NumCharAreas); + return 0; +} + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ + +/********************************************************************* +* +* GUI_SIF_DispChar +*/ +static void _GUI_SIF_DispChar(U16P c) { + const U8 * pCharInfo, * pData; + pCharInfo = _GetpCharInfo(GUI_Context.pAFont, c); + if (pCharInfo) { + GUI_DRAWMODE DrawMode, OldDrawMode; + GUI_SIF_CHARINFO CharInfo; + CharInfo.XSize = GUI__Read16(&pCharInfo); + CharInfo.XDist = GUI__Read16(&pCharInfo); + CharInfo.BytesPerLine = GUI__Read16(&pCharInfo); + GUI__Read16(&pCharInfo); /* Dummy */ + CharInfo.OffData = GUI__Read32(&pCharInfo); + pData = (const U8 *)GUI_Context.pAFont->p.pFontData + CharInfo.OffData; + DrawMode = GUI_Context.TextMode; + OldDrawMode = LCD_SetDrawMode(DrawMode); + LCD_DrawBitmap(GUI_Context.DispPosX, GUI_Context.DispPosY, + CharInfo.XSize, + GUI_Context.pAFont->YSize, + GUI_Context.pAFont->XMag, + GUI_Context.pAFont->YMag, + 1, + CharInfo.BytesPerLine, + pData, + &LCD_BKCOLORINDEX); + /* Fill empty pixel lines */ + if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) { + int YMag = GUI_Context.pAFont->YMag; + int YDist = GUI_Context.pAFont->YDist * YMag; + int YSize = GUI_Context.pAFont->YSize * YMag; + if (DrawMode != LCD_DRAWMODE_TRANS) { + LCD_COLOR OldColor = GUI_GetColor(); + GUI_SetColor(GUI_GetBkColor()); + LCD_FillRect(GUI_Context.DispPosX, + GUI_Context.DispPosY + YSize, + GUI_Context.DispPosX + CharInfo.XSize, + GUI_Context.DispPosY + YDist); + GUI_SetColor(OldColor); + } + } + LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ + GUI_Context.DispPosX += CharInfo.XDist; + } +} + +/********************************************************************* +* +* GUI_SIF_GetCharDistX +*/ +static int _GUI_SIF_GetCharDistX(U16P c) { + const U8 * pCharInfo; + U16 DistX = 0; + pCharInfo = _GetpCharInfo(GUI_Context.pAFont, c); /* Get pointer to char info data */ + if (pCharInfo) { + pCharInfo += 2 /* Skip XSize */; + DistX = GUI__Read16(&pCharInfo); + } + return DistX; +} + +/********************************************************************* +* +* GUI_SIF_GetFontInfo +*/ +static void _GUI_SIF_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pfi) { + const U8 * pData; + pData = (const U8 *)pFont->p.pFontData + 4 /* Skip XSize and XDist */; + pfi->Baseline = GUI__Read16(&pData); + pfi->LHeight = GUI__Read16(&pData); + pfi->CHeight = GUI__Read16(&pData); + pfi->Flags = GUI_FONTINFO_FLAG_PROP; +} + +/********************************************************************* +* +* GUI_SIF_IsInFont +*/ +static char _GUI_SIF_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) { + const U8 * pCharInfo; + GUI_USE_PARA(pFont); + pCharInfo = _GetpCharInfo(GUI_Context.pAFont, c); + return (pCharInfo) ? 1 : 0; +} + +/********************************************************************* +* +* GUI_SIF_TYPE_PROP +*/ +const tGUI_SIF_APIList GUI_SIF_APIList_Prop = { + _GUI_SIF_DispChar, + _GUI_SIF_GetCharDistX, + _GUI_SIF_GetFontInfo, + _GUI_SIF_IsInFont +}; diff --git a/User/system/lib/lcd/gui/Core/GUI_SaveContext.c b/User/system/lib/lcd/gui/Core/GUI_SaveContext.c new file mode 100644 index 0000000..157bd70 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SaveContext.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SaveContext.c +Purpose : Code to save and restore GUI context +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SaveContext +*/ +void GUI_SaveContext(GUI_CONTEXT* pContext) { + *pContext = GUI_Context; +} + +/********************************************************************* +* +* GUI_RestoreContext +*/ +void GUI_RestoreContext(const GUI_CONTEXT* pContext) { + GUI_Context = *pContext; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SelectLCD.c b/User/system/lib/lcd/gui/Core/GUI_SelectLCD.c new file mode 100644 index 0000000..f4ebe67 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SelectLCD.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SelectLCD.c +Purpose : Implementation of said routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SelectLCD +*/ +void GUI_SelectLCD(void) { + GUI_LOCK(); + #if GUI_SUPPORT_DEVICES + LCD_SelectLCD(); + LCD_UpdateColorIndices(); + #if GUI_WINSUPPORT + WM_Activate(); + #endif + #endif + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SelectLayer.c b/User/system/lib/lcd/gui/Core/GUI_SelectLayer.c new file mode 100644 index 0000000..ae03808 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SelectLayer.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SelectLayer.c.C +Purpose : Selection of Layer +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SelectLayer +*/ +unsigned int GUI_SelectLayer(unsigned int Index) { + unsigned int OldIndex; + GUI_LOCK(); + OldIndex = GUI_Context.SelLayer; + if (Index < GUI_NUM_LAYERS) { + GUI_Context.SelLayer = Index; + GUI_SelectLCD(); + } + GUI_UNLOCK(); + return OldIndex; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetColor.c b/User/system/lib/lcd/gui/Core/GUI_SetColor.c new file mode 100644 index 0000000..5ae0412 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetColor.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetColor.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetBkColor +*/ +void GUI_SetBkColor(GUI_COLOR color) { + GUI_LOCK(); { + LCD_SetBkColor(color); + } GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_SetColor +*/ +void GUI_SetColor(GUI_COLOR color) { + GUI_LOCK(); { + LCD_SetColor(color); + } GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c b/User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c new file mode 100644 index 0000000..5a1853c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DrawBitmap.C +Purpose : Implementation of GUI_DrawBitmap +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetBkColorIndex +*/ +void GUI_SetBkColorIndex(int Index) { + GUI_LOCK(); { + GUI_Context.BkColor = GUI_INVALID_COLOR; + LCD_SetBkColorIndex(Index); + } GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_SetColorIndex +*/ +void GUI_SetColorIndex(int Index) { + GUI_LOCK(); { + GUI_Context.Color = GUI_INVALID_COLOR; + LCD_SetColorIndex(Index); + } GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetDecChar.c b/User/system/lib/lcd/gui/Core/GUI_SetDecChar.c new file mode 100644 index 0000000..9074be4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetDecChar.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetDecChar.C +Purpose : Routines to set the character used for decimal point +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetDecChar +*/ +char GUI_SetDecChar(char c) { + char r = GUI_DecChar; + GUI_DecChar = c; + return r; +} + +/********************************************************************* +* +* GUI_GetDecChar +*/ +char GUI_GetDecChar(void) { + return GUI_DecChar; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetDefault.c b/User/system/lib/lcd/gui/Core/GUI_SetDefault.c new file mode 100644 index 0000000..9b28dc9 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetDefault.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetDefault.c +Purpose : Implementation of GUI_SetDefault +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GL_SetDefault +*/ +void GL_SetDefault(void) { + GUI_SetBkColor(GUI_DEFAULT_BKCOLOR); + GUI_SetColor (GUI_DEFAULT_COLOR); + GUI_SetPenSize(1); + GUI_SetTextAlign(0); + GUI_SetTextMode(0); + GUI_SetDrawMode(0); + GUI_SetFont(GUI_DEFAULT_FONT); + GUI_SetLineStyle(GUI_LS_SOLID); +} + +/********************************************************************* +* +* GUI_SetDefault +*/ +void GUI_SetDefault(void) { + GUI_LOCK(); + GL_SetDefault(); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c b/User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c new file mode 100644 index 0000000..9a046ad --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c @@ -0,0 +1,43 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetDrawMode.C +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetDrawMode +*/ +GUI_DRAWMODE GUI_SetDrawMode(GUI_DRAWMODE dm) { + GUI_DRAWMODE OldMode; + GUI_LOCK(); { + OldMode = LCD_SetDrawMode(dm); + } GUI_UNLOCK(); + return OldMode; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetFont.c b/User/system/lib/lcd/gui/Core/GUI_SetFont.c new file mode 100644 index 0000000..b6a5fb4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetFont.c @@ -0,0 +1,42 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetFont.C +Purpose : Optional routines +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetFont +*/ +const GUI_FONT GUI_UNI_PTR* GUI_SetFont(const GUI_FONT GUI_UNI_PTR * pNewFont) { + const GUI_FONT GUI_UNI_PTR* pOldFont = GUI_Context.pAFont; + GUI_LOCK(); + if (pNewFont) + GUI_Context.pAFont = pNewFont; + GUI_UNLOCK(); + return pOldFont; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLBorder.c b/User/system/lib/lcd/gui/Core/GUI_SetLBorder.c new file mode 100644 index 0000000..1fb60d6 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetLBorder.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetLBorder.C +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetLBorder +* +* Purpose: +* Sets the left border (for carriage return). +*/ +int GUI_SetLBorder(int x) { + int r; + GUI_LOCK(); + r = GUI_Context.LBorder; + GUI_Context.LBorder = x; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c b/User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c new file mode 100644 index 0000000..375a9ef --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetLUTColor.c +Purpose : Implementation of GUI_SetLUTColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetLUTColor +*/ +void GUI_SetLUTColor(U8 Pos, LCD_COLOR Color) { + #if LCD_PHYSCOLORS_IN_RAM + GUI_LOCK(); + LCD_PhysColors[Pos] = Color; + LCD_SetLUTEntry(Pos, Color); + GUI_UNLOCK(); + #else + GUI_USE_PARA(Pos); + GUI_USE_PARA(Color); + #endif +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c b/User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c new file mode 100644 index 0000000..6b0987c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c @@ -0,0 +1,108 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetLUTColorEx.c +Purpose : Implementation of GUI_SetLUTColorEx +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "LCD_Private.h" /* Required for configuration, APIList */ + +#if GUI_COMPILER_SUPPORTS_FP + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const LCD_LUT_INFO _aLutInfo[GUI_NUM_LAYERS] = { + #if GUI_NUM_LAYERS > 1 + { + #if (LCD_FIXEDPALETTE == 0) && (LCD_PHYSCOLORS_IN_RAM) + LCD_PhysColors, (I16)(1 << LCD_BITSPERPIXEL_0) + #else + NULL, 0 + #endif + }, + { + #if (LCD_FIXEDPALETTE_1 == 0) && (LCD_PHYSCOLORS_IN_RAM) + LCD_PhysColors_1, (I16)(1 << LCD_BITSPERPIXEL_1) + #else + NULL, 0 + #endif + }, + #if GUI_NUM_LAYERS > 2 + { + #if (LCD_FIXEDPALETTE_1 == 0) && (LCD_PHYSCOLORS_IN_RAM) + LCD_PhysColors_2, (I16)(1 << LCD_BITSPERPIXEL_2) + #else + NULL, 0 + #endif + }, + #endif + #if GUI_NUM_LAYERS > 3 + { + #if (LCD_FIXEDPALETTE_3 == 0) && (LCD_PHYSCOLORS_IN_RAM) + LCD_PhysColors_3, (I16)(1 << LCD_BITSPERPIXEL_3) + #else + NULL, 0 + #endif + }, + #endif + #if GUI_NUM_LAYERS > 4 + { + #if (LCD_FIXEDPALETTE_4 == 0) && (LCD_PHYSCOLORS_IN_RAM) + LCD_PhysColors_4, (I16)(1 << LCD_BITSPERPIXEL_4) + #else + NULL, 0 + #endif + }, + #endif + #else + { + #if (LCD_FIXEDPALETTE == 0) && (LCD_PHYSCOLORS_IN_RAM) + LCD_PhysColors, 1 << LCD_BITSPERPIXEL + #else + NULL, 0 + #endif + } + #endif +}; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetLUTColorEx +*/ +void GUI_SetLUTColorEx(U8 Pos, LCD_COLOR Color, unsigned int LayerIndex) { + if (LayerIndex < GUI_NUM_LAYERS) { + if (Pos < _aLutInfo[LayerIndex].NumEntries) { + LCD_aAPI[LayerIndex]->pfSetLUTEntry(Pos, Color); + _aLutInfo[LayerIndex].paColor[Pos] = Color; + } + } +} + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c b/User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c new file mode 100644 index 0000000..3b116ed --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetLUTEntry.c +Purpose : Implementation of GUI_SetLUTEntry +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetLUTEntry +*/ +void GUI_SetLUTEntry(U8 Pos, LCD_COLOR Color) { + GUI_LOCK(); + LCD_SetLUTEntry(Pos, Color); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c b/User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c new file mode 100644 index 0000000..42596c0 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetLineStyle.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetLineStyle +*/ +U8 GUI_SetLineStyle(U8 LineStyle) { + U8 r; + GUI_LOCK(); + r = GUI_Context.LineStyle; + GUI_Context.LineStyle = LineStyle; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetOrg.c b/User/system/lib/lcd/gui/Core/GUI_SetOrg.c new file mode 100644 index 0000000..c3c3b48 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetOrg.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetOrg.C +Purpose : Defines the GUI_SetOrg function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetOrg +*/ +void GUI_SetOrg(int x, int y) { + GUI_LOCK(); + LCD_L0_SetOrg(x, y); + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c b/User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c new file mode 100644 index 0000000..dbe7fcf --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_SetPixelIndex.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define RETURN_IF_Y_OUT() \ + if (y < GUI_Context.ClipRect.y0) return; \ + if (y > GUI_Context.ClipRect.y1) return; + +#define RETURN_IF_X_OUT() \ + if (x < GUI_Context.ClipRect.x0) return; \ + if (x > GUI_Context.ClipRect.x1) return; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_SetPixelIndex +* +* Purpose: +* Writes 1 pixel into the display. +*/ +void LCD_SetPixelIndex(int x, int y, int ColorIndex) { + RETURN_IF_X_OUT(); + RETURN_IF_Y_OUT(); + LCDDEV_L0_SetPixelIndex(x, y, ColorIndex); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c b/User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c new file mode 100644 index 0000000..c2cd8a4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetTextAlign.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetTextAlign +*/ +int GUI_SetTextAlign(int Align) { + int r; + GUI_LOCK(); + r = GUI_Context.TextAlign; + GUI_Context.TextAlign = Align; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetTextMode.c b/User/system/lib/lcd/gui/Core/GUI_SetTextMode.c new file mode 100644 index 0000000..901966c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetTextMode.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetTextMode.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetTextMode +*/ +int GUI_SetTextMode(int Mode) { + int r; + GUI_LOCK(); + r = GUI_Context.TextMode; + GUI_Context.TextMode = Mode; + GUI_UNLOCK(); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c b/User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c new file mode 100644 index 0000000..222d73c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c @@ -0,0 +1,81 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_SetTextStyle.C +Purpose : Implementation of various text styles +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__cbDrawTextStyle +*/ +static void GUI__cbDrawTextStyle(U16 Char) { + int x0, x1; + x1 = GUI_Context.DispPosX - 1; + x0 = x1 - GUI_Context.pAFont->pfGetCharDistX(Char) + 1; + /* Handle Underline */ + if (GUI_Context.TextStyle & GUI_TS_UNDERLINE) { + int yOff = GUI_Context.pAFont->Baseline; + if (yOff >= GUI_Context.pAFont->YSize) { + yOff = GUI_Context.pAFont->YSize - 1; + } + LCD_DrawHLine(x0, GUI_Context.DispPosY + yOff, x1); + } + /* Handle strike thru */ + if (GUI_Context.TextStyle & GUI_TS_STRIKETHRU) { + int yOff = GUI_Context.pAFont->Baseline - ((GUI_Context.pAFont->CHeight + 1) / 2); + LCD_DrawHLine(x0, GUI_Context.DispPosY + yOff, x1); + } + /* Handle over line */ + if (GUI_Context.TextStyle & GUI_TS_OVERLINE) { + int yOff = GUI_Context.pAFont->Baseline - GUI_Context.pAFont->CHeight - 1; + if (yOff < 0) { + yOff = 0; + } + LCD_DrawHLine(x0, GUI_Context.DispPosY + yOff, x1); + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_SetTextStyle +*/ +char GUI_SetTextStyle(char Style) { + char OldStyle; + GUI_LOCK(); + OldStyle = GUI_Context.TextStyle; + GUI_pfDispCharStyle = GUI__cbDrawTextStyle; /* Init function pointer (function in this module) */ + GUI_Context.TextStyle = Style; + GUI_UNLOCK(); + return OldStyle; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH.c new file mode 100644 index 0000000..c06e397 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITOUCH.C +Purpose : Generic touch screen routines +---------------------------------------------------------------------- +*/ + +#include +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_PID_STATE _State; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_TOUCH_GetState +*/ +int GUI_TOUCH_GetState(GUI_PID_STATE *pState) { + *pState = _State; + return (_State.Pressed != 0) ? 1 : 0; +} + +/********************************************************************* +* +* GUI_TOUCH_StoreStateEx +*/ +void GUI_TOUCH_StoreStateEx(const GUI_PID_STATE *pState) { + if (memcmp(pState, &_State, sizeof(_State))) { + _State = *pState; + GUI_PID_StoreState(pState); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c new file mode 100644 index 0000000..d963dd0 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c @@ -0,0 +1,299 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITOUCH.C +Purpose : Touch screen manager +---------------------------------------------------------------------- +This module handles the touch screen. It is configured in the file +GUITouch.conf.h (Should be located in the Config\ directory). +---------------------------------------------------------------------- +*/ + +#include +#include +#include +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Protected.h" + +/* Generate code only if configuration says so ! */ +#if GUI_SUPPORT_TOUCH + +#include "GUITouchConf.h" /* Located in GUIx, will include GUITouchConf.h */ + +/********************************************************************* +* +* Defines, config defaults +* +********************************************************************** +*/ + +#ifndef GUI_TOUCH_AD_LEFT /* max value returned by AD-converter */ + #define GUI_TOUCH_AD_LEFT 30 +#endif + +#ifndef GUI_TOUCH_AD_RIGHT /* min value returned by AD-converter */ + #define GUI_TOUCH_AD_RIGHT 220 +#endif + +#ifndef GUI_TOUCH_AD_TOP /* max value returned by AD-converter */ + #define GUI_TOUCH_AD_TOP 30 +#endif + +#ifndef GUI_TOUCH_AD_BOTTOM /* min value returned by AD-converter */ + #define GUI_TOUCH_AD_BOTTOM 220 +#endif + +#ifndef GUI_TOUCH_SWAP_XY /* Is XY of touch swapped ? */ + #define GUI_TOUCH_SWAP_XY 0 +#endif + +#ifndef GUI_TOUCH_MIRROR_X + #define GUI_TOUCH_MIRROR_X 0 +#endif + +#ifndef GUI_TOUCH_MIRROR_Y + #define GUI_TOUCH_MIRROR_Y 0 +#endif + +#ifndef GUI_TOUCH_YSIZE + #define GUI_TOUCH_YSIZE LCD_YSIZE +#endif + +#ifndef GUI_TOUCH_XSIZE + #define GUI_TOUCH_XSIZE LCD_XSIZE +#endif + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct {int Min; int Max; } tMinMax; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static int xPhys, yPhys; + +static tMinMax xyMinMax[2] = { +#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_X==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_Y==0)) + { GUI_TOUCH_AD_LEFT, GUI_TOUCH_AD_RIGHT }, +#else + { GUI_TOUCH_AD_RIGHT, GUI_TOUCH_AD_LEFT }, +#endif +#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_Y==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_X==0)) + { GUI_TOUCH_AD_TOP, GUI_TOUCH_AD_BOTTOM } +#else + { GUI_TOUCH_AD_BOTTOM, GUI_TOUCH_AD_TOP } +#endif +}; + +#ifndef WIN32 +static int xMin; +static int xMax; +static int yMin; +static int yMax; +#endif + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _AD2X +* +* Purpose: +* Convert physical value into (logical) coordinates. +*/ +#ifndef WIN32 +static int _AD2X(int adx) { + I32 r = adx - xyMinMax[GUI_COORD_X].Min; + r *= GUI_TOUCH_XSIZE - 1; + return r / (xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min); +} + +/********************************************************************* +* +* _AD2Y +* +* Purpose: +* Convert physical value into (logical) coordinates. +*/ +static int _AD2Y(int ady) { + I32 r = ady - xyMinMax[GUI_COORD_Y].Min; + r *= GUI_TOUCH_YSIZE - 1; + return r/(xyMinMax[GUI_COORD_Y].Max - xyMinMax[GUI_COORD_Y].Min); +} +#endif + +/********************************************************************* +* +* _Log2Phys +*/ +static int _Log2Phys(int l, I32 l0, I32 l1, I32 p0, I32 p1) { + return p0+ ((p1 - p0) * (l - l0)) / (l1 - l0); +} + +/********************************************************************* +* +* _StoreUnstable +*/ +static void _StoreUnstable(int x, int y) { + static int _xLast = -1; + static int _yLast = -1; + int xOut, yOut; + + if ((x != -1) && (y != -1) && (_xLast != -1) && (_yLast != -1)) { + xOut = _xLast; + yOut = _yLast; + } else { + xOut = -1; + yOut = -1; + } + _xLast = x; + _yLast = y; + GUI_TOUCH_StoreUnstable(xOut, yOut); +} +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_TOUCH_GetxPhys +*/ +int GUI_TOUCH_GetxPhys(void) { + return xPhys; +} + +/********************************************************************* +* +* GUI_TOUCH_GetyPhys +*/ +int GUI_TOUCH_GetyPhys(void) { + return yPhys; +} + +/********************************************************************* +* +* GUI_TOUCH_SetDefaultCalibration +*/ +void GUI_TOUCH_SetDefaultCalibration(void) { + xyMinMax[0].Min = GUI_TOUCH_AD_LEFT; + xyMinMax[0].Max = GUI_TOUCH_AD_RIGHT; + xyMinMax[1].Min = GUI_TOUCH_AD_TOP; + xyMinMax[1].Max = GUI_TOUCH_AD_BOTTOM; +} + +/********************************************************************* +* +* GUI_TOUCH_Calibrate +*/ +int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1) { + int l0 = 0; + int l1 = (Coord == GUI_COORD_X) ? LCD_XSIZE - 1 : LCD_YSIZE - 1; + if (labs(Phys0 - Phys1) < 20) { + return 1; + } + if (labs(Log0 - Log1) < 20) { + return 1; + } + xyMinMax[Coord].Min = _Log2Phys(l0, Log0, Log1, Phys0, Phys1); + xyMinMax[Coord].Max = _Log2Phys(l1, Log0, Log1, Phys0, Phys1); + return 0; +} + +/********************************************************************* +* +* GUI_TOUCH_GetCalData +*/ +void GUI_TOUCH_GetCalData(int Coord, int* pMin,int* pMax) { + *pMin = xyMinMax[Coord].Min; + *pMax = xyMinMax[Coord].Max; +} + +/********************************************************************* +* +* GUI_TOUCH_Exec +*/ +void GUI_TOUCH_Exec(void) { + #ifndef WIN32 + static U8 ReadState; + int x,y; + /* calculate Min / Max values */ + if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) { + xMin = xyMinMax[GUI_COORD_X].Min; + xMax = xyMinMax[GUI_COORD_X].Max; + } else { + xMax = xyMinMax[GUI_COORD_X].Min; + xMin = xyMinMax[GUI_COORD_X].Max; + } + if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) { + yMin = xyMinMax[GUI_COORD_Y].Min; + yMax = xyMinMax[GUI_COORD_Y].Max; + } else { + yMax = xyMinMax[GUI_COORD_Y].Min; + yMin = xyMinMax[GUI_COORD_Y].Max; + } + /* Execute the state machine which reads the touch */ + switch (ReadState) { + case 0: + yPhys = TOUCH_X_MeasureY(); + TOUCH_X_ActivateY(); /* Prepare X- measurement */ + ReadState++; + break; + default: + xPhys = TOUCH_X_MeasureX(); + TOUCH_X_ActivateX(); /* Prepare Y- measurement */ + /* Convert values into logical values */ + #if !GUI_TOUCH_SWAP_XY /* Is X/Y swapped ? */ + x = xPhys; + y = yPhys; + #else + x = yPhys; + y = xPhys; + #endif + if ((x < xMin) || (x > xMax) || (y < yMin) || (y > yMax)) { + _StoreUnstable(-1, -1); + } else { + x = _AD2X(x); + y = _AD2Y(y); + _StoreUnstable(x, y); + } + /* Reset state machine */ + ReadState = 0; + break; + } + #endif /* WIN32 */ +} + +#else + +void GUI_TOUCH_DriverAnalog_C(void); /* Avoid "no prototype" warnings */ +void GUI_TOUCH_DriverAnalog_C(void) {} + +#endif /* defined(GUI_SUPPORT_TOUCH) && GUI_SUPPORT_TOUCH */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c new file mode 100644 index 0000000..ee3ae6e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITOUCH_StoreState.C +Purpose : Implementation of GUITOUCH_StoreState +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_TOUCH_StoreState +* +* NOTE: +* This is the older version. Prefer GUI_TOUCH_StoreStateEx in new code +*/ +void GUI_TOUCH_StoreState(int x, int y) { + static GUI_PID_STATE _State; /* static so we retain coordinates when touch is released */ + if ((x >= 0) && (y >= 0)) { + _State.Pressed = 1; + _State.x = x; + _State.y = y; + } else { + _State.Pressed = 0; + } + GUI_TOUCH_StoreStateEx(&_State); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c new file mode 100644 index 0000000..e9eb53b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUITOUCH_StoreUnstable.C +Purpose : Implementation of GUITOUCH_StoreUnstable +---------------------------------------------------------------------- +*/ + +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static int _x, _y; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_TOUCH_StoreUnstable +*/ +void GUI_TOUCH_StoreUnstable(int x, int y) { + int xDiff, yDiff; + xDiff = abs (x - _x); + yDiff = abs (y - _y); + if (xDiff + yDiff > 2) { + _x = x; + _y = y; + GUI_TOUCH_StoreState(x, y); + } +} + +/********************************************************************* +* +* GUI_TOUCH_GetUnstable +*/ +void GUI_TOUCH_GetUnstable(int* px, int* py) { + *px = _x; + *py = _y; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_UC.c b/User/system/lib/lcd/gui/Core/GUI_UC.c new file mode 100644 index 0000000..bd40386 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_UC.c @@ -0,0 +1,120 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_UC_EncodeUTF8.c +Purpose : Encoding routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_UC_GetCharSize +*/ +int GUI_UC_GetCharSize(const char GUI_UNI_PTR * s) { + int r; + GUI_LOCK(); + r = GUI_Context.pUC_API->pfGetCharSize(s); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_UC_GetCharCode +*/ +U16 GUI_UC_GetCharCode(const char GUI_UNI_PTR * s) { + U16 r; + GUI_LOCK(); + r = GUI_Context.pUC_API->pfGetCharCode(s); + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_UC_Encode +*/ +int GUI_UC_Encode(char* s, U16 Char) { + #if GUI_COMPILER_SUPPORTS_FP + int r; + GUI_LOCK(); + r = GUI_Context.pUC_API->pfEncode(s, Char); + GUI_UNLOCK(); + return r; + #else + GUI_USE_PARA(s); + GUI_USE_PARA(Char); + return 0; + #endif +} + +/********************************************************************* +* +* GUI_UC__CalcSizeOfChar +*/ +int GUI_UC__CalcSizeOfChar(U16 Char) { + return GUI_Context.pUC_API->pfCalcSizeOfChar(Char); +} + +/********************************************************************* +* +* GUI_UC__GetCharCodeInc +*/ +U16 GUI_UC__GetCharCodeInc(const char GUI_UNI_PTR ** ps) { + const char GUI_UNI_PTR * s; + U16 r; + s = *ps; + r = GUI_UC__GetCharCode(s); + s += GUI_UC__GetCharSize(s); + *ps = s; + return r; +} + +/********************************************************************* +* +* GUI_UC__NumChars2NumBytes +*/ +int GUI_UC__NumChars2NumBytes(const char GUI_UNI_PTR * s, int NumChars) { + int CharSize, NumBytes = 0; + while (NumChars--) { + CharSize = GUI_UC__GetCharSize(s); + s += CharSize; + NumBytes += CharSize; + } + return NumBytes; +} + +/********************************************************************* +* +* GUI_UC__NumBytes2NumChars +*/ +int GUI_UC__NumBytes2NumChars(const char GUI_UNI_PTR * s, int NumBytes) { + int CharSize, Chars = 0, Bytes = 0; + while (NumBytes > Bytes) { + CharSize = GUI_UC__GetCharSize(s + Bytes); + Bytes += CharSize; + Chars++; + } + return Chars; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_UC_DispString.c b/User/system/lib/lcd/gui/Core/GUI_UC_DispString.c new file mode 100644 index 0000000..d2f50dd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_UC_DispString.c @@ -0,0 +1,161 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_UC_DispString.c +Purpose : Implementation of GUI_UC_DispString +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetLineDistX +*/ +static int _GetLineDistX(const U16 GUI_UNI_PTR *s, int MaxNumChars) { + int Dist =0; + if (s) { + U16 Char; + while (((Char = *s) != 0) && MaxNumChars >= 0) { + s++; + MaxNumChars--; + Dist += GUI_GetCharDistX(Char); + } + } + return Dist; +} + +/********************************************************************* +* +* _GetLineLen +*/ +static int _GetLineLen(const U16 GUI_UNI_PTR *s, int MaxLen) { + int Len =0; + if (!s) + return 0; + { + while ((*s !=0) && Len < MaxLen) { + Len++; s++; + } + } + return Len; +} + +/********************************************************************* +* +* _DispLine_UC +*/ +static void _DispLine_UC(const U16 GUI_UNI_PTR *s, int Len, const GUI_RECT *pRect) { + if (GUI_Context.pClipRect_HL) { + if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0) + return; + } + { + U16 c0; + while (--Len >=0) { + c0=*s++; + GL_DispChar(c0); + } + } +} + +/********************************************************************* +* +* _DispLine +*/ +static void _DispLine(const U16 GUI_UNI_PTR *s, int Len, const GUI_RECT* pr) { + GUI_RECT r; + r = *pr; + #if GUI_WINSUPPORT + WM_ADDORG(r.x0,r.y0); + WM_ADDORG(r.x1,r.y1); + WM_ITERATE_START(&r) { + #endif + GUI_Context.DispPosX = r.x0; + GUI_Context.DispPosY = r.y0; + _DispLine_UC(s, Len, &r); /* Do the actual drawing via routine call. */ + #if GUI_WINSUPPORT + } WM_ITERATE_END(); + WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY); + #endif +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_UC_DispString +*/ +void GUI_UC_DispString(const U16 GUI_UNI_PTR *s) { + int xAdjust, yAdjust, xOrg; + int FontSizeY; + if (!s) + return; + GUI_LOCK(); + FontSizeY = GUI_Context.pAFont->YSize; + xOrg = GUI_Context.DispPosX; + /* Adjust vertical position */ + yAdjust = GUI_GetYAdjust(); + GUI_Context.DispPosY -= yAdjust; + for (; *s; s++) { + GUI_RECT r; + int LineLen= _GetLineLen(s,0x7fff); + int xLineSize = _GetLineDistX(s, LineLen); + /* Check if x-position needs to be changed due to h-alignment */ + switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { + case GUI_TA_CENTER: xAdjust= xLineSize/2; break; + case GUI_TA_RIGHT: xAdjust= xLineSize; break; + default: xAdjust= 0; + } + r.x0 = GUI_Context.DispPosX -= xAdjust; + r.x1 = r.x0 + xLineSize-1; + r.y0 = GUI_Context.DispPosY; + r.y1 = r.y0 + FontSizeY-1; + _DispLine(s, LineLen, &r); + GUI_Context.DispPosY = r.y0; + s += LineLen; + if (*s=='\n') { + switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { + case GUI_TA_CENTER: + case GUI_TA_RIGHT: + GUI_Context.DispPosX = xOrg; + break; + default: + GUI_Context.DispPosX = GUI_Context.LBorder; + break; + } + GUI_Context.DispPosY += GUI_GetFontDistY(); + } else { + GUI_Context.DispPosX = r.x0+xLineSize; + } + if (*s==0) /* end of string (last line) reached ? */ + break; + } + GUI_Context.DispPosY += yAdjust; + GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL; + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c new file mode 100644 index 0000000..f1173cc --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c @@ -0,0 +1,108 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_UC_EncodeNone.c +Purpose : Encoding routines for non unicode systems (default) +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetCharCode +* +* Purpose: +* Return the UNICODE character code of the current character. +*/ +static U16 _GetCharCode(const char GUI_UNI_PTR * s) { + return *(const U8 GUI_UNI_PTR *)s; +} + +/********************************************************************* +* +* _GetCharSize +* +* Purpose: +* Return the number of bytes of the current character. +*/ +static int _GetCharSize(const char GUI_UNI_PTR * s) { + GUI_USE_PARA(s); + return 1; +} + +/********************************************************************* +* +* _CalcSizeOfChar +* +* Purpose: +* Return the number of bytes needed for the given character. +*/ +static int _CalcSizeOfChar(U16 Char) { + GUI_USE_PARA(Char); + return 1; +} + +/********************************************************************* +* +* _Encode +* +* Purpose: +* Encode character into 1/2/3 bytes. +*/ +static int _Encode(char *s, U16 Char) { + *s = (U8)(Char); + return 1; +} + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +/********************************************************************* +* +* _API_Table +*/ +const GUI_UC_ENC_APILIST GUI__API_TableNone = { + _GetCharCode, /* return character code as U16 */ + _GetCharSize, /* return size of character: 1 */ + _CalcSizeOfChar, /* return size of character: 1 */ + _Encode /* Encode character */ +}; + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_UC_SetEncodeNone +*/ +void GUI_UC_SetEncodeNone(void) { + GUI_LOCK(); + GUI_Context.pUC_API = &GUI__API_TableNone; + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c new file mode 100644 index 0000000..cc0e1bf --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c @@ -0,0 +1,153 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_UC_EncodeUTF8.c +Purpose : Encoding routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetCharCode +* +* Purpose: +* Return the UNICODE character code of the current character. +*/ +static U16 _GetCharCode(const char GUI_UNI_PTR * s) { + U16 r; + U8 Char = *(const U8*)s; + if ((Char & 0x80) == 0) { /* Single byte (ASCII) */ + r = Char; + } else if ((Char & 0xe0) == 0xc0) { /* Double byte sequence */ + r = (Char & 0x1f) << 6; + Char = *(++s); + Char &= 0x3f; + r |= Char; + } else if ((Char & 0xf0) == 0xe0) { /* 3 byte sequence */ + r = (Char & 0x0f) << 12; + Char = *(++s); + Char &= 0x3f; + r |= (Char << 6); + Char = *(++s); + Char &= 0x3f; + r |= Char; + } else { + GUI_DEBUG_ERROROUT("Illegal character during UTF-8 decoding!"); + r = 1; /* Illegal character. To avoid endless loops in upper layers, we return 1 rather than 0. */ + } + return r; +} + +/********************************************************************* +* +* _GetCharSize +* +* Purpose: +* Return the number of bytes of the current character. +*/ +static int _GetCharSize(const char GUI_UNI_PTR * s) { + U8 Char = *s; + if ((Char & 0x80) == 0) { + return 1; + } else if ((Char & 0xe0) == 0xc0) { + return 2; + } else if ((Char & 0xf0) == 0xe0) { + return 3; + } + GUI_DEBUG_ERROROUT("Illegal character during UTF-8 decoding!"); + return 1; /* Illegal character. To avoid endless loops in upper layers, we return 1 rather than 0. */ +} + +/********************************************************************* +* +* _CalcSizeOfChar +* +* Purpose: +* Return the number of bytes needed for the given character. +*/ +static int _CalcSizeOfChar(U16 Char) { + int r; + if (Char & 0xF800) { /* Single byte (ASCII) */ + r = 3; + } else if (Char & 0xFF80) { /* Double byte sequence */ + r = 2; + } else { /* 3 byte sequence */ + r = 1; + } + return r; +} + +/********************************************************************* +* +* _Encode +* +* Purpose: +* Encode character into 1/2/3 bytes. +*/ +static int _Encode(char *s, U16 Char) { + int r; + r = _CalcSizeOfChar(Char); + switch (r) { + case 1: + *s = (char)Char; + break; + case 2: + *s++ = 0xC0 | (Char >> 6); + *s = 0x80 | (Char & 0x3F); + break; + case 3: + *s++ = 0xE0 | (Char >> 12); + *s++ = 0x80 | ((Char >> 6) & 0x3F); + *s = 0x80 | (Char & 0x3F); + break; + } + return r; +} + +/********************************************************************* +* +* _API_Table +*/ +static const GUI_UC_ENC_APILIST _API_Table = { + _GetCharCode, /* return character code as U16 (Unicode) */ + _GetCharSize, /* return size of character: 1/2/3 */ + _CalcSizeOfChar, /* return size of character: 1/2/3 */ + _Encode /* Encode character into 1/2/3 bytes */ +}; + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_UC_SetEncodeUTF8 +*/ +void GUI_UC_SetEncodeUTF8(void) { + GUI_LOCK(); + GUI_Context.pUC_API = &_API_Table; + GUI_UNLOCK(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_VNC.h b/User/system/lib/lcd/gui/Core/GUI_VNC.h new file mode 100644 index 0000000..f1d9a9d --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_VNC.h @@ -0,0 +1,95 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_VNC.h +Purpose : Publics for the VNC server +---------------------------END-OF-HEADER------------------------------ + +Attention : Do not modify this file ! If you do, you will not + be able do update to a later GUI version ! + +*/ + +#ifndef GUI_VNC_H +#define GUI_VNC_H + +#include "GUI.h" +#include "LCD_Private.h" /* Required because the Driver API depends on Config currently */ + +#if GUI_SUPPORT_DEVICES + + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ +#define GUI_VNC_NO_ERROR 0 +#define GUI_VNC_ERROR_MISC 1 +#define GUI_VNC_ERROR_WRONGFORMAT 2 + +/********************************************************************* +* +* types +* +********************************************************************** +*/ +typedef int (*GUI_tSend) (const U8 * pData, int len, void* pConnectInfo); +typedef int (*GUI_tReceive)( U8 * pData, int len, void* pConnectInfo); + +typedef struct GUI_VNC_CONTEXT { + struct GUI_VNC_CONTEXT * pNext; + int LayerIndex; + /* Connection related data */ + GUI_tSend pfSend; + GUI_tReceive pfReceive; + void* pConnectInfo; + U16 ServerIndex; + /* Display related info */ + const tLCDDEV_APIList* pLayerAPIOrig; + tLCDDEV_APIList VNC_LayerAPI; + int x0Dirty, y0Dirty, x1Dirty, y1Dirty; + int XSize, YSize; + /* Status */ + char ClientSupportsHextile; + char IsBigEndian; +} GUI_VNC_CONTEXT; + +/********************************************************************* +* +* functions +* +********************************************************************** +*/ +int GUI_VNC_Process (GUI_VNC_CONTEXT* pContext, GUI_tSend pfSend, GUI_tReceive pfReceive, void* pConnectInfo); +void GUI_VNC_AttachToLayer(GUI_VNC_CONTEXT* pContext, int LayerIndex); +int GUI_VNC_GetNumConnections(void); + +/**** External routine to link the server to the system ... USER defined ! ****/ +int GUI_VNC_X_StartServer(int LayerIndex, int ServerIndex); + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_SUPPORT_DEVICES */ +#endif /* Avoid multiple inclusion */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_WaitEvent.c b/User/system/lib/lcd/gui/Core/GUI_WaitEvent.c new file mode 100644 index 0000000..1523c4b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_WaitEvent.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_WaitEvent.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_WaitEvent +*/ +void GUI_WaitEvent(void) { + GUI_X_WAIT_EVENT(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_WaitKey.c b/User/system/lib/lcd/gui/Core/GUI_WaitKey.c new file mode 100644 index 0000000..bb48e61 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_WaitKey.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_WaitKey.c +Purpose : Implementation of GUI_WaitKey +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_WaitKey +*/ +int GUI_WaitKey(void) { + int r; + do { + r = GUI_GetKey(); + if (r) { + break; + } + if (!GUI_Exec()) { + GUI_X_WAIT_EVENT(); /* Wait for event (keyboard, mouse or whatever) */ + } + } while (1); + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_Warn.c b/User/system/lib/lcd/gui/Core/GUI_Warn.c new file mode 100644 index 0000000..0abc4ed --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_Warn.c @@ -0,0 +1,126 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_Warn.C +Purpose : Logging (used only at higher debug levels) +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "GUI_X.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define MAXLEN 50 + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _CopyString +*/ +static void _CopyString(char*d, const char*s, int MaxLen) { + while ((MaxLen > 0) && *s) { + *d++ = *s++; + MaxLen--; + } + *d = 0; +} + +/********************************************************************* +* +* Public code +* +* Note: These routines are needed only in higher debug levels. +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_Warn +*/ +void GUI_Warn(const char *s) { + GUI_X_Warn(s); +} + +/********************************************************************* +* +* GUI_Warn1 +*/ +void GUI_Warn1(const char *s, int p0) { + char ac[MAXLEN + 10]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI_Warn(ac); +} + +/********************************************************************* +* +* GUI_Warn2 +*/ +void GUI_Warn2(const char *s, int p0, int p1) { + char ac[MAXLEN + 20]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI_Warn(ac); +} + +/********************************************************************* +* +* GUI_Warn3 +*/ +void GUI_Warn3(const char *s, int p0, int p1, int p2) { + char ac[MAXLEN + 30]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI__AddSpaceHex(p2, 8, &sOut); + GUI_Warn(ac); +} + +/********************************************************************* +* +* GUI_Warn4 +*/ +void GUI_Warn4(const char *s, int p0, int p1, int p2, int p3) { + char ac[MAXLEN + 40]; + char* sOut = ac; + _CopyString(ac, s, MAXLEN); + sOut += strlen(sOut); + GUI__AddSpaceHex(p0, 8, &sOut); + GUI__AddSpaceHex(p1, 8, &sOut); + GUI__AddSpaceHex(p2, 8, &sOut); + GUI__AddSpaceHex(p3, 8, &sOut); + GUI_Warn(ac); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI_X.h b/User/system/lib/lcd/gui/Core/GUI_X.h new file mode 100644 index 0000000..850d46c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI_X.h @@ -0,0 +1,79 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_X.h +Purpose : Declarations for GUI_X module +---------------------------END-OF-HEADER------------------------------ + +Attention : Do not modify this file ! If you do, you will not + be able do update to a later GUI version ! + +*/ + +#ifndef GUI_X_H +#define GUI_X_H + +#include "GUI.h" + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/************************************************************ +* +* GUI_X_ +* +* externals, to be defined by application +* +************************************************************* + +The externals defined below should be defined by the +application. They are per default contained in the module +GUI_X.c. +Note that a lot if not all of these are not required in most target +systems. +For this module, samples are available for configurations +with or without operating system. +*/ + +/**** Init ****/ +void GUI_X_Init(void); + +/**** ExecIdle - called if nothing else is left to do ****/ +void GUI_X_ExecIdle(void); + +/**** Timing routines - required for blinking ****/ +int GUI_X_GetTime(void); +void GUI_X_Delay(int Period); + +/**** Multitask routines - required only if multitasking is used (#define GUI_OS 1) ****/ +void GUI_X_Unlock(void); +void GUI_X_Lock(void); +U32 GUI_X_GetTaskId(void); +void GUI_X_InitOS(void); + +/**** Event driving (optional with multitasking) ****/ +void GUI_X_WaitEvent(void); +void GUI_X_SignalEvent(void); +/**** Recording (logs/warnings and errors) - required only for higher levels ****/ +void GUI_X_Log(const char *s); +void GUI_X_Warn(const char *s); +void GUI_X_ErrorOut(const char *s); + +#if defined(__cplusplus) + } +#endif +#endif /* ifdef GUI_X_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c b/User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c new file mode 100644 index 0000000..c0de245 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__AddSpaceHex.C +Purpose : Internal function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code (module internal) +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__AddSpaceHex +*/ +void GUI__AddSpaceHex(U32 v, U8 Len, char** ps) { + char* s = *ps; + *s++ = ' '; + *ps = s; + GUI_AddHex(v, Len, ps); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c b/User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c new file mode 100644 index 0000000..220b27c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c @@ -0,0 +1,75 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__CalcTextRect.c +Purpose : Implementation of gui function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" +#include "GUI.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__CalcTextRect +*/ +void GUI__CalcTextRect(const char GUI_UNI_PTR* pText, const GUI_RECT* pTextRectIn, GUI_RECT* pTextRectOut, int TextAlign) { + if (pText) { + int xPos, yPos, TextWidth, TextHeight; + + /* Calculate X-pos of text */ + TextWidth = GUI_GetStringDistX(pText); + switch (TextAlign & GUI_TA_HORIZONTAL) { + case GUI_TA_HCENTER: + xPos = pTextRectIn->x0 + ((pTextRectIn->x1 - pTextRectIn->x0 + 1) - TextWidth) / 2; + break; + case GUI_TA_RIGHT: + xPos = pTextRectIn->x1 - TextWidth + 1; + break; + default: + xPos = pTextRectIn->x0; + } + + /* Calculate Y-pos of text*/ + TextHeight = GUI_GetFontDistY(); + switch (TextAlign & GUI_TA_VERTICAL) { + case GUI_TA_VCENTER: + yPos = pTextRectIn->y0 + ((pTextRectIn->y1 - pTextRectIn->y0 + 1) - TextHeight) / 2; + break; + case GUI_TA_BOTTOM: + yPos = pTextRectIn->y1 - TextHeight + 1; + break; + case GUI_TA_BASELINE: + default: + yPos = pTextRectIn->y0; + } + + /* Return text rectangle */ + pTextRectOut->x0 = xPos; + pTextRectOut->y0 = yPos; + pTextRectOut->x1 = xPos + TextWidth - 1; + pTextRectOut->y1 = yPos + TextHeight - 1; + } else { + *pTextRectOut = *pTextRectIn; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__DivideRound.c b/User/system/lib/lcd/gui/Core/GUI__DivideRound.c new file mode 100644 index 0000000..14a5303 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__DivideRound.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__DivideRound.C +Purpose : Implementation of GUI__DivideRound +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__DivideRound +* +* This routine is used internally for computations. Primary goal is +* to minimize the effects of rounding which occur if we simply +* divide. +*/ +int GUI__DivideRound(int a, int b) { + int r = 0; + if (b) { + r = ((a + b / 2) / b); + } + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__DivideRound32.c b/User/system/lib/lcd/gui/Core/GUI__DivideRound32.c new file mode 100644 index 0000000..da2aa39 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__DivideRound32.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__DivideRound32.C +Purpose : Implementation of GUI__DivideRound32 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__DivideRound32 +* +* This routine is used internally for computations. Primary goal is +* to minimize the effects of rounding which occur if we simply +* divide. +*/ +I32 GUI__DivideRound32(I32 a, I32 b) { + if (b) { + if (a < 0) { + return (a - (b >> 1)) / b; + } else { + return (a + (b >> 1)) / b; + } + } + return 0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c b/User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c new file mode 100644 index 0000000..bb78054 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__GetFontSizeY.c +Purpose : Implementation of optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_GetFontSizeY +*/ +int GUI__GetFontSizeY(void) { + return GUI_Context.pAFont->YSize * GUI_Context.pAFont->YMag; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__GetNumChars.c b/User/system/lib/lcd/gui/Core/GUI__GetNumChars.c new file mode 100644 index 0000000..c235983 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__GetNumChars.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__GetNumChars.c +Purpose : Implementation of character and string services +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__GetNumChars +*/ +int GUI__GetNumChars(const char GUI_UNI_PTR *s) { + int NumChars = 0; + if (s) { + while (GUI_UC__GetCharCodeInc(&s)) { + NumChars++; + } + } + return NumChars; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c b/User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c new file mode 100644 index 0000000..1420433 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__HandleEOLine.C +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + + +/********************************************************************* +* +* GUI__HandleEOLine +* +* Is called when processing strings which may consist of +* multiple lines after a line has been processed. It will +* a) Swall the line feed character (if it is there) +* b) Return 1 if end of string, otherwise 0 +*/ +int GUI__HandleEOLine(const char GUI_UNI_PTR **ps) { + const char GUI_UNI_PTR *s = *ps; + char c = *s++; + if (c == 0) { + return 1; + } + if (c == '\n') { + *ps = s; + } + return 0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__IntersectRect.c b/User/system/lib/lcd/gui/Core/GUI__IntersectRect.c new file mode 100644 index 0000000..1580604 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__IntersectRect.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_IntersectRect.c +Purpose : Implementation of GUI_IntersectRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__IntersectRects +* +* Purpose: +* Calc intersection of rectangles +* +* Add. info: +* Rectangles are passed as pointers. These pointers need to be valid; +* a NULL pointer may not be passed. There is no check for NULL pointers +* implemented in order to avoid avoid performance penalty. +* There is a similar function available, GUI__IntersectRects(), +* which takes 3 parameters and +* has a return value. Note that this one should be preferred because +* it is considerably faster and the call requires one parameter less. +*/ +void GUI__IntersectRect(GUI_RECT* pDest, const GUI_RECT* pr0) { + if (pDest->x0 < pr0->x0) { + pDest->x0 = pr0->x0; + } + if (pDest->y0 < pr0->y0) { + pDest->y0 = pr0->y0; + } + if (pDest->x1 > pr0->x1) { + pDest->x1 = pr0->x1; + } + if (pDest->y1 > pr0->y1) { + pDest->y1 = pr0->y1; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__IntersectRects.c b/User/system/lib/lcd/gui/Core/GUI__IntersectRects.c new file mode 100644 index 0000000..47151f7 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__IntersectRects.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_IntersectRects.c +Purpose : Implementation of GUI_IntersectRects +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Macros +* +********************************************************************** +*/ + +#define MIN(v0,v1) ((v0>v1) ? v1 : v0) +#define MAX(v0,v1) ((v0>v1) ? v0 : v1) + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__IntersectRects +* +* Purpose: +* Calc intersection of rectangles +* +* Return value: +* 1 if they do intersect, +* 0 if there is no intersection +* +* Add. info: +* Rectangles are passed as pointers. These pointers need to be valid; +* a NULL pointer may not be passed. There is no check for NULL pointers +* implemented in order to avoid avoid performance penalty. +*/ +int GUI__IntersectRects(GUI_RECT* pDest, const GUI_RECT* pr0, const GUI_RECT* pr1) { + pDest->x0 = MAX (pr0->x0, pr1->x0); + pDest->y0 = MAX (pr0->y0, pr1->y0); + pDest->x1 = MIN (pr0->x1, pr1->x1); + pDest->y1 = MIN (pr0->y1, pr1->y1); + if (pDest->x1 < pDest->x0) { + return 0; + } + if (pDest->y1 < pDest->y0) { + return 0; + } + return 1; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__Read.c b/User/system/lib/lcd/gui/Core/GUI__Read.c new file mode 100644 index 0000000..fb888e5 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__Read.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__ReadData.c +Purpose : Implementation of reading data +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__Read16 +*/ +U16 GUI__Read16(const U8 ** ppData) { + const U8 * pData; + U16 Value; + pData = *ppData; + Value = *pData; + Value |= (U16)(*(pData + 1) << 8); + pData += 2; + *ppData = pData; + return Value; +} + +/********************************************************************* +* +* GUI__Read32 +*/ +U32 GUI__Read32(const U8 ** ppData) { + const U8 * pData; + U32 Value; + pData = *ppData; + Value = *pData; + Value |= ( *(pData + 1) << 8); + Value |= ((U32)*(pData + 2) << 16); + Value |= ((U32)*(pData + 3) << 24); + pData += 4; + *ppData = pData; + return Value; +} + diff --git a/User/system/lib/lcd/gui/Core/GUI__ReduceRect.c b/User/system/lib/lcd/gui/Core/GUI__ReduceRect.c new file mode 100644 index 0000000..b69dfdb --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__ReduceRect.c @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__ReduceRect.C +Purpose : Implementation of GUI__ReduceRect +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__ReduceRect +*/ +void GUI__ReduceRect(GUI_RECT* pDest, const GUI_RECT *pRect, int Dist) { + pDest->x0 = pRect->x0 + Dist; + pDest->x1 = pRect->x1 - Dist; + pDest->y0 = pRect->y0 + Dist; + pDest->y1 = pRect->y1 - Dist; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__SetText.c b/User/system/lib/lcd/gui/Core/GUI__SetText.c new file mode 100644 index 0000000..153b92f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__SetText.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__SetText.C +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__SetText +*/ +int GUI__SetText(GUI_HMEM* phText, const char* s) { + int r = 0; + if (GUI__strcmp_hp(*phText, s) != 0) { /* Make sure we have a quick out if nothing changes */ + GUI_HMEM hMem; + hMem = GUI_ALLOC_AllocNoInit(GUI__strlen(s) + 1); + if (hMem) { + char* pMem; + pMem = (char*) GUI_ALLOC_h2p(hMem); + strcpy(pMem, s); + GUI_ALLOC_FreePtr(phText); + *phText = hMem; + r = 1; + } + } + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__Wrap.c b/User/system/lib/lcd/gui/Core/GUI__Wrap.c new file mode 100644 index 0000000..2672ff4 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__Wrap.c @@ -0,0 +1,161 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__WRAP.c +Purpose : Implementation of wrap routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _IsLineEnd +*/ +static int _IsLineEnd(U16 Char) { + if (!Char || (Char == '\n')) { + return 1; + } + return 0; +} + +/********************************************************************* +* +* _GetWordWrap +*/ +static int _GetWordWrap(const char GUI_UNI_PTR * s, int xSize) { + int xDist = 0, NumChars = 0, WordWrap = 0; + U16 Char, PrevChar = 0; + while (1) { + Char = GUI_UC__GetCharCodeInc(&s); /* Similar to: *s++ */ + /* Let's first check if the line end is reached. In this case we are done. */ + if (_IsLineEnd(Char)) { + WordWrap = NumChars; + break; + } + /* If current character is a space, we found a wrap position */ + if ((Char == ' ') && (Char != PrevChar)) { + WordWrap = NumChars; + } + PrevChar = Char; + xDist += GUI_GetCharDistX(Char); + if ((xDist <= xSize) || (NumChars == 0)) { + NumChars++; + } else { + break; + } + } + if (!WordWrap) { + WordWrap = NumChars; + } + return WordWrap; +} + +/********************************************************************* +* +* _GetCharWrap +*/ +static int _GetCharWrap(const char GUI_UNI_PTR * s, int xSize) { + int xDist = 0, NumChars = 0; + U16 Char; + while ((Char = GUI_UC__GetCharCodeInc(&s)) != 0) { + xDist += GUI_GetCharDistX(Char); + if ((NumChars && (xDist > xSize)) || (Char == '\n')) { + break; + } + NumChars++; + } + return NumChars; +} + +/********************************************************************* +* +* _GetNoWrap +*/ +static int _GetNoWrap(const char GUI_UNI_PTR * s) { + return GUI__GetLineNumChars(s, 0x7FFF); +} + +/********************************************************************* +* +* puplic code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__WrapGetNumCharsDisp +* +* Returns: +* Number of characters to display in the line. +* Trailing spaces and line end character are +* not counted +*/ +int GUI__WrapGetNumCharsDisp(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) { + int r; + switch (WrapMode) { + case GUI_WRAPMODE_WORD: + r = _GetWordWrap(pText, xSize); + break; + case GUI_WRAPMODE_CHAR: + r = _GetCharWrap(pText, xSize); + break; + default: + r = _GetNoWrap(pText); + } + return r; +} + +/********************************************************************* +* +* GUI__WrapGetNumCharsToNextLine +*/ +int GUI__WrapGetNumCharsToNextLine(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) { + int NumChars; + U16 Char; + NumChars = GUI__WrapGetNumCharsDisp(pText, xSize, WrapMode); + pText += GUI_UC__NumChars2NumBytes(pText, NumChars); + Char = GUI_UC__GetCharCodeInc(&pText); + if (Char == '\n') { + NumChars++; + } else { + if (WrapMode == GUI_WRAPMODE_WORD) { + while (Char == ' ') { + NumChars++; + Char = GUI_UC__GetCharCodeInc(&pText); + } + } + } + return NumChars; +} + +/********************************************************************* +* +* GUI__WrapGetNumBytesToNextLine +*/ +int GUI__WrapGetNumBytesToNextLine(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) { + int NumChars, NumBytes; + NumChars = GUI__WrapGetNumCharsToNextLine(pText, xSize, WrapMode); + NumBytes = GUI_UC__NumChars2NumBytes(pText, NumChars); + return NumBytes; +} + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Core/GUI__memset.c b/User/system/lib/lcd/gui/Core/GUI__memset.c new file mode 100644 index 0000000..f89908c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__memset.c @@ -0,0 +1,81 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__memset.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__memset +* +* Purpose: +* Replacement for the memset function. The advantage is high speed +* on all systems (sometime up to 10 times as fast as the one +* in the library) +* Main idea is to write int-wise. +*/ +void GUI__memset(U8* p, U8 Fill, int NumBytes) { + int NumInts; + /* Write bytes until we are done or have reached an int boundary */ + while (NumBytes && ((sizeof(int) - 1) & (U32)p)) { + *p++ = Fill; + NumBytes--; + } + /* Write Ints */ + NumInts = (unsigned)NumBytes / sizeof(int); + if (NumInts) { + int FillInt; + int *pInt; + NumBytes &= (sizeof(int) - 1); + if (sizeof(int) == 2) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */ + FillInt = Fill * 0x101; /* May some compilers generate a warning at this line: Unreachable code */ + } else if (sizeof(int) == 4) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */ + FillInt = Fill * 0x1010101; /* May some compilers generate a warning at this line: Unreachable code */ + } + pInt = (int*)p; + /* Fill large amount of data at a time */ + while (NumInts >= 4) { + *pInt++ = FillInt; + *pInt++ = FillInt; + *pInt++ = FillInt; + *pInt++ = FillInt; + NumInts -= 4; + } + /* Fill one int at a time */ + while (NumInts) { + *pInt++ = FillInt; + NumInts--; + } + p = (U8*)pInt; + } + /* Fill the remainder byte wise */ + while (NumBytes) { + *p++ = Fill; + NumBytes--; + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__memset16.c b/User/system/lib/lcd/gui/Core/GUI__memset16.c new file mode 100644 index 0000000..e160651 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__memset16.c @@ -0,0 +1,93 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__memset16.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__memset +* +* Purpose: +* Equivalent to the memset function, for 16 bit Data. +*/ +void GUI__memset16(U16 * p, U16 Fill, int NumWords) { + /* Code for 16 bit CPUs */ + if (sizeof(int) == 2) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */ + if (NumWords >= 8) { /* May some compilers generate a warning at this line: Unreachable code */ + *p++ = Fill; + *p++ = Fill; + *p++ = Fill; + *p++ = Fill; + *p++ = Fill; + *p++ = Fill; + *p++ = Fill; + *p++ = Fill; + NumWords -= 8; + } + while (NumWords) { + *p++ = Fill; + NumWords--; + } + } else { + int NumInts; /* May some compilers generate a warning at this line: Unreachable code */ + /* Write 16 bit until we are done or have reached an int boundary */ + if (2 & (U32)p) { + *p++ = Fill; + NumWords--; + } + /* Write Ints */ + NumInts = (unsigned)NumWords / (sizeof(int) / 2); + if (NumInts) { + int FillInt; + int *pInt; + FillInt = Fill * 0x10001; + + pInt = (int*)p; + /* Fill large amount of data at a time */ + if (NumInts >= 4) { + do { + *pInt = FillInt; + *(pInt + 1) = FillInt; + *(pInt + 2) = FillInt; + *(pInt + 3) = FillInt; + pInt += 4; + } while ((NumInts -= 4) >= 4); + } + /* Fill one int at a time */ + while (NumInts) { + *pInt++ = FillInt; + NumInts--; + } + p = (U16*)pInt; + } + /* Fill the remainder */ + if (NumWords & 1) { + *p = Fill; + } + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__strcmp.c b/User/system/lib/lcd/gui/Core/GUI__strcmp.c new file mode 100644 index 0000000..eca49f7 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__strcmp.c @@ -0,0 +1,80 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__strcmp.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Protected.h" + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__strcmp +* +* Purpose: +* Replacement for the strcmp function. The advantage is that it can +* be called with NULL pointer(s). +* A NULL string is treated as a an empty string (""). +* Return value: +* 0 if identical +* 1 else +*/ +int GUI__strcmp(const char GUI_UNI_PTR * s0, const char GUI_UNI_PTR * s1) { + if (s0 == NULL) { + s0 = ""; + } + if (s1 == NULL) { + s1 = ""; + } + do { + if (*s0 != *s1) { + return 1; + } + s1++; + } while (*++s0); + if (*s1) { + return 1; /* Not equal, since s1 is longer than s0 */ + } + return 0; /* Equal ! */ +} + +/********************************************************************* +* +* GUI__strcmp_hp +* +* Purpose: +* Replacement for the strcmp function. The advantage is that it can +* be called with NULL pointer or 0 handle. +* A NULL string is treated as a an empty string (""). +* Return value: +* 0 if identical +* 1 else +*/ +int GUI__strcmp_hp(GUI_HMEM hs0, const char GUI_UNI_PTR * s1) { + const char* s0 = NULL; + if (hs0) { + s0 = (const char*)GUI_ALLOC_h2p(hs0); + } + return GUI__strcmp(s0, s1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/GUI__strlen.c b/User/system/lib/lcd/gui/Core/GUI__strlen.c new file mode 100644 index 0000000..2d74333 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/GUI__strlen.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI__strlen.c +Purpose : Implementation of GUI__strlen +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI__strlen +* +* Purpose: +* Replacement for the strlen function. The advantage is that it can +* be called with a NULL pointer, in which case -1 is returned. +*/ +int GUI__strlen(const char GUI_UNI_PTR * s) { + int r = -1; + if (s) { + do { + r++; + } while (*s++); + } + return r; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD.c b/User/system/lib/lcd/gui/Core/LCD.c new file mode 100644 index 0000000..4f4977f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD.c @@ -0,0 +1,415 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD.c +Purpose : Link between GUI and LCD_L0 + Performs most of the clipping. +---------------------------END-OF-HEADER------------------------------ +*/ + +#define LCD_C + +#include +#include "GUI_Private.h" +#include "LCD_Private.h" +#include "GUIDebug.h" + +/********************************************************************* + * + * Defines + * + ********************************************************************** + */ + +#define RETURN_IF_Y_OUT() \ + if (y < GUI_Context.ClipRect.y0) \ + return; \ + if (y > GUI_Context.ClipRect.y1) \ + return; + +#define RETURN_IF_X_OUT() \ + if (x < GUI_Context.ClipRect.x0) \ + return; \ + if (x > GUI_Context.ClipRect.x1) \ + return; + +#define CLIP_X() \ + if (x0 < GUI_Context.ClipRect.x0) \ + { \ + x0 = GUI_Context.ClipRect.x0; \ + } \ + if (x1 > GUI_Context.ClipRect.x1) \ + { \ + x1 = GUI_Context.ClipRect.x1; \ + } + +#define CLIP_Y() \ + if (y0 < GUI_Context.ClipRect.y0) \ + { \ + y0 = GUI_Context.ClipRect.y0; \ + } \ + if (y1 > GUI_Context.ClipRect.y1) \ + { \ + y1 = GUI_Context.ClipRect.y1; \ + } + +/********************************************************************* + * + * Static code + * + ********************************************************************** + */ +/********************************************************************* + * + * _GetColorIndex + */ +static int _GetColorIndex(int i) /* i is 0 or 1 */ +{ + return (GUI_Context.DrawMode & LCD_DRAWMODE_REV) ? i - 1 : i; +} + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * LCD_SetColorIndex + */ +void LCD_SetColorIndex(int Index) +{ + LCD_ACOLORINDEX[_GetColorIndex(1)] = Index; +} + +/********************************************************************* + * + * LCD_SetBkColorIndex + */ +void LCD_SetBkColorIndex(int Index) +{ + LCD_ACOLORINDEX[_GetColorIndex(0)] = Index; +} + +/********************************************************************* + * + * LCD_SetDrawMode + */ +LCD_DRAWMODE LCD_SetDrawMode(LCD_DRAWMODE dm) +{ + LCD_DRAWMODE OldDM = GUI_Context.DrawMode; + if ((GUI_Context.DrawMode ^ dm) & LCD_DRAWMODE_REV) + { + LCD_PIXELINDEX temp = LCD_BKCOLORINDEX; + LCD_BKCOLORINDEX = LCD_COLORINDEX; + LCD_COLORINDEX = temp; + } + GUI_Context.DrawMode = dm; + return OldDM; +} + +/********************************************************************* + * + * LCD_DrawPixel + */ +void LCD_DrawPixel(int x, int y) +{ + RETURN_IF_Y_OUT(); + RETURN_IF_X_OUT(); + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) + { + LCDDEV_L0_XorPixel(x, y); + } + else + { + LCDDEV_L0_SetPixelIndex(x, y, LCD_COLORINDEX); + } +} + +/********************************************************************* + * + * LCD_DrawHLine + */ +void LCD_DrawHLine(int x0, int y, int x1) +{ + /* Perform clipping and check if there is something to do */ + RETURN_IF_Y_OUT(); + CLIP_X(); + if (x1 < x0) + return; + /* Call driver to draw */ + LCDDEV_L0_DrawHLine(x0, y, x1); +} + +/********************************************************************* + * + * LCD_FillRect + */ +void LCD_FillRect(int x0, int y0, int x1, int y1) +{ + /* Perform clipping and check if there is something to do */ + CLIP_X(); + if (x1 < x0) + return; + CLIP_Y(); + if (y1 < y0) + return; + /* Call driver to draw */ + LCDDEV_L0_FillRect(x0, y0, x1, y1); +} + +/********************************************************************* + * + * LCD_DrawBitmap + */ +void LCD_DrawBitmap(int x0, int y0, int xsize, int ysize, int xMul, int yMul, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR *pPixel, const LCD_PIXELINDEX *pTrans) +{ + U8 Data = 0; + int x1, y1; +/* Handle rotation if necessary */ +#if GUI_SUPPORT_ROTATION + if (GUI_pLCD_APIList) + { + GUI_pLCD_APIList->pfDrawBitmap(x0, y0, xsize, ysize, xMul, yMul, BitsPerPixel, BytesPerLine, pPixel, pTrans); + return; + } +#endif + /* Handle the optional Y-magnification */ + y1 = y0 + ysize - 1; + x1 = x0 + xsize - 1; + /* Handle BITMAP without magnification */ + if ((xMul | yMul) == 1) + { + int Diff; + /* Clip y0 (top) */ + Diff = GUI_Context.ClipRect.y0 - y0; + if (Diff > 0) + { + ysize -= Diff; + if (ysize <= 0) + { + return; + } + y0 = GUI_Context.ClipRect.y0; +#if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */ + pPixel += (U32)Diff * (U32)BytesPerLine; +#else + pPixel += (unsigned)Diff * (unsigned)BytesPerLine; +#endif + } + /* Clip y1 (bottom) */ + Diff = y1 - GUI_Context.ClipRect.y1; + if (Diff > 0) + { + ysize -= Diff; + if (ysize <= 0) + { + return; + } + } + /* Clip right side */ + Diff = x1 - GUI_Context.ClipRect.x1; + if (Diff > 0) + { + xsize -= Diff; + } + /* Clip left side ... (The difficult side ...) */ + Diff = 0; + if (x0 < GUI_Context.ClipRect.x0) + { + Diff = GUI_Context.ClipRect.x0 - x0; + xsize -= Diff; + switch (BitsPerPixel) + { + case 1: + pPixel += (Diff >> 3); + x0 += (Diff >> 3) << 3; + Diff &= 7; + break; + case 2: + pPixel += (Diff >> 2); + x0 += (Diff >> 2) << 2; + Diff &= 3; + break; + case 4: + pPixel += (Diff >> 1); + x0 += (Diff >> 1) << 1; + Diff &= 1; + break; + case 8: + pPixel += Diff; + x0 += Diff; + Diff = 0; + break; + case 16: + pPixel += (Diff << 1); + x0 += Diff; + Diff = 0; + break; + } + } + if (xsize <= 0) + { + return; + } + LCDDEV_L0_DrawBitmap(x0, y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans); + } + else + { + /**** Handle BITMAP with magnification ***/ + int x, y; + int yi; + int Shift = 8 - BitsPerPixel; + for (y = y0, yi = 0; yi < ysize; yi++, y += yMul, pPixel += BytesPerLine) + { + int yMax = y + yMul - 1; + /* Draw if within clip area (Optimization ... "if" is not required !) */ + if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) + { + int BitsLeft = 0; + int xi; + const U8 GUI_UNI_PTR *pDataLine = pPixel; + for (x = x0, xi = 0; xi < xsize; xi++, x += xMul) + { + U8 Index; + if (!BitsLeft) + { + Data = *pDataLine++; + BitsLeft = 8; + } + Index = Data >> Shift; + Data <<= BitsPerPixel; + BitsLeft -= BitsPerPixel; + if (Index || ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0)) + { + LCD_PIXELINDEX OldColor = LCD_COLORINDEX; + if (pTrans) + { + LCD_COLORINDEX = *(pTrans + Index); + } + else + { + LCD_COLORINDEX = Index; + } + LCD_FillRect(x, y, x + xMul - 1, yMax); + LCD_COLORINDEX = OldColor; + } + } + } + } + } +} + +/********************************************************************* + * + * LCD_SetClipRectMax + */ +void LCD_SetClipRectMax(void) +{ + LCDDEV_L0_GetRect(&GUI_Context.ClipRect); +} + +/********************************************************************* + * + * LCD_Init + */ +int LCD_Init(void) +{ + int r = 0; + GUI_DEBUG_LOG("\nLCD_Init..."); + LCD_SetClipRectMax(); + r |= LCD_L0_Init(); +#if GUI_NUM_LAYERS > 1 + r |= LCD_L0_1_Init(); +#endif +#if GUI_NUM_LAYERS > 2 + r |= LCD_L0_2_Init(); +#endif +#if GUI_NUM_LAYERS > 3 + r |= LCD_L0_3_Init(); +#endif +#if GUI_NUM_LAYERS > 4 + r |= LCD_L0_4_Init(); +#endif + LCD_InitLUT(); + { +#if GUI_NUM_LAYERS > 1 + int i; + for (i = GUI_NUM_LAYERS - 1; i >= 0; i--) + { + GUI_SelectLayer(i); +#else + { +#endif +#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR) + /* Clear video memory */ + LCD_SetDrawMode(GUI_DRAWMODE_REV); + // LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX); // xsh:?????????????????? + LCD_SetDrawMode(0); +#endif + } + } + /* Switch LCD on */ + LCD_On(); + return r; +} + +/********************************************************************* + * + * LCD_Color2Index + */ +int LCD_Color2Index(LCD_COLOR Color) +{ + return LCDDEV_L0_Color2Index(Color); +} + +/********************************************************************* + * + * LCD_Index2Color + */ +LCD_COLOR LCD_Index2Color(int Index) +{ + return LCDDEV_L0_Index2Color(Index); +} + +/********************************************************************* + * + * LCD_SetBkColor + */ +void LCD_SetBkColor(GUI_COLOR color) +{ + if (GUI_Context.BkColor != color) + { + GUI_Context.BkColor = color; + LCD_SetBkColorIndex(LCD_Color2Index(color)); + } +} + +/********************************************************************* + * + * LCD_SetColor + */ +void LCD_SetColor(GUI_COLOR color) +{ + if (GUI_Context.Color != color) + { + GUI_Context.Color = color; + LCD_SetColorIndex(LCD_Color2Index(color)); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD.h b/User/system/lib/lcd/gui/Core/LCD.h new file mode 100644 index 0000000..e39a27f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD.h @@ -0,0 +1,538 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD.h +Purpose : Declares LCD interface functions +---------------------------------------------------------------------- +*/ + +#ifndef LCD_H +#define LCD_H + +#include "GUI_ConfDefaults.h" /* Used for GUI_UNI_PTR */ + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/* + ******************************************************************** + * * + * Basic type defines * + * * + ******************************************************************** + +The follwing are defines for types used in the LCD-driver and the +GUI layers on top of that. Since "C" does not provide data types of +fixed length which are identical on all platforms, this is done here. +For most 16/32 controllers, the settings will work fine. However, if +you have similar defines in other sections of your program, you might +want to change or relocate these defines, e.g. in a TYPE.h file. +*/ + +#define I8 signed char +#define U8 unsigned char /* unsigned 8 bits. */ +#define I16 signed short /* signed 16 bits. */ +#define U16 unsigned short /* unsigned 16 bits. */ +#define I32 signed long /* signed 32 bits. */ +#define U32 unsigned long /* unsigned 32 bits. */ +#define I16P I16 /* signed 16 bits OR MORE ! */ +#define U16P U16 /* unsigned 16 bits OR MORE ! */ + +/* + ******************************************************************** + * * + * Settings for windows simulation * + * * + ******************************************************************** + +Some settings in the configuration may conflict with the values required +in the Simulation. This is why we ignore the target settings for data +types and use the correct settings for the simulation. +(U32 could be defined as long, which would yield a 64 bit type on +the PC) +*/ + +#ifdef WIN32 + #pragma warning( disable : 4244 ) // Disable warning messages in simulation + #pragma warning( disable : 4761 ) // Disable warning "integral size mismatch in argument; conversion supplied" +#endif + + +/* ************************************************************* + * * + * Constants * + * * + ************************************************************* +*/ +#define LCD_ERR0 (0x10) +#define LCD_ERR_CONTROLLER_NOT_FOUND (LCD_ERR0+1) +#define LCD_ERR_MEMORY (LCD_ERR0+2) + +/* + ********************************* + * * + * Drawing modes * + * * + ********************************* +*/ + +#define LCD_DRAWMODE_NORMAL (0) +#define LCD_DRAWMODE_XOR (1<<0) +#define LCD_DRAWMODE_TRANS (1<<1) +#define LCD_DRAWMODE_REV (1<<2) + + + +/* ************************************************************* + * * + * Typedefs * + * * + ************************************************************* +*/ + +typedef int LCD_DRAWMODE; +typedef U32 LCD_COLOR; + + +/******************************************************** +* +* Data structures +* +********************************************************* +*/ + +typedef struct { I16P x,y; } GUI_POINT; +typedef struct { I16 x0,y0,x1,y1; } LCD_RECT; +/*typedef struct { GUI_POINT P0, P1; } LCD_RECT; */ + +typedef struct { + int NumEntries; + char HasTrans; + const LCD_COLOR GUI_UNI_PTR * pPalEntries; +} LCD_LOGPALETTE; + +/* This is used for the simulation only ! */ +typedef struct { + int x,y; + unsigned char KeyStat; +} LCD_tMouseState; + +/********************************************************************* +* +* Index2Color + + This function needs to be int the public part of the software + since it is needed by the simulation. Most other driver + functions are hidden in the private header file. +*/ + +typedef LCD_COLOR tLCDDEV_Index2Color (int Index); +typedef unsigned int tLCDDEV_Color2Index (LCD_COLOR Color); +typedef unsigned int tLCDDEV_GetIndexMask (void); +LCD_COLOR LCD_L0_Index2Color (int Index); +LCD_COLOR LCD_L0_1_Index2Color(int Index); +LCD_COLOR LCD_L0_2_Index2Color(int Index); +LCD_COLOR LCD_L0_3_Index2Color(int Index); +LCD_COLOR LCD_L0_4_Index2Color(int Index); +unsigned int LCD_L0_Color2Index (LCD_COLOR Color); +unsigned int LCD_L0_1_Color2Index(LCD_COLOR Color); +unsigned int LCD_L0_2_Color2Index(LCD_COLOR Color); +unsigned int LCD_L0_3_Color2Index(LCD_COLOR Color); +unsigned int LCD_L0_4_Color2Index(LCD_COLOR Color); +unsigned int LCD_L0_GetIndexMask (void); +unsigned int LCD_L0_1_GetIndexMask(void); +unsigned int LCD_L0_2_GetIndexMask(void); +unsigned int LCD_L0_3_GetIndexMask(void); +unsigned int LCD_L0_4_GetIndexMask(void); + + +/********************************************************************* +* +* Color conversion API tables +*/ + +typedef struct { + tLCDDEV_Color2Index* pfColor2Index; + tLCDDEV_Index2Color* pfIndex2Color; + tLCDDEV_GetIndexMask* pfGetIndexMask; +} LCD_API_COLOR_CONV; + +extern const LCD_API_COLOR_CONV LCD_API_ColorConv_1; +extern const LCD_API_COLOR_CONV LCD_API_ColorConv_2; +extern const LCD_API_COLOR_CONV LCD_API_ColorConv_4; +extern const LCD_API_COLOR_CONV LCD_API_ColorConv_8666; + +#define GUI_COLOR_CONV_1 &LCD_API_ColorConv_1 +#define GUI_COLOR_CONV_2 &LCD_API_ColorConv_2 +#define GUI_COLOR_CONV_4 &LCD_API_ColorConv_4 +#define GUI_COLOR_CONV_8666 &LCD_API_ColorConv_8666 + +/********************************************************************* +* +* LCDDEV function table +* +********************************************************************** + + Below the routines which need to in an LCDDEV routine table are + defined. All of these routines have to be in the low-level driver + (LCD_L0) or in the memory device which can be used to replace the + driver. + The one exception to this is the SetClipRect routine, which would + be identical for all drivers and is therefor contained in the + level above (LCD). +*/ +typedef void tLCDDEV_DrawHLine (int x0, int y0, int x1); +typedef void tLCDDEV_DrawVLine (int x , int y0, int y1); +typedef void tLCDDEV_FillRect (int x0, int y0, int x1, int y1); +typedef unsigned int tLCDDEV_GetPixelIndex(int x, int y); +typedef void tLCDDEV_SetPixelIndex(int x, int y, int ColorIndex); +typedef void tLCDDEV_XorPixel (int x, int y); +typedef void tLCDDEV_FillPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0); +typedef void tLCDDEV_FillPolygonAA(const GUI_POINT* pPoints, int NumPoints, int x0, int y0); +typedef void tLCDDEV_GetRect (LCD_RECT*pRect); +typedef int tLCDDEV_Init (void); +typedef void tLCDDEV_On (void); +typedef void tLCDDEV_Off (void); +typedef void tLCDDEV_SetLUTEntry (U8 Pos, LCD_COLOR color); + +/********************************************************************* +* +* Memory device API tables +*/ +#if GUI_COMPILER_SUPPORTS_FP + typedef struct tLCDDEV_APIList_struct tLCDDEV_APIList; +#endif + +typedef void tLCDDEV_DrawBitmap (int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, + const void* pTrans); /* Really LCD_PIXELINDEX, but is void to avoid compiler warnings*/ + +struct tLCDDEV_APIList_struct { + tLCDDEV_Color2Index* pfColor2Index; + tLCDDEV_Index2Color* pfIndex2Color; + tLCDDEV_GetIndexMask* pfGetIndexMask; + tLCDDEV_DrawBitmap* pfDrawBitmap; + tLCDDEV_DrawHLine* pfDrawHLine; + tLCDDEV_DrawVLine* pfDrawVLine; + tLCDDEV_FillRect* pfFillRect; + tLCDDEV_GetPixelIndex* pfGetPixelIndex; + tLCDDEV_GetRect* pfGetRect; + tLCDDEV_SetPixelIndex* pfSetPixelIndex; + tLCDDEV_XorPixel* pfXorPixel; + tLCDDEV_SetLUTEntry* pfSetLUTEntry; + #if GUI_SUPPORT_MEMDEV + tLCDDEV_FillPolygon* pfFillPolygon; + tLCDDEV_FillPolygonAA* pfFillPolygonAA; + const tLCDDEV_APIList* pMemDevAPI; + unsigned BitsPerPixel; + #endif +}; +#if GUI_COMPILER_SUPPORTS_FP + extern const struct tLCDDEV_APIList_struct GUI_MEMDEV__APIList1; + extern const struct tLCDDEV_APIList_struct GUI_MEMDEV__APIList8; + extern const struct tLCDDEV_APIList_struct GUI_MEMDEV__APIList16; + + #define GUI_MEMDEV_APILIST_1 &GUI_MEMDEV__APIList1 + #define GUI_MEMDEV_APILIST_8 &GUI_MEMDEV__APIList8 + #define GUI_MEMDEV_APILIST_16 &GUI_MEMDEV__APIList16 +#endif + +/* ************************************************************* + * * + * Defines * + * * + * for device capabilities * + * * + ************************************************************* + +The following is the list of device capabilities which can, but do +not have to be implemented in the driver. This way the driver can be +enhanced in the future without affecting the driver interface, +keeping older drivers compatible. +More DevCaps can always be added in the future, as older drivers +are guaranteed to return 0 for all unimplemented features or queries. + +The values below define the legal parameters to the LCD_GetDeviceCaps +and the LCD_GetpCapFunc routines. +*/ + +#define LCD_DEVCAP_NUMCOLORS 0x0 /* Quest number of colors + which LCD can display */ +#define LCD_DEVCAP_XSIZE 0x1 /* Quest horiz. res. of display */ +#define LCD_DEVCAP_YSIZE 0x2 /* Quest vert. res. of display */ +#define LCD_DEVCAP_VXSIZE 0x3 /* Quest vert. res. of virtual disp.*/ +#define LCD_DEVCAP_VYSIZE 0x4 /* Quest vert. res. of virtual disp.*/ +#define LCD_DEVCAP_XORG 0x5 /* X-origin ... usually 0 */ +#define LCD_DEVCAP_YORG 0x6 /* Y-origin ... usually 0 */ +#define LCD_DEVCAP_CONTROLLER 0x7 /* LCD Controller (Numerical) */ +#define LCD_DEVCAP_BITSPERPIXEL 0x8 /* Bits per pixel ... 1/2/4/8 */ +#define LCD_DEVCAP_NUMPAGES 0x10 /* Quest number of pages of display */ + +#define LCD_DEVCAP_COLOR 0x1000 /* Quest Color[0] + 0x1001 Quest Color[1] + 0x1002 Quest Color[2] + ... */ + /* The next 4095 entries are reserved so up to 4096 colors + can be queried ...*/ + +int LCD_GetXSize(void); +int LCD_GetXSize_1(void); +int LCD_GetXSizeEx(int Index); + +int LCD_GetYSize(void); +int LCD_GetYSize_1(void); +int LCD_GetYSizeEx(int Index); + +int LCD_GetVXSize(void); +int LCD_GetVXSize_1(void); +int LCD_GetVXSizeEx(int Index); + +int LCD_GetVYSize(void); +int LCD_GetVYSize_1(void); +int LCD_GetVYSizeEx(int Index); + +U32 LCD_GetNumColors(void); +U32 LCD_GetNumColors_1(void); +U32 LCD_GetNumColorsEx(int Index); + +int LCD_GetBitsPerPixel(void); +int LCD_GetBitsPerPixel_1(void); +int LCD_GetBitsPerPixelEx(int Index); + +int LCD_GetFixedPalette(void); +int LCD_GetFixedPalette_1(void); +I32 LCD_GetFixedPaletteEx(int Index); + +int LCD_GetXMag(void); +int LCD_GetXMag_1(void); +int LCD_GetXMagEx(int Index); + +int LCD_GetYMag(void); +int LCD_GetYMag_1(void); +int LCD_GetYMagEx(int Index); + +int LCD_GetMirrorXEx(int LayerIndex); +int LCD_GetMirrorYEx(int LayerIndex); +int LCD_GetSwapXYEx(int LayerIndex); + +int LCD_GetSwapRBEx(int LayerIndex); +int LCD_GetDeltaModeEx(int LayerIndex); +int LCD_GetBitsPerPixel_L0Ex(int LayerIndex); + +int LCD_GetNumLayers(void); + +#define LCD_GetNumDisplays() LCD_GetNumLayers() + +#define LCD_GET_XSIZE() LCD_GetXSize() +#define LCD_GET_YSIZE() LCD_GetYSize() +#define LCD_GET_VXSIZE() LCD_GetVXSize() +#define LCD_GET_VYSIZE() LCD_GetVYSize() +#define LCD_GET_NUMCOLORS() LCD_GetNumColors() +#define LCD_GET_BITSPERPIXEL() LCD_GetBitsPerPixel() + + +/********************************************************************* +* +* LCD_CLIP function table +* +********************************************************************** +*/ +typedef void tLCD_HL_DrawHLine (int x0, int y0, int x1); +typedef void tLCD_HL_DrawPixel (int x0, int y0); + +typedef struct { + tLCD_HL_DrawHLine* pfDrawHLine; + tLCD_HL_DrawPixel* pfDrawPixel; +} tLCD_HL_APIList; + +void LCD_DrawHLine(int x0, int y0, int x1); +void LCD_DrawPixel(int x0, int y0); +void LCD_DrawVLine (int x, int y0, int y1); + + + +/********************************************************************* +* +* Declarations for LCD_ +* +********************************************************************** +*/ + +void LCD_SetClipRectEx(const LCD_RECT* pRect); +void LCD_SetClipRectMax(void); + +/* Get device capabilities (0 if not supported) */ +I32 LCD_GetDevCap(int Index); + +/* Initialize LCD using config-paramters */ +int LCD_Init(void); + +void LCD_SetBkColor (LCD_COLOR Color); /* Set background color */ +void LCD_SetColor (LCD_COLOR Color); /* Set foreground color */ +void LCD_SetPixelIndex(int x, int y, int ColorIndex); + +/* Palette routines (Not available on all drivers) */ +void LCD_InitLUT(void); + +/* Decompressors */ +//typedef void tfDrawSpecialBitmap(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag); +void LCD_DrawBitmap_RLE8(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag); +void LCD_DrawBitmap_RLE4(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag); +void LCD_DrawBitmap_565 (int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag); +void LCD_DrawBitmap_M565(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag); + +LCD_DRAWMODE LCD_SetDrawMode (LCD_DRAWMODE dm); +void LCD_SetColorIndex(int Index); +void LCD_SetBkColorIndex(int Index); +void LCD_FillRect(int x0, int y0, int x1, int y1); +typedef void tLCD_SetPixelAA(int x, int y, U8 Intens); + +void LCD_SetPixelAA(int x, int y, U8 Intens); +void LCD_SetPixelAA_NoTrans(int x, int y, U8 Intens); + +LCD_COLOR LCD_AA_MixColors(LCD_COLOR Color, LCD_COLOR BkColor, U8 Intens); +LCD_COLOR LCD_MixColors256(LCD_COLOR Color, LCD_COLOR BkColor, unsigned Intens); +LCD_COLOR LCD_GetPixelColor(int x, int y); /* Get RGB color of pixel */ +unsigned int LCD_GetPixelIndex(int x, int y); +int LCD_GetBkColorIndex (void); +int LCD_GetColorIndex (void); + +/********************************************************************* +* +* Optional support for rotatation +* +********************************************************************** +*/ + +#if GUI_SUPPORT_ROTATION + +typedef void tLCD_DrawBitmap(int x0, int y0, int xsize, int ysize, + int xMul, int yMul, int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pPixel, const void * pTrans); +typedef void tRect2TextRect (LCD_RECT * pRect); + +struct tLCD_APIList_struct { + tLCD_DrawBitmap * pfDrawBitmap; + tRect2TextRect * pfRect2TextRect; +}; + +typedef struct tLCD_APIList_struct tLCD_APIList; + +extern tLCD_APIList LCD_APIListCCW; +extern tLCD_APIList LCD_APIListCW; +extern tLCD_APIList LCD_APIList180; + +#define GUI_ROTATION tLCD_APIList +#define GUI_ROTATE_CCW &LCD_APIListCCW +#define GUI_ROTATE_CW &LCD_APIListCW +#define GUI_ROTATE_180 &LCD_APIList180 +#define GUI_ROTATE_0 0 +#endif + + +/* ************************************************************* + * * + * LCD publics not used by GUI * + * * + ************************************************************* + + +The following functions can, but do not have to be defined in the LCD driver +as they are not used by the GUI level. + +*/ + + + +#define LCD_On LCD_L0_On +#define LCD_Off LCD_L0_Off +#define LCD_ReInit LCD_L0_ReInit +#define LCD_SetLUTEntry LCD_L0_SetLUTEntry + + +#define LCD_CC_UNLOCK (0) /* Default mode: Cache is transparent */ +#define LCD_CC_LOCK (1) /* Cache is locked, no write operations */ +#define LCD_CC_FLUSH (2) /* Flush cache, do not change mode */ +U8 LCD_L0_ControlCache(U8 mode); +U8 LCD_L0_1_ControlCache(U8 mode); +U8 LCD_L0_2_ControlCache(U8 mode); +U8 LCD_L0_3_ControlCache(U8 mode); +U8 LCD_L0_4_ControlCache(U8 mode); +void LCD_L0_Refresh(void); +void LCD_L0_1_Refresh(void); +void LCD_L0_2_Refresh(void); +void LCD_L0_3_Refresh(void); +void LCD_L0_4_Refresh(void); +/* Check if controller is still properly initialized */ +int LCD_L0_CheckInit(void); /* returns if init is still O.K. + by reading all available registers of + Display controller. + 0: Init O.K. + */ + +#define LCD_ControlCache LCD_L0_ControlCache + +/* + ****************************************** + * * + * Support for paging * + * * + ****************************************** +*/ + +int LCD_SelPage (int NewPage); /* returns formerly sel. page */ +int LCD_ShowPage (int NewPage); /* sets / returns visible page */ +int LCD_GetSelPage (void); /* returns selected page */ +int LCD_GetVisPage (void); /* returns visible page */ + + +/* ************************************************************* + * * + * LCD imports * + * (for routines in LCDColor) * + * * + ************************************************************* +*/ + + +int LCD_Color2Index (LCD_COLOR Color); +LCD_COLOR LCD_Index2Color (int Index); +LCD_COLOR LCD_Index2ColorEx (int i, unsigned int LayerIndex); + +/********************************************************************* +* +* LCD_X_... +* +********************************************************************** +*/ + +void LCD_X_Init(void); +void LCD_X_On (void); +void LCD_X_Off (void); + +char LCD_X_Read00(void); +char LCD_X_Read01(void); +void LCD_X_Write00(char c); +void LCD_X_Write01(char c); +void LCD_X_WriteM01(char * pData, int NumBytes); + +#if defined(__cplusplus) + } +#endif + +#endif /* LCD_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDAA.c b/User/system/lib/lcd/gui/Core/LCDAA.c new file mode 100644 index 0000000..ceee261 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDAA.c @@ -0,0 +1,117 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDAA.c +Purpose : Low level antialiasing routines. +---------------------------END-OF-HEADER------------------------------ +*/ + +#define LCD_C + +#include /* needed for definition of NULL */ +#include "LCD.h" +#include "GUI_Private.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define RETURN_IF_Y_OUT() \ + if (y < GUI_Context.ClipRect.y0) \ + return; \ + if (y > GUI_Context.ClipRect.y1) \ + return; + +#define RETURN_IF_X_OUT() \ + if (x < GUI_Context.ClipRect.x0) return; \ + if (x > GUI_Context.ClipRect.x1) return; + +#define CLIP_X() \ + if (x0 < GUI_Context.ClipRect.x0) { x0 = GUI_Context.ClipRect.x0; } \ + if (x1 > GUI_Context.ClipRect.x1) { x1 = GUI_Context.ClipRect.x1; } + +#define CLIP_Y() \ + if (y0 < GUI_Context.ClipRect.y0) { y0 = GUI_Context.ClipRect.y0; } \ + if (y1 > GUI_Context.ClipRect.y1) { y1 = GUI_Context.ClipRect.y1; } + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_AA_MixColors +*/ +LCD_COLOR LCD_AA_MixColors(LCD_COLOR Color, LCD_COLOR BkColor, U8 Intens) { + /* Calc Color seperations for FgColor first */ + I32 R = (Color&0xff)*Intens; + I32 G = (Color&0xff00)*Intens; + I32 B = (Color&0xff0000)*Intens; + /* Add Color seperations for BkColor */ + Intens = 15-Intens; + R += (BkColor&0xff)*Intens; + G += (BkColor&0xff00)*Intens; + B += (BkColor&0xff0000)*Intens; + R = (R/15)&0xff; + G = (G/15)&0xff00; + B = (B/15)&0xff0000; + Color = R+G+B; + return Color; +} + +/********************************************************************* +* +* LCD_SetPixelAA +*/ +void LCD_SetPixelAA(int x, int y, U8 Intens) { + if (Intens == 0) + return; + RETURN_IF_Y_OUT(); + RETURN_IF_X_OUT(); + if (Intens >= 15) { + LCDDEV_L0_SetPixelIndex(x,y, LCD_COLORINDEX); + } else { + LCD_COLOR Color = LCD_Index2Color(LCD_COLORINDEX); + LCD_COLOR BkColor = LCD_GetPixelColor(x,y); + Color = LCD_AA_MixColors(Color, BkColor, Intens); + LCDDEV_L0_SetPixelIndex(x,y, LCD_Color2Index(Color)); + } +} + +/********************************************************************* +* +* LCD_SetPixelAA_NoTrans +*/ +void LCD_SetPixelAA_NoTrans(int x, int y, U8 Intens) { + RETURN_IF_Y_OUT(); + RETURN_IF_X_OUT(); + if (Intens == 0) { + LCDDEV_L0_SetPixelIndex(x,y, LCD_BKCOLORINDEX); + } else if (Intens == 15) { + LCDDEV_L0_SetPixelIndex(x,y, LCD_COLORINDEX); + } else { + LCD_COLOR Color = LCD_AA_MixColors(LCD_Index2Color(LCD_COLORINDEX), + LCD_Index2Color(LCD_BKCOLORINDEX), + Intens); + LCDDEV_L0_SetPixelIndex(x,y,LCD_Color2Index(Color)); + } +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDColor.c b/User/system/lib/lcd/gui/Core/LCDColor.c new file mode 100644 index 0000000..80c8f74 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDColor.c @@ -0,0 +1,181 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDColor.C +Purpose : Color conversion routines for LCD-drivers +---------------------------END-OF-HEADER------------------------------ +*/ + +#define LCDCOLOR_C + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "LCD_Private.h" /* inter modul definitions & Config */ + +/********************************************************************* +* +* Defines, config defaults +* +********************************************************************** +*/ + +#ifndef LCD_SIZEOF_COLORCACHE + #define LCD_SIZEOF_COLORCACHE 0 +#endif + +#if LCD_SIZEOF_COLORCACHE + static const LCD_LOGPALETTE * pLogPalCache; +#endif + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +LCD_PIXELINDEX LCD__aConvTable[LCD_MAX_LOG_COLORS]; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_GetpPalConvTableUncached +*/ +LCD_PIXELINDEX* LCD_GetpPalConvTableUncached(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal) { + if (pLogPal == NULL) { + return NULL; + } + if (!pLogPal->pPalEntries) { + return NULL; + } + /* Check if sufficient space is available */ + if (pLogPal->NumEntries > LCD_MAX_LOG_COLORS) { + return NULL; + } + /* Build conversion table */ + { + int i; + int NumEntries = pLogPal->NumEntries; + const LCD_COLOR GUI_UNI_PTR * pPalEntry = &pLogPal->pPalEntries[0]; + for (i=0; i< NumEntries; i++) { + LCD__aConvTable[i] = LCD_Color2Index(*(pPalEntry+i)); + } + } + return &LCD__aConvTable[0]; +} + +/********************************************************************* +* +* LCD_GetpPalConvTable +*/ +LCD_PIXELINDEX* LCD_GetpPalConvTable(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal) { +/* Check cache */ + #if LCD_SIZEOF_COLORCACHE + if (pLogPalCache == pLogPal) { + return &LCD__aConvTable[0]; + } + pLogPalCache = pLogPal; + #endif + return LCD_GetpPalConvTableUncached(pLogPal); +} + +/********************************************************************* +* +* LCD_InitLUT +*/ +void LCD_InitLUT(void) { + #if (LCD_BITSPERPIXEL <= 8) + { + int i; + for (i=0; i < LCD_NUM_COLORS; i++) { + LCD_COLOR color = LCD_Index2Color((U8)i); + #if LCD_REVERSE_LUT + color ^= 0xffffff; /* Invert R,G,B components */ + #endif + LCD_L0_SetLUTEntry((U8)i, color); + } + } + #endif + #if (GUI_NUM_LAYERS > 1) + #if (LCD_BITSPERPIXEL_1 <= 8) + { + int i; + int DisplayOld = GUI_SelectLayer(1); + for (i=0; i < LCD_NUM_COLORS_1; i++) { + LCD_COLOR color = LCD_Index2Color((U8)i); + #if LCD_REVERSE_LUT_1 + color ^= 0xffffff; /* Invert R,G,B components */ + #endif + LCD_L0_1_SetLUTEntry((U8)i, color); + } + GUI_SelectLayer(DisplayOld); + } + #endif + #endif + #if (GUI_NUM_LAYERS > 2) + #if (LCD_BITSPERPIXEL_2 <= 8) + { + int i; + int DisplayOld = GUI_SelectLayer(2); + for (i=0; i < LCD_NUM_COLORS_2; i++) { + LCD_COLOR color = LCD_Index2Color((U8)i); + #if LCD_REVERSE_LUT_2 + color ^= 0xffffff; /* Invert R,G,B components */ + #endif + LCD_L0_2_SetLUTEntry((U8)i, color); + } + GUI_SelectLayer(DisplayOld); + } + #endif + #endif + #if (GUI_NUM_LAYERS > 3) + #if (LCD_BITSPERPIXEL_3 <= 8) + { + int i; + int DisplayOld = GUI_SelectLayer(3); + for (i=0; i < LCD_NUM_COLORS_3; i++) { + LCD_COLOR color = LCD_Index2Color((U8)i); + #if LCD_REVERSE_LUT_3 + color ^= 0xffffff; /* Invert R,G,B components */ + #endif + LCD_L0_3_SetLUTEntry((U8)i, color); + } + GUI_SelectLayer(DisplayOld); + } + #endif + #endif + #if (GUI_NUM_LAYERS > 4) + #if (LCD_BITSPERPIXEL_4 <= 8) + { + int i; + int DisplayOld = GUI_SelectLayer(4); + for (i=0; i < LCD_NUM_COLORS_4; i++) { + LCD_COLOR color = LCD_Index2Color((U8)i); + #if LCD_REVERSE_LUT_4 + color ^= 0xffffff; /* Invert R,G,B components */ + #endif + LCD_L0_4_SetLUTEntry((U8)i, color); + } + GUI_SelectLayer(DisplayOld); + } + #endif + #endif +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDGetP.c b/User/system/lib/lcd/gui/Core/LCDGetP.c new file mode 100644 index 0000000..25f7aa9 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDGetP.c @@ -0,0 +1,61 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDGetP.c +Purpose : Get Pixel routines + Note: These routines are in a module of their own + because they are mostly not required to link +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_GetPixelIndex +* +* NOTE: +* We can not use the standard clipping which we use for drawing +* operations as it is perfectly legal to read pixels outside of +* the clipping area. We therefor get the bounding rectangle of the +* device and use it for clipping. +*/ +unsigned LCD_GetPixelIndex(int x, int y) { + LCD_RECT r; + GUI_ASSERT_LOCK(); + LCDDEV_L0_GetRect(&r); + if (x < r.x0) { + return 0; + } + if (x > r.x1) { + return 0; + } + if (y < r.y0) { + return 0; + } + if (y > r.y1) { + return 0; + } + return LCDDEV_L0_GetPixelIndex(x,y); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDInfo.c b/User/system/lib/lcd/gui/Core/LCDInfo.c new file mode 100644 index 0000000..ca3c78a --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDInfo.c @@ -0,0 +1,57 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDInfo.C +Purpose : Routines returning info at runtime +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" /* interface definitions */ +#include "LCD_Private.h" /* private modul definitions & config */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_GetDevCap +*/ +I32 LCD_GetDevCap(int Index) { + switch (Index) { + case LCD_DEVCAP_NUMCOLORS: + return LCD_NUM_COLORS; + case LCD_DEVCAP_XSIZE: + return LCD_GetXSize(); + case LCD_DEVCAP_YSIZE: + return LCD_GetYSize(); + case LCD_DEVCAP_VXSIZE: + return LCD_VXSIZE; + case LCD_DEVCAP_VYSIZE: + return LCD_VYSIZE; + case LCD_DEVCAP_CONTROLLER: + return LCD_CONTROLLER; + case LCD_DEVCAP_BITSPERPIXEL: + return LCD_BITSPERPIXEL; + } + if ((Index >= LCD_DEVCAP_COLOR) && (Index < LCD_DEVCAP_COLOR+LCD_NUM_COLORS)) { + return LCD_Index2Color(Index-LCD_DEVCAP_COLOR); + } + return 0; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDInfo0.c b/User/system/lib/lcd/gui/Core/LCDInfo0.c new file mode 100644 index 0000000..19769ee --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDInfo0.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDInfo1.C +Purpose : Routines returning info at runtime +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" /* interface definitions */ +#include "LCD_Private.h" /* private modul definitions & config */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +int LCD_GetXSize(void) { return LCD_XSIZE; } +int LCD_GetYSize(void) { return LCD_YSIZE; } +int LCD_GetVXSize(void) { return LCD_VXSIZE; } +int LCD_GetVYSize(void) { return LCD_VYSIZE; } +int LCD_GetBitsPerPixel(void) { return LCD_BITSPERPIXEL; } +U32 LCD_GetNumColors(void) { return LCD_NUM_COLORS; } +int LCD_GetYMag(void) { return LCD_YMAG; } +int LCD_GetXMag(void) { return LCD_XMAG; } +int LCD_GetFixedPalette(void) { return LCD_FIXEDPALETTE; } + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDInfo1.c b/User/system/lib/lcd/gui/Core/LCDInfo1.c new file mode 100644 index 0000000..03bcfca --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDInfo1.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDInfo1.C +Purpose : Routines returning info at runtime +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" /* interface definitions */ +#include "LCD_Private.h" /* private modul definitions & config */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +#if GUI_NUM_LAYERS > 1 + int LCD_GetXSize_1(void) { return LCD_XSIZE_1; } + int LCD_GetYSize_1(void) { return LCD_YSIZE_1; } + int LCD_GetVXSize_1(void) { return LCD_VXSIZE_1; } + int LCD_GetVYSize_1(void) { return LCD_VYSIZE_1; } + int LCD_GetBitsPerPixel_1(void) { return LCD_BITSPERPIXEL_1; } + U32 LCD_GetNumColors_1(void) { return LCD_NUM_COLORS_1; } + int LCD_GetYMag_1(void) { return LCD_YMAG_1; } + int LCD_GetXMag_1(void) { return LCD_XMAG_1; } + int LCD_GetFixedPalette_1(void) { return LCD_FIXEDPALETTE_1; } +#else + int LCD_GetXSize_1(void) { return 0; } + int LCD_GetYSize_1(void) { return 0; } + int LCD_GetVXSize_1(void) { return 0; } + int LCD_GetVYSize_1(void) { return 0; } + int LCD_GetBitsPerPixel_1(void) { return 0; } + U32 LCD_GetNumColors_1(void) { return 0; } + int LCD_GetYMag_1(void) { return 0; } + int LCD_GetXMag_1(void) { return 0; } + int LCD_GetFixedPalette_1(void) { return 0; } +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDL0Delta.c b/User/system/lib/lcd/gui/Core/LCDL0Delta.c new file mode 100644 index 0000000..a582fe5 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDL0Delta.c @@ -0,0 +1,516 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDL0Delta.c +Purpose : Link between GUI and LCD_L0... if delta display needs to + be supported +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "GUIDebug.h" +#include "LCD_Private.h" /* private modul definitions & config */ + +#if LCD_DELTA_MODE + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +static U8 _aPixelData_0[LCD_XSIZE]; +static U8 _aPixelData_1[LCD_XSIZE]; +static const GUI_LOGPALETTE _Pal; +static GUI_BITMAP _Bm; +static int _y; +static U8 _aRGB[3]; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _SetRGB +*/ +static void _SetRGB(LCD_PIXELINDEX ColorIndex) { + _aRGB[0] = ColorIndex & 0x00f; + _aRGB[1] = (ColorIndex & 0x0f0) >> 4; + _aRGB[2] = (ColorIndex & 0xf00) >> 8; +} + +/********************************************************************* +* +* _SetPixel +*/ +static void _SetPixelIndex(int x, LCD_PIXELINDEX ColorIndex) { + _SetRGB(ColorIndex); + _aPixelData_0[x] = _aRGB[(x + (_y & 1)) % 3]; +} + +/********************************************************************* +* +* _InitBM +*/ +static void _InitBM(int xsize, int x0) { + _Bm.XSize = xsize; + _Bm.YSize = 1; + _Bm.BytesPerLine = xsize; + _Bm.BitsPerPixel = 8; + _Bm.pfDraw = 0; + _Bm.pData = &_aPixelData_0[x0]; + _Bm.pPal = &_Pal; + _Bm.pfDraw = 0; +} + +/********************************************************************* +* +* _DrawBitLine1BPP +*/ +static void _DrawBitLine1BPP(int x, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) { + int xx; + LCD_PIXELINDEX Index0 = *(pTrans+0); + LCD_PIXELINDEX Index1 = *(pTrans+1); + x += Diff; + xx = x; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + do { + _SetPixelIndex(xx++, (*p & (0x80 >> Diff)) ? Index1 : Index0); + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*p & (0x80 >> Diff)) { + _SetPixelIndex(xx, Index1); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + xx++; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_XOR:; + do { + if (*p & (0x80 >> Diff)) { + int Pixel = LCD_L0_GetPixelIndex(xx, _y); + _SetPixelIndex(xx, LCD_NUM_COLORS - 1 - Pixel); + } + xx++; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + } + LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0); +} + +/********************************************************************* +* +* _DrawBitLine2BPP +*/ +static void _DrawBitLine2BPP(int x, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) { + int xx; + LCD_PIXELINDEX Pixels = *p; + int CurrentPixel = Diff; + x += Diff; + xx = x; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + if (pTrans) { + do { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + _SetPixelIndex(xx++, PixelIndex); + if (++CurrentPixel == 4) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } else { + do { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + _SetPixelIndex(xx++, Index); + if (++CurrentPixel == 4) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) { + do { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + if (Index) { + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + _SetPixelIndex(xx, PixelIndex); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + xx++; + if (++CurrentPixel == 4) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } else { + do { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + if (Index) { + _SetPixelIndex(xx, Index); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + xx++; + if (++CurrentPixel == 4) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + } + LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0); +} + +/********************************************************************* +* +* _DrawBitLine4BPP +*/ +static void _DrawBitLine4BPP(int x, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) { + int xx; + U8 Pixels = *p; + int CurrentPixel = Diff; + x += Diff; + xx = x; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + if (pTrans) { + do { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + _SetPixelIndex(xx++, PixelIndex); + if (++CurrentPixel == 2) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } else { + do { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + _SetPixelIndex(xx++, Index); + if (++CurrentPixel == 2) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) { + do { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + if (Index) { + U8 PixelIndex = *(pTrans + Index); + _SetPixelIndex(xx, PixelIndex); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + xx++; + if (++CurrentPixel == 2) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } else { + do { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + if (Index) { + _SetPixelIndex(xx, Index); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + xx++; + if (++CurrentPixel == 2) { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + } + LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0); +} + +/********************************************************************* +* +* _DrawBitLine8BPP +*/ +static void _DrawBitLine8BPP(int x, U8 const GUI_UNI_PTR * p, int xsize, const LCD_PIXELINDEX * pTrans) { + int xx = x; + LCD_PIXELINDEX Pixel; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + if (pTrans) { + for (; xsize > 0; xsize--, xx++, p++) { + Pixel = *p; + _SetPixelIndex(xx, *(pTrans + Pixel)); + } + } else { + for (; xsize > 0; xsize--, xx++, p++) { + _SetPixelIndex(xx, *p); + } + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) { + for (; xsize > 0; xsize--, xx++, p++) { + Pixel = *p; + if (Pixel) { + _SetPixelIndex(xx, *(pTrans + Pixel)); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + } + } else { + for (; xsize > 0; xsize--, xx++, p++) { + Pixel = *p; + if (Pixel) { + _SetPixelIndex(xx, Pixel); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + } + } + break; + } + LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0); +} + +/********************************************************************* +* +* _DrawBitLine16BPP +*/ +static void _DrawBitLine16BPP(int x, U16 const GUI_UNI_PTR * p, int xsize, const LCD_PIXELINDEX * pTrans) { + int xx = x; + LCD_PIXELINDEX pixel; + if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) { + if (pTrans) { + for (; xsize > 0; xsize--, xx++, p++) { + pixel = *p; + _SetPixelIndex(xx, *(pTrans + pixel)); + } + } else { + for (;xsize > 0; xsize--, xx++, p++) { + _SetPixelIndex(xx, *p); + } + } + } else { + if (pTrans) { + for (; xsize > 0; xsize--, xx++, p++) { + pixel = *p; + if (pixel) { + _SetPixelIndex(xx, *(pTrans + pixel)); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + } + } else { + for (; xsize > 0; xsize--, xx++, p++) { + pixel = *p; + if (pixel) { + _SetPixelIndex(xx, pixel); + } else { + _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y)); + } + } + } + } + LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_L0_DELTA_DrawBitmap +*/ +void LCD_L0_DELTA_DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, + const LCD_PIXELINDEX* pTrans) +{ + int i; + _InitBM(xsize, x0 + Diff); + for (i = 0; i < ysize; i++) { + _y = i + y0; + switch (BitsPerPixel) { + case 1: + _DrawBitLine1BPP(x0, pData, Diff, xsize, pTrans); + break; + #if (LCD_MAX_LOG_COLORS > 2) + case 2: + _DrawBitLine2BPP(x0, pData, Diff, xsize, pTrans); + break; + #endif + #if (LCD_MAX_LOG_COLORS > 4) + case 4: + _DrawBitLine4BPP(x0, pData, Diff, xsize, pTrans); + break; + #endif + #if (LCD_MAX_LOG_COLORS > 16) + case 8: + _DrawBitLine8BPP(x0, pData, xsize, pTrans); + break; + #endif + #if (LCD_BITSPERPIXEL > 8) + case 16: + _DrawBitLine16BPP(x0, (const U16 *)pData, xsize, pTrans); + break; + #endif + } + pData += BytesPerLine; + } +} + +/********************************************************************* +* +* LCD_L0_DELTA_DrawHLine +*/ +void LCD_L0_DELTA_DrawHLine(int x0, int y, int x1) { + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + for (; x0 <= x1; x0++) { + LCD_L0_XorPixel(x0, y); + } + } else { + LCD_L0_DELTA_FillRect(x0, y, x1, y); + } +} + +/********************************************************************* +* +* LCD_L0_DELTA_DrawVLine +*/ +void LCD_L0_DELTA_DrawVLine(int x , int y0, int y1) { + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + for (; y0 <= y1; y0++) { + LCD_L0_XorPixel(x, y0); + } + } else { + int aIndex[2]; + _SetRGB(LCD_COLORINDEX); + aIndex[0] = x % 3; + aIndex[1] = (x + 1) % 3; + for (; y0 <= y1; y0++) { + LCD_L0_SetPixelIndex(x, y0, _aRGB[aIndex[y0 & 1]]); + } + } +} + +/********************************************************************* +* +* LCD_L0_DELTA_FillRect +*/ +void LCD_L0_DELTA_FillRect(int x0, int y0, int x1, int y1) { + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + for (; y0 <= y1; y0++) { + LCD_L0_DELTA_DrawHLine(x0, y0, x1); + } + } else { + int x, y, aInit_0 = 0, aInit_1 = 0; + _InitBM(x1 - x0 + 1, x0);/**/ + _SetRGB(LCD_COLORINDEX); + for (y = y0; y <= y1; y++) { + int Index = y & 1; + if (Index) { + if (!aInit_1) { + for (x = x0; x <= x1; x++) { + _aPixelData_1[x] = _aRGB[(x + 1) % 3]; + } + aInit_1 = 1; + } + LCD_L0_DrawBitmap(x0, y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, &_aPixelData_1[x0], 0, 0); + } else { + if (!aInit_0) { + for (x = x0; x <= x1; x++) { + _aPixelData_0[x] = _aRGB[x % 3]; + } + aInit_0 = 1; + } + LCD_L0_DrawBitmap(x0, y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0); + } + } + } +} + +/********************************************************************* +* +* LCD_L0_DELTA_GetPixelIndex +*/ +unsigned int LCD_L0_DELTA_GetPixelIndex(int x, int y) { + return LCD_L0_GetPixelIndex(x, y); +} + +/********************************************************************* +* +* LCD_L0_DELTA_SetPixelIndex +*/ +void LCD_L0_DELTA_SetPixelIndex(int x, int y, int ColorIndex) { + LCD_L0_SetPixelIndex(x, y, ColorIndex); +} + +/********************************************************************* +* +* LCD_L0_DELTA_XorPixel +*/ +void LCD_L0_DELTA_XorPixel(int x, int y) { + LCD_L0_XorPixel(x, y); +} + +#else + +void LCDL0Delta_c(void); +void LCDL0Delta_c(void) { } /* avoid empty object files */ + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDL0Mag.c b/User/system/lib/lcd/gui/Core/LCDL0Mag.c new file mode 100644 index 0000000..89f9c49 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDL0Mag.c @@ -0,0 +1,260 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD.c +Purpose : Link between GUI and LCD_L0 + Performs most of the clipping. +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "GUIDebug.h" +#include "LCD_Private.h" /* private modul definitions & config */ + +#if LCD_XMAG > 2 + #error Not yet supported +#endif + +#if LCD_XMAG == 2 + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const U8 abData12[16] = { + 0x0, 0x3, 0xc, 0xf, 0x30, 0x33, 0x3c, 0x3f, 0xC0, 0xC3, 0xCc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff +}; + +static const U8 abData22[16] = { + 0x0, 0x5, 0x5*2, 0x5*3, + 0x50*1+0x0, 0x50*1+0x5, 0x50*1+0x5*2, 0x50*1+0x5*3, + 0x50*2+0x0, 0x50*2+0x5, 0x50*2+0x5*2, 0x50*2+0x5*3, + 0x50*3+0x0, 0x50*3+0x5, 0x50*3+0x5*2, 0x50*3+0x5*3 +}; + +static const U8 abData32[16] = { + 0x0, 0x11, 0x22, 0x33, + 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, + 0xcc, 0xdd, 0xee, 0xff +}; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitline +*/ +static void _DrawBitline(int x0, int y0, int xsize, int BPP, const U8*pData, int Diff, const LCD_PIXELINDEX* pTrans) { + union { + U8 ab[100]; /* Byte Buffer */ + U16 au16[50]; /* Word Buffer */ + } Buffer; + int i; + int NumPixels; + int NumPixelsMax = sizeof(Buffer.ab)*8/BPP/LCD_XMAG; + while (xsize >0) { + int iOff =0; + NumPixels = (xsize < NumPixelsMax) ? xsize : NumPixelsMax; + switch (BPP) { + case 1: + for (i=0; i>= 8-Diff; + Data &= 0xff; + } else { + Data = *pData; + } + pData++; + Buffer.ab[iOff++] = abData12[Data>>4]; + Buffer.ab[iOff++] = abData12[Data&15]; + } + break; + case 2: + for (i=0; i>= 8-(Diff<<1); + Data &= 0xff; + } else { + Data = *pData; + } + pData++; + Buffer.ab[iOff++] = abData22[Data>>4]; + Buffer.ab[iOff++] = abData22[Data&15]; + } + break; + case 4: + for (i=0; i>= 8-(Diff<<2); + Data &= 0xff; + } else { + Data = *pData; + } + pData++; + Buffer.ab[iOff++] = abData32[Data>>4]; + Buffer.ab[iOff++] = abData32[Data&15]; + } + break; + case 8: + for (i=0; i 2 + GUI_MEMSET (&Buffer.ab[i*LCD_XMAG], *(pData+i), LCD_XMAG); + #else + Buffer.ab[i*LCD_XMAG] = Buffer.ab[i*LCD_XMAG+1] = *pData++; + #endif + } + break; + case 16: + for (i=0; i 2 + GUI_MEMSET (&Buffer.ab[i*LCD_XMAG], *(pData+i), LCD_XMAG); + #else + Buffer.au16[i*LCD_XMAG] = Buffer.au16[i*LCD_XMAG+1] = *(U16*)pData; + pData += 2; /* Move to next word */ + #endif + } + break; + } + LCD_L0_DrawBitmap(x0 + Diff * LCD_XMAG, y0, NumPixels * LCD_XMAG, LCD_YMAG, BPP, 0, Buffer.ab, 0, pTrans); + x0 += NumPixels*LCD_XMAG; + xsize -= NumPixels; + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_L0_MAG_DrawBitmap +*/ +void LCD_L0_MAG_DrawBitmap(int x0, int y0, int xsize, int ysize, + int BPP, int BytesPerLine, const U8* pData, int Diff, + const LCD_PIXELINDEX* pTrans) +{ + int iLine; + y0 *= LCD_YMAG; + x0 *= LCD_XMAG; + for (iLine = 0; iLine < ysize; iLine++) { + #if LCD_XMAG == 1 + LCD_L0_DrawBitmap(x0, y0, xsize, LCD_YMAG, BPP, 0, pData, Diff, pTrans); + #else + _DrawBitline(x0, y0, xsize, BPP, pData, Diff, pTrans); + #endif + y0+= LCD_YMAG; + pData += BytesPerLine; + } +} + +/********************************************************************* +* +* LCD_L0_MAG_DrawHLine +*/ +void LCD_L0_MAG_DrawHLine(int x0, int y0, int x1) { + x0 *= LCD_XMAG; + x1 = x1*(LCD_XMAG) + LCD_XMAG-1; + y0 *= LCD_YMAG; + LCD_L0_FillRect(x0, y0, x1, y0 + LCD_YMAG-1); +} + +/********************************************************************* +* +* LCD_L0_MAG_DrawVLine +*/ +void LCD_L0_MAG_DrawVLine(int x0 , int y0, int y1) { + y0 *= LCD_YMAG; + y1 = y1*(LCD_YMAG) + LCD_YMAG-1; + x0 *= LCD_XMAG; + LCD_L0_FillRect(x0, y0, x0 + LCD_XMAG-1, y1); +} + +/********************************************************************* +* +* LCD_L0_MAG_FillRect +*/ +void LCD_L0_MAG_FillRect(int x0, int y0, int x1, int y1) { + y0 *= LCD_YMAG; + y1 = y1*(LCD_YMAG) + LCD_YMAG-1; + x0 *= LCD_XMAG; + x1 = x1*(LCD_XMAG) + LCD_XMAG-1; + LCD_L0_FillRect(x0, y0, x1, y1); +} + +/********************************************************************* +* +* LCD_L0_MAG_GetPixelIndex +*/ +unsigned int LCD_L0_MAG_GetPixelIndex(int x, int y) { + return LCD_L0_GetPixelIndex(x* LCD_XMAG, y* LCD_YMAG); +} + +/********************************************************************* +* +* LCD_L0_MAG_SetPixelIndex +*/ +void LCD_L0_MAG_SetPixelIndex(int x, int y, int ColorIndex) { + int ix, iy; + y *= LCD_YMAG; + x *= LCD_XMAG; + for (iy=0; iy< LCD_YMAG; iy++) { + for (ix=0; ix< LCD_XMAG; ix++) { + LCD_L0_SetPixelIndex(x+ix, y+iy, ColorIndex); + } + } +} + +/********************************************************************* +* +* LCD_L0_MAG_XorPixel +*/ +void LCD_L0_MAG_XorPixel(int x, int y) { + int ix, iy; + y *= LCD_YMAG; + x *= LCD_XMAG; + for (iy=0; iy< LCD_YMAG; iy++) { + for (ix=0; ix< LCD_XMAG; ix++) { + LCD_L0_XorPixel(x+ix, y+iy); + } + } +} + +#else + +void LCDL0Mag_c(void); +void LCDL0Mag_c(void) { } /* avoid empty object files */ + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDP1.c b/User/system/lib/lcd/gui/Core/LCDP1.c new file mode 100644 index 0000000..ca1fe0e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDP1.c @@ -0,0 +1,83 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD1.C +Purpose : Color conversion routines for 1 bpp (b/w) mode +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LCD_Protected.h" /* inter modul definitions */ + + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* LCD_Color2Index_1 +* +* Purpose +* API table for this color conversion mode. Only used by memory +* devices in this mode. +*/ +const LCD_API_COLOR_CONV LCD_API_ColorConv_1 = { + LCD_Color2Index_1, + LCD_Index2Color_1, + LCD_GetIndexMask_1 +}; + +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Color2Index_1 +*/ +unsigned LCD_Color2Index_1(LCD_COLOR Color) { + int r,g,b; + r = Color &255; + g = (Color>>8) &255; + b = Color>>16; + return (r+g+b+383) /(3*255); +} + +/********************************************************************* +* +* LCD_Index2Color_1 +*/ +LCD_COLOR LCD_Index2Color_1(int Index) { + return Index ? 0xFFFFFF : 0; +} + +/********************************************************************* +* +* LCD_GetIndexMask_1 +*/ +unsigned LCD_GetIndexMask_1(void) { + return 0x01; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c b/User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c new file mode 100644 index 0000000..17c3f2e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDP565_Index2Color.c +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 6 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 565, 65536 colors, BBBBBGGGGGGRRRRR +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Index2Color_565 +*/ +LCD_COLOR LCD_Index2Color_565(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + r = Index & R_MASK; + g = (Index >> R_BITS) & G_MASK; + b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c b/User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c new file mode 100644 index 0000000..cd562e9 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDPM565_Index2Color.c +Purpose : Color conversion routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define B_BITS 5 +#define G_BITS 6 +#define R_BITS 5 + +#define R_MASK ((1 << R_BITS) -1) +#define G_MASK ((1 << G_BITS) -1) +#define B_MASK ((1 << B_BITS) -1) + +/********************************************************************* +* +* Public code, +* +* LCD_FIXEDPALETTE == 565, 65536 colors, RRRRRGGGGGGBBBBB +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Index2Color_M565 +*/ +LCD_COLOR LCD_Index2Color_M565(int Index) { + unsigned int r,g,b; + /* Seperate the color masks */ + b = Index & B_MASK; + g = (Index >> B_BITS) & G_MASK; + r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK; + /* Convert the color masks */ + r = r * 255 / R_MASK; + g = g * 255 / G_MASK; + b = b * 255 / B_MASK; + return r + (g<<8) + (((U32)b)<<16); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDRLE4.c b/User/system/lib/lcd/gui/Core/LCDRLE4.c new file mode 100644 index 0000000..aa1c12f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDRLE4.c @@ -0,0 +1,138 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDRLE4.c +Purpose : Drawing routines for run length encoded bitmaps + with 4bpp +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" +#include "GUI_Private.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitmap_RLE4 +*/ +static void _DrawBitmap_RLE4(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR* pLogPal, int xMag, int yMag) { + const LCD_PIXELINDEX* pTrans =NULL; + char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS); + LCD_PIXELINDEX aColorIndex[2]; + LCD_PIXELINDEX PixelIndex; + int xi,y; + int xL, yL; + char IsMagnified = ((yMag | xMag) != 1); + aColorIndex[0] = LCD_ACOLORINDEX[0]; + aColorIndex[1] = LCD_ACOLORINDEX[1]; + /* Handle color translation */ + if ((pLogPal) && (pLogPal->pPalEntries)) { + if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) { + return; + } + } + /* Check if we can limit the number of lines due to clipping) */ + if (yMag == 1) { + if (ysize > GUI_Context.ClipRect.y1 - y0 + 1) + ysize = GUI_Context.ClipRect.y1 - y0 + 1; + } + /* Repeat until we have reached bottom */ + for (xi=0, y = 0; y < ysize; ) { + U8 Cmd,Data; + Cmd= *pPixel++; + Data = *pPixel++; + if (Cmd) { + LCD_SetColorIndex(pTrans ? *(pTrans+Data) : Data); + while (Cmd) { + int xi1 = xi+Cmd; + if (xi1>=xsize) + xi1 = xsize; + Cmd -= (xi1-xi); + if (Data || NoTrans) { /* Skip transparent pixels */ + if (IsMagnified) { + xL = xMag * xi + x0; + yL = yMag * y + y0; + LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1); + } else { + LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1); + } + } + xi =xi1; + if (xi1==xsize) { + y++; + xi=0; + } + } + } else { + while (Data--) { + U8 Index = *pPixel++; + if ((Index>>4) || NoTrans) { /* Skip transparent pixels */ + PixelIndex = pTrans ? *(pTrans+(Index>>4)) : (Index>>4); + if (IsMagnified) { + LCD_SetColorIndex(PixelIndex); + xL = xMag * xi + x0; + yL = yMag * y + y0; + LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1); + } else { + LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex); + } + } + if (++xi >= xsize) { + xi=0; y++; + } + if (Data-- == 0) + break; + if ((Index&15) || NoTrans) { /* Skip transparent pixels */ + PixelIndex = pTrans ? *(pTrans+(Index&15)) : (Index&15); + if (IsMagnified) { + LCD_SetColorIndex(PixelIndex); + xL = xMag * xi + x0; + yL = yMag * y + y0; + LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1); + } else { + LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex); + } + } + if (++xi >= xsize) { + xi=0; y++; + } + } + } + } + LCD_ACOLORINDEX[0] = aColorIndex[0]; + LCD_ACOLORINDEX[1] = aColorIndex[1]; +} + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_BitmapMethodsRLE4 +*/ +const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE4 = { + _DrawBitmap_RLE4, + NULL +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDRLE8.c b/User/system/lib/lcd/gui/Core/LCDRLE8.c new file mode 100644 index 0000000..4da2e58 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDRLE8.c @@ -0,0 +1,165 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDRLE8.c +Purpose : Drawing routines for run length encoded bitmaps + with 8 bpp +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static struct { + int x,y; + const U8 GUI_UNI_PTR * pPixel; + const U8 GUI_UNI_PTR * pPixelStart; +} Cache; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitmap_RLE8 +*/ +static void _DrawBitmap_RLE8(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) { + LCD_PIXELINDEX aColorIndex[2]; + LCD_PIXELINDEX PixelIndex; + int xi,y; + int xL, yL; + const U8 GUI_UNI_PTR * pPixelOrg = pPixel; + char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS); + const LCD_PIXELINDEX* pTrans =NULL; + char IsMagnified = ((yMag | xMag) != 1); + aColorIndex[0] = LCD_ACOLORINDEX[0]; + aColorIndex[1] = LCD_ACOLORINDEX[1]; + /* Handle color translation */ + if ((pLogPal) && (pLogPal->pPalEntries)) { + if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) { + return; + } + } + /* Check if we can limit the number of lines due to clipping) */ + if (yMag == 1) { + if (ysize > GUI_Context.ClipRect.y1 - y0 + 1) + ysize = GUI_Context.ClipRect.y1 - y0 + 1; + } + /* Init variables for looping */ + xi=0; + y =0; + /* Check if we can use the cache to save some unnecessary iterations */ + if (!IsMagnified) { + int yDiff = GUI_Context.ClipRect.y0 - y0; + if ((Cache.pPixelStart == pPixel) && (yDiff > Cache.y)) { + /* Accept cache values */ + y = Cache.y; + xi = Cache.x; + pPixel = Cache.pPixel; + } + } + /* Init values for caching */ + Cache.pPixel = Cache.pPixelStart = pPixelOrg; + Cache.x = Cache.y = 0; + /* Repeat until we have reached bottom */ + for (; y < ysize; ) { + U8 Cmd = *pPixel++; + U8 Data = *pPixel++; + if (Cmd) { + /* Save cache info */ + Cache.pPixel = pPixel-2; + Cache.x = xi; + Cache.y = y; + LCD_ACOLORINDEX[1] = pTrans ? *(pTrans+Data) : Data; + while (Cmd) { + int xi1 = xi+Cmd; + if (xi1>=xsize) + xi1 = xsize; + Cmd -= (xi1-xi); + if (Data || NoTrans) { /* Skip transparent pixels */ + if (IsMagnified) { + xL = xMag * xi + x0; + yL = yMag * y + y0; + LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1); + } else { + LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1); + } + } + xi =xi1; + if (xi1==xsize) { + y++; + xi=0; + } + } + } else { + do { + U8 Index = *pPixel++; + if (Index || NoTrans) { /* Skip transparent pixels */ + int x = x0+xi; + PixelIndex = pTrans ? *(pTrans+Index) : Index; + if (IsMagnified) { + LCD_SetColorIndex(PixelIndex); + xL = xMag * xi + x0; + yL = yMag * y + y0; + LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1); + } else { + #if 1 /* High speed variant */ + if (y + y0>= GUI_Context.ClipRect.y0) + if (x >= GUI_Context.ClipRect.x0) + if (x <= GUI_Context.ClipRect.x1) + LCDDEV_L0_SetPixelIndex(x, y + y0, PixelIndex); + #else + LCD_SetPixelIndex(x, y + y0, PixelIndex); + #endif + } + } + if (++xi >= xsize) { + xi=0; y++; + if (y >= ysize) + break; + } + } while (--Data); + } + } + LCD_ACOLORINDEX[0] = aColorIndex[0]; + LCD_ACOLORINDEX[1] = aColorIndex[1]; +} + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_BitmapMethodsRLE8 +*/ +const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE8 = { + _DrawBitmap_RLE8, + NULL +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCDSIM.h b/User/system/lib/lcd/gui/Core/LCDSIM.h new file mode 100644 index 0000000..b45bbdb --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCDSIM.h @@ -0,0 +1,90 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDSIM.h +Purpose : Declares LCD interface functions +---------------------------------------------------------------------- +*/ + +#ifndef LCDSIM_H +#define LCDSIM_H + + +/************************************************************ +* +* defines +* +************************************************************* +*/ +#define LCDSIM_MAX_DISPLAYS 5 + +/************************************************************ +* +* LCDSIM_ General declarations +* +************************************************************* +*/ + +char* LCDSIM_Init(void); +int LCDSIM_GetMouseState(LCD_tMouseState *pState); +void LCDSIM_SetMouseState(int x, int y, int KeyStat); +void LCDSIM_CheckMouseState(void); +int LCDSIM_SaveBMP (const char * sFileName); +int LCDSIM_SaveBMPEx (const char * sFileName, int x0, int y0, int xSize, int ySize); +int LCDSIM_SaveSBMP (const char * sFileName); +int LCDSIM_SaveSBMPEx(const char * sFileName, int x0, int y0, int xSize, int ySize); + +/************************************************************ +* +* LCDSIM_ Functions for each display +* +************************************************************* +*/ + +void LCDSIM_FillRect(int x0, int y0, int x1, int y1, int Index, int LayerIndex); +int LCDSIM_GetModifyCnt(int LayerIndex); +int LCDSIM_GetModifyCntInfo(int LayerIndex); +int LCDSIM_GetPixelColor(int x, int y, int LayerIndex); +int LCDSIM_GetPixelIndex(int x, int y, int LayerIndex); +int LCDSIM_Index2Color(int Index, int LayerIndex); +int LCDSIM_RLUT_GetPixelIndex(int x, int y, int LayerIndex); +void LCDSIM_RLUT_SetPixelIndex(int x, int y, int Index, int LayerIndex); +void LCDSIM_SetLUTEntry(U8 Pos, LCD_COLOR color, int LayerIndex); +void LCDSIM_SetPixelIndex(int x, int y, int Index, int LayerIndex); +void LCDSIM_SetPixelColor(int x, int y, LCD_COLOR PixelColor, int LayerIndex); +void LCDSIM_SetSubPixel(int x, int y, U8 Value, int LayerIndex); +void LCDSIM_SetSubPixelPhys(int xPhys, int yPhys, int Index, int LayerIndex); +void LCDSIM_SetPixelPhys(int x, int y, int Index, int LayerIndex); +int LCDSIM_GetPixelPhys(int xPhys, int yPhys, int LayerIndex); +void LCDSIM_FillRectPhys(int x0Phys, int y0Phys, int x1Phys, int y1Phys, int Index, int LayerIndex); + +/************************************************************ +* +* LCDSIM_ Declarations for painting in windows program +* +************************************************************* +*/ + +#if defined(_WINDOWS_) | defined(_WINDOWS_H) /* if windows.h has already been included */ + void LCDSIM_Paint (HWND hWnd); + void LCDSIM_PaintEx(HWND hWnd, LPRECT pRectDest, LPRECT pRectSrc); + void LCDSIM_PaintAt(HWND hWnd, int x, int y); +#endif + + +#endif /* LCD_H */ + + + + diff --git a/User/system/lib/lcd/gui/Core/LCD_API.c b/User/system/lib/lcd/gui/Core/LCD_API.c new file mode 100644 index 0000000..c734b61 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_API.c @@ -0,0 +1,302 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_API.C +Purpose : Selection of LCD display +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "GUIDebug.h" +#include "LCD_Private.h" /* Required for configuration, APIList */ + +#if GUI_COMPILER_SUPPORTS_FP + +/********************************************************************* +* +* LCD Device +* (if memory devices are supported) +* +********************************************************************** +*/ + +const tLCDDEV_APIList LCD_L0_APIList = { +#if LCD_YMAG==1 + #if LCD_DELTA_MODE + LCD_L0_Color2Index, + LCD_L0_Index2Color, + LCD_L0_GetIndexMask, + LCD_L0_DELTA_DrawBitmap, + LCD_L0_DELTA_DrawHLine, + LCD_L0_DELTA_DrawVLine, + LCD_L0_DELTA_FillRect, + LCD_L0_DELTA_GetPixelIndex, + LCD_L0_GetRect, /* Original routine is o.k. here, since we use the logical + coordinates for clipping, which are not magnified */ + LCD_L0_DELTA_SetPixelIndex, + LCD_L0_DELTA_XorPixel, + LCD_L0_SetLUTEntry, + #else + LCD_L0_Color2Index, + LCD_L0_Index2Color, + LCD_L0_GetIndexMask, + (tLCDDEV_DrawBitmap*)LCD_L0_DrawBitmap, + LCD_L0_DrawHLine, + LCD_L0_DrawVLine, + LCD_L0_FillRect, + LCD_L0_GetPixelIndex, + LCD_L0_GetRect, + LCD_L0_SetPixelIndex, + LCD_L0_XorPixel, + LCD_L0_SetLUTEntry, + #endif +#else + LCD_L0_Color2Index, + LCD_L0_Index2Color, + LCD_L0_GetIndexMask, + LCD_L0_MAG_DrawBitmap, + LCD_L0_MAG_DrawHLine, + LCD_L0_MAG_DrawVLine, + LCD_L0_MAG_FillRect, + LCD_L0_MAG_GetPixelIndex, + LCD_L0_GetRect, /* Original routine is o.k. here, since we use the logical + coordinates for clipping, which are not magnified */ + LCD_L0_MAG_SetPixelIndex, + LCD_L0_MAG_XorPixel, + LCD_L0_SetLUTEntry, +#endif +#if GUI_SUPPORT_MEMDEV + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + #if LCD_BITSPERPIXEL <= 8 + &GUI_MEMDEV__APIList8 + #else + &GUI_MEMDEV__APIList16 + #endif +#endif +}; + +/* + ************************************************* + * * + * LCD Device * + * (if memory devices are supported) * + * * + ************************************************* +*/ + +#if GUI_NUM_LAYERS > 1 +const tLCDDEV_APIList LCD_L0_1_APIList = { +#if LCD_YMAG_1 == 1 + LCD_L0_1_Color2Index, + LCD_L0_1_Index2Color, + LCD_L0_1_GetIndexMask, + LCD_L0_1_DrawBitmap, + LCD_L0_1_DrawHLine, + LCD_L0_1_DrawVLine, + LCD_L0_1_FillRect, + LCD_L0_1_GetPixelIndex, + LCD_L0_1_GetRect, + LCD_L0_1_SetPixelIndex, + LCD_L0_1_XorPixel, + LCD_L0_1_SetLUTEntry, +#else + LCD_L0_1_Color2Index, + LCD_L0_1_Index2Color, + LCD_L0_1_GetIndexMask, + LCD_L0_1_MAG_DrawBitmap, + LCD_L0_1_MAG_DrawHLine, + LCD_L0_1_MAG_DrawVLine, + LCD_L0_1_MAG_FillRect, + LCD_L0_1_MAG_GetPixelIndex, + LCD_L0_1_GetRect, /* Original routine is o.k. here, since we use the logical + coordinates for clipping, which are not magnified */ + LCD_L0_1_MAG_SetPixelIndex, + LCD_L0_1_MAG_XorPixel, + LCD_L0_1_SetLUTEntry, +#endif +#if GUI_SUPPORT_MEMDEV + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + #if LCD_BITSPERPIXEL_1 <= 8 + &GUI_MEMDEV__APIList8 + #else + &GUI_MEMDEV__APIList16 + #endif +#endif +}; +#endif + +#if GUI_NUM_LAYERS > 2 +const tLCDDEV_APIList LCD_L0_2_APIList = { +#if LCD_YMAG_2 == 1 + LCD_L0_2_Color2Index, + LCD_L0_2_Index2Color, + LCD_L0_2_GetIndexMask, + LCD_L0_2_DrawBitmap, + LCD_L0_2_DrawHLine, + LCD_L0_2_DrawVLine, + LCD_L0_2_FillRect, + LCD_L0_2_GetPixelIndex, + LCD_L0_2_GetRect, + LCD_L0_2_SetPixelIndex, + LCD_L0_2_XorPixel, + LCD_L0_2_SetLUTEntry, +#else + LCD_L0_2_Color2Index, + LCD_L0_2_Index2Color, + LCD_L0_2_GetIndexMask, + LCD_L0_2_MAG_DrawBitmap, + LCD_L0_2_MAG_DrawHLine, + LCD_L0_2_MAG_DrawVLine, + LCD_L0_2_MAG_FillRect, + LCD_L0_2_MAG_GetPixelIndex, + LCD_L0_2_GetRect, /* Original routine is o.k. here, since we use the logical + coordinates for clipping, which are not magnified */ + LCD_L0_2_MAG_SetPixelIndex, + LCD_L0_2_MAG_XorPixel, + LCD_L0_2_SetLUTEntry, +#endif +#if GUI_SUPPORT_MEMDEV + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + #if LCD_BITSPERPIXEL_2 <= 8 + &GUI_MEMDEV__APIList8 + #else + &GUI_MEMDEV__APIList16 + #endif +#endif +}; +#endif + +#if GUI_NUM_LAYERS > 3 +const tLCDDEV_APIList LCD_L0_3_APIList = { +#if LCD_YMAG_3 == 1 + LCD_L0_3_Color2Index, + LCD_L0_3_Index2Color, + LCD_L0_3_GetIndexMask, + LCD_L0_3_DrawBitmap, + LCD_L0_3_DrawHLine, + LCD_L0_3_DrawVLine, + LCD_L0_3_FillRect, + LCD_L0_3_GetPixelIndex, + LCD_L0_3_GetRect, + LCD_L0_3_SetPixelIndex, + LCD_L0_3_XorPixel, + LCD_L0_3_SetLUTEntry, +#else + LCD_L0_3_Color2Index, + LCD_L0_3_Index2Color, + LCD_L0_3_GetIndexMask, + LCD_L0_3_MAG_DrawBitmap, + LCD_L0_3_MAG_DrawHLine, + LCD_L0_3_MAG_DrawVLine, + LCD_L0_3_MAG_FillRect, + LCD_L0_3_MAG_GetPixelIndex, + LCD_L0_3_GetRect, /* Original routine is o.k. here, since we use the logical + coordinates for clipping, which are not magnified */ + LCD_L0_3_MAG_SetPixelIndex, + LCD_L0_3_MAG_XorPixel, + LCD_L0_3_SetLUTEntry, +#endif +#if GUI_SUPPORT_MEMDEV + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + #if LCD_BITSPERPIXEL_3 <= 8 + &GUI_MEMDEV__APIList8 + #else + &GUI_MEMDEV__APIList16 + #endif +#endif +}; +#endif + +#if GUI_NUM_LAYERS > 4 +const tLCDDEV_APIList LCD_L0_4_APIList = { +#if LCD_YMAG_4 == 1 + LCD_L0_4_Color2Index, + LCD_L0_4_Index2Color, + LCD_L0_4_GetIndexMask, + LCD_L0_4_DrawBitmap, + LCD_L0_4_DrawHLine, + LCD_L0_4_DrawVLine, + LCD_L0_4_FillRect, + LCD_L0_4_GetPixelIndex, + LCD_L0_4_GetRect, + LCD_L0_4_SetPixelIndex, + LCD_L0_4_XorPixel, + LCD_L0_4_SetLUTEntry, +#else + LCD_L0_4_Color2Index, + LCD_L0_4_Index2Color, + LCD_L0_4_GetIndexMask, + LCD_L0_4_MAG_DrawBitmap, + LCD_L0_4_MAG_DrawHLine, + LCD_L0_4_MAG_DrawVLine, + LCD_L0_4_MAG_FillRect, + LCD_L0_4_MAG_GetPixelIndex, + LCD_L0_4_GetRect, /* Original routine is o.k. here, since we use the logical + coordinates for clipping, which are not magnified */ + LCD_L0_4_MAG_SetPixelIndex, + LCD_L0_4_MAG_XorPixel, + LCD_L0_4_SetLUTEntry, +#endif +#if GUI_SUPPORT_MEMDEV + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + #if LCD_BITSPERPIXEL_4 <= 8 + &GUI_MEMDEV__APIList8 + #else + &GUI_MEMDEV__APIList16 + #endif +#endif +}; +#endif + +/*********************************************************** +* +* LCD_aAPI +* +* Purpose: +* This table lists the available displays/layers by a single pointer. +* It is important that these are non-constants, because some high level +* software (such as the VNC server, but maybe also the mouse "Cursor" mdoule) +* may need to override these pointers in order to link itself into the chain +* of drawing routines. +* However, the API tables may of course be constants. +* +*/ + +const tLCDDEV_APIList* /*const*/ LCD_aAPI[] = { + &LCD_L0_APIList +#if GUI_NUM_LAYERS > 1 + ,&LCD_L0_1_APIList +#endif +#if GUI_NUM_LAYERS > 2 + ,&LCD_L0_2_APIList +#endif +#if GUI_NUM_LAYERS > 3 + ,&LCD_L0_3_APIList +#endif +#if GUI_NUM_LAYERS > 4 + ,&LCD_L0_4_APIList +#endif +}; + +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h b/User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h new file mode 100644 index 0000000..a683fbd --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h @@ -0,0 +1,740 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* �C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_ConfDefaults.h +Purpose : Valid LCD configuration and defaults +---------------------------------------------------------------------- +*/ + +#ifndef LCD_CONFIG_DEFAULTS_H +#define LCD_CONFIG_DEFAULTS_H + +#include "LCDConf.h" /* Configuration header file */ +#include "GUI_ConfDefaults.h" /* Needed for GUI_NUM_LAYERS */ +/********************************************************************* + * + * Map the defines for this controller + * + * #define LCD_ LCD__0 + * + ********************************************************************** + */ + +#ifdef LCD_CONTROLLER_0 +#define LCD_CONTROLLER LCD_CONTROLLER_0 +#endif + +#ifdef LCD_XSIZE_0 +#define LCD_XSIZE LCD_XSIZE_0 +#endif + +#ifdef LCD_YSIZE_0 +#define LCD_YSIZE LCD_YSIZE_0 +#endif + +#ifdef LCD_BITSPERPIXEL_0 +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_0 +#endif + +#ifdef LCD_VYSIZE_0 +#define LCD_VYSIZE LCD_VYSIZE_0 +#endif + +#ifdef LCD_MIRROR_X_0 +#define LCD_MIRROR_X LCD_MIRROR_X_0 +#endif + +#ifdef LCD_MIRROR_Y_0 +#define LCD_MIRROR_Y LCD_MIRROR_Y_0 +#endif + +#ifdef LCD_SWAP_XY_0 +#define LCD_SWAP_XY LCD_SWAP_XY_0 +#endif + +#ifdef LCD_CACHE_CONTROL_0 +#define LCD_CACHE_CONTROL LCD_CACHE_CONTROL_0 +#endif + +#ifdef LCD_FIRSTSEG0_0 +#define LCD_FIRSTSEG0 LCD_FIRSTSEG0_0 +#endif + +#ifdef LCD_LASTSEG0_0 +#define LCD_LASTSEG0 LCD_LASTSEG0_0 +#endif + +#ifdef LCD_FIRSTCOM0_0 +#define LCD_FIRSTCOM0 LCD_FIRSTCOM0_0 +#endif + +#ifdef LCD_LASTCOM0_0 +#define LCD_LASTCOM0 LCD_LASTCOM0_0 +#endif + +#ifdef LCD_BITSPERPIXEL_L0_0 +#define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL_0 +#endif + +#ifdef LCD_DELTA_MODE_0 +#define LCD_DELTA_MODE LCD_DELTA_MODE_0 +#endif + +#ifdef LCD_XORG0_0 +#define LCD_XORG0 LCD_XORG0_0 +#endif + +#ifdef LCD_YORG0_0 +#define LCD_YORG0 LCD_YORG0_0 +#endif + +#ifdef LCD_FIXEDPALETTE_0 +#define LCD_FIXEDPALETTE LCD_FIXEDPALETTE_0 +#endif + +#ifdef LCD_CACHE_0 +#ifdef LCD_CACHE +#undef LCD_CACHE +#endif +#define LCD_CACHE LCD_CACHE_0 +#endif + +#ifdef LCD_CHECKBUSY_0 +#ifdef LCD_CHECKBUSY +#undef LCD_CHECKBUSY +#endif +#define LCD_CHECKBUSY LCD_CHECKBUSY_0 +#endif + +#ifdef LCD_SWAP_BYTE_ORDER_0 +#define LCD_SWAP_BYTE_ORDER LCD_SWAP_BYTE_ORDER_0 +#endif + +#ifdef LCD_SWAP_RB_0 +#define LCD_SWAP_RB LCD_SWAP_RB_0 +#endif + +#ifdef LCD_PHYSCOLORS_0 +#define LCD_PHYSCOLORS LCD_PHYSCOLORS_0 +#endif + +#ifndef LCD_ALLOW_NON_OPTIMIZED_MODE +#define LCD_ALLOW_NON_OPTIMIZED_MODE 0 +#endif + +/********************************************************************* + * + * Some error checking + * + ********************************************************************** + */ +#ifndef LCD_CONTROLLER +#error LCD_CONTROLLER not defined ! +#endif + +/******************************************************************* + * + * Defaults for config switches + * + ******************************************************************** + */ + +#ifndef LCD_NUM_CONTROLLERS +#define LCD_NUM_CONTROLLERS (1) +#endif + +#ifndef LCD_NUM_COLORS +#define LCD_NUM_COLORS (1L << LCD_BITSPERPIXEL) +#endif + +/********************************************************************* + * + * Map the defines for controller 0 to general defines + * + ********************************************************************** + */ + +/* Allow use of multiple physical lines for one logical line ... + Used for delta-type LCDs, where value should be 2 */ + +#ifndef LCD_YMAG +#define LCD_YMAG 1 +#endif +#ifndef LCD_XMAG +#define LCD_XMAG 1 +#endif + +#ifndef LCD_VXSIZE +#define LCD_VXSIZE (LCD_XSIZE * LCD_XMAG) /* virtual x-size */ +#endif +#ifndef LCD_VYSIZE +#define LCD_VYSIZE (LCD_YSIZE * LCD_YMAG) /* virtual y-size */ +#endif + +#ifndef LCD_SWAP_BYTE_ORDER +#define LCD_SWAP_BYTE_ORDER (0) /* only for 16 bit bus, default is not swapped */ +#endif + +#ifndef LCD_MAX_LOG_COLORS +#define LCD_MAX_LOG_COLORS (256) +#endif + +/* Optionally swap red and blue components */ +#ifndef LCD_SWAP_RB +#define LCD_SWAP_RB 0 +#endif + +#if !defined(LCD_CONTROLLER) && defined(LCD_CONTROLLER_0) +#define LCD_CONTROLLER LCD_CONTROLLER_0 +#endif + +#if !defined(LCD_XSIZE) && defined(LCD_XSIZE_0) +#define LCD_XSIZE LCD_XSIZE_0 +#endif + +#if !defined(LCD_YSIZE) && defined(LCD_YSIZE_0) +#define LCD_YSIZE LCD_YSIZE_0 +#endif + +#if !defined(LCD_BITSPERPIXEL) && defined(LCD_BITSPERPIXEL_0) +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_0 +#endif + +#if !defined(LCD_VYSIZE) && defined(LCD_VYSIZE_0) +#define LCD_VYSIZE LCD_VYSIZE_0 +#endif + +/********************************************************************* + * + * Defaults for Display 0 (first display) + * + ********************************************************************** + */ + +#ifndef LCD_MIRROR_X +#define LCD_MIRROR_X (0) /* If active: X -> -X */ +#endif +#ifndef LCD_MIRROR_Y +#define LCD_MIRROR_Y (0) /* If active: Y -> -Y */ +#endif +#ifndef LCD_SWAP_XY +#define LCD_SWAP_XY (0) /* If active: X <-> Y */ +#endif +#ifndef LCD_BITSPERPIXEL_L0 +#define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL +#endif +#ifndef LCD_DELTA_MODE +#define LCD_DELTA_MODE 0 /**/ +#endif + +/* Position data for controller 0 */ +#ifndef LCD_XORG0 +#define LCD_XORG0 (0) /* leftmost position covered by this controller */ +#endif +#ifndef LCD_YORG0 +#define LCD_YORG0 (0) /* topmost position covered by this controller */ +#endif +#ifndef LCD_XSIZE0 +#define LCD_XSIZE0 (LCD_XSIZE) /* horizontal size covered by this controller */ +#endif +#ifndef LCD_YSIZE0 +#define LCD_YSIZE0 (LCD_YSIZE) /* vertical size covered by this controller */ +#endif +#ifndef LCD_FIRSTSEG0 +#define LCD_FIRSTSEG0 (0) /* first segment used by this controller */ +#endif +#ifndef LCD_LASTSEG0 +#define LCD_LASTSEG0 (LCD_XSIZE - 1) /* Contr.0: last segment line used */ +#endif +#ifndef LCD_FIRSTCOM0 +#define LCD_FIRSTCOM0 (0) /* first com used by this controller */ +#endif +#ifndef LCD_LASTCOM0 +#define LCD_LASTCOM0 (LCD_YSIZE - 1) /* Contr.0: last com line used */ +#endif + +#if (!LCD_SWAP_XY) +#define LCD_XSIZE_PHYS LCD_XSIZE +#define LCD_YSIZE_PHYS LCD_YSIZE +#define LCD_VXSIZE_PHYS LCD_VXSIZE +#define LCD_VYSIZE_PHYS LCD_VYSIZE +#else +#define LCD_XSIZE_PHYS LCD_YSIZE +#define LCD_YSIZE_PHYS LCD_XSIZE +#define LCD_VXSIZE_PHYS LCD_VYSIZE +#define LCD_VYSIZE_PHYS LCD_VXSIZE +#endif + +/********************************************************** + * + * Color settings + */ +#ifndef LCD_REVERSE +#define LCD_REVERSE 0 +#endif + +#ifndef LCD_REVERSE_LUT +#define LCD_REVERSE_LUT 0 +#endif + +#ifndef LCD_PHYSCOLORS_IN_RAM +#define LCD_PHYSCOLORS_IN_RAM 0 +#endif + +#if !defined(LCD_PHYSCOLORS) +#if (LCD_BITSPERPIXEL == 1) | (LCD_BITSPERPIXEL == 2) | (LCD_BITSPERPIXEL == 4) +#ifndef LCD_FIXEDPALETTE +#define LCD_FIXEDPALETTE LCD_BITSPERPIXEL +#endif +#endif +#endif /* defined (LCD_PHYSCOLORS) */ + +#if !defined(LCD_FIXEDPALETTE) +#if !defined(LCD_PHYSCOLORS) +#if LCD_BITSPERPIXEL == 8 +// #define LCD_FIXEDPALETTE 8666 +#define LCD_FIXEDPALETTE 233 + +#elif LCD_BITSPERPIXEL == 12 +#define LCD_FIXEDPALETTE 44412 +#elif LCD_BITSPERPIXEL == 15 +#define LCD_FIXEDPALETTE 555 +#elif LCD_BITSPERPIXEL == 16 +#define LCD_FIXEDPALETTE 565 +#else +#define LCD_FIXEDPALETTE 0 +#endif +#else +#define LCD_FIXEDPALETTE 0 +#endif +#endif + +#if (LCD_BITSPERPIXEL > 8) && defined(LCD_PHYSCOLORS) +#error List of physical colors not permitted if more than 8 bpp are used ! +#endif + +#if (LCD_FIXEDPALETTE == 0) +#if !defined(LCD_PHYSCOLORS) +#error You have to define a fixed palette (LCD_FIXEDPALETTE) or +#error the list of physical colors (LCD_PHYSCOLORS) in LCDConf.h ! +#endif +#endif + +/* In order to avoid warnings for undefined parameters */ +#ifndef LCD_USE_PARA +#define LCD_USE_PARA(para) para = para; +#endif + +/********************************************************************* + * + * Defaults for Display 1 (second display) + * + ********************************************************************** + */ +#if GUI_NUM_LAYERS > 1 + +#ifndef LCD_MIRROR_X_1 +#define LCD_MIRROR_X_1 (0) /* If active: X -> -X */ +#endif +#ifndef LCD_MIRROR_Y_1 +#define LCD_MIRROR_Y_1 (0) /* If active: Y -> -Y */ +#endif +#ifndef LCD_SWAP_XY_1 +#define LCD_SWAP_XY_1 (0) /* If active: X <-> Y */ +#endif +#ifndef LCD_BITSPERPIXEL_L0_1 +#define LCD_BITSPERPIXEL_L0_1 LCD_BITSPERPIXEL_1 +#endif +#ifndef LCD_DELTA_MODE_1 +#define LCD_DELTA_MODE_1 0 /**/ +#endif + +#ifndef LCD_YMAG_1 +#define LCD_YMAG_1 1 +#endif + +#ifndef LCD_XMAG_1 +#define LCD_XMAG_1 1 +#endif + +#ifndef LCD_VXSIZE_1 +#define LCD_VXSIZE_1 (LCD_XSIZE_1 * LCD_XMAG_1) /* virtual x-size */ +#endif + +#ifndef LCD_VYSIZE_1 +#define LCD_VYSIZE_1 (LCD_YSIZE_1 * LCD_YMAG_1) /* virtual y-size */ +#endif + +#ifndef LCD_NUM_COLORS_1 +#define LCD_NUM_COLORS_1 (1L << LCD_BITSPERPIXEL_1) +#endif + +/* Optionally swap red and blue components */ +#ifndef LCD_SWAP_RB_1 +#define LCD_SWAP_RB_1 0 +#endif + +/********************************************************** + * + * Color settings + */ +#ifndef LCD_REVERSE_1 +#define LCD_REVERSE_1 0 +#endif + +#ifndef LCD_REVERSE_LUT_1 +#define LCD_REVERSE_LUT_1 0 +#endif + +#if !defined(LCD_PHYSCOLORS_1) +#if (LCD_BITSPERPIXEL_1 == 1) | (LCD_BITSPERPIXEL_1 == 2) | (LCD_BITSPERPIXEL_1 == 4) +#ifndef LCD_FIXEDPALETTE_1 +#define LCD_FIXEDPALETTE_1 LCD_BITSPERPIXEL_1 +#endif +#endif +#endif /* defined (LCD_PHYSCOLORS) */ + +#if !defined(LCD_FIXEDPALETTE_1) +#if !defined(LCD_PHYSCOLORS_1) +#if LCD_BITSPERPIXEL_1 == 8 +#define LCD_FIXEDPALETTE_1 8666 +#elif LCD_BITSPERPIXEL_1 == 15 +#define LCD_FIXEDPALETTE_1 555 +#elif LCD_BITSPERPIXEL_1 == 16 +#define LCD_FIXEDPALETTE_1 565 +#else +#define LCD_FIXEDPALETTE_1 0 +#endif +#else +#define LCD_FIXEDPALETTE_1 0 +#endif +#endif + +#if (LCD_BITSPERPIXEL_1 > 8) && defined(LCD_PHYSCOLORS_1) +#error List of physical colors not permitted if more than 8 bpp are used ! +#endif + +#if (LCD_FIXEDPALETTE_1 == 0) +#if !defined(LCD_PHYSCOLORS_1) +#error You have to define a fixed palette (LCD_FIXEDPALETTE_1) or +#error the list of physical colors (LCD_PHYSCOLORS_1) in LCDConf.h ! +#endif +#endif +#endif /* GUI_NUM_LAYERS > 1 */ + +/********************************************************************* + * + * Defaults for Display 2 (third display) + * + ********************************************************************** + */ +#if GUI_NUM_LAYERS > 2 + +#ifndef LCD_MIRROR_X_2 +#define LCD_MIRROR_X_2 (0) /* If active: X -> -X */ +#endif +#ifndef LCD_MIRROR_Y_2 +#define LCD_MIRROR_Y_2 (0) /* If active: Y -> -Y */ +#endif +#ifndef LCD_SWAP_XY_2 +#define LCD_SWAP_XY_2 (0) /* If active: X <-> Y */ +#endif +#ifndef LCD_BITSPERPIXEL_L0_2 +#define LCD_BITSPERPIXEL_L0_2 LCD_BITSPERPIXEL_2 +#endif +#ifndef LCD_DELTA_MODE_2 +#define LCD_DELTA_MODE_2 0 /**/ +#endif + +#ifndef LCD_YMAG_2 +#define LCD_YMAG_2 1 +#endif + +#ifndef LCD_XMAG_2 +#define LCD_XMAG_2 1 +#endif + +#ifndef LCD_VXSIZE_2 +#define LCD_VXSIZE_2 (LCD_XSIZE_2 * LCD_XMAG_2) /* virtual x-size */ +#endif + +#ifndef LCD_VYSIZE_2 +#define LCD_VYSIZE_2 (LCD_YSIZE_2 * LCD_YMAG_2) /* virtual y-size */ +#endif + +#ifndef LCD_NUM_COLORS_2 +#define LCD_NUM_COLORS_2 (1L << LCD_BITSPERPIXEL_2) +#endif + +/* Optionally swap red and blue components */ +#ifndef LCD_SWAP_RB_2 +#define LCD_SWAP_RB_2 0 +#endif + +/********************************************************** + * + * Color settings + */ +#ifndef LCD_REVERSE_2 +#define LCD_REVERSE_2 0 +#endif + +#ifndef LCD_REVERSE_LUT_2 +#define LCD_REVERSE_LUT_2 0 +#endif + +#if !defined(LCD_PHYSCOLORS_2) +#if (LCD_BITSPERPIXEL_2 == 1) | (LCD_BITSPERPIXEL_2 == 2) | (LCD_BITSPERPIXEL_2 == 4) +#ifndef LCD_FIXEDPALETTE_2 +#define LCD_FIXEDPALETTE_2 LCD_BITSPERPIXEL_2 +#endif +#endif +#endif /* defined (LCD_PHYSCOLORS) */ + +#if !defined(LCD_FIXEDPALETTE_2) +#if !defined(LCD_PHYSCOLORS_2) +#if LCD_BITSPERPIXEL_2 == 8 +#define LCD_FIXEDPALETTE_2 8666 +#elif LCD_BITSPERPIXEL_2 == 15 +#define LCD_FIXEDPALETTE_2 555 +#elif LCD_BITSPERPIXEL_2 == 16 +#define LCD_FIXEDPALETTE_2 565 +#else +#define LCD_FIXEDPALETTE_2 0 +#endif +#else +#define LCD_FIXEDPALETTE_2 0 +#endif +#endif + +#if (LCD_BITSPERPIXEL_2 > 8) && defined(LCD_PHYSCOLORS_2) +#error List of physical colors not permitted if more than 8 bpp are used ! +#endif + +#if (LCD_FIXEDPALETTE_2 == 0) +#if !defined(LCD_PHYSCOLORS_2) +#error You have to define a fixed palette (LCD_FIXEDPALETTE_2) or +#error the list of physical colors (LCD_PHYSCOLORS_2) in LCDConf.h ! +#endif +#endif +#endif /* GUI_NUM_LAYERS > 2 */ + +/********************************************************************* + * + * Defaults for Display 3 (fourth display) + * + ********************************************************************** + */ +#if GUI_NUM_LAYERS > 3 + +#ifndef LCD_MIRROR_X_3 +#define LCD_MIRROR_X_3 (0) /* If active: X -> -X */ +#endif +#ifndef LCD_MIRROR_Y_3 +#define LCD_MIRROR_Y_3 (0) /* If active: Y -> -Y */ +#endif +#ifndef LCD_SWAP_XY_3 +#define LCD_SWAP_XY_3 (0) /* If active: X <-> Y */ +#endif +#ifndef LCD_BITSPERPIXEL_L0_3 +#define LCD_BITSPERPIXEL_L0_3 LCD_BITSPERPIXEL_3 +#endif +#ifndef LCD_DELTA_MODE_3 +#define LCD_DELTA_MODE_3 0 /**/ +#endif + +#ifndef LCD_YMAG_3 +#define LCD_YMAG_3 1 +#endif + +#ifndef LCD_XMAG_3 +#define LCD_XMAG_3 1 +#endif + +#ifndef LCD_VXSIZE_3 +#define LCD_VXSIZE_3 (LCD_XSIZE_3 * LCD_XMAG_3) /* virtual x-size */ +#endif + +#ifndef LCD_VYSIZE_3 +#define LCD_VYSIZE_3 (LCD_YSIZE_3 * LCD_YMAG_3) /* virtual y-size */ +#endif + +#ifndef LCD_NUM_COLORS_3 +#define LCD_NUM_COLORS_3 (1L << LCD_BITSPERPIXEL_3) +#endif + +/* Optionally swap red and blue components */ +#ifndef LCD_SWAP_RB_3 +#define LCD_SWAP_RB_3 0 +#endif + +/********************************************************** + * + * Color settings + */ +#ifndef LCD_REVERSE_3 +#define LCD_REVERSE_3 0 +#endif + +#ifndef LCD_REVERSE_LUT_3 +#define LCD_REVERSE_LUT_3 0 +#endif + +#if !defined(LCD_PHYSCOLORS_3) +#if (LCD_BITSPERPIXEL_3 == 1) | (LCD_BITSPERPIXEL_3 == 2) | (LCD_BITSPERPIXEL_3 == 4) +#ifndef LCD_FIXEDPALETTE_3 +#define LCD_FIXEDPALETTE_3 LCD_BITSPERPIXEL_3 +#endif +#endif +#endif /* defined (LCD_PHYSCOLORS) */ + +#if !defined(LCD_FIXEDPALETTE_3) +#if !defined(LCD_PHYSCOLORS_3) +#if LCD_BITSPERPIXEL_3 == 8 +#define LCD_FIXEDPALETTE_3 8666 +#elif LCD_BITSPERPIXEL_3 == 15 +#define LCD_FIXEDPALETTE_3 555 +#elif LCD_BITSPERPIXEL_3 == 16 +#define LCD_FIXEDPALETTE_3 565 +#else +#define LCD_FIXEDPALETTE_3 0 +#endif +#else +#define LCD_FIXEDPALETTE_3 0 +#endif +#endif + +#if (LCD_BITSPERPIXEL_3 > 8) && defined(LCD_PHYSCOLORS_3) +#error List of physical colors not permitted if more than 8 bpp are used ! +#endif + +#if (LCD_FIXEDPALETTE_3 == 0) +#if !defined(LCD_PHYSCOLORS_3) +#error You have to define a fixed palette (LCD_FIXEDPALETTE_3) or +#error the list of physical colors (LCD_PHYSCOLORS_3) in LCDConf.h ! +#endif +#endif +#endif /* GUI_NUM_LAYERS > 3 */ + +/********************************************************************* + * + * Defaults for Display 4 (fiveth display) + * + ********************************************************************** + */ +#if GUI_NUM_LAYERS > 4 + +#ifndef LCD_MIRROR_X_4 +#define LCD_MIRROR_X_4 (0) /* If active: X -> -X */ +#endif +#ifndef LCD_MIRROR_Y_4 +#define LCD_MIRROR_Y_4 (0) /* If active: Y -> -Y */ +#endif +#ifndef LCD_SWAP_XY_4 +#define LCD_SWAP_XY_4 (0) /* If active: X <-> Y */ +#endif +#ifndef LCD_BITSPERPIXEL_L0_4 +#define LCD_BITSPERPIXEL_L0_4 LCD_BITSPERPIXEL_4 +#endif +#ifndef LCD_DELTA_MODE_4 +#define LCD_DELTA_MODE_4 0 /**/ +#endif + +#ifndef LCD_YMAG_4 +#define LCD_YMAG_4 1 +#endif + +#ifndef LCD_XMAG_4 +#define LCD_XMAG_4 1 +#endif + +#ifndef LCD_VXSIZE_4 +#define LCD_VXSIZE_4 (LCD_XSIZE_4 * LCD_XMAG_4) /* virtual x-size */ +#endif + +#ifndef LCD_VYSIZE_4 +#define LCD_VYSIZE_4 (LCD_YSIZE_4 * LCD_YMAG_4) /* virtual y-size */ +#endif + +#ifndef LCD_NUM_COLORS_4 +#define LCD_NUM_COLORS_4 (1L << LCD_BITSPERPIXEL_4) +#endif + +/* Optionally swap red and blue components */ +#ifndef LCD_SWAP_RB_4 +#define LCD_SWAP_RB_4 0 +#endif + +/********************************************************** + * + * Color settings + */ +#ifndef LCD_REVERSE_4 +#define LCD_REVERSE_4 0 +#endif + +#ifndef LCD_REVERSE_LUT_4 +#define LCD_REVERSE_LUT_4 0 +#endif + +#if !defined(LCD_PHYSCOLORS_4) +#if (LCD_BITSPERPIXEL_4 == 1) | (LCD_BITSPERPIXEL_4 == 2) | (LCD_BITSPERPIXEL_4 == 4) +#ifndef LCD_FIXEDPALETTE_4 +#define LCD_FIXEDPALETTE_4 LCD_BITSPERPIXEL_4 +#endif +#endif +#endif /* defined (LCD_PHYSCOLORS) */ + +#if !defined(LCD_FIXEDPALETTE_4) +#if !defined(LCD_PHYSCOLORS_4) +#if LCD_BITSPERPIXEL_4 == 8 +#define LCD_FIXEDPALETTE_4 8666 +#elif LCD_BITSPERPIXEL_4 == 15 +#define LCD_FIXEDPALETTE_4 555 +#elif LCD_BITSPERPIXEL_4 == 16 +#define LCD_FIXEDPALETTE_4 565 +#else +#define LCD_FIXEDPALETTE_4 0 +#endif +#else +#define LCD_FIXEDPALETTE_4 0 +#endif +#endif + +#if (LCD_BITSPERPIXEL_4 > 8) && defined(LCD_PHYSCOLORS_4) +#error List of physical colors not permitted if more than 8 bpp are used ! +#endif + +#if (LCD_FIXEDPALETTE_4 == 0) +#if !defined(LCD_PHYSCOLORS_4) +#error You have to define a fixed palette (LCD_FIXEDPALETTE_4) or +#error the list of physical colors (LCD_PHYSCOLORS_4) in LCDConf.h ! +#endif +#endif +#endif /* GUI_NUM_LAYERS > 4 */ + +/********************************************************************* + * + * Global defaults for all displays + * + ********************************************************************** + */ + +#if (LCD_BITSPERPIXEL <= 8) && (GUI_NUM_LAYERS < 2) +#define LCD_PIXELINDEX U8 +#else +#define LCD_PIXELINDEX U16 +#endif + +#endif /* LCD_INTERN_H */ diff --git a/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c new file mode 100644 index 0000000..aba207e --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c @@ -0,0 +1,157 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_DrawBitmap_565.c +Purpose : Drawing routine for drawing a 16bpp bitmap +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitmap_565 +*/ +static void _DrawBitmap_565(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) { + const U16 * pData; + int y, OldIndex, PrevIndex, Mode, SwapRB, Mag, BytesPerLine, UseDrawBitmap = 0; + GUI_USE_PARA(pLogPal); + OldIndex = LCD_GetColorIndex(); + PrevIndex = OldIndex; + pData = (const U16 *)pPixel; + Mode = LCD_GetFixedPaletteEx(GUI_Context.SelLayer); + SwapRB = LCD_GetSwapRBEx(GUI_Context.SelLayer); + Mag = (xMag | yMag); + BytesPerLine = xsize * 2; + #if GUI_SUPPORT_MEMDEV == 0 + if ((Mode == 565) && (SwapRB == 0) && (Mag == 1)) { + UseDrawBitmap = 1; + } + #else + if (GUI_Context.pDeviceAPI->pMemDevAPI) { + if (((GUI_Context.hDevData && (GUI_Context.pDeviceAPI->pMemDevAPI->pfIndex2Color == LCD_Index2Color_565)) || + ((GUI_Context.hDevData == 0) && (Mode == 565) && (SwapRB == 0))) && (Mag == 1)) { + UseDrawBitmap = 1; + } + } + #endif + if (UseDrawBitmap) { + LCD_DrawBitmap(x0, y0, xsize, ysize, 1, 1, 16, BytesPerLine, pPixel, 0); + } else { + if (Mag == 1) { + /* Perform clipping */ + int x1, y1, Diff; + y1 = y0 + ysize - 1; + x1 = x0 + xsize - 1; + /* Clip Y */ + if (y0 < GUI_Context.ClipRect.y0) { + Diff = GUI_Context.ClipRect.y0 -y0; + y0 = GUI_Context.ClipRect.y0; + #if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */ + pData += (U32)Diff * (U32)BytesPerLine / 2; + #else + pData += (unsigned)Diff * (unsigned)BytesPerLine / 2; + #endif + ysize -= Diff; + } + Diff = y1 - GUI_Context.ClipRect.y1; + if (Diff > 0) { + ysize -= Diff; + } + if (ysize <=0) { + return; + } + /* Clip right side */ + Diff = x1 - GUI_Context.ClipRect.x1; + if (Diff > 0) { + xsize -= Diff; + } + /* Clip left side */ + Diff =0; + if (x0 < GUI_Context.ClipRect.x0) { + Diff = GUI_Context.ClipRect.x0-x0; + xsize -= Diff; + pData += Diff; + x0 += Diff; + } + if (xsize <=0) { + return; + } + /* Simple, unmagnified output using LCD_L0_SetPixel() */ + for (y = 0; y < ysize; y++) { + int x; + const U16 * p = pData; + for (x = 0; x < xsize; x++) { + U16 Index; + Index = *p++; + if (Index != PrevIndex) { + LCD_SetColor(LCD_Index2Color_565(Index)); + PrevIndex = Index; + } + LCDDEV_L0_SetPixelIndex(x + x0, y + y0, LCD_COLORINDEX); + } + pData += BytesPerLine / 2; + } + } else { + /* Magnified output using LCD_FillRect() */ + int x,y; + int yi; + for (y = y0, yi = 0; yi < ysize; yi++, y += yMag, pPixel += BytesPerLine) { + int yMax; + yMax = y + yMag - 1; + /* Draw if within clip area */ + if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) { + int xi; + const U16 GUI_UNI_PTR * p = pData; + for (x = x0, xi = 0; xi < xsize; xi++, x += xMag) { + U16 Index; + Index = *p++; + if (Index != PrevIndex) { + LCD_SetColor(LCD_Index2Color_565(Index)); + PrevIndex = Index; + } + LCD_FillRect(x, y, x + xMag - 1, yMax); + } + } + pData += BytesPerLine / 2; + } + } + GUI_SetColorIndex(OldIndex); + } +} + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_BitmapMethods565 +*/ +const GUI_BITMAP_METHODS GUI_BitmapMethods565 = { + _DrawBitmap_565, + LCD_Index2Color_565 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c new file mode 100644 index 0000000..5b9c844 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c @@ -0,0 +1,157 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_DrawBitmap_M565.c +Purpose : Drawing routine for drawing a 16bpp bitmap +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitmap_M565 +*/ +static void _DrawBitmap_M565(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) { + const U16 * pData; + int y, OldIndex, PrevIndex, Mode, SwapRB, Mag, BytesPerLine, UseDrawBitmap = 0; + GUI_USE_PARA(pLogPal); + OldIndex = LCD_GetColorIndex(); + PrevIndex = OldIndex; + pData = (const U16 *)pPixel; + Mode = LCD_GetFixedPaletteEx(GUI_Context.SelLayer); + SwapRB = LCD_GetSwapRBEx(GUI_Context.SelLayer); + Mag = (xMag | yMag); + BytesPerLine = xsize * 2; + #if GUI_SUPPORT_MEMDEV == 0 + if ((Mode == 565) && (SwapRB == 1) && (Mag == 1)) { + UseDrawBitmap = 1; + } + #else + if (GUI_Context.pDeviceAPI->pMemDevAPI) { + if (((GUI_Context.hDevData && (GUI_Context.pDeviceAPI->pMemDevAPI->pfIndex2Color == LCD_Index2Color_565)) || + ((GUI_Context.hDevData == 0) && (Mode == 565) && (SwapRB == 1))) && (Mag == 1)) { + UseDrawBitmap = 1; + } + } + #endif + if (UseDrawBitmap) { + LCD_DrawBitmap(x0, y0, xsize, ysize, 1, 1, 16, BytesPerLine, pPixel, 0); + } else { + if (Mag == 1) { + /* Perform clipping */ + int x1, y1, Diff; + y1 = y0 + ysize - 1; + x1 = x0 + xsize - 1; + /* Clip Y */ + if (y0 < GUI_Context.ClipRect.y0) { + Diff = GUI_Context.ClipRect.y0 -y0; + y0 = GUI_Context.ClipRect.y0; + #if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */ + pData += (U32)Diff * (U32)BytesPerLine / 2; + #else + pData += (unsigned)Diff * (unsigned)BytesPerLine / 2; + #endif + ysize -= Diff; + } + Diff = y1 - GUI_Context.ClipRect.y1; + if (Diff > 0) { + ysize -= Diff; + } + if (ysize <=0) { + return; + } + /* Clip right side */ + Diff = x1 - GUI_Context.ClipRect.x1; + if (Diff > 0) { + xsize -= Diff; + } + /* Clip left side */ + Diff =0; + if (x0 < GUI_Context.ClipRect.x0) { + Diff = GUI_Context.ClipRect.x0-x0; + xsize -= Diff; + pData += Diff; + x0 += Diff; + } + if (xsize <=0) { + return; + } + /* Simple, unmagnified output using LCD_L0_SetPixel() */ + for (y = 0; y < ysize; y++) { + int x; + const U16 * p = pData; + for (x = 0; x < xsize; x++) { + U16 Index; + Index = *p++; + if (Index != PrevIndex) { + LCD_SetColor(LCD_Index2Color_M565(Index)); + PrevIndex = Index; + } + LCDDEV_L0_SetPixelIndex(x + x0, y + y0, LCD_COLORINDEX); + } + pData += BytesPerLine / 2; + } + } else { + /* Magnified output using LCD_FillRect() */ + int x,y; + int yi; + for (y = y0, yi = 0; yi < ysize; yi++, y += yMag, pPixel += BytesPerLine) { + int yMax; + yMax = y + yMag - 1; + /* Draw if within clip area */ + if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) { + int xi; + const U16 GUI_UNI_PTR * p = pData; + for (x = x0, xi = 0; xi < xsize; xi++, x += xMag) { + U16 Index; + Index = *p++; + if (Index != PrevIndex) { + LCD_SetColor(LCD_Index2Color_M565(Index)); + PrevIndex = Index; + } + LCD_FillRect(x, y, x + xMag - 1, yMax); + } + } + pData += BytesPerLine / 2; + } + } + GUI_SetColorIndex(OldIndex); + } +} + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_BitmapMethodsM565 +*/ +const GUI_BITMAP_METHODS GUI_BitmapMethodsM565 = { + _DrawBitmap_M565, + LCD_Index2Color_M565 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_DrawVLine.c b/User/system/lib/lcd/gui/Core/LCD_DrawVLine.c new file mode 100644 index 0000000..23d2406 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_DrawVLine.c @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_DrawVLine.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Private.h" +#include "GUI_Private.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define RETURN_IF_Y_OUT() \ + if (y < GUI_Context.ClipRect.y0) return; \ + if (y > GUI_Context.ClipRect.y1) return; + +#define RETURN_IF_X_OUT() \ + if (x < GUI_Context.ClipRect.x0) return; \ + if (x > GUI_Context.ClipRect.x1) return; + +#define CLIP_X() \ + if (x0 < GUI_Context.ClipRect.x0) { x0 = GUI_Context.ClipRect.x0; } \ + if (x1 > GUI_Context.ClipRect.x1) { x1 = GUI_Context.ClipRect.x1; } + +#define CLIP_Y() \ + if (y0 < GUI_Context.ClipRect.y0) { y0 = GUI_Context.ClipRect.y0; } \ + if (y1 > GUI_Context.ClipRect.y1) { y1 = GUI_Context.ClipRect.y1; } + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_DrawVLine +*/ +void LCD_DrawVLine(int x, int y0, int y1) { + /* Perform clipping and check if there is something to do */ + RETURN_IF_X_OUT(); + CLIP_Y(); + if (y1 < y0) { + return; + } + /* Call driver to draw */ + LCDDEV_L0_DrawVLine(x, y0, y1); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c b/User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c new file mode 100644 index 0000000..493b955 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_GetColorIndex.c +Purpose : Implementation of different LCD_GetColorIndex routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Private.h" +#include "GUI_Protected.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_GetBkColorIndex +*/ +int LCD_GetBkColorIndex(void) { + return LCD_BKCOLORINDEX; +} + +/********************************************************************* +* +* LCD_GetColorIndex +*/ +int LCD_GetColorIndex(void) { + return LCD_COLORINDEX; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_GetEx.c b/User/system/lib/lcd/gui/Core/LCD_GetEx.c new file mode 100644 index 0000000..f50bd23 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_GetEx.c @@ -0,0 +1,585 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_GetEx.C +Purpose : Routines returning info at runtime +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" /* interface definitions */ +#include "LCD_Private.h" /* private modul definitions & config */ + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * LCD_GetXSizeEx + */ +int LCD_GetXSizeEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_XSIZE; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_XSIZE_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_XSIZE_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_XSIZE_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_XSIZE_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetYSizeEx + */ +int LCD_GetYSizeEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_YSIZE; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_YSIZE_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_YSIZE_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_YSIZE_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_YSIZE_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetVXSizeEx + */ +int LCD_GetVXSizeEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_VXSIZE; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_VXSIZE_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_VXSIZE_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_VXSIZE_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_VXSIZE_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetVYSizeEx + */ +int LCD_GetVYSizeEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_VYSIZE; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_VYSIZE_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_VYSIZE_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_VYSIZE_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_VYSIZE_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetBitsPerPixelEx + */ +int LCD_GetBitsPerPixelEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_BITSPERPIXEL; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_BITSPERPIXEL_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_BITSPERPIXEL_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_BITSPERPIXEL_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_BITSPERPIXEL_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetBitsPerPixel_L0Ex + */ +int LCD_GetBitsPerPixel_L0Ex(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_BITSPERPIXEL_L0; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_BITSPERPIXEL_L0_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_BITSPERPIXEL_L0_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_BITSPERPIXEL_L0_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_BITSPERPIXEL_L0_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetNumColorsEx + */ +U32 LCD_GetNumColorsEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_NUM_COLORS; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_NUM_COLORS_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_NUM_COLORS_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_NUM_COLORS_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_NUM_COLORS_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetYMagEx + */ +int LCD_GetYMagEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_YMAG; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_YMAG_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_YMAG_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_YMAG_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_YMAG_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetXMagEx + */ +int LCD_GetXMagEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_XMAG; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_XMAG_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_XMAG_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_XMAG_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_XMAG_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetFixedPaletteEx + */ +I32 LCD_GetFixedPaletteEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_FIXEDPALETTE; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_FIXEDPALETTE_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_FIXEDPALETTE_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_FIXEDPALETTE_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_FIXEDPALETTE_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetMirrorXEx + */ +int LCD_GetMirrorXEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_MIRROR_X; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_MIRROR_X_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_MIRROR_X_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_MIRROR_X_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_MIRROR_X_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetMirrorYEx + */ +int LCD_GetMirrorYEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_MIRROR_Y; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_MIRROR_Y_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_MIRROR_Y_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_MIRROR_Y_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_MIRROR_Y_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetSwapXYEx + */ +int LCD_GetSwapXYEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_SWAP_XY; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_SWAP_XY_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_SWAP_XY_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_SWAP_XY_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_SWAP_XY_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetSwapRBEx + */ +int LCD_GetSwapRBEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_SWAP_RB; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_SWAP_RB_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_SWAP_RB_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_SWAP_RB_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_SWAP_RB_4; + } +#endif + return 0; +} + +/********************************************************************* + * + * LCD_GetDeltaModeEx + */ +int LCD_GetDeltaModeEx(int LayerIndex) +{ + if (LayerIndex == 0) + { + return LCD_DELTA_MODE; + } +#if GUI_NUM_LAYERS > 1 + if (LayerIndex == 1) + { + return LCD_DELTA_MODE_1; + } +#endif +#if GUI_NUM_LAYERS > 2 + if (LayerIndex == 2) + { + return LCD_DELTA_MODE_2; + } +#endif +#if GUI_NUM_LAYERS > 3 + if (LayerIndex == 3) + { + return LCD_DELTA_MODE_3; + } +#endif +#if GUI_NUM_LAYERS > 4 + if (LayerIndex == 4) + { + return LCD_DELTA_MODE_4; + } +#endif + return 0; +} + +/************************* End of file ******************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c b/User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c new file mode 100644 index 0000000..816c75b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDInfo1.C +Purpose : Routines returning info at runtime +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" /* interface definitions */ +#include "LCD_Private.h" /* private modul definitions & config */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_GetNumLayers +*/ +int LCD_GetNumLayers(void) { + return GUI_NUM_LAYERS; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c b/User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c new file mode 100644 index 0000000..75a1478 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_GetPixelColor.c +Purpose : Get Pixel routines + Note: These routines are in a module of their own + because they are mostly not required to link +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD.h" /* interface definitions */ +#include "LCD_Protected.h" /* inter modul definitions */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_GetPixelColor +*/ +LCD_COLOR LCD_GetPixelColor(int x, int y) { + return LCD_Index2Color(LCD_GetPixelIndex(x,y)); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c b/User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c new file mode 100644 index 0000000..03452af --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_Index2ColorEx.c +Purpose : Implementation of LCD_Index2ColorEx +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "LCD_Private.h" /* Required for configuration, APIList */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_Index2ColorEx +* +* Purpose: +* Convert Index to color for the given display +*/ +LCD_COLOR LCD_Index2ColorEx(int i, unsigned int LayerIndex) { + #if GUI_SUPPORT_DEVICES + LCD_COLOR r = 0; + if (LayerIndex < GUI_NUM_LAYERS) { + r = LCD_aAPI[LayerIndex]->pfIndex2Color(i); + } + return r; + #else + GUI_USE_PARA(LayerIndex); + return LCD_Index2Color(i); + #endif +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_L0_Generic.c b/User/system/lib/lcd/gui/Core/LCD_L0_Generic.c new file mode 100644 index 0000000..1a6cb05 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_L0_Generic.c @@ -0,0 +1,226 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_L0_Generic.c +Purpose : Color conversion routines for LCD-drivers + This file may not be compiled by itself, but needs + to be included in every LCD driver +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef LCD_INCLUDEDRIVER_H /* includes only for stand-alone compilation, not as included file */ + #include /* needed for definition of NULL */ + #include "LCD_Private.h" /* private modul definitions & config */ + #include "GUI_Private.h" + #include "GUIDebug.h" +#endif + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define FIXEDPALETTE LCD_FIXEDPALETTE + +#if FIXEDPALETTE == -1 /* User defined color conversion routines */ + #define COLOR2INDEX(Color) LCD_Color2Index_User(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_User(Index) + #define GETINDEXMASK() LCD_GetIndexMask_User() +#elif FIXEDPALETTE == 0 /* User defined colors (LCD_PHYSCOLORS) */ + #define COLOR2INDEX(Color) LCD_Color2Index_0(Color, &LCD_PhysPal) + #define INDEX2COLOR(Index) LCD_Index2Color_0(Index, &LCD_PhysPal) + #define GETINDEXMASK() LCD_GetIndexMask_0() +#elif FIXEDPALETTE == 1 + #define COLOR2INDEX(Color) LCD_Color2Index_1(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_1(Index) + #define GETINDEXMASK() LCD_GetIndexMask_1() +#elif FIXEDPALETTE == 2 + #define COLOR2INDEX(Color) LCD_Color2Index_2(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_2(Index) + #define GETINDEXMASK() LCD_GetIndexMask_2() +#elif FIXEDPALETTE == 4 + #define COLOR2INDEX(Color) LCD_Color2Index_4(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_4(Index) + #define GETINDEXMASK() LCD_GetIndexMask_4() +#elif (FIXEDPALETTE == 111) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_111(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_111(Index) + #define GETINDEXMASK() LCD_GetIndexMask_111() +#elif (FIXEDPALETTE == 111) && (LCD_SWAP_RB) + #define COLOR2INDEX(Color) LCD_Color2Index_M111(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M111(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M111() +#elif (FIXEDPALETTE == 222) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_222(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_222(Index) + #define GETINDEXMASK() LCD_GetIndexMask_222() +#elif (FIXEDPALETTE == 222) && (LCD_SWAP_RB==1) + #define COLOR2INDEX(Color) LCD_Color2Index_M222(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M222(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M222() +#elif (FIXEDPALETTE == 233) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_233(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_233(Index) + #define GETINDEXMASK() LCD_GetIndexMask_233() +#elif (FIXEDPALETTE == 233) && (LCD_SWAP_RB==1) + #define COLOR2INDEX(Color) LCD_Color2Index_M233(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M233(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M233() +#elif (FIXEDPALETTE == 323) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_323(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_323(Index) + #define GETINDEXMASK() LCD_GetIndexMask_323() +#elif (FIXEDPALETTE == 323) && (LCD_SWAP_RB==1) + #define COLOR2INDEX(Color) LCD_Color2Index_M323(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M323(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M323() +#elif (FIXEDPALETTE == 332) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_332(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_332(Index) + #define GETINDEXMASK() LCD_GetIndexMask_332() +#elif (FIXEDPALETTE == 332) && (LCD_SWAP_RB==1) + #define COLOR2INDEX(Color) LCD_Color2Index_M332(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M332(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M332() +#elif (FIXEDPALETTE == 444121) + #define COLOR2INDEX(Color) LCD_Color2Index_444_12_1(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_444_12_1(Index) + #define GETINDEXMASK() LCD_GetIndexMask_444_12_1() +#elif (FIXEDPALETTE == 44412) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_444_12(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_444_12(Index) + #define GETINDEXMASK() LCD_GetIndexMask_444_12() +#elif (FIXEDPALETTE == 44416) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_444_16(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_444_16(Index) + #define GETINDEXMASK() LCD_GetIndexMask_444_16() +#elif (FIXEDPALETTE == 44412) && (LCD_SWAP_RB==1) + #define COLOR2INDEX(Color) LCD_Color2Index_M444_12(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M444_12(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M444_12() +#elif (FIXEDPALETTE == 44416) && (LCD_SWAP_RB==1) + #define COLOR2INDEX(Color) LCD_Color2Index_M444_16(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M444_16(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M444_16() +#elif (FIXEDPALETTE == 555) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_555(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_555(Index) + #define GETINDEXMASK() LCD_GetIndexMask_555() +#elif (FIXEDPALETTE == 555) && (LCD_SWAP_RB) + #define COLOR2INDEX(Color) LCD_Color2Index_M555(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M555(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M555() +#elif (FIXEDPALETTE == 556) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_556(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_556(Index) + #define GETINDEXMASK() LCD_GetIndexMask_556() +#elif (FIXEDPALETTE == 556) && (LCD_SWAP_RB) + #define COLOR2INDEX(Color) LCD_Color2Index_M556(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M556(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M556() +#elif (FIXEDPALETTE == 565) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_565(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_565(Index) + #define GETINDEXMASK() LCD_GetIndexMask_565() +#elif (FIXEDPALETTE == 565) && (LCD_SWAP_RB) + #define COLOR2INDEX(Color) LCD_Color2Index_M565(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M565(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M565() +#elif (FIXEDPALETTE == 655) && (LCD_SWAP_RB==0) + #define COLOR2INDEX(Color) LCD_Color2Index_655(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_655(Index) + #define GETINDEXMASK() LCD_GetIndexMask_655() +#elif (FIXEDPALETTE == 655) && (LCD_SWAP_RB) + #define COLOR2INDEX(Color) LCD_Color2Index_M655(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_M655(Index) + #define GETINDEXMASK() LCD_GetIndexMask_M655() +#elif FIXEDPALETTE == 8666 + #define COLOR2INDEX(Color) LCD_Color2Index_8666(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_8666(Index) + #define GETINDEXMASK() LCD_GetIndexMask_8666() +#elif FIXEDPALETTE == 86661 + #define COLOR2INDEX(Color) LCD_Color2Index_8666_1(Color) + #define INDEX2COLOR(Index) LCD_Index2Color_8666_1(Index) + #define GETINDEXMASK() LCD_GetIndexMask_8666_1() +#else + #error Unsupported color mode +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +#if (LCD_FIXEDPALETTE==0) + #if !LCD_PHYSCOLORS_IN_RAM + const + #endif + LCD_COLOR LCD_PhysColors[] = { LCD_PHYSCOLORS }; + const LCD_PHYSPALETTE LCD_PhysPal = { LCD_NUM_COLORS, &LCD_PhysColors[0] }; +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_L0_Color2Index +*/ +unsigned int LCD_L0_Color2Index(LCD_COLOR Color) { + unsigned int Index; + Index = COLOR2INDEX(Color); + #if LCD_REVERSE + Index ^= ((1<x0 = 0; + pRect->y0 = 0; + pRect->x1 = LCD_XSIZE - 1; + pRect->y1 = LCD_YSIZE - 1; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_Mirror.c b/User/system/lib/lcd/gui/Core/LCD_Mirror.c new file mode 100644 index 0000000..37a9cf3 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_Mirror.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_Mirror.c +Purpose : Data for 8 bit mirroring +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "LCD_Protected.h" /* private modul definitions & config */ + + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ +GUI_CONST_STORAGE U8 LCD_aMirror[256] = { + ________, X_______, _X______, XX______, __X_____, X_X_____, _XX_____, XXX_____, + ___X____, X__X____, _X_X____, XX_X____, __XX____, X_XX____, _XXX____, XXXX____, + ____X___, X___X___, _X__X___, XX__X___, __X_X___, X_X_X___, _XX_X___, XXX_X___, + ___XX___, X__XX___, _X_XX___, XX_XX___, __XXX___, X_XXX___, _XXXX___, XXXXX___, + _____X__, X____X__, _X___X__, XX___X__, __X__X__, X_X__X__, _XX__X__, XXX__X__, + ___X_X__, X__X_X__, _X_X_X__, XX_X_X__, __XX_X__, X_XX_X__, _XXX_X__, XXXX_X__, + ____XX__, X___XX__, _X__XX__, XX__XX__, __X_XX__, X_X_XX__, _XX_XX__, XXX_XX__, + ___XXX__, X__XXX__, _X_XXX__, XX_XXX__, __XXXX__, X_XXXX__, _XXXXX__, XXXXXX__, + ______X_, X_____X_, _X____X_, XX____X_, __X___X_, X_X___X_, _XX___X_, XXX___X_, + ___X__X_, X__X__X_, _X_X__X_, XX_X__X_, __XX__X_, X_XX__X_, _XXX__X_, XXXX__X_, + ____X_X_, X___X_X_, _X__X_X_, XX__X_X_, __X_X_X_, X_X_X_X_, _XX_X_X_, XXX_X_X_, + ___XX_X_, X__XX_X_, _X_XX_X_, XX_XX_X_, __XXX_X_, X_XXX_X_, _XXXX_X_, XXXXX_X_, + _____XX_, X____XX_, _X___XX_, XX___XX_, __X__XX_, X_X__XX_, _XX__XX_, XXX__XX_, + ___X_XX_, X__X_XX_, _X_X_XX_, XX_X_XX_, __XX_XX_, X_XX_XX_, _XXX_XX_, XXXX_XX_, + ____XXX_, X___XXX_, _X__XXX_, XX__XXX_, __X_XXX_, X_X_XXX_, _XX_XXX_, XXX_XXX_, + ___XXXX_, X__XXXX_, _X_XXXX_, XX_XXXX_, __XXXXX_, X_XXXXX_, _XXXXXX_, XXXXXXX_, + _______X, X______X, _X_____X, XX_____X, __X____X, X_X____X, _XX____X, XXX____X, + ___X___X, X__X___X, _X_X___X, XX_X___X, __XX___X, X_XX___X, _XXX___X, XXXX___X, + ____X__X, X___X__X, _X__X__X, XX__X__X, __X_X__X, X_X_X__X, _XX_X__X, XXX_X__X, + ___XX__X, X__XX__X, _X_XX__X, XX_XX__X, __XXX__X, X_XXX__X, _XXXX__X, XXXXX__X, + _____X_X, X____X_X, _X___X_X, XX___X_X, __X__X_X, X_X__X_X, _XX__X_X, XXX__X_X, + ___X_X_X, X__X_X_X, _X_X_X_X, XX_X_X_X, __XX_X_X, X_XX_X_X, _XXX_X_X, XXXX_X_X, + ____XX_X, X___XX_X, _X__XX_X, XX__XX_X, __X_XX_X, X_X_XX_X, _XX_XX_X, XXX_XX_X, + ___XXX_X, X__XXX_X, _X_XXX_X, XX_XXX_X, __XXXX_X, X_XXXX_X, _XXXXX_X, XXXXXX_X, + ______XX, X_____XX, _X____XX, XX____XX, __X___XX, X_X___XX, _XX___XX, XXX___XX, + ___X__XX, X__X__XX, _X_X__XX, XX_X__XX, __XX__XX, X_XX__XX, _XXX__XX, XXXX__XX, + ____X_XX, X___X_XX, _X__X_XX, XX__X_XX, __X_X_XX, X_X_X_XX, _XX_X_XX, XXX_X_XX, + ___XX_XX, X__XX_XX, _X_XX_XX, XX_XX_XX, __XXX_XX, X_XXX_XX, _XXXX_XX, XXXXX_XX, + _____XXX, X____XXX, _X___XXX, XX___XXX, __X__XXX, X_X__XXX, _XX__XXX, XXX__XXX, + ___X_XXX, X__X_XXX, _X_X_XXX, XX_X_XXX, __XX_XXX, X_XX_XXX, _XXX_XXX, XXXX_XXX, + ____XXXX, X___XXXX, _X__XXXX, XX__XXXX, __X_XXXX, X_X_XXXX, _XX_XXXX, XXX_XXXX, + ___XXXXX, X__XXXXX, _X_XXXXX, XX_XXXXX, __XXXXXX, X_XXXXXX, _XXXXXXX, XXXXXXXX +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_MixColors256.c b/User/system/lib/lcd/gui/Core/LCD_MixColors256.c new file mode 100644 index 0000000..ad94378 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_MixColors256.c @@ -0,0 +1,57 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_MixColors256.c +Purpose : Implementation of LCD_MixColors256 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD.h" +#include "GUI_Private.h" +#include "LCD_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_MixColors256 +* +* Purpose: +* Mix 2 colors. +* +* Parameters: +* Intens: Intensity of first color in 257 steps, from 0 to 256, where 256 equals 100% +*/ +LCD_COLOR LCD_MixColors256(LCD_COLOR Color, LCD_COLOR BkColor, unsigned Intens) { + /* Calc Color seperations for FgColor first */ + U32 R = (Color & 0xff) * Intens; + U32 G = (Color & 0xff00) * Intens; + U32 B = (Color & 0xff0000)* Intens; + /* Add Color seperations for BkColor */ + Intens = 256 - Intens; + R += (BkColor & 0xff) * Intens; + G += (BkColor & 0xff00) * Intens; + B += (BkColor & 0xff0000) * Intens; + R = (R >> 8); + G = (G >> 8) & 0xff00; + B = (B >> 8) & 0xff0000; + return R + G + B; +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_Private.h b/User/system/lib/lcd/gui/Core/LCD_Private.h new file mode 100644 index 0000000..b338292 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_Private.h @@ -0,0 +1,117 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* �C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_Private.h +Purpose : Internals of the LCD level +---------------------------------------------------------------------- +*/ + +#ifndef LCD_Private_H +#define LCD_Private_H + +#include "LCD_ConfDefaults.h" /* Configuration header file */ +#include "LCD_Protected.h" +#include "GUI.h" + +typedef struct +{ + LCD_COLOR *paColor; + I16 NumEntries; +} LCD_LUT_INFO; + +#if LCD_PHYSCOLORS_IN_RAM +#if (LCD_FIXEDPALETTE == 0) +#if (LCD_FIXEDPALETTE == 0) +extern LCD_COLOR LCD_PhysColors[1 << LCD_BITSPERPIXEL]; +#endif +#endif +#if (GUI_NUM_LAYERS > 1) +#if (LCD_FIXEDPALETTE_1 == 0) +extern LCD_COLOR LCD_PhysColors_1[1 << LCD_BITSPERPIXEL_1]; +#endif +#endif +#if (GUI_NUM_LAYERS > 2) +#if (LCD_FIXEDPALETTE_2 == 0) +extern LCD_COLOR LCD_PhysColors_2[1 << LCD_BITSPERPIXEL_2]; +#endif +#endif +#if (GUI_NUM_LAYERS > 3) +#if (LCD_FIXEDPALETTE_3 == 0) +extern LCD_COLOR LCD_PhysColors_3[1 << LCD_BITSPERPIXEL_3]; +#endif +#endif +#if (GUI_NUM_LAYERS > 4) +#if (LCD_FIXEDPALETTE_4 == 0) +extern LCD_COLOR LCD_PhysColors_4[1 << LCD_BITSPERPIXEL_4]; +#endif +#endif +#endif + +#if GUI_COMPILER_SUPPORTS_FP + +extern const struct tLCDDEV_APIList_struct * /* const */ LCD_aAPI[GUI_NUM_LAYERS]; + +const tLCDDEV_APIList *LCD_SetAPI(const tLCDDEV_APIList *pAPI, int Index); + +#endif + +#if (LCD_BITSPERPIXEL <= 8) && (GUI_NUM_LAYERS < 2) +#define LCD_BKCOLORINDEX GUI_Context.GLCD.aColorIndex8[0] +#define LCD_COLORINDEX GUI_Context.GLCD.aColorIndex8[1] +#define LCD_ACOLORINDEX GUI_Context.GLCD.aColorIndex8 +#else +#define LCD_BKCOLORINDEX GUI_Context.GLCD.aColorIndex16[0] +#define LCD_COLORINDEX GUI_Context.GLCD.aColorIndex16[1] +#define LCD_ACOLORINDEX GUI_Context.GLCD.aColorIndex16 +#endif + +extern LCD_PIXELINDEX LCD__aConvTable[LCD_MAX_LOG_COLORS]; +void LCD_DrawBitmap(int x0, int y0, + int xsize, int ysize, + int xMul, int yMul, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR *pPixel, + const LCD_PIXELINDEX *pTrans); +void LCD_UpdateColorIndices(void); + +/********************************************************************* + * + * Support for Segment/COMLUTs + * + ********************************************************************** + */ + +#define LCD_TYPE_SEGTRANS U16 +#define LCD_TYPE_COMTRANS U16 + +#ifdef LCD_LUT_COM +#ifdef LCDCOLOR_C +LCD_TYPE_COMTRANS LCD__aLine2Com0[LCD_YSIZE] = {LCD_LUT_COM}; +#else +extern LCD_TYPE_COMTRANS LCD__aLine2Com0[LCD_YSIZE]; +#endif +#endif + +#ifdef LCD_LUT_SEG +#ifdef LCDCOLOR_C +LCD_TYPE_SEGTRANS LCD__aCol2Seg0[LCD_XSIZE] = {LCD_LUT_SEG}; +#else +extern LCD_TYPE_COMTRANS LCD__aCol2Seg0[LCD_XSIZE]; +#endif +#endif + +#endif /* Avoid multiple inclusion */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_Protected.h b/User/system/lib/lcd/gui/Core/LCD_Protected.h new file mode 100644 index 0000000..fc08f2c --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_Protected.h @@ -0,0 +1,255 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_Protected.h +Purpose : Internals of the LCD level +---------------------------------------------------------------------- +*/ + +#ifndef LCD_INTERN_H +#define LCD_INTERN_H + +#include "LCD.h" + +/********************************************************************* +* +* Data types +* +********************************************************************** +*/ + +typedef struct { + int NumEntries; + const LCD_COLOR* pPalEntries; +} LCD_PHYSPALETTE; + +/********************************************************************* +* +* Data +* +********************************************************************** +*/ +extern GUI_CONST_STORAGE U8 LCD_aMirror[256]; + + +/******************************************************** +* +* Color conversion routines (used internally only ! +* +********************************************************* +*/ +unsigned LCD_Color2Index_User (LCD_COLOR Color); +unsigned LCD_Color2Index_0 (LCD_COLOR Color, const LCD_PHYSPALETTE* pPhysPal); +unsigned LCD_Color2Index_1 (LCD_COLOR Color); +unsigned LCD_Color2Index_M1 (LCD_COLOR Color); +unsigned LCD_Color2Index_2 (LCD_COLOR Color); +unsigned LCD_Color2Index_M2 (LCD_COLOR Color); +unsigned LCD_Color2Index_4 (LCD_COLOR Color); +unsigned LCD_Color2Index_M4 (LCD_COLOR Color); +unsigned LCD_Color2Index_111 (LCD_COLOR Color); +unsigned LCD_Color2Index_222 (LCD_COLOR Color); +unsigned LCD_Color2Index_233 (LCD_COLOR Color); +unsigned LCD_Color2Index_323 (LCD_COLOR Color); +unsigned LCD_Color2Index_332 (LCD_COLOR Color); +unsigned LCD_Color2Index_444_12 (LCD_COLOR Color); +unsigned LCD_Color2Index_444_12_1(LCD_COLOR Color); +unsigned LCD_Color2Index_444_16 (LCD_COLOR Color); +unsigned LCD_Color2Index_555 (LCD_COLOR Color); +unsigned LCD_Color2Index_565 (LCD_COLOR Color); +unsigned LCD_Color2Index_556 (LCD_COLOR Color); +unsigned LCD_Color2Index_655 (LCD_COLOR Color); +unsigned LCD_Color2Index_8666 (LCD_COLOR Color); +unsigned LCD_Color2Index_8666_1 (LCD_COLOR Color); +unsigned LCD_Color2Index_M111 (LCD_COLOR Color); +unsigned LCD_Color2Index_M222 (LCD_COLOR Color); +unsigned LCD_Color2Index_M233 (LCD_COLOR Color); +unsigned LCD_Color2Index_M323 (LCD_COLOR Color); +unsigned LCD_Color2Index_M332 (LCD_COLOR Color); +unsigned LCD_Color2Index_M444_12 (LCD_COLOR Color); +unsigned LCD_Color2Index_M444_16 (LCD_COLOR Color); +unsigned LCD_Color2Index_M555 (LCD_COLOR Color); +unsigned LCD_Color2Index_M565 (LCD_COLOR Color); +unsigned LCD_Color2Index_M556 (LCD_COLOR Color); +unsigned LCD_Color2Index_M655 (LCD_COLOR Color); + +LCD_COLOR LCD_Index2Color_User (int Index); +LCD_COLOR LCD_Index2Color_0 (int Index, const LCD_PHYSPALETTE* pPhysPal); +LCD_COLOR LCD_Index2Color_1 (int Index); +LCD_COLOR LCD_Index2Color_2 (int Index); +LCD_COLOR LCD_Index2Color_4 (int Index); +LCD_COLOR LCD_Index2Color_111 (int Index); +LCD_COLOR LCD_Index2Color_222 (int Index); +LCD_COLOR LCD_Index2Color_233 (int Index); +LCD_COLOR LCD_Index2Color_323 (int Index); +LCD_COLOR LCD_Index2Color_332 (int Index); +LCD_COLOR LCD_Index2Color_444_12 (int Index); +LCD_COLOR LCD_Index2Color_444_12_1(int Index); +LCD_COLOR LCD_Index2Color_444_16 (int Index); +LCD_COLOR LCD_Index2Color_555 (int Index); +LCD_COLOR LCD_Index2Color_565 (int Index); +LCD_COLOR LCD_Index2Color_556 (int Index); +LCD_COLOR LCD_Index2Color_655 (int Index); +LCD_COLOR LCD_Index2Color_8666 (int Index); +LCD_COLOR LCD_Index2Color_8666_1 (int Index); +LCD_COLOR LCD_Index2Color_M111 (int Index); +LCD_COLOR LCD_Index2Color_M222 (int Index); +LCD_COLOR LCD_Index2Color_M233 (int Index); +LCD_COLOR LCD_Index2Color_M323 (int Index); +LCD_COLOR LCD_Index2Color_M332 (int Index); +LCD_COLOR LCD_Index2Color_M444_12 (int Index); +LCD_COLOR LCD_Index2Color_M444_16 (int Index); +LCD_COLOR LCD_Index2Color_M555 (int Index); +LCD_COLOR LCD_Index2Color_M565 (int Index); +LCD_COLOR LCD_Index2Color_M556 (int Index); +LCD_COLOR LCD_Index2Color_M655 (int Index); + +unsigned LCD_GetIndexMask_User (void); +unsigned LCD_GetIndexMask_0 (void); +unsigned LCD_GetIndexMask_1 (void); +unsigned LCD_GetIndexMask_M1 (void); +unsigned LCD_GetIndexMask_2 (void); +unsigned LCD_GetIndexMask_M2 (void); +unsigned LCD_GetIndexMask_4 (void); +unsigned LCD_GetIndexMask_M4 (void); +unsigned LCD_GetIndexMask_111 (void); +unsigned LCD_GetIndexMask_222 (void); +unsigned LCD_GetIndexMask_233 (void); +unsigned LCD_GetIndexMask_323 (void); +unsigned LCD_GetIndexMask_332 (void); +unsigned LCD_GetIndexMask_444_12 (void); +unsigned LCD_GetIndexMask_444_12_1(void); +unsigned LCD_GetIndexMask_444_16 (void); +unsigned LCD_GetIndexMask_555 (void); +unsigned LCD_GetIndexMask_565 (void); +unsigned LCD_GetIndexMask_556 (void); +unsigned LCD_GetIndexMask_655 (void); +unsigned LCD_GetIndexMask_8666 (void); +unsigned LCD_GetIndexMask_8666_1 (void); +unsigned LCD_GetIndexMask_M111 (void); +unsigned LCD_GetIndexMask_M222 (void); +unsigned LCD_GetIndexMask_M233 (void); +unsigned LCD_GetIndexMask_M323 (void); +unsigned LCD_GetIndexMask_M332 (void); +unsigned LCD_GetIndexMask_M444_12 (void); +unsigned LCD_GetIndexMask_M444_16 (void); +unsigned LCD_GetIndexMask_M555 (void); +unsigned LCD_GetIndexMask_M565 (void); +unsigned LCD_GetIndexMask_M556 (void); +unsigned LCD_GetIndexMask_M655 (void); + +void LCD_SelectLCD(void); + +/********************************************************************* +* +* Declarations for LCD_L0_ +* +********************************************************************** + + Prefixes are as follows: + LCD_L0_xxx ... Driver for first LCD + LCD_L0_1_xxx ... Driver for second LCD/layer + LCD_L0_2_xxx ... Driver for third LCD/layer + LCD_L0_MAG_xxx ... Driver for first LCD, magnification level (calling LCD_L0_xxx after magnification) + LCD_L0_DELTA_xxx ... Driver for first LCD, delta mode + +*/ + +unsigned int LCD_L0_Color2Index (LCD_COLOR Color); +unsigned int LCD_L0_1_Color2Index (LCD_COLOR Color); +unsigned int LCD_L0_2_Color2Index (LCD_COLOR Color); +unsigned int LCD_L0_3_Color2Index (LCD_COLOR Color); +unsigned int LCD_L0_4_Color2Index (LCD_COLOR Color); +void LCD_L0_DrawHLine (int x0, int y0, int x1); +void LCD_L0_1_DrawHLine (int x0, int y0, int x1); +void LCD_L0_2_DrawHLine (int x0, int y0, int x1); +void LCD_L0_3_DrawHLine (int x0, int y0, int x1); +void LCD_L0_4_DrawHLine (int x0, int y0, int x1); +void LCD_L0_MAG_DrawHLine (int x0, int y0, int x1); +void LCD_L0_DELTA_DrawHLine (int x0, int y0, int x1); +void LCD_L0_DrawVLine (int x, int y0, int y1); +void LCD_L0_1_DrawVLine (int x, int y0, int y1); +void LCD_L0_2_DrawVLine (int x, int y0, int y1); +void LCD_L0_3_DrawVLine (int x, int y0, int y1); +void LCD_L0_4_DrawVLine (int x, int y0, int y1); +void LCD_L0_MAG_DrawVLine (int x, int y0, int y1); +void LCD_L0_DELTA_DrawVLine (int x, int y0, int y1); +void LCD_L0_FillRect (int x0, int y0, int x1, int y1); +void LCD_L0_1_FillRect (int x0, int y0, int x1, int y1); +void LCD_L0_2_FillRect (int x0, int y0, int x1, int y1); +void LCD_L0_3_FillRect (int x0, int y0, int x1, int y1); +void LCD_L0_4_FillRect (int x0, int y0, int x1, int y1); +void LCD_L0_MAG_FillRect (int x0, int y0, int x1, int y1); +void LCD_L0_DELTA_FillRect (int x0, int y0, int x1, int y1); +unsigned int LCD_L0_GetPixelIndex (int x, int y); +unsigned int LCD_L0_1_GetPixelIndex (int x, int y); +unsigned int LCD_L0_2_GetPixelIndex (int x, int y); +unsigned int LCD_L0_3_GetPixelIndex (int x, int y); +unsigned int LCD_L0_4_GetPixelIndex (int x, int y); +unsigned int LCD_L0_MAG_GetPixelIndex (int x, int y); +unsigned int LCD_L0_DELTA_GetPixelIndex (int x, int y); +void LCD_L0_GetRect (LCD_RECT * pRect); +void LCD_L0_1_GetRect (LCD_RECT * pRect); +void LCD_L0_2_GetRect (LCD_RECT * pRect); +void LCD_L0_3_GetRect (LCD_RECT * pRect); +void LCD_L0_4_GetRect (LCD_RECT * pRect); +void LCD_L0_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_1_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_2_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_3_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_4_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_MAG_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_DELTA_SetPixelIndex (int x, int y, int ColorIndex); +void LCD_L0_XorPixel (int x, int y); +void LCD_L0_1_XorPixel (int x, int y); +void LCD_L0_2_XorPixel (int x, int y); +void LCD_L0_3_XorPixel (int x, int y); +void LCD_L0_4_XorPixel (int x, int y); +void LCD_L0_MAG_XorPixel (int x, int y); +void LCD_L0_DELTA_XorPixel (int x, int y); +int LCD_L0_Init (void); +int LCD_L0_1_Init (void); +int LCD_L0_2_Init (void); +int LCD_L0_3_Init (void); +int LCD_L0_4_Init (void); +int LCD_L0_MAG_Init (void); +int LCD_L0_DELTA_Init (void); +void LCD_L0_On (void); +void LCD_L0_1_On (void); +void LCD_L0_2_On (void); +void LCD_L0_3_On (void); +void LCD_L0_4_On (void); +void LCD_L0_Off (void); +void LCD_L0_1_Off (void); +void LCD_L0_2_Off (void); +void LCD_L0_3_Off (void); +void LCD_L0_4_Off (void); +void LCD_L0_SetLUTEntry (U8 Pos, LCD_COLOR color); +void LCD_L0_1_SetLUTEntry (U8 Pos, LCD_COLOR color); +void LCD_L0_2_SetLUTEntry (U8 Pos, LCD_COLOR color); +void LCD_L0_3_SetLUTEntry (U8 Pos, LCD_COLOR color); +void LCD_L0_4_SetLUTEntry (U8 Pos, LCD_COLOR color); + +void LCD_L0_ReInit (void); /* Reinitialize LCD using config-paramters */ +void LCD_L0_Refresh (void); /* Refresh entire LCD */ + /* Refresh LCD partially. Could be one line, depends on what + the LCD controller can handle efficiently */ +void LCD_L0_SetOrg (int x, int y); + + +#endif /* LCD_INTERN_H */ + + + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Core/LCD_Rotate180.c b/User/system/lib/lcd/gui/Core/LCD_Rotate180.c new file mode 100644 index 0000000..f6c338d --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_Rotate180.c @@ -0,0 +1,265 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_Rotate180.c +Purpose : Implementation of GUI_SetRotation +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "LCD.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +#if GUI_SUPPORT_ROTATION + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitLine1BPP +*/ +static void _DrawBitLine1BPP(int x, int y, U8 const GUI_UNI_PTR *p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) { + LCD_PIXELINDEX Index0 = *(pTrans+0); + LCD_PIXELINDEX Index1 = *(pTrans+1); + x -= Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + do { + LCDDEV_L0_SetPixelIndex(x--, y, (*p & (0x80 >> Diff)) ? Index1 : Index0); + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*p & (0x80 >> Diff)) + LCDDEV_L0_SetPixelIndex(x, y, Index1); + x--; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_XOR:; + do { + if (*p & (0x80 >> Diff)) { + int Pixel = LCD_L0_GetPixelIndex(x, y); + LCDDEV_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel); + } + x--; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* _DrawBitmap +* +* Purpose: +* Draws a bitmap (1bpp) rotated by 180 degrees. +*/ +static void _DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, + const LCD_PIXELINDEX* pTrans) +{ + int i; + /* Use _DrawBitLineXBPP */ + for (i = 0; i < ysize; i++) { + switch (BitsPerPixel) { + case 1: + _DrawBitLine1BPP(x0, y0 - i, pData, Diff, xsize, pTrans); + break; + } + pData += BytesPerLine; + } +} + +/********************************************************************* +* +* _Rect2TextRect +* +* Purpose: +* This function transforms a given rectangle (window coordinates) +* to the rectangle used to clip the text. +*/ +static void _Rect2TextRect(GUI_RECT * pRect) { + GUI_USE_PARA(pRect); + /* nothing to do in case of rotating text by 180 degrees */ +} + +/********************************************************************* +* +* _TransformPoint180 +* +* Purpose: +* This function transforms an unrotated point (window +* coordinates) into a rotated point in desktop coordinates +* and handles the rotation of the current text rectangle. +*/ +static void _TransformPoint180(int * pXPos, int * pYPos) { + GUI_RECT ClientRect = {0}; + int xPos, yPos, xNumPixel, yNumPixel; + /* Get the client rectangle */ + #if GUI_WINSUPPORT + WM_GetWindowRect(&ClientRect); + #else + GUI_GetClientRect(&ClientRect); + #endif + xNumPixel = LCD_GetXSize() - 1; + yNumPixel = LCD_GetYSize() - 1; + if (ClientRect.x1 > xNumPixel) { + ClientRect.x1 = xNumPixel; + } + if (ClientRect.y1 > yNumPixel) { + ClientRect.y1 = yNumPixel; + } + /* Save old positions */ + xPos = *pXPos; + yPos = *pYPos; + /* Handle rotation of text rectangle */ + *pXPos = ClientRect.x0 + GUI_RectDispString.x1 - (xPos - GUI_RectDispString.x0); + *pYPos = ClientRect.y0 + GUI_RectDispString.y1 - (yPos - GUI_RectDispString.y0); +} + +/********************************************************************* +* +* _DrawBitmap180 +*/ +static void _DrawBitmap180(int x0, int y0, int xsize, int ysize, int xMul, int yMul, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pPixel, const LCD_PIXELINDEX* pTrans) +{ + U8 Data = 0; + int x1, y1; + /* Handle the optional Y-magnification */ + y1 = y0 + ysize - 1; + x1 = x0 + xsize - 1; + /* Rotate positions */ + _TransformPoint180(&x0, &y0); + _TransformPoint180(&x1, &y1); + /* Handle BITMAP without magnification */ + if ((xMul == 1) && (yMul == 1)) { + int Diff; + /* Clip top */ + if (y0 > GUI_Context.ClipRect.y1) { + int Diff = y0 - GUI_Context.ClipRect.y1; + y0 = GUI_Context.ClipRect.y1; + pPixel += Diff * BytesPerLine; + ysize -= Diff; + } + /* Clip bottom */ + if (y1 < GUI_Context.ClipRect.y0) { + int Diff = GUI_Context.ClipRect.y0 - y1; + ysize -= Diff; + } + if (ysize <= 0) { + return; + } + /* Clip right side */ + if (x1 < GUI_Context.ClipRect.x0) { + int Diff = GUI_Context.ClipRect.x0 - x1; + xsize -= Diff; + } + /* Clip left side */ + Diff = 0; + if (x0 > GUI_Context.ClipRect.x1) { + Diff = x0 - GUI_Context.ClipRect.x1; + xsize -= Diff; + switch (BitsPerPixel) { + case 1: + pPixel += (Diff >> 3); x0 += (Diff >> 3) << 3; Diff &= 7; + break; + } + } + if (xsize <= 0) { + return; + } + _DrawBitmap(x0, y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans); + } else { + /* Handle BITMAP with magnification */ + int x, y; + int yi; + int Shift = 8 - BitsPerPixel; + for (y = y0, yi = 0; yi < ysize; yi++, y -= yMul, pPixel += BytesPerLine) { + int yMax = y + yMul - 1; + /* Draw if within clip area (Optimization ... "if" is not required !) */ + if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) { + int BitsLeft = 0; + int xi; + const U8 GUI_UNI_PTR * pDataLine = pPixel; + for (x = x0, xi = 0; xi < xsize; xi++, x -= xMul) { + U8 Index; + if (!BitsLeft) { + Data = *pDataLine++; + BitsLeft =8; + } + Index = Data >> Shift; + Data <<= BitsPerPixel; + BitsLeft -= BitsPerPixel; + if (Index || ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0)) { + LCD_PIXELINDEX OldColor = LCD_COLORINDEX; + if (pTrans) { + LCD_COLORINDEX = *(pTrans + Index); + } else { + LCD_COLORINDEX = Index; + } + LCD_FillRect(x - xMul + 1, y, x, yMax); + LCD_COLORINDEX = OldColor; + } + } + } + } + } +} + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_APIList180 +* +* Purpose: +* Function pointer table for rotating text 180 +*/ +tLCD_APIList LCD_APIList180 = { + (tLCD_DrawBitmap*)&_DrawBitmap180, + &_Rect2TextRect +}; + +#else +void LCD_Rotate180_C(void); +void LCD_Rotate180_C(void){} +#endif + diff --git a/User/system/lib/lcd/gui/Core/LCD_RotateCCW.c b/User/system/lib/lcd/gui/Core/LCD_RotateCCW.c new file mode 100644 index 0000000..e38381b --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_RotateCCW.c @@ -0,0 +1,268 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_RotateCCW.c +Purpose : Implementation of GUI_SetRotation +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "LCD.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +#if GUI_SUPPORT_ROTATION + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitLine1BPP +*/ +static void _DrawBitLine1BPP(int x, int y, U8 const GUI_UNI_PTR *p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) { + LCD_PIXELINDEX Index0 = *(pTrans+0); + LCD_PIXELINDEX Index1 = *(pTrans+1); + y -= Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + do { + LCDDEV_L0_SetPixelIndex(x, y, (*p & (0x80 >> Diff)) ? Index1 : Index0); + y--; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*p & (0x80 >> Diff)) + LCDDEV_L0_SetPixelIndex(x, y, Index1); + y--; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_XOR:; + do { + if (*p & (0x80 >> Diff)) { + int Pixel = LCD_L0_GetPixelIndex(x, y); + LCDDEV_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel); + } + y--; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* _DrawBitmap +* +* Purpose: +* Draws a bitmap (1bpp) counter clockwise. +*/ +static void _DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, + const LCD_PIXELINDEX* pTrans) +{ + int i; + /* Use _DrawBitLineXBPP */ + for (i=0; ix1; + y1 = pRect->y1; + pRect->x1 = pRect->x0 + (y1 - pRect->y0); + pRect->y1 = pRect->y0 + (x1 - pRect->x0); +} + +/********************************************************************* +* +* _TransformPointCCW +* +* Purpose: +* This function transforms an unrotated point (window +* coordinates) into a rotated point in desktop coordinates +* and handles the rotation of the current text rectangle. +*/ +static void _TransformPointCCW(int * pXPos, int * pYPos) { + GUI_RECT ClientRect = {0}; + int xPos, yPos, xNumPixel, yNumPixel; + /* Get the client rectangle */ + #if GUI_WINSUPPORT + WM_GetWindowRect(&ClientRect); + #else + GUI_GetClientRect(&ClientRect); + #endif + xNumPixel = LCD_GetXSize() - 1; + yNumPixel = LCD_GetYSize() - 1; + if (ClientRect.x1 > xNumPixel) { + ClientRect.x1 = xNumPixel; + } + if (ClientRect.y1 > yNumPixel) { + ClientRect.y1 = yNumPixel; + } + /* Save old positions */ + xPos = *pXPos; + yPos = *pYPos; + /* Rotate and add window origin */ + *pXPos = ClientRect.x0 + yPos; + *pYPos = ClientRect.y1 - xPos; + /* Handle rotation of text rectangle */ + *pXPos = *pXPos + GUI_RectDispString.x0 - GUI_RectDispString.y0; + *pYPos = *pYPos + GUI_RectDispString.y1 - (ClientRect.y1 - ClientRect.y0) + GUI_RectDispString.x0; +} + +/********************************************************************* +* +* _DrawBitmapCCW +*/ +static void _DrawBitmapCCW(int x0, int y0, int xsize, int ysize, int xMul, int yMul, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pPixel, const LCD_PIXELINDEX* pTrans) +{ + U8 Data = 0; + int x1, y1; + /* Handle the optional Y-magnification */ + y1 = y0 + ysize - 1; + x1 = x0 + xsize - 1; + /* Rotate positions */ + _TransformPointCCW(&x0, &y0); + _TransformPointCCW(&x1, &y1); + /* Handle BITMAP without magnification */ + if ((xMul == 1) && (yMul == 1)) { + int Diff = 0; + /* Clip top */ + if (y1 < GUI_Context.ClipRect.y0) { + int Diff = GUI_Context.ClipRect.y0 - y1; + xsize -= Diff; + } + /* Clip bottom */ + if (y0 > GUI_Context.ClipRect.y1) { + Diff = y0 - GUI_Context.ClipRect.y1; + xsize -= Diff; + switch (BitsPerPixel) { + case 1: + pPixel += (Diff >> 3); y0 -= (Diff >> 3) << 3; Diff &= 7; + break; + } + } + if (ysize <= 0) { + return; + } + /* Clip right side */ + if (x1 > GUI_Context.ClipRect.x1) { + int Diff = x1 - GUI_Context.ClipRect.x1; + ysize -= Diff; + } + /* Clip left side */ + if (x0 < GUI_Context.ClipRect.x0) { + int Diff = GUI_Context.ClipRect.x0 - x0; + pPixel += Diff * BytesPerLine; + x0 += Diff; + ysize -= Diff; + } + if (xsize <= 0) { + return; + } + _DrawBitmap(x0, y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans); + } else { + /* Handle BITMAP with magnification */ + int x, y, xi, yi; + int Shift = 8 - BitsPerPixel; + for (x = x0, xi = 0; xi < ysize; xi++, x += yMul, pPixel += BytesPerLine) { + int xMax = x + yMul - 1; + if ((xMax >= GUI_Context.ClipRect.x0) && (x <= GUI_Context.ClipRect.x1)) { + int BitsLeft = 0; + const U8 GUI_UNI_PTR * pDataLine = pPixel; + for (y = y0, yi = 0; yi < xsize; yi++, y -= xMul) { + U8 Index; + if (!BitsLeft) { + Data = *pDataLine++; + BitsLeft =8; + } + Index = Data >> Shift; + Data <<= BitsPerPixel; + BitsLeft -= BitsPerPixel; + if (Index || ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0)) { + LCD_PIXELINDEX OldColor = LCD_COLORINDEX; + if (pTrans) { + LCD_COLORINDEX = *(pTrans + Index); + } else { + LCD_COLORINDEX = Index; + } + LCD_FillRect(x, y - xMul + 1, xMax, y); + LCD_COLORINDEX = OldColor; + } + } + } + } + } +} + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_APIListCCW +* +* Purpose: +* Function pointer table for rotating text CCW +*/ +tLCD_APIList LCD_APIListCCW = { + (tLCD_DrawBitmap*)&_DrawBitmapCCW, + &_Rect2TextRect +}; + +#else +void LCD_RotateCCW_C(void); +void LCD_RotateCCW_C(void){} +#endif + diff --git a/User/system/lib/lcd/gui/Core/LCD_RotateCW.c b/User/system/lib/lcd/gui/Core/LCD_RotateCW.c new file mode 100644 index 0000000..41da1f9 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_RotateCW.c @@ -0,0 +1,269 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_RotateCW.c +Purpose : Implementation of GUI_SetRotation +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "LCD.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +#if GUI_SUPPORT_ROTATION + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitLine1BPP +*/ +static void _DrawBitLine1BPP(int x, int y, U8 const GUI_UNI_PTR *p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) { + LCD_PIXELINDEX Index0 = *(pTrans+0); + LCD_PIXELINDEX Index1 = *(pTrans+1); + y -= Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: + do { + LCDDEV_L0_SetPixelIndex(x, y, (*p & (0x80 >> Diff)) ? Index1 : Index0); + y++; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*p & (0x80 >> Diff)) + LCDDEV_L0_SetPixelIndex(x, y, Index1); + y++; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_XOR:; + do { + if (*p & (0x80 >> Diff)) { + int Pixel = LCD_L0_GetPixelIndex(x, y); + LCDDEV_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel); + } + y++; + if (++Diff == 8) { + Diff = 0; + p++; + } + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* _DrawBitmap +* +* Purpose: +* Draws a bitmap (1bpp) clockwise. +*/ +static void _DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, + const LCD_PIXELINDEX* pTrans) +{ + int i; + /* Use _DrawBitLineXBPP */ + for (i = 0; i < ysize; i++) { + switch (BitsPerPixel) { + case 1: + _DrawBitLine1BPP(x0 - i, y0, pData, Diff, xsize, pTrans); + break; + } + pData += BytesPerLine; + } +} + +/********************************************************************* +* +* _Rect2TextRect +* +* Purpose: +* This function transforms a given rectangle (window coordinates) +* to the rectangle used to clip the text. +*/ +static void _Rect2TextRect(GUI_RECT * pRect) { + int x1, y1; + x1 = pRect->x1; + y1 = pRect->y1; + pRect->x1 = pRect->x0 + (y1 - pRect->y0); + pRect->y1 = pRect->y0 + (x1 - pRect->x0); +} + +/********************************************************************* +* +* _TransformPointCW +* +* Purpose: +* This function transforms an unrotated point (window +* coordinates) into a rotated point in desktop coordinates +* and handles the rotation of the current text rectangle. +*/ +static void _TransformPointCW(int * pXPos, int * pYPos) { + GUI_RECT ClientRect = {0}; + int xPos, yPos, xNumPixel, yNumPixel; + /* Get the client rectangle */ + #if GUI_WINSUPPORT + WM_GetWindowRect(&ClientRect); + #else + GUI_GetClientRect(&ClientRect); + #endif + xNumPixel = LCD_GetXSize() - 1; + yNumPixel = LCD_GetYSize() - 1; + if (ClientRect.x1 > xNumPixel) { + ClientRect.x1 = xNumPixel; + } + if (ClientRect.y1 > yNumPixel) { + ClientRect.y1 = yNumPixel; + } + /* Save old positions */ + xPos = *pXPos; + yPos = *pYPos; + /* Rotate and add window origin */ + *pXPos = ClientRect.x0 - yPos; + *pYPos = ClientRect.y0 + xPos; + /* Handle rotation of text rectangle */ + *pXPos = *pXPos + GUI_RectDispString.x1 + GUI_RectDispString.y0; + *pYPos = *pYPos + GUI_RectDispString.y0 - GUI_RectDispString.x0; +} + +/********************************************************************* +* +* _DrawBitmapCW +*/ +static void _DrawBitmapCW(int x0, int y0, int xsize, int ysize, int xMul, int yMul, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pPixel, const LCD_PIXELINDEX* pTrans) +{ + U8 Data = 0; + int x1, y1; + /* Handle the optional Y-magnification */ + y1 = y0 + ysize - 1; + x1 = x0 + xsize - 1; + /* Rotate positions */ + _TransformPointCW(&x0, &y0); + _TransformPointCW(&x1, &y1); + /* Handle BITMAP without magnification */ + if ((xMul == 1) && (yMul == 1)) { + int Diff = 0; + /* Clip top */ + if (y1 > GUI_Context.ClipRect.y1) { + int Diff = y1 - GUI_Context.ClipRect.y1; + xsize -= Diff; + } + /* Clip bottom */ + if (y0 < GUI_Context.ClipRect.y0) { + Diff = GUI_Context.ClipRect.y1 - y0; + xsize -= Diff; + switch (BitsPerPixel) { + case 1: + pPixel += (Diff >> 3); y0 -= (Diff >> 3) << 3; Diff &= 7; + break; + } + } + if (ysize <=0) { + return; + } + /* Clip right side */ + if (x0 > GUI_Context.ClipRect.x1) { + int Diff = x0 - GUI_Context.ClipRect.x1; + ysize -= Diff; + x0 -= Diff; + pPixel += Diff * BytesPerLine; + } + /* Clip left side */ + if (x1 < GUI_Context.ClipRect.x0) { + int Diff = GUI_Context.ClipRect.x0 - x1; + x1 += Diff; + ysize -= Diff; + } + if (xsize <= 0) { + return; + } + _DrawBitmap(x0, y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans); + } else { + /* Handle BITMAP with magnification */ + int x, y, xi, yi; + int Shift = 8 - BitsPerPixel; + for (x = x0, xi = 0; xi < ysize; xi++, x -= yMul, pPixel += BytesPerLine) { + int xMax = x - yMul + 1; + if ((xMax >= GUI_Context.ClipRect.x0) && (x <= GUI_Context.ClipRect.x1)) { + int BitsLeft = 0; + const U8 GUI_UNI_PTR * pDataLine = pPixel; + for (y = y0, yi = 0; yi < xsize; yi++, y += xMul) { + U8 Index; + if (!BitsLeft) { + Data = *pDataLine++; + BitsLeft =8; + } + Index = Data >> Shift; + Data <<= BitsPerPixel; + BitsLeft -= BitsPerPixel; + if (Index || ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0)) { + LCD_PIXELINDEX OldColor = LCD_COLORINDEX; + if (pTrans) { + LCD_COLORINDEX = *(pTrans + Index); + } else { + LCD_COLORINDEX = Index; + } + LCD_FillRect(xMax, y, x, y + xMul - 1); + LCD_COLORINDEX = OldColor; + } + } + } + } + } +} + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_APIListCW +* +* Purpose: +* Function pointer table for rotating text CW +*/ +tLCD_APIList LCD_APIListCW = { + (tLCD_DrawBitmap*)&_DrawBitmapCW, + &_Rect2TextRect +}; + +#else +void LCD_RotateCW_C(void); +void LCD_RotateCW_C(void){} +#endif + diff --git a/User/system/lib/lcd/gui/Core/LCD_SelectLCD.c b/User/system/lib/lcd/gui/Core/LCD_SelectLCD.c new file mode 100644 index 0000000..93d6569 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_SelectLCD.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_SelectLCD.c +Purpose : Implementation of said routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ + +#include "GUI_Private.h" +#if GUI_WINSUPPORT +#include "WM.h" +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* _SelectLCD +*/ +void LCD_SelectLCD(void) { + #if GUI_SUPPORT_DEVICES + #if GUI_NUM_LAYERS == 1 + GUI_Context.pDeviceAPI = LCD_aAPI[0]; + #else + GUI_Context.pDeviceAPI = LCD_aAPI[GUI_Context.SelLayer]; + #endif + GUI_Context.hDevData = 0; + #endif + GUI_Context.pClipRect_HL = &GUI_Context.ClipRect; + LCD_SetClipRectMax(); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_SetAPI.c b/User/system/lib/lcd/gui/Core/LCD_SetAPI.c new file mode 100644 index 0000000..70a710f --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_SetAPI.c @@ -0,0 +1,61 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_SetAPI.C +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "GUI_Private.h" +#include "GUIDebug.h" +#include "LCD_Private.h" /* Required for configuration, APIList */ + +#if GUI_SUPPORT_DEVICES + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_SetAPI +* +* Purpose: +* Sets the API table for a layer. +* Some high level software (such as the VNC server, but maybe also the mouse "Cursor" module) +* may need to override these pointers in order to link itself into the chain +* of drawing routines. +*/ +const tLCDDEV_APIList* LCD_SetAPI(const tLCDDEV_APIList* pAPI, int Index) { + const tLCDDEV_APIList* pOldAPI; + pOldAPI = LCD_aAPI[Index]; + /* Also aplly changes to current context if LCD of this layer is selected */ + if ((GUI_Context.SelLayer == Index) && (GUI_Context.hDevData == 0)) { + GUI_Context.pDeviceAPI = pAPI; + } + LCD_aAPI[Index] = pAPI; + return pOldAPI; +} + +#else + +void LCD_SetAPI_C(void); +void LCD_SetAPI_C(void) {} + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_SetClipRectEx.c b/User/system/lib/lcd/gui/Core/LCD_SetClipRectEx.c new file mode 100644 index 0000000..42df145 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_SetClipRectEx.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_ClipRectEx.c +Purpose : Implementation of optional routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Private.h" +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_SetClipRectEx +* +* Purpose: +* This function is actually a driver function. +* Since it is identical for all drivers with only one controller, +* it is placed here. +* For multi-controller systems, this routine is placed in the +* distribution driver. +*/ + +void LCD_SetClipRectEx(const GUI_RECT* pRect) { + LCD_RECT r; + LCDDEV_L0_GetRect(&r); + GUI__IntersectRects(&GUI_Context.ClipRect, pRect, &r); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/LCD_UpdateColorIndices.c b/User/system/lib/lcd/gui/Core/LCD_UpdateColorIndices.c new file mode 100644 index 0000000..383b952 --- /dev/null +++ b/User/system/lib/lcd/gui/Core/LCD_UpdateColorIndices.c @@ -0,0 +1,38 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_UpdateColorIndices.c +Purpose : Implementation of LCD_UpdateColorIndices +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Private.h" +#include "GUI_Private.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LCD_UpdateColorIndices +*/ +void LCD_UpdateColorIndices(void) { + LCD_SetColorIndex(LCD_Color2Index(GUI_Context.Color)); + LCD_SetBkColorIndex(LCD_Color2Index(GUI_Context.BkColor)); +} + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Core/vssver.scc b/User/system/lib/lcd/gui/Core/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..9d43d9340e98582ca5243a80406ebaef777b2196 GIT binary patch literal 3488 zcmX}uc~nhX90%|+r6`e%We9o55T(>Zp;2a)R78;`SCg4auL;d&%Q8j0GDI>&QHmx? zbFT0ZB|;@*?|pk~efRz6uFv`Iebzo_@BKSlr;n_RBx%SOr7qLWLzAOYS})l@RcKut zHm;M*|35AKJNrH~zU|_nCW|ZMVRz5^=Yg%a4|aG0+}G)S9z7BEzjULTo&*o>9iK{T z!)rWV9HS@0N#Oy_^b|Pr+@`Ly4y@yB2Y;3-pEz8*s>W2?rc& z`9&MSLyPS1(8jR#?p%9%7Q9hqWE?#kHnXZRrsu$y!ae+H6WHYI&G)n^Y@KYki8h04 z+K!0#XAbAROf+`Cr>WcVJ}ltCv_>tqw}cNgM0Tg=!rsL-zO)r=wJI^0o(I3P`|_Ed z4@(Bkzd|p7ulDGqL@$K>)*V)%7s2Z@b`;W!;iz1%zo-MdMPZ`S@MLohI=F| z72~&oZIrM3Ft>#pd`dFtW$;pk%3ZV_eDe9!D0(?OS@p_e+8!Pfe9e<~fKO#K4WJ!i z^7Xh1Vtx`_0@Hjte?-nqCJxEUp*p(+v*PPK##l4sUIKkVt#L0sTkh)1Gjf z!G3qz3vOI#^^9H*x8%;XrX_H3!1OWn2Dnc3Yys^JyR=Ea(mwF96DIE?wM5vCUBjE8BVKQ_A?5R@S zMxTLGqCe@Z)?uGQDT-WE;zZ+PbzIWhhu*r_OLA@gL| zxi0u8eF4_oUv-(j2shelhAP^@_~pX);C#(GvA?q5ZZ(CX zzGuUdh>$w=zYm|hd%~B_fot<@YUy0~wBe0p`T-n0CnTMI2>TTJ_N4RR2DNl^Iv+0g zkItqG;K-m~N9jViB&x}RE`k>Y4i@8k1jk+|5cTjeoV&s^p6!d_apq4R(j~C5XRlcL z2^^Q}ChBo1>>u&Nj(Hh;vs!;RT@Gsu9j;GTz;oX9bD=9?b)Q)AeXfGdyax|sUJa)k zDYwuyaBpwr!}L?QY|r+Iv=mlo%noISi{G}}Li^(JVEdiw%yY8of@ z*Gu@t)g|(5{|_9LS+;|I1&=!WL7Y!s!wHgc66SAU71fdex(@DcaY&r+-ogc`ax0j> zgQXXW_2_zdU_!PyA2z_jlDBHi-^2P{4BP2OSVLMO>fZ-A>sy&D^N+B6Sa4su2|nax zBcAUQyeLz%EA!8AQMvE9af3d%_V%e8hTC zgomij{lHuaF83SONcV#8ht({gmEn`e@AsyA!^RdhGISq!()!g0XcgG}g;@^W7p@B5 z7fGwaNv(dOe)fawAJ&WWK!3Qr%0R5Y0kHbwU>pw)Dh#UX_ literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/Font/CCGUIFont.BAT b/User/system/lib/lcd/gui/Font/CCGUIFont.BAT new file mode 100644 index 0000000..05b25a3 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/CCGUIFont.BAT @@ -0,0 +1,54 @@ +@ECHO OFF + +ECHO CCGUIFont.BAT: Compiling GUI\Font + +CALL CC F08_1 +CALL CC F08_ASCII +CALL CC F10S_1 +CALL CC F10S_ASCII +CALL CC F10_1 +CALL CC F10_ASCII +CALL CC F13B_1 +CALL CC F13B_ASCII +CALL CC F13HB_1 +CALL CC F13HB_ASCII +CALL CC F13H_1 +CALL CC F13H_ASCII +CALL CC F13_1 +CALL CC F13_ASCII +CALL CC F16B_1 +CALL CC F16B_ASCII +CALL CC F16_1 +CALL CC F16_1HK +CALL CC F16_ASCII +CALL CC F16_HK +CALL CC F24_1 +CALL CC F24_ASCII +CALL CC F24B_1 +CALL CC F24B_ASCII +CALL CC F32_1 +CALL CC F32_ASCII +CALL CC F32B_1 +CALL CC F32B_ASCII +CALL CC F4x6 +CALL CC F6x8 +CALL CC F8x10_ASCII +CALL CC F8x12_ASCII +CALL CC F8x13_1 +CALL CC F8x13_ASCII +CALL CC F8x15B_1 +CALL CC F8x15B_ASCII +CALL CC F8x16 +CALL CC F8x8 +CALL CC FComic18B_1 +CALL CC FComic18B_ASCII +CALL CC FComic24B_1 +CALL CC FComic24B_ASCII +CALL CC FD24x32 +CALL CC FD32 +CALL CC FD36x48 +CALL CC FD48 +CALL CC FD48x64 +CALL CC FD60x80 +CALL CC FD64 +CALL CC FD80 diff --git a/User/system/lib/lcd/gui/Font/F08_1.c b/User/system/lib/lcd/gui/Font/F08_1.c new file mode 100644 index 0000000..4322ef1 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F08_1.c @@ -0,0 +1,1017 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8_1.C +Purpose : ISO 8859-1, West European Character Set +Height : 8 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +GUI_CONST_STORAGE unsigned char acFont8_1_160[8] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_161[8] = { /* code 161 */ + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______}; +GUI_CONST_STORAGE unsigned char acFont8_1_162[8] = { /* code 162 */ + ________, + __X_____, + _XXX____, + X_X_____, + X_X_____, + X_X_X___, + _XXX____, + __X_____}; +GUI_CONST_STORAGE unsigned char acFont8_1_163[8] = { /* code 163 */ + __XX____, + _X______, + _X______, + XXX_____, + _X______, + _X__X___, + X_XX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_164[8] = { /* code 164 */ + ________, + ________, + X___X___, + _XXX____, + _X_X____, + _XXX____, + X___X___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_165[8] = { /* code 165 */ + X___X___, + _X_X____, + XXXXX___, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_166[8] = { /* code 166 */ + __X_____, + __X_____, + __X_____, + ________, + __X_____, + __X_____, + __X_____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_167[8] = { /* code 167 */ + __XX____, + _X__X___, + __X_____, + _X_X____, + __X_____, + X__X____, + _XX_____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_168[8] = { /* code 168 */ + X___X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_169[8] = { /* code 169 */ + XXXXX___, + X___X___, + X_X_X___, + X_XXX___, + X_X_X___, + X___X___, + XXXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_170[8] = { /* code 170 */ + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXX____, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_171[8] = { /* code 171 */ + ________, + __X_X___, + _X_X____, + X_X_____, + _X_X____, + __X_X___, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_172[8] = { /* code 172 */ + ________, + ________, + ________, + XXXXX___, + ____X___, + ____X___, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_173[8] = { /* code 173 */ + ________, + ________, + ________, + _XXX____, + ________, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_174[8] = { /* code 174 */ + XXXXX___, + X___X___, + X_X_X___, + X___X___, + X__XX___, + X_X_X___, + XXXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_175[8] = { /* code 175 */ + XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_176[8] = { /* code 176 */ + __X_____, + _X_X____, + __X_____, + ________, + ________, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_177[8] = { /* code 177 */ + ________, + __X_____, + _XXX____, + __X_____, + ________, + _XXX____, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_178[8] = { /* code 178 */ + _XX_____, + X__X____, + __X_____, + _X______, + XXXX____, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_179[8] = { /* code 179 */ + XXX_____, + ___X____, + _XX_____, + ___X____, + XXX_____, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_180[8] = { /* code 180 */ + ___XX___, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_181[8] = { /* code 181 */ + ________, + ________, + X___X___, + X___X___, + X___X___, + XX__X___, + X_XX____, + X_______}; +GUI_CONST_STORAGE unsigned char acFont8_1_182[8] = { /* code 182 */ + _XXXX___, + X__XX___, + X__XX___, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_183[8] = { /* code 183 */ + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_184[8] = { /* code 184 */ + ________, + ________, + ________, + ________, + ________, + ________, + __X_____, + _XX_____}; +GUI_CONST_STORAGE unsigned char acFont8_1_185[8] = { /* code 185 */ + _X______, + XX______, + _X______, + _X______, + XXX_____, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_186[8] = { /* code 186 */ + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_187[8] = { /* code 187 */ + ________, + X_X_____, + _X_X____, + __X_X___, + _X_X____, + X_X_____, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_188[8] = { /* code 188 */ + X___X___, + X__X____, + X_X_____, + _X_X____, + X_XX____, + _X_X____, + _XXXX___, + ___X____}; +GUI_CONST_STORAGE unsigned char acFont8_1_189[8] = { /* code 189 */ + X___X___, + X__X____, + X_X_____, + _X______, + X_XXX___, + ____X___, + ___X____, + __XXX___}; +GUI_CONST_STORAGE unsigned char acFont8_1_190[8] = { /* code 190 */ + XX______, + _X______, + XX______, + _X__X___, + XX_XX___, + __X_X___, + __XXX___, + ____X___}; +GUI_CONST_STORAGE unsigned char acFont8_1_191[8] = { /* code 191 */ + ________, + __X_____, + ________, + __X_____, + __X_____, + _X______, + X___X___, + _XXX____}; +GUI_CONST_STORAGE unsigned char acFont8_1_192[8] = { /* code 192 */ + ________, + __X_____, + ___X____, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_}; +GUI_CONST_STORAGE unsigned char acFont8_1_193[8] = { /* code 193 */ + ________, + ____X___, + ___X____, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_}; +GUI_CONST_STORAGE unsigned char acFont8_1_194[8] = { /* code 194 */ + ________, + ___X____, + __X_X___, + __XXX___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_}; +GUI_CONST_STORAGE unsigned char acFont8_1_195[8] = { /* code 195 */ + ________, + __XX__X_, + _X__XX__, + __XXX___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_}; +GUI_CONST_STORAGE unsigned char acFont8_1_196[8] = { /* code 196 */ + ________, + _X___X__, + ___X____, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_}; +GUI_CONST_STORAGE unsigned char acFont8_1_197[8] = { /* code 197 */ + ________, + __XXX___, + __X_X___, + __XXX___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_}; +GUI_CONST_STORAGE unsigned char acFont8_1_198[8] = { /* code 198 */ + ________, + ___XXXX_, + __X_X___, + _X__X___, + _X__XXX_, + _XXXX___, + X___X___, + X___XXX_}; +GUI_CONST_STORAGE unsigned char acFont8_1_199[8] = { /* code 199 */ + ________, + _XXXX___, + X____X__, + X_______, + X_______, + X____X__, + _XXXXX__, + ____X___}; +GUI_CONST_STORAGE unsigned char acFont8_1_200[8] = { /* code 200 */ + _X______, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + XXXXX___}; +GUI_CONST_STORAGE unsigned char acFont8_1_201[8] = { /* code 201 */ + ___X____, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + XXXXX___}; +GUI_CONST_STORAGE unsigned char acFont8_1_202[8] = { /* code 202 */ + _XXX____, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + XXXXX___}; +GUI_CONST_STORAGE unsigned char acFont8_1_203[8] = { /* code 203 */ + _X_X____, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + XXXXX___}; +GUI_CONST_STORAGE unsigned char acFont8_1_204[8] = { /* code 204 */ + ________, + X_______, + _X______, + ________, + X_______, + X_______, + X_______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_205[8] = { /* code 205 */ + ________, + _X______, + X_______, + ________, + X_______, + X_______, + X_______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_206[8] = { /* code 206 */ + ________, + _X______, + X_X_____, + ________, + _X______, + _X______, + _X______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_207[8] = { /* code 207 */ + ________, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_208[8] = { /* code 208 */ + _XXXX___, + _X___X__, + _X____X_, + XXXX__X_, + _X____X_, + _X___X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_209[8] = { /* code 209 */ + _X_X____, + X____X__, + XX___X__, + X_X__X__, + X__X_X__, + X___XX__, + X____X__, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_210[8] = { /* code 210 */ + _X______, + __X_____, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_211[8] = { /* code 211 */ + ____X___, + ___X____, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_212[8] = { /* code 212 */ + __X_____, + _X_X____, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_213[8] = { /* code 213 */ + __X_X___, + _X_X____, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_214[8] = { /* code 214 */ + _X__X___, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_215[8] = { /* code 215 */ + ________, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_216[8] = { /* code 216 */ + __XXX_X_, + _X___X__, + X___X_X_, + X__X__X_, + X_X___X_, + _X___X__, + X_XXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_217[8] = { /* code 217 */ + __X_____, + ___X____, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_218[8] = { /* code 218 */ + ___X____, + __X_____, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_219[8] = { /* code 219 */ + __X_____, + _X_X____, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_220[8] = { /* code 220 */ + _X__X___, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_221[8] = { /* code 221 */ + ___X____, + X_X___X_, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_222[8] = { /* code 222 */ + ________, + X_______, + XXXXX___, + X____X__, + X____X__, + XXXXX___, + X_______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_223[8] = { /* code 223 */ + ________, + _XXX____, + X___X___, + X__X____, + X__XX___, + X_X__X__, + X__XX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_224[8] = { /* code 224 */ + __X_____, + ___X____, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_225[8] = { /* code 225 */ + ___X____, + __X_____, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_226[8] = { /* code 226 */ + __X_____, + _X_X____, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_227[8] = { /* code 227 */ + __X_X___, + _X_X____, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_228[8] = { /* code 228 */ + _X_X____, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_229[8] = { /* code 229 */ + _XXX____, + _X_X____, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_230[16] = { /* code 230 */ + ________,________, + _XXX_XXX,________, + ____X___,X_______, + _XXXXXXX,X_______, + X___X___,________, + X___X___,X_______, + _XXX_XXX,________, + ________,________}; +GUI_CONST_STORAGE unsigned char acFont8_1_231[8] = { /* code 231 */ + ________, + ________, + _XXX____, + X___X___, + X_______, + X___X___, + _XXX____, + ___X____}; +GUI_CONST_STORAGE unsigned char acFont8_1_232[8] = { /* code 232 */ + _X______, + __X_____, + _XXX____, + X___X___, + XXXXX___, + X_______, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_233[8] = { /* code 233 */ + ___X____, + __X_____, + _XXX____, + X___X___, + XXXXX___, + X_______, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_234[8] = { /* code 234 */ + __X_____, + _X_X____, + _XXX____, + X___X___, + XXXXX___, + X_______, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_235[8] = { /* code 235 */ + _X_X____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_236[8] = { /* code 236 */ + X_______, + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_237[8] = { /* code 237 */ + _X______, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_238[8] = { /* code 238 */ + _X______, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_239[8] = { /* code 239 */ + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_240[8] = { /* code 240 */ + ________, + __XXX___, + _X_X____, + _XXXX___, + X___X___, + X___X___, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_241[8] = { /* code 241 */ + __X_X___, + _X_X____, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_242[8] = { /* code 242 */ + _X______, + __X_____, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_243[8] = { /* code 243 */ + ___X____, + __X_____, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_244[8] = { /* code 244 */ + __X_____, + _X_X____, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_245[8] = { /* code 245 */ + __X_X___, + _X_X____, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_246[8] = { /* code 246 */ + _X_X____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_247[8] = { /* code 247 */ + ________, + __X_____, + ________, + XXXXX___, + ________, + __X_____, + ________, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_248[8] = { /* code 248 */ + ________, + ________, + _XX_X___, + X__XX___, + X_X_X___, + XX__X___, + X_XX____, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_249[8] = { /* code 249 */ + _X______, + __X_____, + ________, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_250[8] = { /* code 250 */ + ___X____, + __X_____, + ________, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_251[8] = { /* code 251 */ + __X_____, + _X_X____, + ________, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_252[8] = { /* code 252 */ + ________, + _X_X____, + ________, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_253[8] = { /* code 253 */ + ___X____, + __X_____, + X___X___, + X___X___, + _X_X____, + __X_____, + __X_____, + _X______}; +GUI_CONST_STORAGE unsigned char acFont8_1_254[8] = { /* code 254 */ + ________, + X_______, + XXXX____, + X___X___, + X___X___, + XXXX____, + X_______, + ________}; +GUI_CONST_STORAGE unsigned char acFont8_1_255[8] = { /* code 255 */ + ________, + __X_X___, + _X_X____, + X___X___, + _X_X____, + __X_____, + __X_____, + _X______}; + + +GUI_CONST_STORAGE GUI_CHARINFO Font8_1_CharInfo[96] = { + { 3, 3, 1, acFont8_1_160 } /* code 160 */ + ,{ 2, 2, 1, acFont8_1_161 } /* code 161 */ + ,{ 6, 6, 1, acFont8_1_162 } /* code 162 */ + ,{ 6, 6, 1, acFont8_1_163 } /* code 163 */ + ,{ 7, 7, 1, acFont8_1_164 } /* code 164 */ + ,{ 6, 6, 1, acFont8_1_165 } /* code 165 */ + ,{ 2, 2, 1, acFont8_1_166 } /* code 166 */ + ,{ 6, 6, 1, acFont8_1_167 } /* code 167 */ + ,{ 4, 4, 1, acFont8_1_168 } /* code 168 */ + ,{ 8, 8, 1, acFont8_1_169 } /* code 169 */ + ,{ 4, 4, 1, acFont8_1_170 } /* code 170 */ + ,{ 6, 6, 1, acFont8_1_171 } /* code 171 */ + ,{ 6, 6, 1, acFont8_1_172 } /* code 172 */ + ,{ 4, 4, 1, acFont8_1_173 } /* code 173 */ + ,{ 8, 8, 1, acFont8_1_174 } /* code 174 */ + ,{ 6, 6, 1, acFont8_1_175 } /* code 175 */ + ,{ 4, 4, 1, acFont8_1_176 } /* code 176 */ + ,{ 6, 6, 1, acFont8_1_177 } /* code 177 */ + ,{ 4, 4, 1, acFont8_1_178 } /* code 178 */ + ,{ 4, 4, 1, acFont8_1_179 } /* code 179 */ + ,{ 4, 4, 1, acFont8_1_180 } /* code 180 */ + ,{ 6, 6, 1, acFont8_1_181 } /* code 181 */ + ,{ 6, 6, 1, acFont8_1_182 } /* code 182 */ + ,{ 3, 3, 1, acFont8_1_183 } /* code 183 */ + ,{ 4, 4, 1, acFont8_1_184 } /* code 184 */ + ,{ 4, 4, 1, acFont8_1_185 } /* code 185 */ + ,{ 5, 5, 1, acFont8_1_186 } /* code 186 */ + ,{ 6, 6, 1, acFont8_1_187 } /* code 187 */ + ,{ 9, 9, 2, acFont8_1_188 } /* code 188 */ + ,{ 10, 10, 2, acFont8_1_189 } /* code 189 */ + ,{ 10, 10, 2, acFont8_1_190 } /* code 190 */ + ,{ 6, 6, 1, acFont8_1_191 } /* code 191 */ + ,{ 8, 8, 1, acFont8_1_192 } /* code 192 */ + ,{ 8, 8, 1, acFont8_1_193 } /* code 193 */ + ,{ 8, 8, 1, acFont8_1_194 } /* code 194 */ + ,{ 8, 8, 1, acFont8_1_195 } /* code 195 */ + ,{ 8, 8, 1, acFont8_1_196 } /* code 196 */ + ,{ 8, 8, 1, acFont8_1_197 } /* code 197 */ + ,{ 11, 11, 2, acFont8_1_198 } /* code 198 */ + ,{ 7, 7, 1, acFont8_1_199 } /* code 199 */ + ,{ 6, 6, 1, acFont8_1_200 } /* code 200 */ + ,{ 6, 6, 1, acFont8_1_201 } /* code 201 */ + ,{ 6, 6, 1, acFont8_1_202 } /* code 202 */ + ,{ 6, 6, 1, acFont8_1_203 } /* code 203 */ + ,{ 2, 2, 1, acFont8_1_204 } /* code 204 */ + ,{ 2, 2, 1, acFont8_1_205 } /* code 205 */ + ,{ 2, 2, 1, acFont8_1_206 } /* code 206 */ + ,{ 2, 2, 1, acFont8_1_207 } /* code 207 */ + ,{ 8, 8, 1, acFont8_1_208 } /* code 208 */ + ,{ 7, 7, 1, acFont8_1_209 } /* code 209 */ + ,{ 8, 8, 1, acFont8_1_210 } /* code 210 */ + ,{ 8, 8, 1, acFont8_1_211 } /* code 211 */ + ,{ 8, 8, 1, acFont8_1_212 } /* code 212 */ + ,{ 8, 8, 1, acFont8_1_213 } /* code 213 */ + ,{ 8, 8, 1, acFont8_1_214 } /* code 214 */ + ,{ 6, 6, 1, acFont8_1_215 } /* code 215 */ + ,{ 8, 8, 1, acFont8_1_216 } /* code 216 */ + ,{ 7, 7, 1, acFont8_1_217 } /* code 217 */ + ,{ 7, 7, 1, acFont8_1_218 } /* code 218 */ + ,{ 7, 7, 1, acFont8_1_219 } /* code 219 */ + ,{ 7, 7, 1, acFont8_1_220 } /* code 220 */ + ,{ 8, 8, 1, acFont8_1_221 } /* code 221 */ + ,{ 7, 7, 1, acFont8_1_222 } /* code 222 */ + ,{ 7, 7, 1, acFont8_1_223 } /* code 223 */ + ,{ 6, 6, 1, acFont8_1_224 } /* code 224 */ + ,{ 6, 6, 1, acFont8_1_225 } /* code 225 */ + ,{ 6, 6, 1, acFont8_1_226 } /* code 226 */ + ,{ 6, 6, 1, acFont8_1_227 } /* code 227 */ + ,{ 6, 6, 1, acFont8_1_228 } /* code 228 */ + ,{ 6, 6, 1, acFont8_1_229 } /* code 229 */ + ,{ 10, 10, 2, acFont8_1_230 } /* code 230 */ + ,{ 6, 6, 1, acFont8_1_231 } /* code 231 */ + ,{ 6, 6, 1, acFont8_1_232 } /* code 232 */ + ,{ 6, 6, 1, acFont8_1_233 } /* code 233 */ + ,{ 6, 6, 1, acFont8_1_234 } /* code 234 */ + ,{ 6, 6, 1, acFont8_1_235 } /* code 235 */ + ,{ 2, 2, 1, acFont8_1_236 } /* code 236 */ + ,{ 2, 2, 1, acFont8_1_237 } /* code 237 */ + ,{ 2, 2, 1, acFont8_1_238 } /* code 238 */ + ,{ 2, 2, 1, acFont8_1_239 } /* code 239 */ + ,{ 6, 6, 1, acFont8_1_240 } /* code 240 */ + ,{ 6, 6, 1, acFont8_1_241 } /* code 241 */ + ,{ 6, 6, 1, acFont8_1_242 } /* code 242 */ + ,{ 6, 6, 1, acFont8_1_243 } /* code 243 */ + ,{ 6, 6, 1, acFont8_1_244 } /* code 244 */ + ,{ 6, 6, 1, acFont8_1_245 } /* code 245 */ + ,{ 6, 6, 1, acFont8_1_246 } /* code 246 */ + ,{ 6, 6, 1, acFont8_1_247 } /* code 247 */ + ,{ 6, 6, 1, acFont8_1_248 } /* code 248 */ + ,{ 6, 6, 1, acFont8_1_249 } /* code 249 */ + ,{ 6, 6, 1, acFont8_1_250 } /* code 250 */ + ,{ 6, 6, 1, acFont8_1_251 } /* code 251 */ + ,{ 6, 6, 1, acFont8_1_252 } /* code 252 */ + ,{ 6, 6, 1, acFont8_1_253 } /* code 253 */ + ,{ 6, 6, 1, acFont8_1_254 } /* code 254 */ + ,{ 6, 6, 1, acFont8_1_255 } /* code 255 */ +}; + + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font8_1_Prop = { + 160 /* first character */ + ,255 /* last character */ + ,Font8_1_CharInfo /* address of first character */ + ,&GUI_Font8ASCII_Prop /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,8 /* height of font */ + ,8 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font8_1_Prop} + , 7, 5, 7 +}; +GUI_FONT GUI_Font8_2 = { + GUI_FONTTYPE_PROP /* type of font */ + ,8 /* height of font */ + ,8*2 /* space of font y */ + ,2 /* magnification x */ + ,2 /* magnification y */ + ,{&GUI_Font8_1_Prop} + , 7, 5, 7 +}; + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Font/F08_ASCII.c b/User/system/lib/lcd/gui/Font/F08_ASCII.c new file mode 100644 index 0000000..aa07143 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F08_ASCII.c @@ -0,0 +1,1182 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8_ASCII.C +Purpose : Proportional 8 pixel font, ASCII character set +Height : 8 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont8ASCII[][8] = { + { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* ! */ + ,{ + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + X_______, + ________} + + +/* " */ + ,{ + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________} + +/* # */ + ,{ + _X_X____, + _X_X____, + XXXXX___, + _X_X____, + XXXXX___, + _X_X____, + _X_X____, + ________} + +/* $ */ + ,{ + __X_____, + _XXXX___, + X_X_____, + _XXX____, + __X_X___, + XXXX____, + __X_____} + +/* % */ + ,{ + XX______, + XX__X___, + ___X____, + __X_____, + _X______, + X__XX___, + ___XX___, + ________} + +/* & */ + ,{ + _XX_____, + X__X____, + X_X_____, + _X______, + X_X_X___, + X__X____, + _XX_X___, + ________} + +/* ' */ + ,{ + XX______, + _X______, + X_______, + ________, + ________, + ________, + ________, + ________} + +/* ( */ + ,{ + __X_____, + _X______, + X_______, + X_______, + X_______, + _X______, + __X_____, + ________} + +/* ) */ + ,{ + X_______, + _X______, + __X_____, + __X_____, + __X_____, + _X______, + X_______, + ________} + +/* * */ + ,{ + ________, + _X_X____, + __X_____, + XXXXX___, + __X_____, + _X_X____, + ________, + ________} + + ,{ + ________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________, + ________} + + ,{ + ________, + ________, + ________, + ________, + ________, + XX______, + _X______, + X_______} + + ,{ + ________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________} + + ,{ + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + ________} + + ,{ + ________, + ____X___, + ___X____, + __X_____, + _X______, + X_______, + ________, + ________} + +/* 0 */ + ,{ + _XXX____, + X___X___, + X__XX___, + X_X_X___, + XX__X___, + X___X___, + _XXX____, + ________} + +/* 1 */ + ,{ + __X_____, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________} + +/* 2 */ + ,{ + _XXX____, + X___X___, + ____X___, + __XX____, + _X______, + X_______, + XXXXX___, + ________} + +/* 3 */ + ,{ + _XXX____, + X___X___, + ____X___, + __XX____, + ____X___, + X___X___, + _XXX____, + ________} + +/* 4 */ + ,{ + ___X____, + __XX____, + _X_X____, + X__X____, + XXXXX___, + ___X____, + ___X____, + ________} + +/* 5 */ + ,{ + XXXXX___, + X_______, + XXXX____, + ____X___, + ____X___, + X___X___, + _XXX____, + ________} + +/* 6 */ + ,{ + __XX____, + _X______, + X_______, + XXXX____, + X___X___, + X___X___, + _XXX____, + ________} + +/* 7 */ + ,{ + XXXXX___, + ____X___, + ___X____, + __X_____, + _X______, + _X______, + _X______, + ________} + +/* 8 */ + ,{ + _XXX____, + X___X___, + X___X___, + _XXX____, + X___X___, + X___X___, + _XXX____, + ________} + +/* 9 */ + ,{ + _XXX____, + X___X___, + X___X___, + _XXXX___, + ____X___, + ___X____, + _XX_____, + ________} + +/* ':' 3a */ + ,{ + ________, + XX______, + XX______, + ________, + XX______, + XX______, + ________, + ________} + +/* ';' 3b */ + ,{ + ________, + ________, + XX______, + XX______, + ________, + XX______, + _X______, + X_______} + + +/* '<' 3c */ + ,{ + ___X____, + __X_____, + _X______, + X_______, + _X______, + __X_____, + ___X____, + ________} + +/* '=' 3d */ + ,{ + ________, + ________, + XXXXX___, + ________, + XXXXX___, + ________, + ________, + ________} + +/* '>' */ + ,{ + X_______, + _X______, + __X_____, + ___X____, + __X_____, + _X______, + X_______, + ________} + +/* '?' */ + ,{ + _XXX____, + X___X___, + ____X___, + ___X____, + __X_____, + ________, + __X_____, + ________} + +/* @ */ + ,{ + _XXX____, + X___X___, + ____X___, + _XX_X___, + X_X_X___, + X_X_X___, + _XXX____, + ________} + +/* A */ + ,{ + _XXX____, + X___X___, + X___X___, + XXXXX___, + X___X___, + X___X___, + X___X___, + ________} + +/* B */ + ,{ + XXXX____, + X___X___, + X___X___, + XXXX____, + X___X___, + X___X___, + XXXX____, + ________} + +/* C */ + ,{ + _XXX____, + X___X___, + X_______, + X_______, + X_______, + X___X___, + _XXX____, + ________} + +/* D */ + ,{ + XXX_____, + X__X____, + X___X___, + X___X___, + X___X___, + X__X____, + XXX_____, + ________} + +/* E */ + ,{ + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + XXXXX___, + ________} + +/* 1 */ + ,{ + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + ________} + +/* 1 */ + ,{ + _XXX____, + X___X___, + X_______, + X_______, + X__XX___, + X___X___, + _XXXX___, + ________} + +/* 1 */ + ,{ + X___X___, + X___X___, + X___X___, + XXXXX___, + X___X___, + X___X___, + X___X___, + ________} + +/* I */ + ,{ + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________} + +/* J */ + ,{ + __XXX___, + ___X____, + ___X____, + ___X____, + ___X____, + X__X____, + _XX_____, + ________} + +/* K */ + ,{ + X___X___, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + X___X___, + ________} + +/* L */ + ,{ + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XXXXX___, + ________} + +/* M */ + ,{ + X___X___, + XX_XX___, + X_X_X___, + X_X_X___, + X___X___, + X___X___, + X___X___, + ________} + +/* N */ + ,{ + X___X___, + X___X___, + XX__X___, + X_X_X___, + X__XX___, + X___X___, + X___X___, + ________} + +/* O */ + ,{ + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + +/* P */ + ,{ + XXXX____, + X___X___, + X___X___, + XXXX____, + X_______, + X_______, + X_______, + ________} + +/* Q */ + ,{ + _XXX____, + X___X___, + X___X___, + X___X___, + X_X_X___, + X__X____, + _XX_X___, + ________} + +/* R */ + ,{ + XXXX____, + X___X___, + X___X___, + XXXX____, + X_X_____, + X__X____, + X___X___, + ________} + +/* S */ + ,{ + _XXX____, + X___X___, + X_______, + _XXX____, + ____X___, + X___X___, + _XXX____, + ________} + +/* T */ + ,{ + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________} + +/* U */ + ,{ + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + +/* V */ + ,{ + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _X_X____, + __X_____, + ________} + +/* W */ + ,{ + X___X___, + X___X___, + X___X___, + X_X_X___, + X_X_X___, + X_X_X___, + _X_X____, + ________} + +/* X */ + ,{ + X___X___, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + X___X___, + ________} + +/* Y */ + ,{ + X___X___, + X___X___, + _X_X____, + __X_____, + __X_____, + __X_____, + __X_____, + ________} + +/* Z */ + ,{ + XXXXX___, + ____X___, + ___X____, + __X_____, + _X______, + X_______, + XXXXX___, + ________} + +/* 5b */ + ,{ + XXX_____, + X_______, + X_______, + X_______, + X_______, + X_______, + XXX_____, + ________} + +/* 5c */ + ,{ + ________, + X_______, + _X______, + __X_____, + ___X____, + ____X___, + ________, + ________} + +/* 5d */ + ,{ + XXX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + XXX_____, + ________} + +/* 5e */ + ,{ + __X_____, + _X_X____, + X___X___, + ________, + ________, + ________, + ________, + ________} + +/* 5f */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXX___} + +/* 60 */ + ,{ + X_______, + _X______, + __X_____, + ________, + ________, + ________, + ________, + ________} + +/* a */ + ,{ + ________, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________} + +/* b */ + ,{ + X_______, + X_______, + X_XX____, + XX__X___, + X___X___, + X___X___, + XXXX____, + ________} + +/* c */ + ,{ + ________, + ________, + _XX_____, + X__X____, + X_______, + X__X____, + _XX_____, + ________} + +/* d */ + ,{ + ____X___, + ____X___, + _XX_X___, + X__XX___, + X___X___, + X___X___, + _XXXX___, + ________} + +/* e */ + ,{ + ________, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + _XXX____, + ________} + +/* f */ + ,{ + __X_____, + _X_X____, + _X______, + XXX_____, + _X______, + _X______, + _X______, + ________} + +/* g */ + ,{ + ________, + ________, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ____X___, + _XXX____} + +/* h */ + ,{ + X_______, + X_______, + X_XX____, + XX__X___, + X___X___, + X___X___, + X___X___, + ________} + +/* i */ + ,{ + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + ________} + +/* j */ + ,{ + __X_____, + ________, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + XX______} + +/* k */ + ,{ + X_______, + X_______, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + ________} + +/* l */ + ,{ + XX______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________} + +/* m */ + ,{ + ________, + ________, + XX_X____, + X_X_X___, + X___X___, + X___X___, + X___X___, + ________} + +/* n */ + ,{ + ________, + ________, + X_XX____, + XX_X____, + X__X____, + X__X____, + X__X____, + ________} + +/* o */ + ,{ + ________, + ________, + _XX_____, + X__X____, + X__X____, + X__X____, + _XX_____, + ________} + +/* p */ + ,{ + ________, + ________, + XXX_____, + X__X____, + X__X____, + XXX_____, + X_______, + X_______} + +/* q */ + ,{ + ________, + ________, + _XXX____, + X__X____, + X__X____, + _XXX____, + ___X____, + ___X____} + +/* r */ + ,{ + ________, + ________, + X_X_____, + XX______, + X_______, + X_______, + X_______, + ________} + +/* s */ + ,{ + ________, + ________, + _XXX____, + X_______, + _XX_____, + ___X____, + XXX_____, + ________} + +/* t */ + ,{ + _X______, + _X______, + XXX_____, + _X______, + _X______, + _X______, + _X______, + ________} + +/* u */ + ,{ + ________, + ________, + X__X____, + X__X____, + X__X____, + X__X____, + _XXX____, + ________} + +/* v */ + ,{ + ________, + ________, + X___X___, + X___X___, + X___X___, + _X_X____, + __X_____, + ________} + +/* w */ + ,{ + ________, + ________, + X___X___, + X___X___, + X_X_X___, + X_X_X___, + _X_X____, + ________} + +/* X */ + ,{ + ________, + ________, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + ________} + +/* y */ + ,{ + ________, + ________, + X__X____, + X__X____, + X__X____, + _XXX____, + ___X____, + _XX_____} + +/* z */ + ,{ + ________, + ________, + XXXXX___, + ___X____, + __X_____, + _X______, + XXXXX___, + ________} + +/* 0x7b */ + ,{ + __X_____, + _X______, + _X______, + X_______, + _X______, + _X______, + __X_____, + ________} + +/* 0x7c */ + ,{ + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________} + +/* 0x7d */ + ,{ + X_______, + _X______, + _X______, + __X_____, + _X______, + _X______, + X_______, + ________} + +/* 0x7e */ + ,{ + _XX_X___, + X__X____, + ________, + ________, + ________, + ________, + ________, + ________} +}; + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font8_ASCII_CharInfo[95] = { + { 3,3,1, acFont8ASCII[0]} /* char.code 32: ' ' */ + ,{ 2,2,1, acFont8ASCII[1]} /* char.code 33: '!' */ + ,{ 4,4,1, acFont8ASCII[2]} /* char.code 34: '"' */ + ,{ 6,6,1, acFont8ASCII[3]} /* char.code 35: '#' */ + ,{ 6,6,1, acFont8ASCII[4]} /* char.code 36: '$' */ + ,{ 6,6,1, acFont8ASCII[5]} /* char.code 37: '%' */ + ,{ 6,6,1, acFont8ASCII[6]} /* char.code 38: '&' */ + ,{ 3,3,1, acFont8ASCII[7]} /* char.code 39: ''' */ + ,{ 4,4,1, acFont8ASCII[8]} /* char.code 40: '(' */ + ,{ 4,4,1, acFont8ASCII[9]} /* char.code 41: ')' */ + ,{ 6,6,1, acFont8ASCII[10]} /* char.code 42: '*' */ + ,{ 6,6,1, acFont8ASCII[11]} /* char.code 43: '+' */ + ,{ 3,3,1, acFont8ASCII[12]} /* char.code 44: ',' */ + ,{ 6,6,1, acFont8ASCII[13]} /* char.code 45: '-' */ + ,{ 3,3,1, acFont8ASCII[14]} /* char.code 46: '.' point */ + ,{ 6,6,1, acFont8ASCII[15]} /* char.code 47: '/' */ + ,{ 6,6,1, acFont8ASCII[16]} /* char.code 48: '0' */ + ,{ 6,6,1, acFont8ASCII[17]} /* char.code 49: '1' */ + ,{ 6,6,1, acFont8ASCII[18]} /* char.code 50: '2' */ + ,{ 6,6,1, acFont8ASCII[19]} /* char.code 51: '3' */ + ,{ 6,6,1, acFont8ASCII[20]} /* char.code 52: '4' */ + ,{ 6,6,1, acFont8ASCII[21]} /* char.code 53: '5' */ + ,{ 6,6,1, acFont8ASCII[22]} /* char.code 54: '6' */ + ,{ 6,6,1, acFont8ASCII[23]} /* char.code 55: '7' */ + ,{ 6,6,1, acFont8ASCII[24]} /* char.code 56: '8' */ + ,{ 6,6,1, acFont8ASCII[25]} /* char.code 57: '9' */ + ,{ 3,3,1, acFont8ASCII[26]} /* char.code 58: ':' */ + ,{ 3,3,1, acFont8ASCII[27]} /* char.code 59: ';' */ + ,{ 5,5,1, acFont8ASCII[28]} /* char.code 60: '<' */ + ,{ 6,6,1, acFont8ASCII[29]} /* char.code 61: '=' */ + ,{ 5,5,1, acFont8ASCII[30]} /* char.code 62: '>' */ + ,{ 6,6,1, acFont8ASCII[31]} /* char.code 63: '?' */ + ,{ 6,6,1, acFont8ASCII[32]} /* char.code 64: '@' */ + ,{ 6,6,1, acFont8ASCII[33]} /* char.code 65: 'A' */ + ,{ 6,6,1, acFont8ASCII[34]} /* char.code 66: 'B' */ + ,{ 6,6,1, acFont8ASCII[35]} /* char.code 67: 'C' */ + ,{ 6,6,1, acFont8ASCII[36]} /* char.code 68: 'D' */ + ,{ 6,6,1, acFont8ASCII[37]} /* char.code 69: 'E' */ + ,{ 6,6,1, acFont8ASCII[38]} /* char.code 70: 'F' */ + ,{ 6,6,1, acFont8ASCII[39]} /* char.code 71: 'G' */ + ,{ 6,6,1, acFont8ASCII[40]} /* char.code 72: 'H' */ + ,{ 4,4,1, acFont8ASCII[41]} /* char.code 73: 'I' */ + ,{ 6,6,1, acFont8ASCII[42]} /* char.code 74: 'J' */ + ,{ 6,6,1, acFont8ASCII[43]} /* char.code 75: 'K' */ + ,{ 6,6,1, acFont8ASCII[44]} /* char.code 76: 'L' */ + ,{ 6,6,1, acFont8ASCII[45]} /* char.code 77: 'M' */ + ,{ 6,6,1, acFont8ASCII[46]} /* char.code 78: 'N' */ + ,{ 6,6,1, acFont8ASCII[47]} /* char.code 79: 'O' */ + ,{ 6,6,1, acFont8ASCII[48]} /* char.code 80: 'P' */ + ,{ 6,6,1, acFont8ASCII[49]} /* char.code 81: 'Q' */ + ,{ 6,6,1, acFont8ASCII[50]} /* char.code 82: 'R' */ + ,{ 6,6,1, acFont8ASCII[51]} /* char.code 83: 'S' */ + ,{ 6,6,1, acFont8ASCII[52]} /* char.code 84: 'T' */ + ,{ 6,6,1, acFont8ASCII[53]} /* char.code 85: 'U' */ + ,{ 6,6,1, acFont8ASCII[54]} /* char.code 86: 'V' */ + ,{ 6,6,1, acFont8ASCII[55]} /* char.code 87: 'W' */ + ,{ 6,6,1, acFont8ASCII[56]} /* char.code 88: 'X' */ + ,{ 6,6,1, acFont8ASCII[57]} /* char.code 89: 'Y' */ + ,{ 6,6,1, acFont8ASCII[58]} /* char.code 90: 'Z' */ + ,{ 4,4,1, acFont8ASCII[59]} /* char.code 91: '[' */ + ,{ 6,6,1, acFont8ASCII[60]} /* char.code 92: '\' */ + ,{ 4,4,1, acFont8ASCII[61]} /* char.code 93: ']' */ + ,{ 6,6,1, acFont8ASCII[62]} /* char.code 94: '^' */ + ,{ 6,6,1, acFont8ASCII[63]} /* char.code 95: '_' */ + ,{ 6,6,1, acFont8ASCII[64]} /* char.code 96: '`' */ + ,{ 6,6,1, acFont8ASCII[65]} /* char.code 97: 'a' */ + ,{ 6,6,1, acFont8ASCII[66]} /* char.code 98: 'b' */ + ,{ 5,5,1, acFont8ASCII[67]} /* char.code 99: 'c' */ + ,{ 6,6,1, acFont8ASCII[68]} /* char.code 100: 'd' */ + ,{ 6,6,1, acFont8ASCII[69]} /* char.code 101: 'e' */ + ,{ 5,5,1, acFont8ASCII[70]} /* char.code 102: 'f' */ + ,{ 6,6,1, acFont8ASCII[71]} /* char.code 103: 'g' */ + ,{ 6,6,1, acFont8ASCII[72]} /* char.code 104: 'h' */ + ,{ 2,2,1, acFont8ASCII[73]} /* char.code 105: 'i' */ + ,{ 4,4,1, acFont8ASCII[74]} /* char.code 106: 'j' */ + ,{ 5,5,1, acFont8ASCII[75]} /* char.code 107: 'k' */ + ,{ 4,4,1, acFont8ASCII[76]} /* char.code 108: 'l' */ + ,{ 6,6,1, acFont8ASCII[77]} /* char.code 109: 'm' */ + ,{ 5,5,1, acFont8ASCII[78]} /* char.code 110: 'n' */ + ,{ 5,5,1, acFont8ASCII[79]} /* char.code 111: 'o' */ + ,{ 5,5,1, acFont8ASCII[80]} /* char.code 112: 'p' */ + ,{ 5,5,1, acFont8ASCII[81]} /* char.code 113: 'q' */ + ,{ 4,4,1, acFont8ASCII[82]} /* char.code 114: 'r' */ + ,{ 5,5,1, acFont8ASCII[83]} /* char.code 115: 's' */ + ,{ 4,4,1, acFont8ASCII[84]} /* char.code 116: 't' */ + ,{ 5,5,1, acFont8ASCII[85]} /* char.code 117: 'u' */ + ,{ 6,6,1, acFont8ASCII[86]} /* char.code 118: 'v' */ + ,{ 6,6,1, acFont8ASCII[87]} /* char.code 119: 'w' */ + ,{ 6,6,1, acFont8ASCII[88]} /* char.code 120: 'x' */ + ,{ 5,5,1, acFont8ASCII[89]} /* char.code 121: 'y' */ + ,{ 6,6,1, acFont8ASCII[90]} /* char.code 122: 'z' */ + ,{ 4,4,1, acFont8ASCII[91]} /* char.code 123: '{' */ + ,{ 3,3,1, acFont8ASCII[92]} /* char.code 124: '|' */ + ,{ 4,4,1, acFont8ASCII[93]} /* char.code 125: '}' */ + ,{ 6,6,1, acFont8ASCII[94]} /* char.code 126: '~' */ +}; + + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font8ASCII_Prop = { + 32 /* first character */ + ,126 /* last character */ + ,&GUI_Font8_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONTRANGE */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,8 /* height of font */ + ,8 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font8ASCII_Prop} + , 7, 5, 7 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Font/F10S_1.c b/User/system/lib/lcd/gui/Font/F10S_1.c new file mode 100644 index 0000000..1dd616e --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F10S_1.c @@ -0,0 +1,1293 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F10S.C +Purpose : Proportional small font +Height : 10 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont10S_1_160[10] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_161[10] = { /* code 161 */ + ________, + ________, + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_162[10] = { /* code 162 */ + ________, + ________, + ________, + ___X____, + __XX____, + _X______, + _X______, + __XX____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_163[10] = { /* code 163 */ + ________, + ________, + ___X____, + __X_X___, + __X_____, + _XXX____, + __X_____, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_164[10] = { /* code 164 */ + ________, + ________, + _X_X____, + __X_____, + _X_X____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_165[10] = { /* code 165 */ + ________, + ________, + _X_X____, + __X_____, + _XXX____, + __X_____, + _XXX____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_166[10] = { /* code 166 */ + ________, + ________, + _X______, + _X______, + _X______, + ________, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_167[10] = { /* code 167 */ + ________, + ________, + __X_____, + _X_X____, + _XX_____, + _X_X____, + __XX____, + _X_X____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_168[10] = { /* code 168 */ + ________, + ________, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_169[10] = { /* code 169 */ + ________, + ________, + __XXX___, + _X___X__, + _X_X_X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_170[10] = { /* code 170 */ + ________, + ________, + __X_____, + _XX_____, + ________, + _XX_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_171[10] = { /* code 171 */ + ________, + ________, + ________, + ________, + ________, + __X_X___, + _X_X____, + __X_X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_172[10] = { /* code 172 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + ____X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_173[10] = { /* code 173 */ + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_174[10] = { /* code 174 */ + ________, + ________, + __XXX___, + _X___X__, + _X_X_X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_175[10] = { /* code 175 */ + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_176[10] = { /* code 176 */ + ________, + ________, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_177[10] = { /* code 177 */ + ________, + ________, + ________, + ________, + __X_____, + _XXX____, + __X_____, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_178[10] = { /* code 178 */ + ________, + ________, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_179[10] = { /* code 179 */ + ________, + ________, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_180[10] = { /* code 180 */ + ________, + ________, + _X______, + X_______, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_181[10] = { /* code 181 */ + ________, + ________, + ________, + ________, + _X_X____, + _X_X____, + _X_X____, + _XX_X___, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_182[10] = { /* code 182 */ + ________, + ________, + __XX____, + _XXX____, + _XXX____, + _XXX____, + __XX____, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_183[10] = { /* code 183 */ + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_184[10] = { /* code 184 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __X_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_185[10] = { /* code 185 */ + ________, + ________, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_186[10] = { /* code 186 */ + ________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_187[10] = { /* code 187 */ + ________, + ________, + ________, + ________, + ________, + _X_X____, + __X_X___, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_188[10] = { /* code 188 */ + ________, + ________, + __X_____, + __X__X__, + ____X___, + ___X_X__, + __X_XX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_189[10] = { /* code 189 */ + ________, + ________, + __X_____, + __X__X__, + ____X___, + ___X____, + __X_XX__, + _X__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_190[10] = { /* code 190 */ + ________, + ________, + _XX_____, + _XX__X__, + ____X___, + ___X_X__, + __X_XX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_191[10] = { /* code 191 */ + ________, + ________, + ________, + __X_____, + ________, + __X_____, + __X_____, + _X______, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_192[10] = { /* code 192 */ + __X_____, + ___X____, + ___X____, + ___X____, + __X_X___, + __X_X___, + _XXXXX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_193[10] = { /* code 193 */ + ____X___, + ___X____, + ___X____, + ___X____, + __X_X___, + __X_X___, + _XXXXX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_194[10] = { /* code 194 */ + ___X____, + __X_X___, + ___X____, + ___X____, + __X_X___, + __X_X___, + _XXXXX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_195[10] = { /* code 195 */ + ___X_X__, + __X_X___, + ___X____, + ___X____, + __X_X___, + __X_X___, + _XXXXX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_196[10] = { /* code 196 */ + __X_X___, + ________, + ___X____, + ___X____, + __X_X___, + __X_X___, + _XXXXX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_197[10] = { /* code 197 */ + ___X____, + __X_X___, + ___X____, + ___X____, + __X_X___, + __X_X___, + _XXXXX__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_198[10] = { /* code 198 */ + ________, + ________, + ____XXXX, + ___XX___, + ___XXXXX, + __X_X___, + _XXXX___, + _X__XXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_199[10] = { /* code 199 */ + ________, + ________, + __XX____, + _X__X___, + _X______, + _X______, + _X__X___, + __XX____, + ___X____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_200[10] = { /* code 200 */ + __X_____, + ___X____, + _XXXX___, + _X______, + _XXXX___, + _X______, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_201[10] = { /* code 201 */ + ___X____, + __X_____, + _XXXX___, + _X______, + _XXXX___, + _X______, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_202[10] = { /* code 202 */ + ___X____, + __X_X___, + _XXXX___, + _X______, + _XXXX___, + _X______, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_203[10] = { /* code 203 */ + _X__X___, + ________, + _XXXX___, + _X______, + _XXXX___, + _X______, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_204[10] = { /* code 204 */ + X_______, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_205[10] = { /* code 205 */ + __X_____, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_206[10] = { /* code 206 */ + _X______, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_207[10] = { /* code 207 */ + X_X_____, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_208[10] = { /* code 208 */ + ________, + ________, + _XXXX___, + _X___X__, + XXX__X__, + _X___X__, + _X___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_209[10] = { /* code 209 */ + ___X_X__, + __X_X___, + _X___X__, + _XX__X__, + _X_X_X__, + _X__XX__, + _X___X__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_210[10] = { /* code 210 */ + __X_____, + ___X____, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_211[10] = { /* code 211 */ + ____X___, + ___X____, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_212[10] = { /* code 212 */ + ___X____, + __X_X___, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_213[10] = { /* code 213 */ + ___X_X__, + __X_X___, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_214[10] = { /* code 214 */ + __X_X___, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_215[10] = { /* code 215 */ + ________, + ________, + ________, + ________, + _X_X____, + __X_____, + _X_X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_216[10] = { /* code 216 */ + ________, + ________, + __XXXX__, + _X__XX__, + _X_X_X__, + _X_X_X__, + _XX__X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_217[10] = { /* code 217 */ + __X_____, + ___X____, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_218[10] = { /* code 218 */ + ____X___, + ___X____, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_219[10] = { /* code 219 */ + ___X____, + __X_X___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_220[10] = { /* code 220 */ + __X_X___, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_221[10] = { /* code 221 */ + ____X___, + ___X____, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_222[10] = { /* code 222 */ + ________, + ________, + _X______, + _XXX____, + _X__X___, + _X__X___, + _XXX____, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_223[10] = { /* code 223 */ + ________, + ________, + __X_____, + _X_X____, + _XXX____, + _X__X___, + _X__X___, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_224[10] = { /* code 224 */ + ________, + _X______, + __X_____, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_225[10] = { /* code 225 */ + ________, + ___X____, + __X_____, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_226[10] = { /* code 226 */ + ________, + __X_____, + _X_X____, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_227[10] = { /* code 227 */ + ________, + __XX____, + _XX_____, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_228[10] = { /* code 228 */ + ________, + ________, + _X_X____, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_229[10] = { /* code 229 */ + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_230[10] = { /* code 230 */ + ________, + ________, + ________, + ________, + _XX_XX__, + ___X_X__, + _X_XX___, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_231[10] = { /* code 231 */ + ________, + ________, + ________, + ________, + __XX____, + _X______, + _X______, + __XX____, + ___X____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_232[10] = { /* code 232 */ + ________, + __X_____, + ___X____, + ________, + __X_____, + _X_X____, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_233[10] = { /* code 233 */ + ________, + ___X____, + __X_____, + ________, + __X_____, + _X_X____, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_234[10] = { /* code 234 */ + ________, + __X_____, + _X_X____, + ________, + __X_____, + _X_X____, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_235[10] = { /* code 235 */ + ________, + ________, + _X_X____, + ________, + __X_____, + _X_X____, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_236[10] = { /* code 236 */ + ________, + X_______, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_237[10] = { /* code 237 */ + ________, + __X_____, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_238[10] = { /* code 238 */ + ________, + _X______, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_239[10] = { /* code 239 */ + ________, + ________, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_240[10] = { /* code 240 */ + ________, + ________, + ________, + __XX____, + ___X____, + __XX____, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_241[10] = { /* code 241 */ + ________, + __XX____, + _XX_____, + ________, + _XX_____, + _X_X____, + _X_X____, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_242[10] = { /* code 242 */ + ________, + __X_____, + ___X____, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_243[10] = { /* code 243 */ + ________, + ___X____, + __X_____, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_244[10] = { /* code 244 */ + ________, + ___X____, + __X_X___, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_245[10] = { /* code 245 */ + ________, + ___XX___, + __XX____, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_246[10] = { /* code 246 */ + ________, + ________, + _X__X___, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_247[10] = { /* code 247 */ + ________, + ________, + ________, + ________, + __X_____, + _XXX____, + __X_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_248[10] = { /* code 248 */ + ________, + ________, + ________, + ________, + __XXX___, + _X_XX___, + _XX_X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_249[10] = { /* code 249 */ + ________, + __X_____, + ___X____, + ________, + _X_X____, + _X_X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_250[10] = { /* code 250 */ + ________, + ___X____, + __X_____, + ________, + _X_X____, + _X_X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_251[10] = { /* code 251 */ + ________, + __X_____, + _X_X____, + ________, + _X_X____, + _X_X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_252[10] = { /* code 252 */ + ________, + ________, + _X_X____, + ________, + _X_X____, + _X_X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_253[10] = { /* code 253 */ + ________, + ___X____, + __X_____, + ________, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_254[10] = { /* code 254 */ + ________, + ________, + ________, + _X______, + _XX_____, + _X_X____, + _X_X____, + _XX_____, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_1_255[10] = { /* code 255 */ + ________, + ________, + _X_X____, + ________, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______}; + + + +GUI_CONST_STORAGE GUI_CHARINFO Font10S_1_CharInfo[96] = { + { 2, 2, 1, acFont10S_1_160 } /* code 160 */ + ,{ 2, 2, 1, acFont10S_1_161 } /* code 161 */ + ,{ 4, 4, 1, acFont10S_1_162 } /* code 162 */ + ,{ 5, 5, 1, acFont10S_1_163 } /* code 163 */ + ,{ 4, 4, 1, acFont10S_1_164 } /* code 164 */ + ,{ 4, 4, 1, acFont10S_1_165 } /* code 165 */ + ,{ 2, 2, 1, acFont10S_1_166 } /* code 166 */ + ,{ 4, 4, 1, acFont10S_1_167 } /* code 167 */ + ,{ 3, 3, 1, acFont10S_1_168 } /* code 168 */ + ,{ 6, 6, 1, acFont10S_1_169 } /* code 169 */ + ,{ 3, 3, 1, acFont10S_1_170 } /* code 170 */ + ,{ 5, 5, 1, acFont10S_1_171 } /* code 171 */ + ,{ 5, 5, 1, acFont10S_1_172 } /* code 172 */ + ,{ 2, 2, 1, acFont10S_1_173 } /* code 173 */ + ,{ 6, 6, 1, acFont10S_1_174 } /* code 174 */ + ,{ 4, 4, 1, acFont10S_1_175 } /* code 175 */ + ,{ 2, 2, 1, acFont10S_1_176 } /* code 176 */ + ,{ 4, 4, 1, acFont10S_1_177 } /* code 177 */ + ,{ 2, 2, 1, acFont10S_1_178 } /* code 178 */ + ,{ 2, 2, 1, acFont10S_1_179 } /* code 179 */ + ,{ 2, 2, 1, acFont10S_1_180 } /* code 180 */ + ,{ 5, 5, 1, acFont10S_1_181 } /* code 181 */ + ,{ 4, 4, 1, acFont10S_1_182 } /* code 182 */ + ,{ 2, 2, 1, acFont10S_1_183 } /* code 183 */ + ,{ 3, 3, 1, acFont10S_1_184 } /* code 184 */ + ,{ 2, 2, 1, acFont10S_1_185 } /* code 185 */ + ,{ 3, 3, 1, acFont10S_1_186 } /* code 186 */ + ,{ 5, 5, 1, acFont10S_1_187 } /* code 187 */ + ,{ 6, 6, 1, acFont10S_1_188 } /* code 188 */ + ,{ 6, 6, 1, acFont10S_1_189 } /* code 189 */ + ,{ 6, 6, 1, acFont10S_1_190 } /* code 190 */ + ,{ 4, 4, 1, acFont10S_1_191 } /* code 191 */ + ,{ 6, 6, 1, acFont10S_1_192 } /* code 192 */ + ,{ 6, 6, 1, acFont10S_1_193 } /* code 193 */ + ,{ 6, 6, 1, acFont10S_1_194 } /* code 194 */ + ,{ 6, 6, 1, acFont10S_1_195 } /* code 195 */ + ,{ 6, 6, 1, acFont10S_1_196 } /* code 196 */ + ,{ 6, 6, 1, acFont10S_1_197 } /* code 197 */ + ,{ 8, 8, 1, acFont10S_1_198 } /* code 198 */ + ,{ 5, 5, 1, acFont10S_1_199 } /* code 199 */ + ,{ 5, 5, 1, acFont10S_1_200 } /* code 200 */ + ,{ 5, 5, 1, acFont10S_1_201 } /* code 201 */ + ,{ 5, 5, 1, acFont10S_1_202 } /* code 202 */ + ,{ 5, 5, 1, acFont10S_1_203 } /* code 203 */ + ,{ 2, 2, 1, acFont10S_1_204 } /* code 204 */ + ,{ 3, 3, 1, acFont10S_1_205 } /* code 205 */ + ,{ 3, 3, 1, acFont10S_1_206 } /* code 206 */ + ,{ 3, 3, 1, acFont10S_1_207 } /* code 207 */ + ,{ 6, 6, 1, acFont10S_1_208 } /* code 208 */ + ,{ 6, 6, 1, acFont10S_1_209 } /* code 209 */ + ,{ 6, 6, 1, acFont10S_1_210 } /* code 210 */ + ,{ 6, 6, 1, acFont10S_1_211 } /* code 211 */ + ,{ 6, 6, 1, acFont10S_1_212 } /* code 212 */ + ,{ 6, 6, 1, acFont10S_1_213 } /* code 213 */ + ,{ 6, 6, 1, acFont10S_1_214 } /* code 214 */ + ,{ 4, 4, 1, acFont10S_1_215 } /* code 215 */ + ,{ 6, 6, 1, acFont10S_1_216 } /* code 216 */ + ,{ 6, 6, 1, acFont10S_1_217 } /* code 217 */ + ,{ 6, 6, 1, acFont10S_1_218 } /* code 218 */ + ,{ 6, 6, 1, acFont10S_1_219 } /* code 219 */ + ,{ 6, 6, 1, acFont10S_1_220 } /* code 220 */ + ,{ 6, 6, 1, acFont10S_1_221 } /* code 221 */ + ,{ 5, 5, 1, acFont10S_1_222 } /* code 222 */ + ,{ 5, 5, 1, acFont10S_1_223 } /* code 223 */ + ,{ 4, 4, 1, acFont10S_1_224 } /* code 224 */ + ,{ 4, 4, 1, acFont10S_1_225 } /* code 225 */ + ,{ 4, 4, 1, acFont10S_1_226 } /* code 226 */ + ,{ 4, 4, 1, acFont10S_1_227 } /* code 227 */ + ,{ 4, 4, 1, acFont10S_1_228 } /* code 228 */ + ,{ 4, 4, 1, acFont10S_1_229 } /* code 229 */ + ,{ 6, 6, 1, acFont10S_1_230 } /* code 230 */ + ,{ 4, 4, 1, acFont10S_1_231 } /* code 231 */ + ,{ 4, 4, 1, acFont10S_1_232 } /* code 232 */ + ,{ 4, 4, 1, acFont10S_1_233 } /* code 233 */ + ,{ 4, 4, 1, acFont10S_1_234 } /* code 234 */ + ,{ 4, 4, 1, acFont10S_1_235 } /* code 235 */ + ,{ 2, 2, 1, acFont10S_1_236 } /* code 236 */ + ,{ 3, 3, 1, acFont10S_1_237 } /* code 237 */ + ,{ 3, 3, 1, acFont10S_1_238 } /* code 238 */ + ,{ 3, 3, 1, acFont10S_1_239 } /* code 239 */ + ,{ 5, 5, 1, acFont10S_1_240 } /* code 240 */ + ,{ 4, 4, 1, acFont10S_1_241 } /* code 241 */ + ,{ 5, 5, 1, acFont10S_1_242 } /* code 242 */ + ,{ 5, 5, 1, acFont10S_1_243 } /* code 243 */ + ,{ 5, 5, 1, acFont10S_1_244 } /* code 244 */ + ,{ 5, 5, 1, acFont10S_1_245 } /* code 245 */ + ,{ 5, 5, 1, acFont10S_1_246 } /* code 246 */ + ,{ 4, 4, 1, acFont10S_1_247 } /* code 247 */ + ,{ 5, 5, 1, acFont10S_1_248 } /* code 248 */ + ,{ 4, 4, 1, acFont10S_1_249 } /* code 249 */ + ,{ 4, 4, 1, acFont10S_1_250 } /* code 250 */ + ,{ 4, 4, 1, acFont10S_1_251 } /* code 251 */ + ,{ 4, 4, 1, acFont10S_1_252 } /* code 252 */ + ,{ 4, 4, 1, acFont10S_1_253 } /* code 253 */ + ,{ 4, 4, 1, acFont10S_1_254 } /* code 254 */ + ,{ 4, 4, 1, acFont10S_1_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP Font10S_1_FontProp1 = { + 160 /* first character */ + ,255 /* last character */ + ,&Font10S_1_CharInfo[0] /* address of first character */ + ,&GUI_Font10S_ASCII_FontProp1 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font10S_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,10 /* height of font */ + ,10 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&Font10S_1_FontProp1} + , 8, 4, 6 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Font/F10S_ASCII.c b/User/system/lib/lcd/gui/Font/F10S_ASCII.c new file mode 100644 index 0000000..858b4a8 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F10S_ASCII.c @@ -0,0 +1,1280 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F10S_ASCII.C +Purpose : Proportional small font +Height : 10 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_32[10] = { /* code 32 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_33[10] = { /* code 33 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_34[10] = { /* code 34 */ + ________, + ________, + _X_X____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_35[10] = { /* code 35 */ + ________, + ________, + __X_X___, + _XXXXX__, + __X_X___, + __X_X___, + _XXXXX__, + __X_X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_36[10] = { /* code 36 */ + ________, + ________, + __X_____, + _XXX____, + _XX_____, + __X_____, + __XX____, + _XXX____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_37[10] = { /* code 37 */ + ________, + ________, + _XX_____, + _XX_X___, + ___X____, + __X_____, + _X_XX___, + ___XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_38[10] = { /* code 38 */ + ________, + ________, + __X_____, + _X_X____, + __X_____, + _X_XX___, + _X_X____, + __X_X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_39[10] = { /* code 39 */ + ________, + ________, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_40[10] = { /* code 40 */ + ________, + ________, + __X_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_41[10] = { /* code 41 */ + ________, + ________, + _X______, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_42[10] = { /* code 42 */ + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_43[10] = { /* code 43 */ + ________, + ________, + ________, + ________, + __X_____, + _XXX____, + __X_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_44[10] = { /* code 44 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_45[10] = { /* code 45 */ + ________, + ________, + ________, + ________, + ________, + _XX_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_46[10] = { /* code 46 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_47[10] = { /* code 47 */ + ________, + ________, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_48[10] = { /* code 48 */ + ________, + ________, + __XX____, + _X__X___, + _X__X___, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_49[10] = { /* code 49 */ + ________, + ________, + __X_____, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_50[10] = { /* code 50 */ + ________, + ________, + __XX____, + _X__X___, + ____X___, + __XX____, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_51[10] = { /* code 51 */ + ________, + ________, + __XX____, + _X__X___, + ___X____, + ____X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_52[10] = { /* code 52 */ + ________, + ________, + ___X____, + __XX____, + __XX____, + _X_X____, + _XXXX___, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_53[10] = { /* code 53 */ + ________, + ________, + _XXX____, + _X______, + _XX_____, + ___X____, + ___X____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_54[10] = { /* code 54 */ + ________, + ________, + __XX____, + _X______, + _XXX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_55[10] = { /* code 55 */ + ________, + ________, + _XXX____, + ___X____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_56[10] = { /* code 56 */ + ________, + ________, + __XX____, + _X__X___, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_57[10] = { /* code 57 */ + ________, + ________, + __XX____, + _X__X___, + __XXX___, + ____X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_58[10] = { /* code 58 */ + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_59[10] = { /* code 59 */ + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_60[10] = { /* code 60 */ + ________, + ________, + ________, + ___X____, + __X_____, + _X______, + __X_____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_61[10] = { /* code 61 */ + ________, + ________, + ________, + ________, + _XXX____, + ________, + _XXX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_62[10] = { /* code 62 */ + ________, + ________, + ________, + _X______, + __X_____, + ___X____, + __X_____, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_63[10] = { /* code 63 */ + ________, + ________, + __XX____, + _X__X___, + ___X____, + __X_____, + ________, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_64[10] = { /* code 64 */ + ________, + ________, + ___XXX__, + __X___X_, + _X__X__X, + _X_X_X_X, + _X__XXX_, + __X_____, + ___XXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_65[10] = { /* code 65 */ + ________, + ________, + ___X____, + ___X____, + __X_X___, + __XXX___, + _X___X__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_66[10] = { /* code 66 */ + ________, + ________, + _XXXX___, + _X___X__, + _XXXX___, + _X___X__, + _X___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_67[10] = { /* code 67 */ + ________, + ________, + __XXX___, + _X___X__, + _X______, + _X______, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_68[10] = { /* code 68 */ + ________, + ________, + _XXXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_69[10] = { /* code 69 */ + ________, + ________, + _XXXX___, + _X______, + _XXX____, + _X______, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_70[10] = { /* code 70 */ + ________, + ________, + _XXXX___, + _X______, + _XXX____, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_71[10] = { /* code 71 */ + ________, + ________, + __XXX___, + _X___X__, + _X______, + _X__XX__, + _X___X__, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_72[10] = { /* code 72 */ + ________, + ________, + _X__X___, + _X__X___, + _XXXX___, + _X__X___, + _X__X___, + _X__X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_73[10] = { /* code 73 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_74[10] = { /* code 74 */ + ________, + ________, + ___X____, + ___X____, + ___X____, + ___X____, + _X_X____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_75[10] = { /* code 75 */ + ________, + ________, + _X__X___, + _X_X____, + _XX_____, + _XX_____, + _X_X____, + _X__X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_76[10] = { /* code 76 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_77[10] = { /* code 77 */ + ________, + ________, + _XX___XX, + _XX___XX, + _X_X_X_X, + _X_X_X_X, + _X__X__X, + _X__X__X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_78[10] = { /* code 78 */ + ________, + ________, + _XX__X__, + _XX__X__, + _X_X_X__, + _X_X_X__, + _X__XX__, + _X__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_79[10] = { /* code 79 */ + ________, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_80[10] = { /* code 80 */ + ________, + ________, + _XXX____, + _X__X___, + _X__X___, + _XXX____, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_81[10] = { /* code 81 */ + ________, + ________, + __XXX___, + _X___X__, + _X___X__, + _X_X_X__, + _X__X___, + __XX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_82[10] = { /* code 82 */ + ________, + ________, + _XXXX___, + _X___X__, + _X___X__, + _XXXX___, + _X___X__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_83[10] = { /* code 83 */ + ________, + ________, + __XX____, + _X__X___, + __X_____, + ___X____, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_84[10] = { /* code 84 */ + ________, + ________, + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_85[10] = { /* code 85 */ + ________, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_86[10] = { /* code 86 */ + ________, + ________, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_87[10] = { /* code 87 */ + ________, + ________, + _X_____X, + _X_____X, + __X_X_X_, + __X_X_X_, + ___X_X__, + ___X_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_88[10] = { /* code 88 */ + ________, + ________, + _X___X__, + __X_X___, + ___X____, + ___X____, + __X_X___, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_89[10] = { /* code 89 */ + ________, + ________, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_90[10] = { /* code 90 */ + ________, + ________, + _XXXX___, + ____X___, + ___X____, + __X_____, + _X______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_91[10] = { /* code 91 */ + ________, + ________, + _XX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_92[10] = { /* code 92 */ + ________, + ________, + _X______, + _X______, + _X______, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_93[10] = { /* code 93 */ + ________, + ________, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_94[10] = { /* code 94 */ + ________, + ________, + __X_____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_95[10] = { /* code 95 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_96[10] = { /* code 96 */ + ________, + _X______, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_97[10] = { /* code 97 */ + ________, + ________, + ________, + ________, + _XX_____, + ___X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_98[10] = { /* code 98 */ + ________, + ________, + _X______, + _X______, + _XXX____, + _X__X___, + _X__X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_99[10] = { /* code 99 */ + ________, + ________, + ________, + ________, + __XX____, + _X______, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_100[10] = { /* code 100 */ + ________, + ________, + ____X___, + ____X___, + __XXX___, + _X__X___, + _X__X___, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_101[10] = { /* code 101 */ + ________, + ________, + ________, + ________, + __X_____, + _X_X____, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_102[10] = { /* code 102 */ + ________, + ________, + __X_____, + _X______, + _XX_____, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_103[10] = { /* code 103 */ + ________, + ________, + ________, + ________, + __XXX___, + _X__X___, + _X__X___, + __XXX___, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_104[10] = { /* code 104 */ + ________, + ________, + _X______, + _X______, + _XX_____, + _X_X____, + _X_X____, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_105[10] = { /* code 105 */ + ________, + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_106[10] = { /* code 106 */ + ________, + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_107[10] = { /* code 107 */ + ________, + ________, + _X______, + _X______, + _X_X____, + _XX_____, + _X_X____, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_108[10] = { /* code 108 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_109[10] = { /* code 109 */ + ________, + ________, + ________, + ________, + _XXXX___, + _X_X_X__, + _X_X_X__, + _X_X_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_110[10] = { /* code 110 */ + ________, + ________, + ________, + ________, + _XX_____, + _X_X____, + _X_X____, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_111[10] = { /* code 111 */ + ________, + ________, + ________, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_112[10] = { /* code 112 */ + ________, + ________, + ________, + ________, + _XXX____, + _X__X___, + _X__X___, + _XXX____, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_113[10] = { /* code 113 */ + ________, + ________, + ________, + ________, + __XXX___, + _X__X___, + _X__X___, + __XXX___, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_114[10] = { /* code 114 */ + ________, + ________, + ________, + ________, + _XX_____, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_115[10] = { /* code 115 */ + ________, + ________, + ________, + ________, + __XX____, + _X______, + ___X____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_116[10] = { /* code 116 */ + ________, + ________, + ________, + _X______, + _XX_____, + _X______, + _X______, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_117[10] = { /* code 117 */ + ________, + ________, + ________, + ________, + _X_X____, + _X_X____, + _X_X____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_118[10] = { /* code 118 */ + ________, + ________, + ________, + ________, + _X_X____, + _X_X____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_119[10] = { /* code 119 */ + ________, + ________, + ________, + ________, + _X_X_X__, + _X_X_X__, + __X_X___, + __X_X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_120[10] = { /* code 120 */ + ________, + ________, + ________, + ________, + _X_X____, + __X_____, + __X_____, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_121[10] = { /* code 121 */ + ________, + ________, + ________, + ________, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_122[10] = { /* code 122 */ + ________, + ________, + ________, + ________, + _XXX____, + ___X____, + _X______, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_123[10] = { /* code 123 */ + ________, + ________, + __X_____, + __X_____, + __X_____, + _X______, + __X_____, + __X_____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_124[10] = { /* code 124 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_125[10] = { /* code 125 */ + ________, + ________, + _X______, + _X______, + _X______, + __X_____, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10S_ASCII_126[10] = { /* code 126 */ + ________, + ________, + _X_X____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________}; + + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font10S_ASCII_CharInfo[96] = { + { 2, 2, 1, acFont10S_ASCII_32 } /* code 32 */ + ,{ 2, 2, 1, acFont10S_ASCII_33 } /* code 33 */ + ,{ 4, 4, 1, acFont10S_ASCII_34 } /* code 34 */ + ,{ 6, 6, 1, acFont10S_ASCII_35 } /* code 35 */ + ,{ 4, 4, 1, acFont10S_ASCII_36 } /* code 36 */ + ,{ 5, 5, 1, acFont10S_ASCII_37 } /* code 37 */ + ,{ 5, 5, 1, acFont10S_ASCII_38 } /* code 38 */ + ,{ 2, 2, 1, acFont10S_ASCII_39 } /* code 39 */ + ,{ 3, 3, 1, acFont10S_ASCII_40 } /* code 40 */ + ,{ 3, 3, 1, acFont10S_ASCII_41 } /* code 41 */ + ,{ 3, 3, 1, acFont10S_ASCII_42 } /* code 42 */ + ,{ 4, 4, 1, acFont10S_ASCII_43 } /* code 43 */ + ,{ 2, 2, 1, acFont10S_ASCII_44 } /* code 44 */ + ,{ 3, 3, 1, acFont10S_ASCII_45 } /* code 45 */ + ,{ 2, 2, 1, acFont10S_ASCII_46 } /* code 46 */ + ,{ 3, 3, 1, acFont10S_ASCII_47 } /* code 47 */ + ,{ 5, 5, 1, acFont10S_ASCII_48 } /* code 48 */ + ,{ 3, 3, 1, acFont10S_ASCII_49 } /* code 49 */ + ,{ 5, 5, 1, acFont10S_ASCII_50 } /* code 50 */ + ,{ 5, 5, 1, acFont10S_ASCII_51 } /* code 51 */ + ,{ 5, 5, 1, acFont10S_ASCII_52 } /* code 52 */ + ,{ 4, 4, 1, acFont10S_ASCII_53 } /* code 53 */ + ,{ 5, 5, 1, acFont10S_ASCII_54 } /* code 54 */ + ,{ 4, 4, 1, acFont10S_ASCII_55 } /* code 55 */ + ,{ 5, 5, 1, acFont10S_ASCII_56 } /* code 56 */ + ,{ 5, 5, 1, acFont10S_ASCII_57 } /* code 57 */ + ,{ 2, 2, 1, acFont10S_ASCII_58 } /* code 58 */ + ,{ 2, 2, 1, acFont10S_ASCII_59 } /* code 59 */ + ,{ 4, 4, 1, acFont10S_ASCII_60 } /* code 60 */ + ,{ 4, 4, 1, acFont10S_ASCII_61 } /* code 61 */ + ,{ 4, 4, 1, acFont10S_ASCII_62 } /* code 62 */ + ,{ 5, 5, 1, acFont10S_ASCII_63 } /* code 63 */ + ,{ 8, 8, 1, acFont10S_ASCII_64 } /* code 64 */ + ,{ 6, 6, 1, acFont10S_ASCII_65 } /* code 65 */ + ,{ 6, 6, 1, acFont10S_ASCII_66 } /* code 66 */ + ,{ 6, 6, 1, acFont10S_ASCII_67 } /* code 67 */ + ,{ 6, 6, 1, acFont10S_ASCII_68 } /* code 68 */ + ,{ 5, 5, 1, acFont10S_ASCII_69 } /* code 69 */ + ,{ 5, 5, 1, acFont10S_ASCII_70 } /* code 70 */ + ,{ 6, 6, 1, acFont10S_ASCII_71 } /* code 71 */ + ,{ 5, 5, 1, acFont10S_ASCII_72 } /* code 72 */ + ,{ 2, 2, 1, acFont10S_ASCII_73 } /* code 73 */ + ,{ 4, 4, 1, acFont10S_ASCII_74 } /* code 74 */ + ,{ 5, 5, 1, acFont10S_ASCII_75 } /* code 75 */ + ,{ 4, 4, 1, acFont10S_ASCII_76 } /* code 76 */ + ,{ 8, 8, 1, acFont10S_ASCII_77 } /* code 77 */ + ,{ 6, 6, 1, acFont10S_ASCII_78 } /* code 78 */ + ,{ 6, 6, 1, acFont10S_ASCII_79 } /* code 79 */ + ,{ 5, 5, 1, acFont10S_ASCII_80 } /* code 80 */ + ,{ 6, 6, 1, acFont10S_ASCII_81 } /* code 81 */ + ,{ 6, 6, 1, acFont10S_ASCII_82 } /* code 82 */ + ,{ 5, 5, 1, acFont10S_ASCII_83 } /* code 83 */ + ,{ 5, 5, 1, acFont10S_ASCII_84 } /* code 84 */ + ,{ 6, 6, 1, acFont10S_ASCII_85 } /* code 85 */ + ,{ 6, 6, 1, acFont10S_ASCII_86 } /* code 86 */ + ,{ 8, 8, 1, acFont10S_ASCII_87 } /* code 87 */ + ,{ 6, 6, 1, acFont10S_ASCII_88 } /* code 88 */ + ,{ 6, 6, 1, acFont10S_ASCII_89 } /* code 89 */ + ,{ 5, 5, 1, acFont10S_ASCII_90 } /* code 90 */ + ,{ 3, 3, 1, acFont10S_ASCII_91 } /* code 91 */ + ,{ 3, 3, 1, acFont10S_ASCII_92 } /* code 92 */ + ,{ 3, 3, 1, acFont10S_ASCII_93 } /* code 93 */ + ,{ 4, 4, 1, acFont10S_ASCII_94 } /* code 94 */ + ,{ 5, 5, 1, acFont10S_ASCII_95 } /* code 95 */ + ,{ 3, 3, 1, acFont10S_ASCII_96 } /* code 96 */ + ,{ 4, 4, 1, acFont10S_ASCII_97 } /* code 97 */ + ,{ 5, 5, 1, acFont10S_ASCII_98 } /* code 98 */ + ,{ 4, 4, 1, acFont10S_ASCII_99 } /* code 99 */ + ,{ 5, 5, 1, acFont10S_ASCII_100 } /* code 100 */ + ,{ 4, 4, 1, acFont10S_ASCII_101 } /* code 101 */ + ,{ 3, 3, 1, acFont10S_ASCII_102 } /* code 102 */ + ,{ 5, 5, 1, acFont10S_ASCII_103 } /* code 103 */ + ,{ 4, 4, 1, acFont10S_ASCII_104 } /* code 104 */ + ,{ 2, 2, 1, acFont10S_ASCII_105 } /* code 105 */ + ,{ 2, 2, 1, acFont10S_ASCII_106 } /* code 106 */ + ,{ 4, 4, 1, acFont10S_ASCII_107 } /* code 107 */ + ,{ 2, 2, 1, acFont10S_ASCII_108 } /* code 108 */ + ,{ 6, 6, 1, acFont10S_ASCII_109 } /* code 109 */ + ,{ 4, 4, 1, acFont10S_ASCII_110 } /* code 110 */ + ,{ 5, 5, 1, acFont10S_ASCII_111 } /* code 111 */ + ,{ 5, 5, 1, acFont10S_ASCII_112 } /* code 112 */ + ,{ 5, 5, 1, acFont10S_ASCII_113 } /* code 113 */ + ,{ 3, 3, 1, acFont10S_ASCII_114 } /* code 114 */ + ,{ 4, 4, 1, acFont10S_ASCII_115 } /* code 115 */ + ,{ 3, 3, 1, acFont10S_ASCII_116 } /* code 116 */ + ,{ 4, 4, 1, acFont10S_ASCII_117 } /* code 117 */ + ,{ 4, 4, 1, acFont10S_ASCII_118 } /* code 118 */ + ,{ 6, 6, 1, acFont10S_ASCII_119 } /* code 119 */ + ,{ 4, 4, 1, acFont10S_ASCII_120 } /* code 120 */ + ,{ 4, 4, 1, acFont10S_ASCII_121 } /* code 121 */ + ,{ 4, 4, 1, acFont10S_ASCII_122 } /* code 122 */ + ,{ 3, 3, 1, acFont10S_ASCII_123 } /* code 123 */ + ,{ 2, 2, 1, acFont10S_ASCII_124 } /* code 124 */ + ,{ 3, 3, 1, acFont10S_ASCII_125 } /* code 125 */ + ,{ 4, 4, 1, acFont10S_ASCII_126 } /* code 126 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font10S_ASCII_FontProp1 = { + 32 /* first character */ + ,126 /* last character */ + ,&GUI_Font10S_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font10S_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,10 /* height of font */ + ,10 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font10S_ASCII_FontProp1} + , 8, 4, 6 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Font/F10_1.c b/User/system/lib/lcd/gui/Font/F10_1.c new file mode 100644 index 0000000..e77730e --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F10_1.c @@ -0,0 +1,1687 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F10_1.C +Purpose : ISO 8859-1 West European Character Set similar to Swiss +Height : 10 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* The character codes 0x80 - 0x9f are not part of the + ISO 8859 extensions. If needed them you can include them + by using a modifyed copy of this file. +*/ + +#if 0 + +GUI_CONST_STORAGE unsigned char acFont10_1_128[10] = { /* code 128 */ + ________, + __XXXX__, + _X______, + XXXXXX__, + _X______, + XXXXXX__, + _X______, + __X_____, + ___XXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_129[10] = { /* code 129 */ + ________, + _XXXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_130[10] = { /* code 130 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_131[10] = { /* code 131 */ + ________, + ___XX___, + __X_____, + _XXX____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_132[10] = { /* code 132 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + X_X_____, + X_X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_1_133[20] = { /* code 133 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X__X__X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_134[10] = { /* code 134 */ + ________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_1_135[10] = { /* code 135 */ + ________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + XXXXX___, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_1_136[10] = { /* code 136 */ + ________, + __X_____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_137[20] = { /* code 137 */ + ________,________, + _X__X___,________, + X_X_X___,________, + X_X_X___,________, + _X_X____,________, + ___X_X__,_X______, + __X_X_X_,X_X_____, + __X_X_X_,X_X_____, + __X__X__,_X______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_138[10] = { /* code 138 */ + _X_X____, + __X_____, + _XXXXX__, + X____X__, + X_______, + _XXXX___, + _____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_139[10] = { /* code 139 */ + ________, + ________, + ________, + ________, + __X_____, + _X______, + X_______, + _X______, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_140[20] = { /* code 140 */ + ________,________, + _XXX_XXX,XX______, + X___XX__,________, + X____X__,________, + X____XXX,XX______, + X____X__,________, + X____X__,________, + X___XX__,________, + _XXX_XXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_141[10] = { /* code 141 */ + ________, + _XXXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_142[10] = { /* code 142 */ + __X_X___, + ___X____, + XXXXXX__, + _____X__, + ___XX___, + __X_____, + _X______, + X_______, + XXXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_143[10] = { /* code 143 */ + ________, + _XXXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_144[10] = { /* code 144 */ + ________, + _XXXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_145[10] = { /* code 145 */ + ________, + X_______, + X_______, + X_______, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_146[10] = { /* code 146 */ + ________, + X_______, + X_______, + X_______, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_147[10] = { /* code 147 */ + ________, + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_148[10] = { /* code 148 */ + ________, + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_149[10] = { /* code 149 */ + ________, + ________, + ________, + XXX_____, + XXX_____, + XXX_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_150[10] = { /* code 150 */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_151[20] = { /* code 151 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_152[10] = { /* code 152 */ + ________, + _X_X____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_153[20] = { /* code 153 */ + ________,________, + XXX_X___,X_______, + _X__XX_X,X_______, + _X__XX_X,X_______, + _X__X_X_,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_154[10] = { /* code 154 */ + _X_X____, + __X_____, + ________, + _XXX____, + X___X___, + _XX_____, + ___X____, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_155[10] = { /* code 155 */ + ________, + ________, + ________, + ________, + X_______, + _X______, + __X_____, + _X______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_156[20] = { /* code 156 */ + ________,________, + ________,________, + ________,________, + _XXX_XXX,________, + X___X___,X_______, + X___XXXX,X_______, + X___X___,________, + X___X___,X_______, + _XXX_XXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_157[10] = { /* code 157 */ + ________, + _XXXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_158[10] = { /* code 158 */ + _X_X____, + __X_____, + ________, + XXXXX___, + ___X____, + __X_____, + __X_____, + _X______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_159[10] = { /* code 159 */ + __X_X___, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ________}; + +#endif + +GUI_CONST_STORAGE unsigned char acFont10_1_160[10] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_161[10] = { /* code 161 */ + ________, + ________, + ________, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_162[10] = { /* code 162 */ + ________, + ___X____, + ___X____, + _XXX____, + X_X_X___, + X_X_____, + X_X_____, + X_X_X___, + _XXX____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_163[10] = { /* code 163 */ + ________, + __XX____, + _X__X___, + _X______, + _X______, + XXX_____, + _X______, + _XX_____, + X__XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_164[10] = { /* code 164 */ + ________, + ________, + X____X__, + _XXXX___, + _X__X___, + _X__X___, + _XXXX___, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_165[10] = { /* code 165 */ + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + XXXXX___, + __X_____, + XXXXX___, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_166[10] = { /* code 166 */ + ________, + X_______, + X_______, + X_______, + X_______, + ________, + ________, + X_______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_167[10] = { /* code 167 */ + ________, + _XXX____, + X___X___, + _X______, + XXX_____, + X__X____, + _X__X___, + __X_X___, + ___X____, + X___X___}; + +GUI_CONST_STORAGE unsigned char acFont10_1_168[10] = { /* code 168 */ + ________, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_169[10] = { /* code 169 */ + ________, + __XXXX__, + _X____X_, + X__XXX_X, + X_X____X, + X_X____X, + X__XXX_X, + _X____X_, + __XXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_170[10] = { /* code 170 */ + ________, + XXX_____, + __X_____, + XXX_____, + XXX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_171[10] = { /* code 171 */ + ________, + ________, + ________, + ________, + __X_X___, + _X_X____, + X_X_____, + _X_X____, + __X_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_172[10] = { /* code 172 */ + ________, + ________, + ________, + ________, + XXXXX___, + ____X___, + ____X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_173[10] = { /* code 173 */ + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_174[10] = { /* code 174 */ + ________, + __XXXX__, + _X____X_, + X_XXX__X, + X_X__X_X, + X_XXX__X, + X_X__X_X, + _X____X_, + __XXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_175[10] = { /* code 175 */ + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_176[10] = { /* code 176 */ + ________, + XXX_____, + X_X_____, + XXX_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_177[10] = { /* code 177 */ + ________, + ________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_178[10] = { /* code 178 */ + ________, + XXX_____, + __X_____, + _X______, + XXX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_179[10] = { /* code 179 */ + ________, + XXX_____, + _X______, + __X_____, + XXX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_180[10] = { /* code 180 */ + ________, + __X_____, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_181[10] = { /* code 181 */ + ________, + ________, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + XXXXX___, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_182[10] = { /* code 182 */ + ________, + _XXXXX__, + XXX_X___, + XXX_X___, + _XX_X___, + __X_X___, + __X_X___, + __X_X___, + __X_X___, + __X_X___}; + +GUI_CONST_STORAGE unsigned char acFont10_1_183[10] = { /* code 183 */ + ________, + ________, + ________, + ________, + ________, + X_______, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_184[10] = { /* code 184 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_1_185[10] = { /* code 185 */ + ________, + __X_____, + _XX_____, + __X_____, + __X_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_186[10] = { /* code 186 */ + ________, + _XX_____, + X__X____, + X__X____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_187[10] = { /* code 187 */ + ________, + ________, + ________, + ________, + X_X_____, + _X_X____, + __X_X___, + _X_X____, + X_X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_188[20] = { /* code 188 */ + ________,________, + _X____X_,________, + XX___X__,________, + _X__X___,________, + _X__X___,________, + ___X__X_,________, + ___X_XX_,________, + __X_XXXX,________, + _X____X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_189[20] = { /* code 189 */ + ________,________, + __X____X,________, + _XX___X_,________, + __X__X__,________, + __X_X___,________, + ____X_XX,X_______, + ___X____,X_______, + __X____X,________, + __X___XX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_190[20] = { /* code 190 */ + ________,________, + XXX____X,________, + _X____X_,________, + __X__X__,________, + XXX__X__,________, + ____X__X,________, + ___X__XX,________, + __X__XXX,X_______, + __X____X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_191[10] = { /* code 191 */ + ________, + ________, + __X_____, + ________, + __X_____, + __X_____, + _X______, + X_______, + X___X___, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont10_1_192[10] = { /* code 192 */ + __X_____, + ___X____, + __XXX___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_193[10] = { /* code 193 */ + ____X___, + ___X____, + __XXX___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_194[10] = { /* code 194 */ + ___X____, + __X_X___, + __XXX___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_195[10] = { /* code 195 */ + ___X_X__, + __X_X___, + __XXX___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_196[10] = { /* code 196 */ + __X_X___, + ________, + __XXX___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_197[10] = { /* code 197 */ + __XXX___, + __X_X___, + __XXX___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_198[20] = { /* code 198 */ + ________,________, + ___XXXXX,XX______, + ___X_X__,________, + __X__X__,________, + __X__XXX,XX______, + _X___X__,________, + _XXXXX__,________, + X____X__,________, + X____XXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_199[10] = { /* code 199 */ + ________, + __XXX___, + _X___X__, + X_______, + X_______, + X_______, + _X___X__, + __XXXX__, + ___X____, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont10_1_200[10] = { /* code 200 */ + _X______, + __X_____, + XXXXX___, + X_______, + X_______, + XXXXX___, + X_______, + X_______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_201[10] = { /* code 201 */ + ___X____, + __X_____, + XXXXX___, + X_______, + X_______, + XXXXX___, + X_______, + X_______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_202[10] = { /* code 202 */ + __X_____, + _X_X____, + XXXXX___, + X_______, + X_______, + XXXXX___, + X_______, + X_______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_203[10] = { /* code 203 */ + _X_X____, + ________, + XXXXX___, + X_______, + X_______, + XXXXX___, + X_______, + X_______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_204[10] = { /* code 204 */ + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_205[10] = { /* code 205 */ + _X______, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_206[10] = { /* code 206 */ + X_______, + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_207[10] = { /* code 207 */ + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_208[10] = { /* code 208 */ + ________, + _XXXX___, + _X___X__, + _X____X_, + XXXX__X_, + _X____X_, + _X____X_, + _X___X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_209[10] = { /* code 209 */ + _X_X____, + X____X__, + XX___X__, + X_X__X__, + X_X__X__, + X__X_X__, + X__X_X__, + X___XX__, + X____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_210[10] = { /* code 210 */ + __X_____, + ___X____, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_211[10] = { /* code 211 */ + ____X___, + ___X____, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_212[10] = { /* code 212 */ + ___X____, + __X_X___, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_213[10] = { /* code 213 */ + ___X_X__, + __X_X___, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_214[10] = { /* code 214 */ + __X_X___, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_215[10] = { /* code 215 */ + ________, + ________, + ________, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_216[10] = { /* code 216 */ + ________, + __XXX_X_, + _X___XX_, + X___X_X_, + X__X__X_, + X__X__X_, + X_X___X_, + _X___X__, + X_XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_217[10] = { /* code 217 */ + __X_____, + ___X____, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_218[10] = { /* code 218 */ + ___X____, + __X_____, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_219[10] = { /* code 219 */ + __X_____, + _X_X____, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_220[10] = { /* code 220 */ + __X_X___, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_221[10] = { /* code 221 */ + ____X___, + X__X__X_, + _X___X__, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_222[10] = { /* code 222 */ + ________, + X_______, + X_______, + XXXXX___, + X____X__, + X____X__, + XXXXX___, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_223[10] = { /* code 223 */ + ________, + _XXX____, + X___X___, + X___X___, + X__X____, + X__XX___, + X____X__, + X_X__X__, + X__XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_224[10] = { /* code 224 */ + __X_____, + ___X____, + ________, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_225[10] = { /* code 225 */ + ___X____, + __X_____, + ________, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_226[10] = { /* code 226 */ + __X_____, + _X_X____, + ________, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_227[10] = { /* code 227 */ + __X_X___, + _X_X____, + ________, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_228[10] = { /* code 228 */ + ________, + _X_X____, + ________, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_229[10] = { /* code 229 */ + _XXX____, + _X_X____, + _XXX____, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_230[20] = { /* code 230 */ + ________,________, + ________,________, + ________,________, + _XXX_XXX,________, + X___X___,X_______, + _XXXXXXX,X_______, + X___X___,________, + X___X___,X_______, + _XXX_XXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_231[10] = { /* code 231 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X_______, + X___X___, + _XXX____, + __X_____, + ___X____}; + +GUI_CONST_STORAGE unsigned char acFont10_1_232[10] = { /* code 232 */ + _X______, + __X_____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_233[10] = { /* code 233 */ + ___X____, + __X_____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_234[10] = { /* code 234 */ + __X_____, + _X_X____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_235[10] = { /* code 235 */ + ________, + _X_X____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_236[10] = { /* code 236 */ + X_______, + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_237[10] = { /* code 237 */ + _X______, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_238[10] = { /* code 238 */ + _X______, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_239[10] = { /* code 239 */ + ________, + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_240[10] = { /* code 240 */ + ________, + __XXX___, + _X_X____, + ___X____, + _XXXX___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_241[10] = { /* code 241 */ + __X_X___, + _X_X____, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_242[10] = { /* code 242 */ + _X______, + __X_____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_243[10] = { /* code 243 */ + ___X____, + __X_____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_244[10] = { /* code 244 */ + __X_____, + _X_X____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_245[10] = { /* code 245 */ + __X_X___, + _X_X____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_246[10] = { /* code 246 */ + ________, + _X_X____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_247[10] = { /* code 247 */ + ________, + ________, + ________, + __X_____, + ________, + XXXXX___, + ________, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_248[10] = { /* code 248 */ + ________, + ________, + ________, + _XX_X___, + X__XX___, + X_X_X___, + X_X_X___, + XX__X___, + X_XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_249[10] = { /* code 249 */ + _X______, + __X_____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_250[10] = { /* code 250 */ + ___X____, + __X_____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_251[10] = { /* code 251 */ + __X_____, + _X_X____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_252[10] = { /* code 252 */ + ________, + _X_X____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_1_253[10] = { /* code 253 */ + ___X____, + __X_____, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_254[10] = { /* code 254 */ + ________, + X_______, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + XXXX____, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_1_255[10] = { /* code 255 */ + ________, + _X_X____, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______}; + + + +GUI_CONST_STORAGE GUI_CHARINFO Font10_1_CharInfo[96] = { + { 3, 3, 1, acFont10_1_160 } /* code 160 */ + ,{ 2, 2, 1, acFont10_1_161 } /* code 161 */ + ,{ 6, 6, 1, acFont10_1_162 } /* code 162 */ + ,{ 6, 6, 1, acFont10_1_163 } /* code 163 */ + ,{ 7, 7, 1, acFont10_1_164 } /* code 164 */ + ,{ 6, 6, 1, acFont10_1_165 } /* code 165 */ + ,{ 2, 2, 1, acFont10_1_166 } /* code 166 */ + ,{ 6, 6, 1, acFont10_1_167 } /* code 167 */ + ,{ 4, 4, 1, acFont10_1_168 } /* code 168 */ + ,{ 8, 8, 1, acFont10_1_169 } /* code 169 */ + ,{ 4, 4, 1, acFont10_1_170 } /* code 170 */ + ,{ 6, 6, 1, acFont10_1_171 } /* code 171 */ + ,{ 6, 6, 1, acFont10_1_172 } /* code 172 */ + ,{ 4, 4, 1, acFont10_1_173 } /* code 173 */ + ,{ 8, 8, 1, acFont10_1_174 } /* code 174 */ + ,{ 6, 6, 1, acFont10_1_175 } /* code 175 */ + ,{ 4, 4, 1, acFont10_1_176 } /* code 176 */ + ,{ 6, 6, 1, acFont10_1_177 } /* code 177 */ + ,{ 4, 4, 1, acFont10_1_178 } /* code 178 */ + ,{ 4, 4, 1, acFont10_1_179 } /* code 179 */ + ,{ 4, 4, 1, acFont10_1_180 } /* code 180 */ + ,{ 6, 6, 1, acFont10_1_181 } /* code 181 */ + ,{ 6, 6, 1, acFont10_1_182 } /* code 182 */ + ,{ 3, 3, 1, acFont10_1_183 } /* code 183 */ + ,{ 4, 4, 1, acFont10_1_184 } /* code 184 */ + ,{ 4, 4, 1, acFont10_1_185 } /* code 185 */ + ,{ 5, 5, 1, acFont10_1_186 } /* code 186 */ + ,{ 6, 6, 1, acFont10_1_187 } /* code 187 */ + ,{ 9, 9, 2, acFont10_1_188 } /* code 188 */ + ,{ 10, 10, 2, acFont10_1_189 } /* code 189 */ + ,{ 10, 10, 2, acFont10_1_190 } /* code 190 */ + ,{ 6, 6, 1, acFont10_1_191 } /* code 191 */ + ,{ 8, 8, 1, acFont10_1_192 } /* code 192 */ + ,{ 8, 8, 1, acFont10_1_193 } /* code 193 */ + ,{ 8, 8, 1, acFont10_1_194 } /* code 194 */ + ,{ 8, 8, 1, acFont10_1_195 } /* code 195 */ + ,{ 8, 8, 1, acFont10_1_196 } /* code 196 */ + ,{ 8, 8, 1, acFont10_1_197 } /* code 197 */ + ,{ 11, 11, 2, acFont10_1_198 } /* code 198 */ + ,{ 7, 7, 1, acFont10_1_199 } /* code 199 */ + ,{ 6, 6, 1, acFont10_1_200 } /* code 200 */ + ,{ 6, 6, 1, acFont10_1_201 } /* code 201 */ + ,{ 6, 6, 1, acFont10_1_202 } /* code 202 */ + ,{ 6, 6, 1, acFont10_1_203 } /* code 203 */ + ,{ 2, 2, 1, acFont10_1_204 } /* code 204 */ + ,{ 2, 2, 1, acFont10_1_205 } /* code 205 */ + ,{ 2, 2, 1, acFont10_1_206 } /* code 206 */ + ,{ 2, 2, 1, acFont10_1_207 } /* code 207 */ + ,{ 8, 8, 1, acFont10_1_208 } /* code 208 */ + ,{ 7, 7, 1, acFont10_1_209 } /* code 209 */ + ,{ 8, 8, 1, acFont10_1_210 } /* code 210 */ + ,{ 8, 8, 1, acFont10_1_211 } /* code 211 */ + ,{ 8, 8, 1, acFont10_1_212 } /* code 212 */ + ,{ 8, 8, 1, acFont10_1_213 } /* code 213 */ + ,{ 8, 8, 1, acFont10_1_214 } /* code 214 */ + ,{ 6, 6, 1, acFont10_1_215 } /* code 215 */ + ,{ 8, 8, 1, acFont10_1_216 } /* code 216 */ + ,{ 7, 7, 1, acFont10_1_217 } /* code 217 */ + ,{ 7, 7, 1, acFont10_1_218 } /* code 218 */ + ,{ 7, 7, 1, acFont10_1_219 } /* code 219 */ + ,{ 7, 7, 1, acFont10_1_220 } /* code 220 */ + ,{ 8, 8, 1, acFont10_1_221 } /* code 221 */ + ,{ 7, 7, 1, acFont10_1_222 } /* code 222 */ + ,{ 7, 7, 1, acFont10_1_223 } /* code 223 */ + ,{ 6, 6, 1, acFont10_1_224 } /* code 224 */ + ,{ 6, 6, 1, acFont10_1_225 } /* code 225 */ + ,{ 6, 6, 1, acFont10_1_226 } /* code 226 */ + ,{ 6, 6, 1, acFont10_1_227 } /* code 227 */ + ,{ 6, 6, 1, acFont10_1_228 } /* code 228 */ + ,{ 6, 6, 1, acFont10_1_229 } /* code 229 */ + ,{ 10, 10, 2, acFont10_1_230 } /* code 230 */ + ,{ 6, 6, 1, acFont10_1_231 } /* code 231 */ + ,{ 6, 6, 1, acFont10_1_232 } /* code 232 */ + ,{ 6, 6, 1, acFont10_1_233 } /* code 233 */ + ,{ 6, 6, 1, acFont10_1_234 } /* code 234 */ + ,{ 6, 6, 1, acFont10_1_235 } /* code 235 */ + ,{ 2, 2, 1, acFont10_1_236 } /* code 236 */ + ,{ 2, 2, 1, acFont10_1_237 } /* code 237 */ + ,{ 2, 2, 1, acFont10_1_238 } /* code 238 */ + ,{ 2, 2, 1, acFont10_1_239 } /* code 239 */ + ,{ 6, 6, 1, acFont10_1_240 } /* code 240 */ + ,{ 6, 6, 1, acFont10_1_241 } /* code 241 */ + ,{ 6, 6, 1, acFont10_1_242 } /* code 242 */ + ,{ 6, 6, 1, acFont10_1_243 } /* code 243 */ + ,{ 6, 6, 1, acFont10_1_244 } /* code 244 */ + ,{ 6, 6, 1, acFont10_1_245 } /* code 245 */ + ,{ 6, 6, 1, acFont10_1_246 } /* code 246 */ + ,{ 6, 6, 1, acFont10_1_247 } /* code 247 */ + ,{ 6, 6, 1, acFont10_1_248 } /* code 248 */ + ,{ 6, 6, 1, acFont10_1_249 } /* code 249 */ + ,{ 6, 6, 1, acFont10_1_250 } /* code 250 */ + ,{ 6, 6, 1, acFont10_1_251 } /* code 251 */ + ,{ 6, 6, 1, acFont10_1_252 } /* code 252 */ + ,{ 6, 6, 1, acFont10_1_253 } /* code 253 */ + ,{ 6, 6, 1, acFont10_1_254 } /* code 254 */ + ,{ 6, 6, 1, acFont10_1_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP Font10_1Prop1 = { + 160 /* first character */ + ,255 /* last character */ + ,&Font10_1_CharInfo[0] /* address of first character */ + ,&GUI_Font10ASCIIProp1 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font10_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,10 /* height of font */ + ,10 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&Font10_1Prop1} + ,9, 6, 8 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Font/F10_ASCII.c b/User/system/lib/lcd/gui/Font/F10_ASCII.c new file mode 100644 index 0000000..389e96b --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F10_ASCII.c @@ -0,0 +1,1281 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F10_ASCII.c +Purpose : ASCII character set +Height : 10 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_32[10] = { /* code 32 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_33[10] = { /* code 33 */ + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_34[10] = { /* code 34 */ + ________, + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_35[10] = { /* code 35 */ + ________, + __X_X___, + __X_X___, + XXXXX___, + _X_X____, + _X_X____, + XXXXX___, + X_X_____, + X_X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_36[10] = { /* code 36 */ + ________, + _XXX____, + X_X_X___, + X_X_____, + _XXX____, + __X_X___, + __X_X___, + X_X_X___, + _XXX____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_37[20] = { /* code 37 */ + ________,________, + _XX___X_,________, + X__X_X__,________, + X__X_X__,________, + _XX_X___,________, + ____X_XX,________, + ___X_X__,X_______, + ___X_X__,X_______, + __X___XX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_38[10] = { /* code 38 */ + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + _X_X____, + X___XX__, + X___X___, + _XXX_X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_39[10] = { /* code 39 */ + ________, + X_______, + X_______, + X_______, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_40[10] = { /* code 40 */ + ________, + __X_____, + _X______, + X_______, + X_______, + X_______, + X_______, + X_______, + _X______, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_41[10] = { /* code 41 */ + ________, + X_______, + _X______, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_42[10] = { /* code 42 */ + ________, + _X______, + XXX_____, + _X______, + X_X_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_43[10] = { /* code 43 */ + ________, + ________, + ________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_44[10] = { /* code 44 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_45[10] = { /* code 45 */ + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_46[10] = { /* code 46 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_47[10] = { /* code 47 */ + ________, + __X_____, + __X_____, + _X______, + _X______, + _X______, + _X______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_48[10] = { /* code 48 */ + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_49[10] = { /* code 49 */ + ________, + __X_____, + _XX_____, + X_X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_50[10] = { /* code 50 */ + ________, + _XXX____, + X___X___, + ____X___, + ____X___, + ___X____, + __X_____, + _X______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_51[10] = { /* code 51 */ + ________, + _XXX____, + X___X___, + ____X___, + __XX____, + ____X___, + ____X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_52[10] = { /* code 52 */ + ________, + ___X____, + __XX____, + _X_X____, + _X_X____, + X__X____, + XXXXX___, + ___X____, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_53[10] = { /* code 53 */ + ________, + _XXXX___, + _X______, + X_______, + XXXX____, + ____X___, + ____X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_54[10] = { /* code 54 */ + ________, + _XXX____, + X___X___, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_55[10] = { /* code 55 */ + ________, + XXXXX___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_56[10] = { /* code 56 */ + ________, + _XXX____, + X___X___, + X___X___, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_57[10] = { /* code 57 */ + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXXX___, + ____X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_58[10] = { /* code 58 */ + ________, + ________, + ________, + X_______, + ________, + ________, + ________, + ________, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_59[10] = { /* code 59 */ + ________, + ________, + ________, + X_______, + ________, + ________, + ________, + X_______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_60[10] = { /* code 60 */ + ________, + ________, + ________, + ____X___, + _XXX____, + X_______, + _XXX____, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_61[10] = { /* code 61 */ + ________, + ________, + ________, + ________, + XXXXX___, + ________, + XXXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_62[10] = { /* code 62 */ + ________, + ________, + ________, + X_______, + _XXX____, + ____X___, + _XXX____, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_63[10] = { /* code 63 */ + ________, + _XXX____, + X___X___, + ____X___, + ___X____, + __X_____, + __X_____, + ________, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_64[20] = { /* code 64 */ + ________,________, + ___XXXXX,________, + _XX_____,X_______, + _X__XX_X,_X______, + X__X__XX,_X______, + X_X___X_,_X______, + X_X__XX_,X_______, + X__XX_XX,________, + _X______,_X______, + __XXXXXX,X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_65[10] = { /* code 65 */ + ________, + ___X____, + __X_X___, + __X_X___, + __X_X___, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_66[10] = { /* code 66 */ + ________, + XXXXX___, + X____X__, + X____X__, + XXXXXX__, + X____X__, + X____X__, + X____X__, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_67[10] = { /* code 67 */ + ________, + __XXX___, + _X___X__, + X_______, + X_______, + X_______, + X_______, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_68[10] = { /* code 68 */ + ________, + XXXX____, + X___X___, + X____X__, + X____X__, + X____X__, + X____X__, + X___X___, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_69[10] = { /* code 69 */ + ________, + XXXXX___, + X_______, + X_______, + XXXXX___, + X_______, + X_______, + X_______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_70[10] = { /* code 70 */ + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_71[10] = { /* code 71 */ + ________, + __XXX___, + _X___X__, + X_____X_, + X_______, + X___XXX_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_72[10] = { /* code 72 */ + ________, + X____X__, + X____X__, + X____X__, + XXXXXX__, + X____X__, + X____X__, + X____X__, + X____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_73[10] = { /* code 73 */ + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_74[10] = { /* code 74 */ + ________, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + X__X____, + X__X____, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_75[10] = { /* code 75 */ + ________, + X____X__, + X___X___, + X__X____, + X_XX____, + XX_X____, + X___X___, + X___X___, + X____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_76[10] = { /* code 76 */ + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_77[10] = { /* code 77 */ + ________, + X_____X_, + XX___XX_, + XX___XX_, + X_X_X_X_, + X_X_X_X_, + X_X_X_X_, + X__X__X_, + X__X__X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_78[10] = { /* code 78 */ + ________, + X____X__, + XX___X__, + X_X__X__, + X_X__X__, + X__X_X__, + X__X_X__, + X___XX__, + X____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_79[10] = { /* code 79 */ + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_80[10] = { /* code 80 */ + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + XXXX____, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_81[10] = { /* code 81 */ + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X__XX_X_, + _X___X__, + __XXX_X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_82[10] = { /* code 82 */ + ________, + XXXXX___, + X____X__, + X____X__, + XXXXX___, + X__X____, + X___X___, + X___X___, + X____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_83[10] = { /* code 83 */ + ________, + _XXXX___, + X____X__, + X_______, + _XX_____, + ___XX___, + _____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_84[10] = { /* code 84 */ + ________, + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_85[10] = { /* code 85 */ + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_86[10] = { /* code 86 */ + ________, + X_____X_, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + ___X____, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_87[20] = { /* code 87 */ + ________,________, + X____X__,__X_____, + X___X_X_,__X_____, + _X__X_X_,_X______, + _X__X_X_,_X______, + _X_X___X,_X______, + _X_X___X,_X______, + __X_____,X_______, + __X_____,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_88[10] = { /* code 88 */ + ________, + X____X__, + _X__X___, + _X__X___, + __XX____, + __XX____, + _X__X___, + _X__X___, + X____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_89[10] = { /* code 89 */ + ________, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_90[10] = { /* code 90 */ + ________, + _XXXXX__, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + XXXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_91[10] = { /* code 91 */ + ________, + XX______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_92[10] = { /* code 92 */ + ________, + X_______, + X_______, + _X______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_93[10] = { /* code 93 */ + ________, + XX______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_94[10] = { /* code 94 */ + ________, + __X_____, + _X_X____, + _X_X____, + X___X___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_95[10] = { /* code 95 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_96[10] = { /* code 96 */ + ________, + X_______, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_97[10] = { /* code 97 */ + ________, + ________, + ________, + _XXX____, + X___X___, + _XXXX___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_98[10] = { /* code 98 */ + ________, + X_______, + X_______, + X_XX____, + XX__X___, + X___X___, + X___X___, + XX__X___, + X_XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_99[10] = { /* code 99 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X_______, + X_______, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_100[10] = { /* code 100 */ + ________, + ____X___, + ____X___, + _XX_X___, + X__XX___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_101[10] = { /* code 101 */ + ________, + ________, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_102[10] = { /* code 102 */ + ________, + __X_____, + _X______, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_103[10] = { /* code 103 */ + ________, + ________, + ________, + _XX_X___, + X__XX___, + X___X___, + X__XX___, + _XX_X___, + ____X___, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_104[10] = { /* code 104 */ + ________, + X_______, + X_______, + X_XX____, + XX__X___, + X___X___, + X___X___, + X___X___, + X___X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_105[10] = { /* code 105 */ + ________, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_106[10] = { /* code 106 */ + ________, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_107[10] = { /* code 107 */ + ________, + X_______, + X_______, + X__X____, + X_X_____, + XX______, + X_X_____, + X_X_____, + X__X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_108[10] = { /* code 108 */ + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_109[10] = { /* code 109 */ + ________, + ________, + ________, + X_XXXX__, + XX_X__X_, + X__X__X_, + X__X__X_, + X__X__X_, + X__X__X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_110[10] = { /* code 110 */ + ________, + ________, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_111[10] = { /* code 111 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_112[10] = { /* code 112 */ + ________, + ________, + ________, + X_XX____, + XX__X___, + X___X___, + X___X___, + XX__X___, + X_XX____, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_113[10] = { /* code 113 */ + ________, + ________, + ________, + _XX_X___, + X__XX___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_114[10] = { /* code 114 */ + ________, + ________, + ________, + X_X_____, + XX______, + X_______, + X_______, + X_______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_115[10] = { /* code 115 */ + ________, + ________, + ________, + _XXX____, + X___X___, + _XX_____, + ___X____, + X___X___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_116[10] = { /* code 116 */ + ________, + X_______, + X_______, + XX______, + X_______, + X_______, + X_______, + X_______, + XX______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_117[10] = { /* code 117 */ + ________, + ________, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_118[10] = { /* code 118 */ + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_119[20] = { /* code 119 */ + ________,________, + ________,________, + ________,________, + X___X___,X_______, + X__X_X__,X_______, + _X_X_X_X,________, + _X_X_X_X,________, + __X___X_,________, + __X___X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_120[10] = { /* code 120 */ + ________, + ________, + ________, + X___X___, + _X_X____, + __X_____, + __X_____, + _X_X____, + X___X___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_121[10] = { /* code 121 */ + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_122[10] = { /* code 122 */ + ________, + ________, + ________, + XXXXX___, + ___X____, + __X_____, + __X_____, + _X______, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_123[10] = { /* code 123 */ + ________, + __X_____, + _X______, + _X______, + _X______, + X_______, + _X______, + _X______, + _X______, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_124[10] = { /* code 124 */ + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_125[10] = { /* code 125 */ + ________, + _X______, + __X_____, + __X_____, + __X_____, + ___X____, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont10_ASCII_126[10] = { /* code 126 */ + ________, + ________, + ________, + ________, + XXX_X___, + X_XX____, + ________, + ________, + ________, + ________}; + + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font10_ASCII_CharInfo[96] = { + { 3, 3, 1, acFont10_ASCII_32 } /* code 32 */ + ,{ 2, 2, 1, acFont10_ASCII_33 } /* code 33 */ + ,{ 4, 4, 1, acFont10_ASCII_34 } /* code 34 */ + ,{ 6, 6, 1, acFont10_ASCII_35 } /* code 35 */ + ,{ 6, 6, 1, acFont10_ASCII_36 } /* code 36 */ + ,{ 10, 10, 2, acFont10_ASCII_37 } /* code 37 */ + ,{ 7, 7, 1, acFont10_ASCII_38 } /* code 38 */ + ,{ 2, 2, 1, acFont10_ASCII_39 } /* code 39 */ + ,{ 4, 4, 1, acFont10_ASCII_40 } /* code 40 */ + ,{ 4, 4, 1, acFont10_ASCII_41 } /* code 41 */ + ,{ 4, 4, 1, acFont10_ASCII_42 } /* code 42 */ + ,{ 6, 6, 1, acFont10_ASCII_43 } /* code 43 */ + ,{ 3, 3, 1, acFont10_ASCII_44 } /* code 44 */ + ,{ 4, 4, 1, acFont10_ASCII_45 } /* code 45 */ + ,{ 3, 3, 1, acFont10_ASCII_46 } /* code 46 */ + ,{ 3, 3, 1, acFont10_ASCII_47 } /* code 47 */ + ,{ 6, 6, 1, acFont10_ASCII_48 } /* code 48 */ + ,{ 6, 6, 1, acFont10_ASCII_49 } /* code 49 */ + ,{ 6, 6, 1, acFont10_ASCII_50 } /* code 50 */ + ,{ 6, 6, 1, acFont10_ASCII_51 } /* code 51 */ + ,{ 6, 6, 1, acFont10_ASCII_52 } /* code 52 */ + ,{ 6, 6, 1, acFont10_ASCII_53 } /* code 53 */ + ,{ 6, 6, 1, acFont10_ASCII_54 } /* code 54 */ + ,{ 6, 6, 1, acFont10_ASCII_55 } /* code 55 */ + ,{ 6, 6, 1, acFont10_ASCII_56 } /* code 56 */ + ,{ 6, 6, 1, acFont10_ASCII_57 } /* code 57 */ + ,{ 3, 3, 1, acFont10_ASCII_58 } /* code 58 */ + ,{ 3, 3, 1, acFont10_ASCII_59 } /* code 59 */ + ,{ 6, 6, 1, acFont10_ASCII_60 } /* code 60 */ + ,{ 6, 6, 1, acFont10_ASCII_61 } /* code 61 */ + ,{ 6, 6, 1, acFont10_ASCII_62 } /* code 62 */ + ,{ 6, 6, 1, acFont10_ASCII_63 } /* code 63 */ + ,{ 11, 11, 2, acFont10_ASCII_64 } /* code 64 */ + ,{ 8, 8, 1, acFont10_ASCII_65 } /* code 65 */ + ,{ 7, 7, 1, acFont10_ASCII_66 } /* code 66 */ + ,{ 7, 7, 1, acFont10_ASCII_67 } /* code 67 */ + ,{ 7, 7, 1, acFont10_ASCII_68 } /* code 68 */ + ,{ 6, 6, 1, acFont10_ASCII_69 } /* code 69 */ + ,{ 6, 6, 1, acFont10_ASCII_70 } /* code 70 */ + ,{ 8, 8, 1, acFont10_ASCII_71 } /* code 71 */ + ,{ 7, 7, 1, acFont10_ASCII_72 } /* code 72 */ + ,{ 2, 2, 1, acFont10_ASCII_73 } /* code 73 */ + ,{ 5, 5, 1, acFont10_ASCII_74 } /* code 74 */ + ,{ 7, 7, 1, acFont10_ASCII_75 } /* code 75 */ + ,{ 6, 6, 1, acFont10_ASCII_76 } /* code 76 */ + ,{ 8, 8, 1, acFont10_ASCII_77 } /* code 77 */ + ,{ 7, 7, 1, acFont10_ASCII_78 } /* code 78 */ + ,{ 8, 8, 1, acFont10_ASCII_79 } /* code 79 */ + ,{ 6, 6, 1, acFont10_ASCII_80 } /* code 80 */ + ,{ 8, 8, 1, acFont10_ASCII_81 } /* code 81 */ + ,{ 7, 7, 1, acFont10_ASCII_82 } /* code 82 */ + ,{ 7, 7, 1, acFont10_ASCII_83 } /* code 83 */ + ,{ 6, 6, 1, acFont10_ASCII_84 } /* code 84 */ + ,{ 7, 7, 1, acFont10_ASCII_85 } /* code 85 */ + ,{ 8, 8, 1, acFont10_ASCII_86 } /* code 86 */ + ,{ 11, 11, 2, acFont10_ASCII_87 } /* code 87 */ + ,{ 7, 7, 1, acFont10_ASCII_88 } /* code 88 */ + ,{ 8, 8, 1, acFont10_ASCII_89 } /* code 89 */ + ,{ 7, 7, 1, acFont10_ASCII_90 } /* code 90 */ + ,{ 3, 3, 1, acFont10_ASCII_91 } /* code 91 */ + ,{ 3, 3, 1, acFont10_ASCII_92 } /* code 92 */ + ,{ 3, 3, 1, acFont10_ASCII_93 } /* code 93 */ + ,{ 5, 5, 1, acFont10_ASCII_94 } /* code 94 */ + ,{ 6, 6, 1, acFont10_ASCII_95 } /* code 95 */ + ,{ 4, 4, 1, acFont10_ASCII_96 } /* code 96 */ + ,{ 6, 6, 1, acFont10_ASCII_97 } /* code 97 */ + ,{ 6, 6, 1, acFont10_ASCII_98 } /* code 98 */ + ,{ 6, 6, 1, acFont10_ASCII_99 } /* code 99 */ + ,{ 6, 6, 1, acFont10_ASCII_100 } /* code 100 */ + ,{ 6, 6, 1, acFont10_ASCII_101 } /* code 101 */ + ,{ 4, 4, 1, acFont10_ASCII_102 } /* code 102 */ + ,{ 6, 6, 1, acFont10_ASCII_103 } /* code 103 */ + ,{ 6, 6, 1, acFont10_ASCII_104 } /* code 104 */ + ,{ 2, 2, 1, acFont10_ASCII_105 } /* code 105 */ + ,{ 2, 2, 1, acFont10_ASCII_106 } /* code 106 */ + ,{ 5, 5, 1, acFont10_ASCII_107 } /* code 107 */ + ,{ 2, 2, 1, acFont10_ASCII_108 } /* code 108 */ + ,{ 8, 8, 1, acFont10_ASCII_109 } /* code 109 */ + ,{ 6, 6, 1, acFont10_ASCII_110 } /* code 110 */ + ,{ 6, 6, 1, acFont10_ASCII_111 } /* code 111 */ + ,{ 6, 6, 1, acFont10_ASCII_112 } /* code 112 */ + ,{ 6, 6, 1, acFont10_ASCII_113 } /* code 113 */ + ,{ 4, 4, 1, acFont10_ASCII_114 } /* code 114 */ + ,{ 6, 6, 1, acFont10_ASCII_115 } /* code 115 */ + ,{ 3, 3, 1, acFont10_ASCII_116 } /* code 116 */ + ,{ 6, 6, 1, acFont10_ASCII_117 } /* code 117 */ + ,{ 6, 6, 1, acFont10_ASCII_118 } /* code 118 */ + ,{ 10, 10, 2, acFont10_ASCII_119 } /* code 119 */ + ,{ 6, 6, 1, acFont10_ASCII_120 } /* code 120 */ + ,{ 6, 6, 1, acFont10_ASCII_121 } /* code 121 */ + ,{ 6, 6, 1, acFont10_ASCII_122 } /* code 122 */ + ,{ 4, 4, 1, acFont10_ASCII_123 } /* code 123 */ + ,{ 2, 2, 1, acFont10_ASCII_124 } /* code 124 */ + ,{ 4, 4, 1, acFont10_ASCII_125 } /* code 125 */ + ,{ 6, 6, 1, acFont10_ASCII_126 } /* code 126 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font10ASCIIProp1 = { + 32 /* first character */ + ,126 /* last character */ + ,&GUI_Font10_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font10_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,10 /* height of font */ + ,10 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font10ASCIIProp1} + , 9, 6, 8 +}; + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Font/F13B_1.c b/User/system/lib/lcd/gui/Font/F13B_1.c new file mode 100644 index 0000000..9509d7a --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13B_1.c @@ -0,0 +1,1581 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13B_1.c +Purpose : ISO 8859-1 West European Character Set, bold +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* Start of unicode area */ + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A0[ 13] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A1[ 13] = { /* code 00A1 */ + ________, + ________, + ________, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A2[ 13] = { /* code 00A2 */ + ________, + ________, + ________, + ____X___, + ____X___, + __XXXX__, + _XX_X___, + _XX_X___, + _XX_X___, + _XX_X___, + __XXXX__, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A3[ 13] = { /* code 00A3 */ + ________, + ________, + ________, + __XXX___, + _XX__X__, + _XX_____, + _XX_____, + XXXXX___, + _XX_____, + _XX_____, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A4[ 13] = { /* code 00A4 */ + ________, + ________, + ________, + ________, + X____X__, + _XXXX___, + _X__X___, + _X__X___, + _XXXX___, + X____X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A5[ 13] = { /* code 00A5 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + XXXXXX__, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A6[ 13] = { /* code 00A6 */ + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A7[ 13] = { /* code 00A7 */ + ________, + ________, + ________, + _XXXX___, + XX___X__, + XX______, + _XXXX___, + XX__XX__, + XX__XX__, + _XXXX___, + ____XX__, + X___XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A8[ 13] = { /* code 00A8 */ + ________, + ________, + ________, + XX_XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00A9[ 26] = { /* code 00A9 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X__XXX__,X_______, + X_XX____,X_______, + X_XX____,X_______, + X_XX____,X_______, + X__XXX__,X_______, + _X_____X,________, + __XXXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00AA[ 13] = { /* code 00AA */ + ________, + ________, + ________, + XXXX____, + ___XX___, + _XXXX___, + XX_XX___, + _XXXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00AB[ 13] = { /* code 00AB */ + ________, + ________, + ________, + ________, + ________, + ___X__X_, + __XX_XX_, + _XX_XX__, + __XX_XX_, + ___X__X_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00AC[ 26] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _______X,________, + _______X,________, + _______X,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00AD[ 13] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00AE[ 26] = { /* code 00AE */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X_XXXX__,X_______, + X_XX_XX_,X_______, + X_XXXX__,X_______, + X_XX_XX_,X_______, + X_XX_XX_,X_______, + _X_____X,________, + __XXXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00AF[ 13] = { /* code 00AF */ + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B0[ 13] = { /* code 00B0 */ + ________, + ________, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B1[ 26] = { /* code 00B1 */ + ________,________, + ________,________, + ________,________, + ____X___,________, + ____X___,________, + ____X___,________, + _XXXXXXX,________, + ____X___,________, + ____X___,________, + ____X___,________, + _XXXXXXX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B2[ 13] = { /* code 00B2 */ + ________, + ________, + ________, + XXXX____, + ___XX___, + __XX____, + _XX_____, + XXXXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B3[ 13] = { /* code 00B3 */ + ________, + ________, + ________, + XXXX____, + ___XX___, + _XXX____, + ___XX___, + XXXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B4[ 13] = { /* code 00B4 */ + ________, + ________, + ___XX___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B5[ 13] = { /* code 00B5 */ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXXX__, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B6[ 13] = { /* code 00B6 */ + ________, + ________, + ________, + _XXXXX__, + XXXX_X__, + XXXX_X__, + XXXX_X__, + _XXX_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B7[ 13] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B8[ 13] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00B9[ 13] = { /* code 00B9 */ + ________, + ________, + ________, + __XX____, + _XXX____, + __XX____, + __XX____, + _XXXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00BA[ 13] = { /* code 00BA */ + ________, + ________, + ________, + _XXX____, + XX_XX___, + XX_XX___, + XX_XX___, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00BB[ 13] = { /* code 00BB */ + ________, + ________, + ________, + ________, + ________, + _X__X___, + _XX_XX__, + __XX_XX_, + _XX_XX__, + _X__X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00BC[ 26] = { /* code 00BC */ + ________,________, + ________,________, + ________,________, + _XX____X,________, + XXX___X_,________, + _XX___X_,________, + _XX__X__,XX______, + _XX__X_X,XX______, + ____X_X_,XX______, + ____X_XX,XXX_____, + ___X____,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00BD[ 26] = { /* code 00BD */ + ________,________, + ________,________, + ________,________, + _XX____X,________, + XXX___X_,________, + _XX___X_,________, + _XX__X_X,XX______, + _XX__X__,_XX_____, + ____X___,_XX_____, + ____X___,XX______, + ___X___X,XXX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00BE[ 26] = { /* code 00BE */ + ________,________, + ________,________, + ________,________, + XXX____X,________, + __XX__X_,________, + _XX___X_,________, + __XX_X__,XX______, + XXX__X_X,XX______, + ____X_X_,XX______, + ____X_XX,XXX_____, + ___X____,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00BF[ 13] = { /* code 00BF */ + ________, + ________, + ________, + __XX____, + ________, + __XX____, + __XX____, + _XX_____, + XX______, + XX__X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C0[ 13] = { /* code 00C0 */ + _XX_____, + __XX____, + ________, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C1[ 13] = { /* code 00C1 */ + ___XX___, + __XX____, + ________, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C2[ 13] = { /* code 00C2 */ + __XXX___, + _XX_XX__, + ________, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C3[ 13] = { /* code 00C3 */ + __XX_X__, + _X_XX___, + ________, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C4[ 13] = { /* code 00C4 */ + ________, + _XX_XX__, + ________, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C5[ 13] = { /* code 00C5 */ + ________, + ___X____, + __X_X___, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C6[ 26] = { /* code 00C6 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,XX______, + __XX_XX_,________, + __XX_XX_,________, + __XX_XXX,XX______, + _XXXXXX_,________, + _XX__XX_,________, + _XX__XX_,________, + XX___XXX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C7[ 13] = { /* code 00C7 */ + ________, + ________, + ________, + _XXXXX__, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + _XXXXX__, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C8[ 13] = { /* code 00C8 */ + _XX_____, + __XX____, + ________, + XXXXX___, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00C9[ 13] = { /* code 00C9 */ + ___XX___, + __XX____, + ________, + XXXXX___, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00CA[ 13] = { /* code 00CA */ + _XXX____, + XX_XX___, + ________, + XXXXX___, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00CB[ 13] = { /* code 00CB */ + ________, + XX_XX___, + ________, + XXXXX___, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00CC[ 13] = { /* code 00CC */ + XX______, + _XX_____, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00CD[ 13] = { /* code 00CD */ + __XX____, + _XX_____, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00CE[ 13] = { /* code 00CE */ + _XXX____, + XX_XX___, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00CF[ 13] = { /* code 00CF */ + ________, + X__XX___, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D0[ 26] = { /* code 00D0 */ + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + _XX__XX_,________, + _XX___XX,________, + XXXXX_XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XX_,________, + _XXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D1[ 13] = { /* code 00D1 */ + __XX_X__, + _X_XX___, + ________, + XX___X__, + XXX__X__, + XXXX_X__, + X_XXXX__, + X__XXX__, + X___XX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D2[ 13] = { /* code 00D2 */ + _XX_____, + __XX____, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D3[ 13] = { /* code 00D3 */ + ___XX___, + __XX____, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D4[ 13] = { /* code 00D4 */ + __XXX___, + _XX_XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D5[ 13] = { /* code 00D5 */ + __XX_X__, + _X_XX___, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D6[ 13] = { /* code 00D6 */ + ________, + _XX_XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D7[ 26] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X___X_,________, + ___X_X__,________, + ____X___,________, + ___X_X__,________, + __X___X_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D8[ 13] = { /* code 00D8 */ + ________, + ________, + ______X_, + _XXXXX__, + XX__XXX_, + XX__XXX_, + XX_X_XX_, + XX_X_XX_, + XXX__XX_, + XXX__XX_, + _XXXXX__, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00D9[ 13] = { /* code 00D9 */ + __XX____, + ___XX___, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00DA[ 13] = { /* code 00DA */ + ___XX___, + __XX____, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00DB[ 13] = { /* code 00DB */ + __XXX___, + _XX_XX__, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00DC[ 13] = { /* code 00DC */ + ________, + _XX_XX__, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00DD[ 13] = { /* code 00DD */ + ___XX___, + __XX____, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00DE[ 13] = { /* code 00DE */ + ________, + ________, + ________, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XXXXX___, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00DF[ 13] = { /* code 00DF */ + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX_XX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX_XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E0[ 13] = { /* code 00E0 */ + ________, + ________, + _XX_____, + __XX____, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E1[ 13] = { /* code 00E1 */ + ________, + ________, + ___XX___, + __XX____, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E2[ 13] = { /* code 00E2 */ + ________, + ________, + __XXX___, + _XX_XX__, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E3[ 13] = { /* code 00E3 */ + ________, + ________, + __XX_X__, + _X_XX___, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E4[ 13] = { /* code 00E4 */ + ________, + ________, + ________, + _XX_XX__, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E5[ 13] = { /* code 00E5 */ + ________, + ________, + __XXX___, + __X_X___, + __XXX___, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E6[ 26] = { /* code 00E6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX_XX,X_______, + ____XX__,XX______, + _XXXXXXX,XX______, + XX__XX__,________, + XX__XX__,________, + _XXX_XXX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E7[ 13] = { /* code 00E7 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + XX______, + XX______, + XX______, + XX______, + _XXXX___, + ___X____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E8[ 13] = { /* code 00E8 */ + ________, + ________, + _XX_____, + __XX____, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00E9[ 13] = { /* code 00E9 */ + ________, + ________, + ___XX___, + __XX____, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00EA[ 13] = { /* code 00EA */ + ________, + ________, + __XXX___, + _XX_XX__, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00EB[ 13] = { /* code 00EB */ + ________, + ________, + ________, + _XX_XX__, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00EC[ 13] = { /* code 00EC */ + ________, + ________, + X_______, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00ED[ 13] = { /* code 00ED */ + ________, + ________, + _XX_____, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00EE[ 13] = { /* code 00EE */ + ________, + ________, + XX______, + __X_____, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00EF[ 13] = { /* code 00EF */ + ________, + ________, + __X_____, + __X_____, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F0[ 13] = { /* code 00F0 */ + ________, + ________, + _XX_X___, + __XX____, + _X_XX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F1[ 13] = { /* code 00F1 */ + ________, + ________, + __XX_X__, + _X_XX___, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F2[ 13] = { /* code 00F2 */ + ________, + ________, + _XX_____, + __XX____, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F3[ 13] = { /* code 00F3 */ + ________, + ________, + ___XX___, + __XX____, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F4[ 13] = { /* code 00F4 */ + ________, + ________, + __XXX___, + _XX_XX__, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F5[ 13] = { /* code 00F5 */ + ________, + ________, + __XX_X__, + _X_XX___, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F6[ 13] = { /* code 00F6 */ + ________, + ________, + ________, + XX__XX__, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F7[ 26] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + ________,________, + XXXXXXXX,________, + ________,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F8[ 13] = { /* code 00F8 */ + ________, + ________, + ________, + ________, + _____X__, + _XXXX___, + XX_XXX__, + XX_XXX__, + XXX_XX__, + XXX_XX__, + _XXXX___, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00F9[ 13] = { /* code 00F9 */ + ________, + ________, + _XX_____, + __XX____, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00FA[ 13] = { /* code 00FA */ + ________, + ________, + ___XX___, + __XX____, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00FB[ 13] = { /* code 00FB */ + ________, + ________, + __XXX___, + _XX_XX__, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00FC[ 13] = { /* code 00FC */ + ________, + ________, + ________, + _XX_XX__, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00FD[ 13] = { /* code 00FD */ + ________, + ________, + ___XX___, + __XX____, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00FE[ 13] = { /* code 00FE */ + ________, + ________, + XX______, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXX___, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13B_1_00FF[ 13] = { /* code 00FF */ + ________, + ________, + ________, + XX__XX__, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13B_1_CharInfo[96] = { + { 3, 3, 1, acFont13B_1_00A0 } /* code 00A0 */ + ,{ 3, 3, 1, acFont13B_1_00A1 } /* code 00A1 */ + ,{ 7, 7, 1, acFont13B_1_00A2 } /* code 00A2 */ + ,{ 7, 7, 1, acFont13B_1_00A3 } /* code 00A3 */ + ,{ 7, 7, 1, acFont13B_1_00A4 } /* code 00A4 */ + ,{ 7, 7, 1, acFont13B_1_00A5 } /* code 00A5 */ + ,{ 7, 7, 1, acFont13B_1_00A6 } /* code 00A6 */ + ,{ 7, 7, 1, acFont13B_1_00A7 } /* code 00A7 */ + ,{ 6, 6, 1, acFont13B_1_00A8 } /* code 00A8 */ + ,{ 10, 10, 2, acFont13B_1_00A9 } /* code 00A9 */ + ,{ 6, 6, 1, acFont13B_1_00AA } /* code 00AA */ + ,{ 8, 8, 1, acFont13B_1_00AB } /* code 00AB */ + ,{ 9, 9, 2, acFont13B_1_00AC } /* code 00AC */ + ,{ 5, 5, 1, acFont13B_1_00AD } /* code 00AD */ + ,{ 10, 10, 2, acFont13B_1_00AE } /* code 00AE */ + ,{ 7, 7, 1, acFont13B_1_00AF } /* code 00AF */ + ,{ 6, 6, 1, acFont13B_1_00B0 } /* code 00B0 */ + ,{ 9, 9, 2, acFont13B_1_00B1 } /* code 00B1 */ + ,{ 6, 6, 1, acFont13B_1_00B2 } /* code 00B2 */ + ,{ 6, 6, 1, acFont13B_1_00B3 } /* code 00B3 */ + ,{ 6, 6, 1, acFont13B_1_00B4 } /* code 00B4 */ + ,{ 7, 7, 1, acFont13B_1_00B5 } /* code 00B5 */ + ,{ 7, 7, 1, acFont13B_1_00B6 } /* code 00B6 */ + ,{ 3, 3, 1, acFont13B_1_00B7 } /* code 00B7 */ + ,{ 6, 6, 1, acFont13B_1_00B8 } /* code 00B8 */ + ,{ 6, 6, 1, acFont13B_1_00B9 } /* code 00B9 */ + ,{ 6, 6, 1, acFont13B_1_00BA } /* code 00BA */ + ,{ 8, 8, 1, acFont13B_1_00BB } /* code 00BB */ + ,{ 12, 12, 2, acFont13B_1_00BC } /* code 00BC */ + ,{ 12, 12, 2, acFont13B_1_00BD } /* code 00BD */ + ,{ 12, 12, 2, acFont13B_1_00BE } /* code 00BE */ + ,{ 6, 6, 1, acFont13B_1_00BF } /* code 00BF */ + ,{ 8, 8, 1, acFont13B_1_00C0 } /* code 00C0 */ + ,{ 8, 8, 1, acFont13B_1_00C1 } /* code 00C1 */ + ,{ 8, 8, 1, acFont13B_1_00C2 } /* code 00C2 */ + ,{ 8, 8, 1, acFont13B_1_00C3 } /* code 00C3 */ + ,{ 8, 8, 1, acFont13B_1_00C4 } /* code 00C4 */ + ,{ 8, 8, 1, acFont13B_1_00C5 } /* code 00C5 */ + ,{ 11, 11, 2, acFont13B_1_00C6 } /* code 00C6 */ + ,{ 7, 7, 1, acFont13B_1_00C7 } /* code 00C7 */ + ,{ 6, 6, 1, acFont13B_1_00C8 } /* code 00C8 */ + ,{ 6, 6, 1, acFont13B_1_00C9 } /* code 00C9 */ + ,{ 6, 6, 1, acFont13B_1_00CA } /* code 00CA */ + ,{ 6, 6, 1, acFont13B_1_00CB } /* code 00CB */ + ,{ 5, 5, 1, acFont13B_1_00CC } /* code 00CC */ + ,{ 5, 5, 1, acFont13B_1_00CD } /* code 00CD */ + ,{ 5, 5, 1, acFont13B_1_00CE } /* code 00CE */ + ,{ 5, 5, 1, acFont13B_1_00CF } /* code 00CF */ + ,{ 9, 9, 2, acFont13B_1_00D0 } /* code 00D0 */ + ,{ 7, 7, 1, acFont13B_1_00D1 } /* code 00D1 */ + ,{ 8, 8, 1, acFont13B_1_00D2 } /* code 00D2 */ + ,{ 8, 8, 1, acFont13B_1_00D3 } /* code 00D3 */ + ,{ 8, 8, 1, acFont13B_1_00D4 } /* code 00D4 */ + ,{ 8, 8, 1, acFont13B_1_00D5 } /* code 00D5 */ + ,{ 8, 8, 1, acFont13B_1_00D6 } /* code 00D6 */ + ,{ 9, 9, 2, acFont13B_1_00D7 } /* code 00D7 */ + ,{ 8, 8, 1, acFont13B_1_00D8 } /* code 00D8 */ + ,{ 8, 8, 1, acFont13B_1_00D9 } /* code 00D9 */ + ,{ 8, 8, 1, acFont13B_1_00DA } /* code 00DA */ + ,{ 8, 8, 1, acFont13B_1_00DB } /* code 00DB */ + ,{ 8, 8, 1, acFont13B_1_00DC } /* code 00DC */ + ,{ 7, 7, 1, acFont13B_1_00DD } /* code 00DD */ + ,{ 7, 7, 1, acFont13B_1_00DE } /* code 00DE */ + ,{ 7, 7, 1, acFont13B_1_00DF } /* code 00DF */ + ,{ 7, 7, 1, acFont13B_1_00E0 } /* code 00E0 */ + ,{ 7, 7, 1, acFont13B_1_00E1 } /* code 00E1 */ + ,{ 7, 7, 1, acFont13B_1_00E2 } /* code 00E2 */ + ,{ 7, 7, 1, acFont13B_1_00E3 } /* code 00E3 */ + ,{ 7, 7, 1, acFont13B_1_00E4 } /* code 00E4 */ + ,{ 7, 7, 1, acFont13B_1_00E5 } /* code 00E5 */ + ,{ 11, 11, 2, acFont13B_1_00E6 } /* code 00E6 */ + ,{ 6, 6, 1, acFont13B_1_00E7 } /* code 00E7 */ + ,{ 7, 7, 1, acFont13B_1_00E8 } /* code 00E8 */ + ,{ 7, 7, 1, acFont13B_1_00E9 } /* code 00E9 */ + ,{ 7, 7, 1, acFont13B_1_00EA } /* code 00EA */ + ,{ 7, 7, 1, acFont13B_1_00EB } /* code 00EB */ + ,{ 3, 3, 1, acFont13B_1_00EC } /* code 00EC */ + ,{ 3, 3, 1, acFont13B_1_00ED } /* code 00ED */ + ,{ 3, 3, 1, acFont13B_1_00EE } /* code 00EE */ + ,{ 3, 3, 1, acFont13B_1_00EF } /* code 00EF */ + ,{ 7, 7, 1, acFont13B_1_00F0 } /* code 00F0 */ + ,{ 7, 7, 1, acFont13B_1_00F1 } /* code 00F1 */ + ,{ 7, 7, 1, acFont13B_1_00F2 } /* code 00F2 */ + ,{ 7, 7, 1, acFont13B_1_00F3 } /* code 00F3 */ + ,{ 7, 7, 1, acFont13B_1_00F4 } /* code 00F4 */ + ,{ 7, 7, 1, acFont13B_1_00F5 } /* code 00F5 */ + ,{ 7, 7, 1, acFont13B_1_00F6 } /* code 00F6 */ + ,{ 9, 9, 2, acFont13B_1_00F7 } /* code 00F7 */ + ,{ 7, 7, 1, acFont13B_1_00F8 } /* code 00F8 */ + ,{ 7, 7, 1, acFont13B_1_00F9 } /* code 00F9 */ + ,{ 7, 7, 1, acFont13B_1_00FA } /* code 00FA */ + ,{ 7, 7, 1, acFont13B_1_00FB } /* code 00FB */ + ,{ 7, 7, 1, acFont13B_1_00FC } /* code 00FC */ + ,{ 7, 7, 1, acFont13B_1_00FD } /* code 00FD */ + ,{ 7, 7, 1, acFont13B_1_00FE } /* code 00FE */ + ,{ 7, 7, 1, acFont13B_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13B_1_Prop1 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font13B_1_CharInfo[ 0] /* address of first character */ + ,&GUI_Font13B_ASCII_Prop1 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13B_1_Prop1} + ,11 ,6 ,8 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13B_ASCII.c b/User/system/lib/lcd/gui/Font/F13B_ASCII.c new file mode 100644 index 0000000..4200132 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13B_ASCII.c @@ -0,0 +1,1565 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13B_ASCII.c +Purpose : Proportional Font, ASCII characters, bold +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* Start of unicode area */ + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0020[ 13] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0021[ 13] = { /* code 0021 */ + ________, + ________, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0022[ 13] = { /* code 0022 */ + ________, + ________, + XX_XX___, + XX_XX___, + XX_XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0023[ 26] = { /* code 0023 */ + ________,________, + ________,________, + ________,________, + ___X__X_,________, + ___X__X_,________, + _XXXXXXX,________, + _XXXXXXX,________, + __X__X__,________, + XXXXXXX_,________, + XXXXXXX_,________, + _X__X___,________, + _X__X___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0024[ 13] = { /* code 0024 */ + ________, + ________, + ___X____, + ___X____, + _XXXX___, + XX_X_X__, + XX_X____, + _XXXX___, + __X_XX__, + X_X_XX__, + _XXXX___, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0025[ 26] = { /* code 0025 */ + ________,________, + ________,________, + ________,________, + _XXX___X,________, + XX_XX__X,________, + XX_XX_X_,________, + XX_XX_X_,XXX_____, + _XXX_X_X,X_XX____, + _____X_X,X_XX____, + ____X__X,X_XX____, + ____X___,XXX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0026[ 26] = { /* code 0026 */ + ________,________, + ________,________, + ________,________, + _XXX____,________, + XX_XX___,________, + XX_XX___,________, + _XXX__XX,________, + XX_XX_X_,________, + XX__XX__,________, + XX___XX_,________, + _XXXX_XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0027[ 13] = { /* code 0027 */ + ________, + ________, + XX______, + XX______, + XX______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0028[ 13] = { /* code 0028 */ + ________, + ________, + __XX____, + _XX_____, + _XX_____, + XX______, + XX______, + XX______, + XX______, + XX______, + _XX_____, + _XX_____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0029[ 13] = { /* code 0029 */ + ________, + ________, + XX______, + _XX_____, + _XX_____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XX_____, + _XX_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_002A[ 13] = { /* code 002A */ + ________, + ________, + __XX____, + X_XX_X__, + _XXXX___, + X_XX_X__, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_002B[ 26] = { /* code 002B */ + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,________, + ____X___,________, + ____X___,________, + _XXXXXXX,________, + ____X___,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_002C[ 13] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + XX______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_002D[ 13] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_002E[ 13] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_002F[ 13] = { /* code 002F */ + ________, + ________, + ____X___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0030[ 13] = { /* code 0030 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0031[ 13] = { /* code 0031 */ + ________, + ________, + ________, + __XX____, + _XXX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0032[ 13] = { /* code 0032 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0033[ 13] = { /* code 0033 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + ____XX__, + __XXX___, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0034[ 13] = { /* code 0034 */ + ________, + ________, + ________, + ____X___, + ___XX___, + __XXX___, + _X_XX___, + X__XX___, + XXXXXX__, + ___XX___, + ___XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0035[ 13] = { /* code 0035 */ + ________, + ________, + ________, + _XXXXX__, + _XX_____, + _XX_____, + _XXXX___, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0036[ 13] = { /* code 0036 */ + ________, + ________, + ________, + _XXXX___, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0037[ 13] = { /* code 0037 */ + ________, + ________, + ________, + XXXXXX__, + ____XX__, + ___XX___, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0038[ 13] = { /* code 0038 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0039[ 13] = { /* code 0039 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ____XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_003A[ 13] = { /* code 003A */ + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + ________, + ________, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_003B[ 13] = { /* code 003B */ + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + ________, + ________, + XX______, + XX______, + XX______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_003C[ 26] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ____XX__,________, + __XX____,________, + _X______,________, + __XX____,________, + ____XX__,________, + ______XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_003D[ 26] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + ________,________, + ________,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_003E[ 26] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + ___XX___,________, + _____XX_,________, + _______X,________, + _____XX_,________, + ___XX___,________, + _XX_____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_003F[ 13] = { /* code 003F */ + ________, + ________, + ________, + _XXX____, + X__XX___, + ___XX___, + __XX____, + _XX_____, + _XX_____, + ________, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0040[ 26] = { /* code 0040 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X__XXXX_,X_______, + X_XX_XX_,X_______, + X_XX_XX_,X_______, + X_XX_XX_,X_______, + X__XX_XX,________, + _X______,________, + __XXXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0041[ 13] = { /* code 0041 */ + ________, + ________, + ________, + __XXX___, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0042[ 13] = { /* code 0042 */ + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0043[ 13] = { /* code 0043 */ + ________, + ________, + ________, + _XXXXX__, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0044[ 13] = { /* code 0044 */ + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XX__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0045[ 13] = { /* code 0045 */ + ________, + ________, + ________, + XXXXX___, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0046[ 13] = { /* code 0046 */ + ________, + ________, + ________, + XXXXX___, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0047[ 13] = { /* code 0047 */ + ________, + ________, + ________, + _XXXXXX_, + XX______, + XX______, + XX______, + XX__XXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0048[ 13] = { /* code 0048 */ + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0049[ 13] = { /* code 0049 */ + ________, + ________, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_004A[ 13] = { /* code 004A */ + ________, + ________, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_004B[ 13] = { /* code 004B */ + ________, + ________, + ________, + XX__XX__, + XX_XX___, + XXXX____, + XXX_____, + XXX_____, + XXXX____, + XX_XX___, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_004C[ 13] = { /* code 004C */ + ________, + ________, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_004D[ 26] = { /* code 004D */ + ________,________, + ________,________, + ________,________, + XX_____X,X_______, + XXX___XX,X_______, + XXXX_XXX,X_______, + X_XXXX_X,X_______, + X__XX__X,X_______, + X______X,X_______, + X______X,X_______, + X______X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_004E[ 13] = { /* code 004E */ + ________, + ________, + ________, + XX___X__, + XXX__X__, + XXXX_X__, + X_XXXX__, + X__XXX__, + X___XX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_004F[ 13] = { /* code 004F */ + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0050[ 13] = { /* code 0050 */ + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXX___, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0051[ 13] = { /* code 0051 */ + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ___XX___, + ____XXX_}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0052[ 13] = { /* code 0052 */ + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXX___, + XX_XX___, + XX__XX__, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0053[ 13] = { /* code 0053 */ + ________, + ________, + ________, + _XXXXX__, + XX______, + XX______, + XXXXX___, + _XXXXX__, + ____XX__, + ____XX__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0054[ 13] = { /* code 0054 */ + ________, + ________, + ________, + XXXXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0055[ 13] = { /* code 0055 */ + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0056[ 13] = { /* code 0056 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0057[ 26] = { /* code 0057 */ + ________,________, + ________,________, + ________,________, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + _XX_XX_X,X_______, + _XXXXXXX,X_______, + _XXX__XX,X_______, + __XX__XX,________, + __XX__XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0058[ 13] = { /* code 0058 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0059[ 13] = { /* code 0059 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_005A[ 13] = { /* code 005A */ + ________, + ________, + ________, + XXXXXX__, + ____XX__, + ___XXX__, + __XXX___, + _XXX____, + XXX_____, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_005B[ 13] = { /* code 005B */ + ________, + ________, + XXXX____, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_005C[ 13] = { /* code 005C */ + ________, + ________, + X_______, + X_______, + _X______, + _X______, + __X_____, + __X_____, + __X_____, + ___X____, + ___X____, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_005D[ 13] = { /* code 005D */ + ________, + ________, + XXXX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_005E[ 26] = { /* code 005E */ + ________,________, + ________,________, + ________,________, + ___X____,________, + __X_X___,________, + _X___X__,________, + X_____X_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_005F[ 13] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0060[ 13] = { /* code 0060 */ + ________, + ________, + _XX_____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0061[ 13] = { /* code 0061 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0062[ 13] = { /* code 0062 */ + ________, + ________, + XX______, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0063[ 13] = { /* code 0063 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + XX______, + XX______, + XX______, + XX______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0064[ 13] = { /* code 0064 */ + ________, + ________, + ____XX__, + ____XX__, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0065[ 13] = { /* code 0065 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0066[ 13] = { /* code 0066 */ + ________, + ________, + _XXX____, + XX______, + XX______, + XXX_____, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0067[ 13] = { /* code 0067 */ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0068[ 13] = { /* code 0068 */ + ________, + ________, + XX______, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0069[ 13] = { /* code 0069 */ + ________, + ________, + ________, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_006A[ 13] = { /* code 006A */ + ________, + ________, + ________, + _XX_____, + ________, + XXX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_006B[ 13] = { /* code 006B */ + ________, + ________, + XX______, + XX______, + XX______, + XX__XX__, + XX_XX___, + XXXX____, + XXXX____, + XX_XX___, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_006C[ 13] = { /* code 006C */ + ________, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_006D[ 26] = { /* code 006D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX_XX,X_______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_006E[ 13] = { /* code 006E */ + ________, + ________, + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_006F[ 13] = { /* code 006F */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0070[ 13] = { /* code 0070 */ + ________, + ________, + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXX___, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0071[ 13] = { /* code 0071 */ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ____XX__}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0072[ 13] = { /* code 0072 */ + ________, + ________, + ________, + ________, + ________, + XX_X____, + XXXX____, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0073[ 13] = { /* code 0073 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + XX______, + XXXX____, + _XXXX___, + ___XX___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0074[ 13] = { /* code 0074 */ + ________, + ________, + ________, + XX______, + XX______, + XXXX____, + XX______, + XX______, + XX______, + XX______, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0075[ 13] = { /* code 0075 */ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0076[ 13] = { /* code 0076 */ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0077[ 26] = { /* code 0077 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XX_XX,________, + XX_XX_XX,________, + XX_XX_XX,________, + XXXXXXXX,________, + _XX__XX_,________, + _XX__XX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0078[ 13] = { /* code 0078 */ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_0079[ 13] = { /* code 0079 */ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_007A[ 13] = { /* code 007A */ + ________, + ________, + ________, + ________, + ________, + XXXXX___, + ___XX___, + __XX____, + _XX_____, + XX______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_007B[ 13] = { /* code 007B */ + ________, + ________, + ___XXX__, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XXX__}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_007C[ 13] = { /* code 007C */ + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_007D[ 13] = { /* code 007D */ + ________, + ________, + XXX_____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XXX__, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont13B_ASCII_007E[ 26] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX___X,________, + X__XX__X,________, + X___XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13B_ASCII_CharInfo[95] = { + { 3, 3, 1, acFont13B_ASCII_0020 } /* code 0020 */ + ,{ 3, 3, 1, acFont13B_ASCII_0021 } /* code 0021 */ + ,{ 6, 6, 1, acFont13B_ASCII_0022 } /* code 0022 */ + ,{ 9, 9, 2, acFont13B_ASCII_0023 } /* code 0023 */ + ,{ 7, 7, 1, acFont13B_ASCII_0024 } /* code 0024 */ + ,{ 13, 13, 2, acFont13B_ASCII_0025 } /* code 0025 */ + ,{ 9, 9, 2, acFont13B_ASCII_0026 } /* code 0026 */ + ,{ 3, 3, 1, acFont13B_ASCII_0027 } /* code 0027 */ + ,{ 5, 5, 1, acFont13B_ASCII_0028 } /* code 0028 */ + ,{ 5, 5, 1, acFont13B_ASCII_0029 } /* code 0029 */ + ,{ 7, 7, 1, acFont13B_ASCII_002A } /* code 002A */ + ,{ 9, 9, 2, acFont13B_ASCII_002B } /* code 002B */ + ,{ 3, 3, 1, acFont13B_ASCII_002C } /* code 002C */ + ,{ 5, 5, 1, acFont13B_ASCII_002D } /* code 002D */ + ,{ 3, 3, 1, acFont13B_ASCII_002E } /* code 002E */ + ,{ 6, 6, 1, acFont13B_ASCII_002F } /* code 002F */ + ,{ 7, 7, 1, acFont13B_ASCII_0030 } /* code 0030 */ + ,{ 7, 7, 1, acFont13B_ASCII_0031 } /* code 0031 */ + ,{ 7, 7, 1, acFont13B_ASCII_0032 } /* code 0032 */ + ,{ 7, 7, 1, acFont13B_ASCII_0033 } /* code 0033 */ + ,{ 7, 7, 1, acFont13B_ASCII_0034 } /* code 0034 */ + ,{ 7, 7, 1, acFont13B_ASCII_0035 } /* code 0035 */ + ,{ 7, 7, 1, acFont13B_ASCII_0036 } /* code 0036 */ + ,{ 7, 7, 1, acFont13B_ASCII_0037 } /* code 0037 */ + ,{ 7, 7, 1, acFont13B_ASCII_0038 } /* code 0038 */ + ,{ 7, 7, 1, acFont13B_ASCII_0039 } /* code 0039 */ + ,{ 3, 3, 1, acFont13B_ASCII_003A } /* code 003A */ + ,{ 3, 3, 1, acFont13B_ASCII_003B } /* code 003B */ + ,{ 9, 9, 2, acFont13B_ASCII_003C } /* code 003C */ + ,{ 9, 9, 2, acFont13B_ASCII_003D } /* code 003D */ + ,{ 9, 9, 2, acFont13B_ASCII_003E } /* code 003E */ + ,{ 6, 6, 1, acFont13B_ASCII_003F } /* code 003F */ + ,{ 10, 10, 2, acFont13B_ASCII_0040 } /* code 0040 */ + ,{ 8, 8, 1, acFont13B_ASCII_0041 } /* code 0041 */ + ,{ 7, 7, 1, acFont13B_ASCII_0042 } /* code 0042 */ + ,{ 7, 7, 1, acFont13B_ASCII_0043 } /* code 0043 */ + ,{ 8, 8, 1, acFont13B_ASCII_0044 } /* code 0044 */ + ,{ 6, 6, 1, acFont13B_ASCII_0045 } /* code 0045 */ + ,{ 6, 6, 1, acFont13B_ASCII_0046 } /* code 0046 */ + ,{ 8, 8, 1, acFont13B_ASCII_0047 } /* code 0047 */ + ,{ 8, 8, 1, acFont13B_ASCII_0048 } /* code 0048 */ + ,{ 5, 5, 1, acFont13B_ASCII_0049 } /* code 0049 */ + ,{ 6, 6, 1, acFont13B_ASCII_004A } /* code 004A */ + ,{ 7, 7, 1, acFont13B_ASCII_004B } /* code 004B */ + ,{ 6, 6, 1, acFont13B_ASCII_004C } /* code 004C */ + ,{ 10, 10, 2, acFont13B_ASCII_004D } /* code 004D */ + ,{ 7, 7, 1, acFont13B_ASCII_004E } /* code 004E */ + ,{ 8, 8, 1, acFont13B_ASCII_004F } /* code 004F */ + ,{ 7, 7, 1, acFont13B_ASCII_0050 } /* code 0050 */ + ,{ 8, 8, 1, acFont13B_ASCII_0051 } /* code 0051 */ + ,{ 8, 8, 1, acFont13B_ASCII_0052 } /* code 0052 */ + ,{ 7, 7, 1, acFont13B_ASCII_0053 } /* code 0053 */ + ,{ 7, 7, 1, acFont13B_ASCII_0054 } /* code 0054 */ + ,{ 8, 8, 1, acFont13B_ASCII_0055 } /* code 0055 */ + ,{ 7, 7, 1, acFont13B_ASCII_0056 } /* code 0056 */ + ,{ 11, 11, 2, acFont13B_ASCII_0057 } /* code 0057 */ + ,{ 7, 7, 1, acFont13B_ASCII_0058 } /* code 0058 */ + ,{ 7, 7, 1, acFont13B_ASCII_0059 } /* code 0059 */ + ,{ 7, 7, 1, acFont13B_ASCII_005A } /* code 005A */ + ,{ 5, 5, 1, acFont13B_ASCII_005B } /* code 005B */ + ,{ 6, 6, 1, acFont13B_ASCII_005C } /* code 005C */ + ,{ 5, 5, 1, acFont13B_ASCII_005D } /* code 005D */ + ,{ 9, 9, 2, acFont13B_ASCII_005E } /* code 005E */ + ,{ 7, 7, 1, acFont13B_ASCII_005F } /* code 005F */ + ,{ 6, 6, 1, acFont13B_ASCII_0060 } /* code 0060 */ + ,{ 7, 7, 1, acFont13B_ASCII_0061 } /* code 0061 */ + ,{ 7, 7, 1, acFont13B_ASCII_0062 } /* code 0062 */ + ,{ 6, 6, 1, acFont13B_ASCII_0063 } /* code 0063 */ + ,{ 7, 7, 1, acFont13B_ASCII_0064 } /* code 0064 */ + ,{ 7, 7, 1, acFont13B_ASCII_0065 } /* code 0065 */ + ,{ 4, 4, 1, acFont13B_ASCII_0066 } /* code 0066 */ + ,{ 7, 7, 1, acFont13B_ASCII_0067 } /* code 0067 */ + ,{ 7, 7, 1, acFont13B_ASCII_0068 } /* code 0068 */ + ,{ 3, 3, 1, acFont13B_ASCII_0069 } /* code 0069 */ + ,{ 4, 4, 1, acFont13B_ASCII_006A } /* code 006A */ + ,{ 7, 7, 1, acFont13B_ASCII_006B } /* code 006B */ + ,{ 3, 3, 1, acFont13B_ASCII_006C } /* code 006C */ + ,{ 11, 11, 2, acFont13B_ASCII_006D } /* code 006D */ + ,{ 7, 7, 1, acFont13B_ASCII_006E } /* code 006E */ + ,{ 7, 7, 1, acFont13B_ASCII_006F } /* code 006F */ + ,{ 7, 7, 1, acFont13B_ASCII_0070 } /* code 0070 */ + ,{ 7, 7, 1, acFont13B_ASCII_0071 } /* code 0071 */ + ,{ 5, 5, 1, acFont13B_ASCII_0072 } /* code 0072 */ + ,{ 6, 6, 1, acFont13B_ASCII_0073 } /* code 0073 */ + ,{ 5, 5, 1, acFont13B_ASCII_0074 } /* code 0074 */ + ,{ 7, 7, 1, acFont13B_ASCII_0075 } /* code 0075 */ + ,{ 7, 7, 1, acFont13B_ASCII_0076 } /* code 0076 */ + ,{ 9, 9, 2, acFont13B_ASCII_0077 } /* code 0077 */ + ,{ 7, 7, 1, acFont13B_ASCII_0078 } /* code 0078 */ + ,{ 7, 7, 1, acFont13B_ASCII_0079 } /* code 0079 */ + ,{ 6, 6, 1, acFont13B_ASCII_007A } /* code 007A */ + ,{ 7, 7, 1, acFont13B_ASCII_007B } /* code 007B */ + ,{ 7, 7, 1, acFont13B_ASCII_007C } /* code 007C */ + ,{ 7, 7, 1, acFont13B_ASCII_007D } /* code 007D */ + ,{ 9, 9, 2, acFont13B_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13B_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font13B_ASCII_CharInfo[ 0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13B_ASCII_Prop1} + ,11 ,6 ,8 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13HB_1.c b/User/system/lib/lcd/gui/Font/F13HB_1.c new file mode 100644 index 0000000..99edc4d --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13HB_1.c @@ -0,0 +1,1587 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13HB_1.C +Purpose : ISO 8859-1, West European Character Set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A0[ 13] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A1[ 13] = { /* code 00A1 */ + ________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A2[ 13] = { /* code 00A2 */ + ________, + ________, + ____X___, + ____X___, + __XXXX__, + _XX_X_X_, + _XX_X___, + _XX_X___, + _XX_X___, + _XX_X_X_, + __XXXX__, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A3[ 13] = { /* code 00A3 */ + ________, + ________, + ___XXX__, + __XX__X_, + __XX____, + __XX____, + _XXXXX__, + __XX____, + __XX____, + _XX_____, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A4[ 13] = { /* code 00A4 */ + ________, + ________, + ________, + X_____X_, + _XXXXX__, + _X___X__, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A5[ 13] = { /* code 00A5 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + __XXXX__, + __XXXX__, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ___XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A6[ 13] = { /* code 00A6 */ + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A7[ 13] = { /* code 00A7 */ + ________, + ________, + _XXXXX__, + XX____X_, + XX______, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + _____XX_, + X____XX_, + _XXXXX__}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A8[ 13] = { /* code 00A8 */ + ________, + _XX_XX__, + _XX_XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00A9[ 26] = { /* code 00A9 */ + ________,________, + ________,________, + ___XXXXX,________, + __X_____,X_______, + _X______,_X______, + X___XXXX,__X_____, + X__XX___,__X_____, + X__XX___,__X_____, + X__XX___,__X_____, + X___XXXX,__X_____, + _X______,_X______, + __X_____,X_______, + ___XXXXX,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00AA[ 13] = { /* code 00AA */ + ________, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00AB[ 26] = { /* code 00AB */ + ________,________, + ________,________, + ________,________, + ________,________, + ___X___X,________, + __XX__XX,________, + _XX__XX_,________, + _XX__XX_,________, + __XX__XX,________, + ___X___X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00AC[ 26] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00AD[ 13] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00AE[ 26] = { /* code 00AE */ + ________,________, + ________,________, + ___XXXXX,________, + __X_____,X_______, + _X______,_X______, + X__XXXX_,__X_____, + X__XX_XX,__X_____, + X__XXXX_,__X_____, + X__XX_XX,__X_____, + X__XX__X,X_X_____, + _X______,_X______, + __X_____,X_______, + ___XXXXX,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00AF[ 13] = { /* code 00AF */ + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B0[ 13] = { /* code 00B0 */ + ________, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B1[ 26] = { /* code 00B1 */ + ________,________, + ________,________, + ________,________, + _____X__,________, + _____X__,________, + _____X__,________, + __XXXXXX,X_______, + _____X__,________, + _____X__,________, + _____X__,________, + __XXXXXX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B2[ 13] = { /* code 00B2 */ + ________, + ________, + __XXX___, + _X__XX__, + ____XX__, + ___XX___, + __XX____, + _XXXXX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B3[ 13] = { /* code 00B3 */ + ________, + ________, + __XXX___, + _X__XX__, + ___XX___, + ____XX__, + _X__XX__, + __XXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B4[ 13] = { /* code 00B4 */ + ________, + ___XX___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B5[ 13] = { /* code 00B5 */ + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + XXXX_XX_, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B6[ 13] = { /* code 00B6 */ + ________, + ________, + _XXXXXX_, + XXXXX_X_, + XXXXX_X_, + XXXXX_X_, + XXXXX_X_, + _XXXX_X_, + ____X_X_, + ____X_X_, + ____X_X_, + ____X_X_, + ____X_X_}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B7[ 13] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B8[ 13] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00B9[ 13] = { /* code 00B9 */ + ________, + ________, + ___XX___, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00BA[ 13] = { /* code 00BA */ + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00BB[ 26] = { /* code 00BB */ + ________,________, + ________,________, + ________,________, + ________,________, + _X___X__,________, + _XX__XX_,________, + __XX__XX,________, + __XX__XX,________, + _XX__XX_,________, + _X___X__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00BC[ 26] = { /* code 00BC */ + ________,________, + ________,________, + __XX____,_X______, + _XXX____,X_______, + __XX___X,________, + __XX___X,___XX___, + __XX__X_,__XXX___, + __XX_X__,_X_XX___, + _____X__,X__XX___, + ____X___,XXXXXX__, + ___X____,___XX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00BD[ 26] = { /* code 00BD */ + ________,________, + ________,________, + __XX____,_X______, + _XXX____,X_______, + __XX___X,________, + __XX___X,__XXX___, + __XX__X_,_X__XX__, + __XX_X__,____XX__, + _____X__,___XX___, + ____X___,__XX____, + ___X____,_XXXXX__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00BE[ 26] = { /* code 00BE */ + ________,________, + ________,________, + __XXX___,__X_____, + _X__XX__,_X______, + ___XX___,X_______, + ____XX__,X__XX___, + _X__XX_X,__XXX___, + __XXX_X_,_X_XX___, + ______X_,X__XX___, + _____X__,XXXXXX__, + ____X___,___XX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00BF[ 13] = { /* code 00BF */ + ________, + ________, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + _XX_____, + XX______, + XX___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C0[ 26] = { /* code 00C0 */ + __XX____,________, + ___XX___,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C1[ 26] = { /* code 00C1 */ + _____XX_,________, + ____XX__,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C2[ 26] = { /* code 00C2 */ + ___XXX__,________, + __XX_XX_,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C3[ 26] = { /* code 00C3 */ + ___XX__X,________, + __X__XX_,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C4[ 26] = { /* code 00C4 */ + __XX_XX_,________, + __XX_XX_,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C5[ 26] = { /* code 00C5 */ + ___XXX__,________, + __X___X_,________, + __XXXXX_,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C6[ 26] = { /* code 00C6 */ + ________,________, + ________,________, + ___XXXXX,XXXX____, + __XX__XX,________, + __XX__XX,________, + __XX__XX,________, + _XX___XX,XXXX____, + _XXXXXXX,________, + _XX___XX,________, + XX____XX,________, + XX____XX,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C7[ 13] = { /* code 00C7 */ + ________, + ________, + _XXXXX__, + XX____X_, + XX____X_, + XX______, + XX______, + XX______, + XX____X_, + XX____X_, + _XXXXX__, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C8[ 13] = { /* code 00C8 */ + _XX_____, + __XX____, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00C9[ 13] = { /* code 00C9 */ + ___XX___, + __XX____, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00CA[ 13] = { /* code 00CA */ + __XXX___, + _XX_XX__, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00CB[ 13] = { /* code 00CB */ + _XX_XX__, + _XX_XX__, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00CC[ 13] = { /* code 00CC */ + XX______, + _XX_____, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00CD[ 13] = { /* code 00CD */ + __XX____, + _XX_____, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00CE[ 13] = { /* code 00CE */ + _XXX____, + XX_XX___, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00CF[ 13] = { /* code 00CF */ + X__XX___, + X__XX___, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D0[ 26] = { /* code 00D0 */ + ________,________, + ________,________, + _XXXXXX_,________, + _XX___XX,________, + _XX____X,X_______, + _XX____X,X_______, + XXXXX__X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX___XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D1[ 13] = { /* code 00D1 */ + __XX__X_, + _X__XX__, + XXX___X_, + XXX___X_, + X_XX__X_, + X_XX__X_, + X__XX_X_, + X__XX_X_, + X___XXX_, + X___XXX_, + X____XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D2[ 26] = { /* code 00D2 */ + __XX____,________, + ___XX___,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D3[ 26] = { /* code 00D3 */ + ____XX__,________, + ___XX___,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D4[ 26] = { /* code 00D4 */ + ___XXX__,________, + __XX_XX_,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D5[ 26] = { /* code 00D5 */ + __XX__X_,________, + _X__XX__,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D6[ 26] = { /* code 00D6 */ + _XX__XX_,________, + _XX__XX_,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D7[ 26] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___X___X,________, + ____X_X_,________, + _____X__,________, + ____X_X_,________, + ___X___X,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D8[ 26] = { /* code 00D8 */ + ________,________, + _______X,________, + _XXXXXX_,________, + XX___XXX,________, + XX__X_XX,________, + XX__X_XX,________, + XX_X__XX,________, + XX_X__XX,________, + XX_X__XX,________, + XXX___XX,________, + _XXXXXX_,________, + X_______,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00D9[ 13] = { /* code 00D9 */ + __XX____, + ___XX___, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00DA[ 13] = { /* code 00DA */ + ___XX___, + __XX____, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00DB[ 13] = { /* code 00DB */ + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00DC[ 13] = { /* code 00DC */ + _XX_XX__, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00DD[ 26] = { /* code 00DD */ + ____XX__,________, + ___XX___,________, + XX____XX,________, + XX____XX,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00DE[ 26] = { /* code 00DE */ + ________,________, + ________,________, + XX______,________, + XXXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXXXXXX_,________, + XX______,________, + XX______,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00DF[ 13] = { /* code 00DF */ + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX_XXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX_XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E0[ 13] = { /* code 00E0 */ + ________, + __XX____, + ___XX___, + ________, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E1[ 13] = { /* code 00E1 */ + ________, + ____XX__, + ___XX___, + ________, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E2[ 13] = { /* code 00E2 */ + ________, + __XXX___, + _XX_XX__, + ________, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E3[ 13] = { /* code 00E3 */ + ________, + __XX__X_, + _X__XX__, + ________, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E4[ 13] = { /* code 00E4 */ + ________, + _XX_XX__, + _XX_XX__, + ________, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E5[ 13] = { /* code 00E5 */ + ___XX___, + __X__X__, + __X__X__, + ___XX___, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E6[ 26] = { /* code 00E6 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXX_XX,XX______, + _X__XX__,_XX_____, + ____XX__,_XX_____, + _XXXXXXX,XXX_____, + XX__XX__,________, + XX__XX__,__X_____, + _XXX__XX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E7[ 13] = { /* code 00E7 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX___X__, + XX______, + XX______, + XX______, + XX___X__, + _XXXX___, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E8[ 13] = { /* code 00E8 */ + ________, + _XX_____, + __XX____, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX______, + XX____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00E9[ 13] = { /* code 00E9 */ + ________, + ____XX__, + ___XX___, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX______, + XX____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00EA[ 13] = { /* code 00EA */ + ________, + __XXX___, + _XX_XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX______, + XX____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00EB[ 13] = { /* code 00EB */ + ________, + _XX_XX__, + _XX_XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX______, + XX____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00EC[ 13] = { /* code 00EC */ + ________, + X_______, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00ED[ 13] = { /* code 00ED */ + ________, + _XX_____, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00EE[ 13] = { /* code 00EE */ + ________, + XX______, + __X_____, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00EF[ 13] = { /* code 00EF */ + ________, + __X_____, + __X_____, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F0[ 13] = { /* code 00F0 */ + ________, + __XX_X__, + ___XX___, + __X_XX__, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F1[ 13] = { /* code 00F1 */ + ________, + __XX__X_, + _X__XX__, + ________, + XX_XXX__, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F2[ 13] = { /* code 00F2 */ + ________, + _XX_____, + __XX____, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F3[ 13] = { /* code 00F3 */ + ________, + ____XX__, + ___XX___, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F4[ 13] = { /* code 00F4 */ + ________, + __XXX___, + _XX_XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F5[ 13] = { /* code 00F5 */ + ________, + __XX__X_, + _X__XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F6[ 13] = { /* code 00F6 */ + ________, + _XX_XX__, + _XX_XX__, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F7[ 26] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ____XX__,________, + ____XX__,________, + ________,________, + _XXXXXXX,X_______, + ________,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F8[ 13] = { /* code 00F8 */ + ________, + ________, + ________, + ______X_, + _XXXXX__, + XX__XXX_, + XX__XXX_, + XX_X_XX_, + XXX__XX_, + XXX__XX_, + _XXXXX__, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00F9[ 13] = { /* code 00F9 */ + ________, + _XX_____, + __XX____, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00FA[ 13] = { /* code 00FA */ + ________, + ____XX__, + ___XX___, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00FB[ 13] = { /* code 00FB */ + ________, + __XXX___, + _XX_XX__, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00FC[ 13] = { /* code 00FC */ + ________, + _XX_XX__, + _XX_XX__, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00FD[ 13] = { /* code 00FD */ + ________, + ____XX__, + ___XX___, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + ___XX___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00FE[ 13] = { /* code 00FE */ + ________, + XX______, + XX______, + XX______, + XX_XXX__, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_1_00FF[ 13] = { /* code 00FF */ + ________, + _XX_XX__, + _XX_XX__, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + ___XX___, + __XX____}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13HB_1_CharInfo[96] = { + { 4, 4, 1, acFont13HB_1_00A0 } /* code 00A0 */ + ,{ 5, 5, 1, acFont13HB_1_00A1 } /* code 00A1 */ + ,{ 8, 8, 1, acFont13HB_1_00A2 } /* code 00A2 */ + ,{ 8, 8, 1, acFont13HB_1_00A3 } /* code 00A3 */ + ,{ 8, 8, 1, acFont13HB_1_00A4 } /* code 00A4 */ + ,{ 8, 8, 1, acFont13HB_1_00A5 } /* code 00A5 */ + ,{ 7, 7, 1, acFont13HB_1_00A6 } /* code 00A6 */ + ,{ 8, 8, 1, acFont13HB_1_00A7 } /* code 00A7 */ + ,{ 7, 7, 1, acFont13HB_1_00A8 } /* code 00A8 */ + ,{ 12, 12, 2, acFont13HB_1_00A9 } /* code 00A9 */ + ,{ 7, 7, 1, acFont13HB_1_00AA } /* code 00AA */ + ,{ 9, 9, 2, acFont13HB_1_00AB } /* code 00AB */ + ,{ 11, 11, 2, acFont13HB_1_00AC } /* code 00AC */ + ,{ 6, 6, 1, acFont13HB_1_00AD } /* code 00AD */ + ,{ 12, 12, 2, acFont13HB_1_00AE } /* code 00AE */ + ,{ 8, 8, 1, acFont13HB_1_00AF } /* code 00AF */ + ,{ 7, 7, 1, acFont13HB_1_00B0 } /* code 00B0 */ + ,{ 11, 11, 2, acFont13HB_1_00B1 } /* code 00B1 */ + ,{ 7, 7, 1, acFont13HB_1_00B2 } /* code 00B2 */ + ,{ 7, 7, 1, acFont13HB_1_00B3 } /* code 00B3 */ + ,{ 7, 7, 1, acFont13HB_1_00B4 } /* code 00B4 */ + ,{ 8, 8, 1, acFont13HB_1_00B5 } /* code 00B5 */ + ,{ 8, 8, 1, acFont13HB_1_00B6 } /* code 00B6 */ + ,{ 4, 4, 1, acFont13HB_1_00B7 } /* code 00B7 */ + ,{ 7, 7, 1, acFont13HB_1_00B8 } /* code 00B8 */ + ,{ 7, 7, 1, acFont13HB_1_00B9 } /* code 00B9 */ + ,{ 7, 7, 1, acFont13HB_1_00BA } /* code 00BA */ + ,{ 9, 9, 2, acFont13HB_1_00BB } /* code 00BB */ + ,{ 15, 15, 2, acFont13HB_1_00BC } /* code 00BC */ + ,{ 15, 15, 2, acFont13HB_1_00BD } /* code 00BD */ + ,{ 15, 15, 2, acFont13HB_1_00BE } /* code 00BE */ + ,{ 7, 7, 1, acFont13HB_1_00BF } /* code 00BF */ + ,{ 10, 10, 2, acFont13HB_1_00C0 } /* code 00C0 */ + ,{ 10, 10, 2, acFont13HB_1_00C1 } /* code 00C1 */ + ,{ 10, 10, 2, acFont13HB_1_00C2 } /* code 00C2 */ + ,{ 10, 10, 2, acFont13HB_1_00C3 } /* code 00C3 */ + ,{ 10, 10, 2, acFont13HB_1_00C4 } /* code 00C4 */ + ,{ 10, 10, 2, acFont13HB_1_00C5 } /* code 00C5 */ + ,{ 13, 13, 2, acFont13HB_1_00C6 } /* code 00C6 */ + ,{ 8, 8, 1, acFont13HB_1_00C7 } /* code 00C7 */ + ,{ 7, 7, 1, acFont13HB_1_00C8 } /* code 00C8 */ + ,{ 7, 7, 1, acFont13HB_1_00C9 } /* code 00C9 */ + ,{ 7, 7, 1, acFont13HB_1_00CA } /* code 00CA */ + ,{ 7, 7, 1, acFont13HB_1_00CB } /* code 00CB */ + ,{ 5, 5, 1, acFont13HB_1_00CC } /* code 00CC */ + ,{ 5, 5, 1, acFont13HB_1_00CD } /* code 00CD */ + ,{ 5, 5, 1, acFont13HB_1_00CE } /* code 00CE */ + ,{ 5, 5, 1, acFont13HB_1_00CF } /* code 00CF */ + ,{ 10, 10, 2, acFont13HB_1_00D0 } /* code 00D0 */ + ,{ 8, 8, 1, acFont13HB_1_00D1 } /* code 00D1 */ + ,{ 9, 9, 2, acFont13HB_1_00D2 } /* code 00D2 */ + ,{ 9, 9, 2, acFont13HB_1_00D3 } /* code 00D3 */ + ,{ 9, 9, 2, acFont13HB_1_00D4 } /* code 00D4 */ + ,{ 9, 9, 2, acFont13HB_1_00D5 } /* code 00D5 */ + ,{ 9, 9, 2, acFont13HB_1_00D6 } /* code 00D6 */ + ,{ 11, 11, 2, acFont13HB_1_00D7 } /* code 00D7 */ + ,{ 9, 9, 2, acFont13HB_1_00D8 } /* code 00D8 */ + ,{ 8, 8, 1, acFont13HB_1_00D9 } /* code 00D9 */ + ,{ 8, 8, 1, acFont13HB_1_00DA } /* code 00DA */ + ,{ 8, 8, 1, acFont13HB_1_00DB } /* code 00DB */ + ,{ 8, 8, 1, acFont13HB_1_00DC } /* code 00DC */ + ,{ 9, 9, 2, acFont13HB_1_00DD } /* code 00DD */ + ,{ 9, 9, 2, acFont13HB_1_00DE } /* code 00DE */ + ,{ 8, 8, 1, acFont13HB_1_00DF } /* code 00DF */ + ,{ 8, 8, 1, acFont13HB_1_00E0 } /* code 00E0 */ + ,{ 8, 8, 1, acFont13HB_1_00E1 } /* code 00E1 */ + ,{ 8, 8, 1, acFont13HB_1_00E2 } /* code 00E2 */ + ,{ 8, 8, 1, acFont13HB_1_00E3 } /* code 00E3 */ + ,{ 8, 8, 1, acFont13HB_1_00E4 } /* code 00E4 */ + ,{ 8, 8, 1, acFont13HB_1_00E5 } /* code 00E5 */ + ,{ 12, 12, 2, acFont13HB_1_00E6 } /* code 00E6 */ + ,{ 7, 7, 1, acFont13HB_1_00E7 } /* code 00E7 */ + ,{ 8, 8, 1, acFont13HB_1_00E8 } /* code 00E8 */ + ,{ 8, 8, 1, acFont13HB_1_00E9 } /* code 00E9 */ + ,{ 8, 8, 1, acFont13HB_1_00EA } /* code 00EA */ + ,{ 8, 8, 1, acFont13HB_1_00EB } /* code 00EB */ + ,{ 3, 3, 1, acFont13HB_1_00EC } /* code 00EC */ + ,{ 3, 3, 1, acFont13HB_1_00ED } /* code 00ED */ + ,{ 3, 3, 1, acFont13HB_1_00EE } /* code 00EE */ + ,{ 3, 3, 1, acFont13HB_1_00EF } /* code 00EF */ + ,{ 8, 8, 1, acFont13HB_1_00F0 } /* code 00F0 */ + ,{ 8, 8, 1, acFont13HB_1_00F1 } /* code 00F1 */ + ,{ 8, 8, 1, acFont13HB_1_00F2 } /* code 00F2 */ + ,{ 8, 8, 1, acFont13HB_1_00F3 } /* code 00F3 */ + ,{ 8, 8, 1, acFont13HB_1_00F4 } /* code 00F4 */ + ,{ 8, 8, 1, acFont13HB_1_00F5 } /* code 00F5 */ + ,{ 8, 8, 1, acFont13HB_1_00F6 } /* code 00F6 */ + ,{ 11, 11, 2, acFont13HB_1_00F7 } /* code 00F7 */ + ,{ 8, 8, 1, acFont13HB_1_00F8 } /* code 00F8 */ + ,{ 8, 8, 1, acFont13HB_1_00F9 } /* code 00F9 */ + ,{ 8, 8, 1, acFont13HB_1_00FA } /* code 00FA */ + ,{ 8, 8, 1, acFont13HB_1_00FB } /* code 00FB */ + ,{ 8, 8, 1, acFont13HB_1_00FC } /* code 00FC */ + ,{ 8, 8, 1, acFont13HB_1_00FD } /* code 00FD */ + ,{ 8, 8, 1, acFont13HB_1_00FE } /* code 00FE */ + ,{ 8, 8, 1, acFont13HB_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13HB_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font13HB_1_CharInfo[0] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13HB_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font13HB_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font13HB_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13HB_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13HB_1_Prop1} + , 11, 7, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13HB_ASCII.c b/User/system/lib/lcd/gui/Font/F13HB_ASCII.c new file mode 100644 index 0000000..483efb9 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13HB_ASCII.c @@ -0,0 +1,1563 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13HB_ASCII.C +Purpose : ASCII character set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0020[ 13] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0021[ 13] = { /* code 0021 */ + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0022[ 13] = { /* code 0022 */ + ________, + XX_XX___, + XX_XX___, + XX_XX___, + XX_XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0023[ 26] = { /* code 0023 */ + ________,________, + ________,________, + ___X__X_,________, + ___X__X_,________, + _XXXXXXX,________, + _XXXXXXX,________, + __X__X__,________, + XXXXXXX_,________, + XXXXXXX_,________, + _X__X___,________, + _X__X___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0024[ 13] = { /* code 0024 */ + ___X____, + ___X____, + _XXXXX__, + XX_X__X_, + XX_X____, + XX_X____, + _XXXXX__, + ___X_XX_, + ___X_XX_, + X__X_XX_, + _XXXXX__, + ___X____, + ___X____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0025[ 26] = { /* code 0025 */ + ________,________, + ________,________, + _XXXX___,________, + XX__XX__,_X______, + XX__XX__,X_______, + XX__XX_X,________, + _XXXX_X_,XXXX____, + _____X_X,X__XX___, + ____X__X,X__XX___, + ___X___X,X__XX___, + ________,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0026[ 26] = { /* code 0026 */ + ________,________, + ________,________, + __XXXX__,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,XX______, + _XX__XX_,XX______, + _XX___XX,X_______, + _XX___XX,________, + __XXXX_X,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0027[ 13] = { /* code 0027 */ + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0028[ 13] = { /* code 0028 */ + ________, + ___XX___, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + __XX____, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0029[ 13] = { /* code 0029 */ + ________, + _XX_____, + __XX____, + __XX____, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XX____, + __XX____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_002A[ 13] = { /* code 002A */ + ________, + ___XX___, + _X_XX_X_, + __XXXX__, + _X_XX_X_, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_002B[ 26] = { /* code 002B */ + ________,________, + ________,________, + ________,________, + _____X__,________, + _____X__,________, + _____X__,________, + __XXXXXX,X_______, + _____X__,________, + _____X__,________, + _____X__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_002C[ 13] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_002D[ 13] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_002E[ 13] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_002F[ 13] = { /* code 002F */ + ________, + _____X__, + _____X__, + ____X___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0030[ 13] = { /* code 0030 */ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0031[ 13] = { /* code 0031 */ + ________, + ________, + ___XX___, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0032[ 13] = { /* code 0032 */ + ________, + ________, + _XXXXX__, + X____XX_, + X____XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XXXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0033[ 13] = { /* code 0033 */ + ________, + ________, + _XXXXX__, + X____XX_, + _____XX_, + _____XX_, + __XXXX__, + _____XX_, + _____XX_, + X____XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0034[ 13] = { /* code 0034 */ + ________, + ________, + ____XX__, + ___XXX__, + __X_XX__, + _X__XX__, + X___XX__, + XXXXXXX_, + ____XX__, + ____XX__, + ____XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0035[ 13] = { /* code 0035 */ + ________, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XXXXX__, + _____XX_, + _____XX_, + _____XX_, + X____XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0036[ 13] = { /* code 0036 */ + ________, + ________, + __XXXX__, + _XX_____, + XX______, + XXXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0037[ 13] = { /* code 0037 */ + ________, + ________, + XXXXXXX_, + _____XX_, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0038[ 13] = { /* code 0038 */ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0039[ 13] = { /* code 0039 */ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + _____XX_, + ____XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_003A[ 13] = { /* code 003A */ + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_003B[ 13] = { /* code 003B */ + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + _XX_____, + _XX_____, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_003C[ 26] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + _______X,X_______, + _____XX_,________, + ___XX___,________, + _XX_____,________, + _XX_____,________, + ___XX___,________, + _____XX_,________, + _______X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_003D[ 26] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + ________,________, + ________,________, + _XXXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_003E[ 26] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + _XX_____,________, + ___XX___,________, + _____XX_,________, + _______X,X_______, + _______X,X_______, + _____XX_,________, + ___XX___,________, + _XX_____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_003F[ 13] = { /* code 003F */ + ________, + ________, + _XXXX___, + X___XX__, + ____XX__, + ___XX___, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0040[ 26] = { /* code 0040 */ + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X__XXXX_,X_______, + X_XX_XX_,X_______, + X_XX_XX_,X_______, + X_XX_XX_,X_______, + X_XX_XX_,X_______, + X__XX_XX,________, + _X______,________, + __XXXXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0041[ 26] = { /* code 0041 */ + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0042[ 13] = { /* code 0042 */ + ________, + ________, + XXXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0043[ 13] = { /* code 0043 */ + ________, + ________, + _XXXXX__, + XX____X_, + XX____X_, + XX______, + XX______, + XX______, + XX____X_, + XX____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0044[ 26] = { /* code 0044 */ + ________,________, + ________,________, + XXXXXX__,________, + XX___XX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX___XX_,________, + XXXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0045[ 13] = { /* code 0045 */ + ________, + ________, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0046[ 13] = { /* code 0046 */ + ________, + ________, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0047[ 13] = { /* code 0047 */ + ________, + ________, + _XXXXX__, + XX____X_, + XX____X_, + XX______, + XX__XXX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0048[ 26] = { /* code 0048 */ + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XXXXXXXX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0049[ 13] = { /* code 0049 */ + ________, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_004A[ 13] = { /* code 004A */ + ________, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_004B[ 13] = { /* code 004B */ + ________, + ________, + XX___XX_, + XX__XX__, + XX_XX___, + XXXX____, + XXX_____, + XXXX____, + XX_XX___, + XX__XX__, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_004C[ 13] = { /* code 004C */ + ________, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_004D[ 26] = { /* code 004D */ + ________,________, + ________,________, + XXX____X,XX______, + XXX____X,XX______, + X_XX__X_,XX______, + X_XX__X_,XX______, + X__XXX__,XX______, + X__XXX__,XX______, + X___X___,XX______, + X___X___,XX______, + X_______,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_004E[ 13] = { /* code 004E */ + ________, + ________, + XXX___X_, + XXX___X_, + X_XX__X_, + X_XX__X_, + X__XX_X_, + X__XX_X_, + X___XXX_, + X___XXX_, + X____XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_004F[ 26] = { /* code 004F */ + ________,________, + ________,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0050[ 13] = { /* code 0050 */ + ________, + ________, + XXXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0051[ 26] = { /* code 0051 */ + ________,________, + ________,________, + _XXXXXX_,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XXXXXX_,________, + _____XX_,________, + ______XX,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0052[ 26] = { /* code 0052 */ + ________,________, + ________,________, + XXXXXX__,________, + XX___XX_,________, + XX___XX_,________, + XX___XX_,________, + XXXXXX__,________, + XX_XX___,________, + XX__XX__,________, + XX___XX_,________, + XX____XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0053[ 13] = { /* code 0053 */ + ________, + ________, + _XXXXX__, + XX____X_, + XX____X_, + XX______, + _XXXXX__, + _____XX_, + X____XX_, + X____XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0054[ 13] = { /* code 0054 */ + ________, + ________, + XXXXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0055[ 13] = { /* code 0055 */ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0056[ 26] = { /* code 0056 */ + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + XX____XX,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0057[ 26] = { /* code 0057 */ + ________,________, + ________,________, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX___XX_,__XX____, + XX__XXXX,__XX____, + _XX_XXXX,_XX_____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + __XX____,XX______, + __XX____,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0058[ 26] = { /* code 0058 */ + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + _XX__XX_,________, + __XXXX__,________, + ___XX___,________, + __XXXX__,________, + _XX__XX_,________, + XX____XX,________, + XX____XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0059[ 26] = { /* code 0059 */ + ________,________, + ________,________, + XX____XX,________, + XX____XX,________, + _XX__XX_,________, + _XX__XX_,________, + __XXXX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_005A[ 13] = { /* code 005A */ + ________, + ________, + XXXXXX__, + ____XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_005B[ 13] = { /* code 005B */ + ________, + _XXXX___, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_005C[ 13] = { /* code 005C */ + ________, + X_______, + X_______, + _X______, + _X______, + __X_____, + __X_____, + ___X____, + ___X____, + ____X___, + ____X___, + _____X__, + _____X__}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_005D[ 13] = { /* code 005D */ + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_005E[ 26] = { /* code 005E */ + ________,________, + ________,________, + ____XX__,________, + ___X__X_,________, + __X____X,________, + _X______,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_005F[ 13] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0060[ 13] = { /* code 0060 */ + ________, + __XX____, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0061[ 13] = { /* code 0061 */ + ________, + ________, + ________, + ________, + __XXXX__, + _X___XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0062[ 13] = { /* code 0062 */ + ________, + XX______, + XX______, + XX______, + XX_XXX__, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0063[ 13] = { /* code 0063 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX___X__, + XX______, + XX______, + XX______, + XX___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0064[ 13] = { /* code 0064 */ + ________, + _____XX_, + _____XX_, + _____XX_, + _XXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0065[ 13] = { /* code 0065 */ + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX______, + XX____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0066[ 13] = { /* code 0066 */ + ________, + __XXX___, + _XX_____, + _XX_____, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0067[ 13] = { /* code 0067 */ + ________, + ________, + ________, + ________, + _XXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + _____XX_, + _XXXXX__}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0068[ 13] = { /* code 0068 */ + ________, + XX______, + XX______, + XX______, + XX_XXX__, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0069[ 13] = { /* code 0069 */ + ________, + XX______, + XX______, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_006A[ 13] = { /* code 006A */ + ________, + _XX_____, + _XX_____, + ________, + XXX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_006B[ 13] = { /* code 006B */ + ________, + XX______, + XX______, + XX______, + XX__XX__, + XX_XX___, + XXXX____, + XXX_____, + XXXX____, + XX_XX___, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_006C[ 13] = { /* code 006C */ + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_006D[ 26] = { /* code 006D */ + ________,________, + ________,________, + ________,________, + ________,________, + XXXXX_XX,X_______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_006E[ 13] = { /* code 006E */ + ________, + ________, + ________, + ________, + XX_XXX__, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_006F[ 13] = { /* code 006F */ + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0070[ 13] = { /* code 0070 */ + ________, + ________, + ________, + ________, + XX_XXX__, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0071[ 13] = { /* code 0071 */ + ________, + ________, + ________, + ________, + _XXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + _____XX_, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0072[ 13] = { /* code 0072 */ + ________, + ________, + ________, + ________, + XX_XX___, + XXXXX___, + XX______, + XX______, + XX______, + XX______, + XX______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0073[ 13] = { /* code 0073 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX___X__, + XXX_____, + _XXXX___, + ___XXX__, + X___XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0074[ 13] = { /* code 0074 */ + ________, + ________, + _XX_____, + _XX_____, + XXXXX___, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0075[ 13] = { /* code 0075 */ + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0076[ 13] = { /* code 0076 */ + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0077[ 26] = { /* code 0077 */ + ________,________, + ________,________, + ________,________, + ________,________, + XX__XX__,XX______, + XX__XX__,XX______, + _XX_XX_X,X_______, + _XX_XX_X,X_______, + _XXX__XX,X_______, + __XX__XX,________, + __XX__XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0078[ 13] = { /* code 0078 */ + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_0079[ 13] = { /* code 0079 */ + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + ___XX___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_007A[ 13] = { /* code 007A */ + ________, + ________, + ________, + ________, + XXXXXX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_007B[ 13] = { /* code 007B */ + ________, + ___XXX__, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XXX__}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_007C[ 13] = { /* code 007C */ + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_007D[ 13] = { /* code 007D */ + ________, + XXX_____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont13HB_ASCII_007E[ 26] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX___,_X______, + XXXXXX__,_X______, + X___XXXX,XX______, + X____XXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13HB_ASCII_CharInfo[95] = { + { 4, 4, 1, acFont13HB_ASCII_0020 } /* code 0020 */ + ,{ 5, 5, 1, acFont13HB_ASCII_0021 } /* code 0021 */ + ,{ 6, 6, 1, acFont13HB_ASCII_0022 } /* code 0022 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0023 } /* code 0023 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0024 } /* code 0024 */ + ,{ 14, 14, 2, acFont13HB_ASCII_0025 } /* code 0025 */ + ,{ 11, 11, 2, acFont13HB_ASCII_0026 } /* code 0026 */ + ,{ 4, 4, 1, acFont13HB_ASCII_0027 } /* code 0027 */ + ,{ 6, 6, 1, acFont13HB_ASCII_0028 } /* code 0028 */ + ,{ 6, 6, 1, acFont13HB_ASCII_0029 } /* code 0029 */ + ,{ 8, 8, 1, acFont13HB_ASCII_002A } /* code 002A */ + ,{ 11, 11, 2, acFont13HB_ASCII_002B } /* code 002B */ + ,{ 4, 4, 1, acFont13HB_ASCII_002C } /* code 002C */ + ,{ 6, 6, 1, acFont13HB_ASCII_002D } /* code 002D */ + ,{ 4, 4, 1, acFont13HB_ASCII_002E } /* code 002E */ + ,{ 8, 8, 1, acFont13HB_ASCII_002F } /* code 002F */ + ,{ 8, 8, 1, acFont13HB_ASCII_0030 } /* code 0030 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0031 } /* code 0031 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0032 } /* code 0032 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0033 } /* code 0033 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0034 } /* code 0034 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0035 } /* code 0035 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0036 } /* code 0036 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0037 } /* code 0037 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0038 } /* code 0038 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0039 } /* code 0039 */ + ,{ 5, 5, 1, acFont13HB_ASCII_003A } /* code 003A */ + ,{ 5, 5, 1, acFont13HB_ASCII_003B } /* code 003B */ + ,{ 11, 11, 2, acFont13HB_ASCII_003C } /* code 003C */ + ,{ 11, 11, 2, acFont13HB_ASCII_003D } /* code 003D */ + ,{ 11, 11, 2, acFont13HB_ASCII_003E } /* code 003E */ + ,{ 7, 7, 1, acFont13HB_ASCII_003F } /* code 003F */ + ,{ 10, 10, 2, acFont13HB_ASCII_0040 } /* code 0040 */ + ,{ 10, 10, 2, acFont13HB_ASCII_0041 } /* code 0041 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0042 } /* code 0042 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0043 } /* code 0043 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0044 } /* code 0044 */ + ,{ 7, 7, 1, acFont13HB_ASCII_0045 } /* code 0045 */ + ,{ 6, 6, 1, acFont13HB_ASCII_0046 } /* code 0046 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0047 } /* code 0047 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0048 } /* code 0048 */ + ,{ 5, 5, 1, acFont13HB_ASCII_0049 } /* code 0049 */ + ,{ 6, 6, 1, acFont13HB_ASCII_004A } /* code 004A */ + ,{ 8, 8, 1, acFont13HB_ASCII_004B } /* code 004B */ + ,{ 7, 7, 1, acFont13HB_ASCII_004C } /* code 004C */ + ,{ 11, 11, 2, acFont13HB_ASCII_004D } /* code 004D */ + ,{ 8, 8, 1, acFont13HB_ASCII_004E } /* code 004E */ + ,{ 9, 9, 2, acFont13HB_ASCII_004F } /* code 004F */ + ,{ 8, 8, 1, acFont13HB_ASCII_0050 } /* code 0050 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0051 } /* code 0051 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0052 } /* code 0052 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0053 } /* code 0053 */ + ,{ 7, 7, 1, acFont13HB_ASCII_0054 } /* code 0054 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0055 } /* code 0055 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0056 } /* code 0056 */ + ,{ 13, 13, 2, acFont13HB_ASCII_0057 } /* code 0057 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0058 } /* code 0058 */ + ,{ 9, 9, 2, acFont13HB_ASCII_0059 } /* code 0059 */ + ,{ 7, 7, 1, acFont13HB_ASCII_005A } /* code 005A */ + ,{ 6, 6, 1, acFont13HB_ASCII_005B } /* code 005B */ + ,{ 8, 8, 1, acFont13HB_ASCII_005C } /* code 005C */ + ,{ 6, 6, 1, acFont13HB_ASCII_005D } /* code 005D */ + ,{ 11, 11, 2, acFont13HB_ASCII_005E } /* code 005E */ + ,{ 8, 8, 1, acFont13HB_ASCII_005F } /* code 005F */ + ,{ 7, 7, 1, acFont13HB_ASCII_0060 } /* code 0060 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0061 } /* code 0061 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0062 } /* code 0062 */ + ,{ 7, 7, 1, acFont13HB_ASCII_0063 } /* code 0063 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0064 } /* code 0064 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0065 } /* code 0065 */ + ,{ 5, 5, 1, acFont13HB_ASCII_0066 } /* code 0066 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0067 } /* code 0067 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0068 } /* code 0068 */ + ,{ 3, 3, 1, acFont13HB_ASCII_0069 } /* code 0069 */ + ,{ 4, 4, 1, acFont13HB_ASCII_006A } /* code 006A */ + ,{ 7, 7, 1, acFont13HB_ASCII_006B } /* code 006B */ + ,{ 3, 3, 1, acFont13HB_ASCII_006C } /* code 006C */ + ,{ 11, 11, 2, acFont13HB_ASCII_006D } /* code 006D */ + ,{ 8, 8, 1, acFont13HB_ASCII_006E } /* code 006E */ + ,{ 8, 8, 1, acFont13HB_ASCII_006F } /* code 006F */ + ,{ 8, 8, 1, acFont13HB_ASCII_0070 } /* code 0070 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0071 } /* code 0071 */ + ,{ 6, 6, 1, acFont13HB_ASCII_0072 } /* code 0072 */ + ,{ 7, 7, 1, acFont13HB_ASCII_0073 } /* code 0073 */ + ,{ 6, 6, 1, acFont13HB_ASCII_0074 } /* code 0074 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0075 } /* code 0075 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0076 } /* code 0076 */ + ,{ 11, 11, 2, acFont13HB_ASCII_0077 } /* code 0077 */ + ,{ 7, 7, 1, acFont13HB_ASCII_0078 } /* code 0078 */ + ,{ 8, 8, 1, acFont13HB_ASCII_0079 } /* code 0079 */ + ,{ 7, 7, 1, acFont13HB_ASCII_007A } /* code 007A */ + ,{ 7, 7, 1, acFont13HB_ASCII_007B } /* code 007B */ + ,{ 7, 7, 1, acFont13HB_ASCII_007C } /* code 007C */ + ,{ 7, 7, 1, acFont13HB_ASCII_007D } /* code 007D */ + ,{ 11, 11, 2, acFont13HB_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13HB_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font13HB_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13HB_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13HB_ASCII_Prop1} + , 11, 7, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13H_1.c b/User/system/lib/lcd/gui/Font/F13H_1.c new file mode 100644 index 0000000..c7bfb0d --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13H_1.c @@ -0,0 +1,1586 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13H_1.C +Purpose : ISO 8859-1, West European Character Set +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont13H_1_00A0[ 13] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A1[ 13] = { /* code 00A1 */ + ________, + ________, + _X______, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A2[ 13] = { /* code 00A2 */ + ________, + ________, + ___X____, + ___X____, + __XXXX__, + _X_X____, + _X_X____, + _X_X____, + _X_X____, + _X_X____, + __XXXX__, + ___X____, + ___X____}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A3[ 13] = { /* code 00A3 */ + ________, + ________, + ___XXX__, + __X___X_, + __X_____, + __X_____, + _XXXXX__, + __X_____, + __X_____, + _X______, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A4[ 13] = { /* code 00A4 */ + ________, + ________, + ________, + ________, + X____X__, + _XXXX___, + _X__X___, + _X__X___, + _XXXX___, + X____X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A5[ 13] = { /* code 00A5 */ + ________, + ________, + X_____X_, + _X___X__, + __X_X___, + __X_X___, + ___X____, + _XXXXX__, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A6[ 13] = { /* code 00A6 */ + ________, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A7[ 13] = { /* code 00A7 */ + ________, + ________, + _XXXX___, + X____X__, + X_______, + _XXX____, + X___X___, + X____X__, + _X___X__, + __XXX___, + _____X__, + X____X__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A8[ 13] = { /* code 00A8 */ + ________, + ________, + __X__X__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00A9[ 26] = { /* code 00A9 */ + ________,________, + ________,________, + ___XXXXX,________, + __X_____,X_______, + _X__XXX_,_X______, + X__X___X,__X_____, + X__X____,__X_____, + X__X____,__X_____, + X__X____,__X_____, + X__X___X,__X_____, + _X__XXX_,_X______, + __X_____,X_______, + ___XXXXX,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00AA[ 13] = { /* code 00AA */ + ________, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00AB[ 13] = { /* code 00AB */ + ________, + ________, + ________, + ________, + __X__X__, + _X__X___, + X__X____, + X__X____, + _X__X___, + __X__X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00AC[ 26] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _______X,________, + _______X,________, + _______X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00AD[ 13] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00AE[ 26] = { /* code 00AE */ + ________,________, + ________,________, + ___XXXXX,________, + __X_____,X_______, + _X_XXXX_,_X______, + X__X___X,__X_____, + X__X___X,__X_____, + X__XXXX_,__X_____, + X__X__X_,__X_____, + X__X___X,__X_____, + _X_X___X,_X______, + __X_____,X_______, + ___XXXXX,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00AF[ 13] = { /* code 00AF */ + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B0[ 13] = { /* code 00B0 */ + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B1[ 13] = { /* code 00B1 */ + ________, + ________, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B2[ 13] = { /* code 00B2 */ + ________, + ________, + __XX____, + _X__X___, + ____X___, + ___X____, + __X_____, + _XXXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B3[ 13] = { /* code 00B3 */ + ________, + ________, + _XXX____, + ____X___, + __XX____, + ____X___, + ____X___, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B4[ 13] = { /* code 00B4 */ + ________, + ____X___, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B5[ 13] = { /* code 00B5 */ + ________, + ________, + ________, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + XXXX_X__, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B6[ 13] = { /* code 00B6 */ + ________, + ________, + _XXXXX__, + XXXX_X__, + XXXX_X__, + XXXX_X__, + XXXX_X__, + _XXX_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B7[ 13] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B8[ 13] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00B9[ 13] = { /* code 00B9 */ + ________, + ________, + ___X____, + __XX____, + ___X____, + ___X____, + ___X____, + __XXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00BA[ 13] = { /* code 00BA */ + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00BB[ 13] = { /* code 00BB */ + ________, + ________, + ________, + ________, + X__X____, + _X__X___, + __X__X__, + __X__X__, + _X__X___, + X__X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00BC[ 26] = { /* code 00BC */ + ________,________, + ________,________, + __X_____,X_______, + _XX____X,________, + __X____X,________, + __X___X_,__X_____, + __X___X_,_XX_____, + __X__X__,X_X_____, + ____X__X,__X_____, + ____X__X,XXXX____, + ___X____,__X_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00BD[ 26] = { /* code 00BD */ + ________,________, + ________,________, + __X____X,________, + _XX____X,________, + __X___X_,________, + __X___X_,_XX_____, + __X__X__,X__X____, + __X__X__,___X____, + ____X___,__X_____, + ____X___,_X______, + ___X____,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00BE[ 26] = { /* code 00BE */ + ________,________, + ________,________, + _XXX____,_X______, + ____X___,X_______, + __XX____,X_______, + ____X__X,__X_____, + ____X__X,_XX_____, + _XXX__X_,X_X_____, + _____X_X,__X_____, + _____X_X,XXXX____, + ____X___,__X_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00BF[ 13] = { /* code 00BF */ + ________, + ________, + ___X____, + ___X____, + ________, + ___X____, + __X_____, + _X______, + X_______, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C0[ 13] = { /* code 00C0 */ + __X_____, + ___X____, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C1[ 13] = { /* code 00C1 */ + ____X___, + ___X____, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C2[ 13] = { /* code 00C2 */ + ___XX___, + __X__X__, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C3[ 13] = { /* code 00C3 */ + __XX_X__, + _X_XX___, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C4[ 13] = { /* code 00C4 */ + _X___X__, + ________, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C5[ 13] = { /* code 00C5 */ + ___X____, + __X_X___, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C6[ 26] = { /* code 00C6 */ + ________,________, + ________,________, + ___XXXXX,XXX_____, + ___X__X_,________, + __X___X_,________, + __X___X_,________, + __X___XX,XXX_____, + _XXXXXX_,________, + _X____X_,________, + _X____X_,________, + X_____XX,XXX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C7[ 13] = { /* code 00C7 */ + ________, + ________, + __XXXX__, + _X____X_, + X_______, + X_______, + X_______, + X_______, + X_______, + _X____X_, + __XXXX__, + _____X__, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C8[ 13] = { /* code 00C8 */ + __X_____, + ___X____, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00C9[ 13] = { /* code 00C9 */ + ____X___, + ___X____, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00CA[ 13] = { /* code 00CA */ + __XX____, + _X__X___, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00CB[ 13] = { /* code 00CB */ + _X__X___, + ________, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00CC[ 13] = { /* code 00CC */ + X_______, + _X______, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00CD[ 13] = { /* code 00CD */ + __X_____, + _X______, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00CE[ 13] = { /* code 00CE */ + _XX_____, + X__X____, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00CF[ 13] = { /* code 00CF */ + X_X_____, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D0[ 26] = { /* code 00D0 */ + ________,________, + ________,________, + _XXXXX__,________, + _X____X_,________, + _X_____X,________, + _X_____X,________, + XXXX___X,________, + _X_____X,________, + _X_____X,________, + _X____X_,________, + _XXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D1[ 13] = { /* code 00D1 */ + __XX_X__, + _X_XX___, + XX____X_, + XX____X_, + X_X___X_, + X_X___X_, + X__X__X_, + X___X_X_, + X___X_X_, + X____XX_, + X____XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D2[ 26] = { /* code 00D2 */ + ___X____,________, + ____X___,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D3[ 26] = { /* code 00D3 */ + ____X___,________, + ___X____,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D4[ 26] = { /* code 00D4 */ + ___XX___,________, + __X__X__,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D5[ 26] = { /* code 00D5 */ + ___XX_X_,________, + __X_XX__,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D6[ 26] = { /* code 00D6 */ + __X__X__,________, + ________,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D7[ 26] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + __X___X_,________, + ___X_X__,________, + ____X___,________, + ___X_X__,________, + __X___X_,________, + _X_____X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D8[ 26] = { /* code 00D8 */ + ________,________, + ________,________, + __XXXX_X,________, + _X____X_,________, + X____X_X,________, + X___X__X,________, + X__X___X,________, + X__X___X,________, + X_X____X,________, + _X____X_,________, + X_XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00D9[ 13] = { /* code 00D9 */ + __X_____, + ___X____, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00DA[ 13] = { /* code 00DA */ + ____X___, + ___X____, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00DB[ 13] = { /* code 00DB */ + ___XX___, + __X__X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00DC[ 13] = { /* code 00DC */ + _X___X__, + ________, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00DD[ 13] = { /* code 00DD */ + ____X___, + ___X____, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00DE[ 13] = { /* code 00DE */ + ________, + ________, + X_______, + X_______, + XXXXX___, + X____X__, + X____X__, + X____X__, + XXXXX___, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00DF[ 13] = { /* code 00DF */ + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X_XX____, + X___X___, + X____X__, + X____X__, + X___X___, + X_XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E0[ 13] = { /* code 00E0 */ + ________, + __X_____, + ___X____, + ________, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E1[ 13] = { /* code 00E1 */ + ________, + ____X___, + ___X____, + ________, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E2[ 13] = { /* code 00E2 */ + ________, + __XX____, + _X__X___, + ________, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E3[ 13] = { /* code 00E3 */ + ________, + __XX_X__, + _X_XX___, + ________, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E4[ 13] = { /* code 00E4 */ + ________, + ________, + _X__X___, + ________, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E5[ 13] = { /* code 00E5 */ + __XX____, + _X__X___, + _X__X___, + __XX____, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E6[ 26] = { /* code 00E6 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX__XX,________, + ____XX__,X_______, + ____X___,_X______, + _XXXXXXX,XX______, + X___X___,________, + X___XX__,_X______, + _XXX__XX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E7[ 13] = { /* code 00E7 */ + ________, + ________, + ________, + ________, + _XXXX___, + X_______, + X_______, + X_______, + X_______, + X_______, + _XXXX___, + ___X____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E8[ 13] = { /* code 00E8 */ + ________, + __X_____, + ___X____, + ________, + _XXXX___, + X____X__, + X____X__, + XXXXXX__, + X_______, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00E9[ 13] = { /* code 00E9 */ + ________, + ___X____, + __X_____, + ________, + _XXXX___, + X____X__, + X____X__, + XXXXXX__, + X_______, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00EA[ 13] = { /* code 00EA */ + ________, + __XX____, + _X__X___, + ________, + _XXXX___, + X____X__, + X____X__, + XXXXXX__, + X_______, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00EB[ 13] = { /* code 00EB */ + ________, + ________, + _X__X___, + ________, + _XXXX___, + X____X__, + X____X__, + XXXXXX__, + X_______, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00EC[ 13] = { /* code 00EC */ + ________, + X_______, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00ED[ 13] = { /* code 00ED */ + ________, + __X_____, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00EE[ 13] = { /* code 00EE */ + ________, + _X______, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00EF[ 13] = { /* code 00EF */ + ________, + ________, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F0[ 13] = { /* code 00F0 */ + ________, + ________, + __X_X___, + ___X____, + _XX_X___, + _____X__, + _XXXXX__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F1[ 13] = { /* code 00F1 */ + ________, + __XX_X__, + _X_XX___, + ________, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F2[ 13] = { /* code 00F2 */ + ________, + __X_____, + ___X____, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F3[ 13] = { /* code 00F3 */ + ________, + ____X___, + ___X____, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F4[ 13] = { /* code 00F4 */ + ________, + __XX____, + _X__X___, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F5[ 13] = { /* code 00F5 */ + ________, + __XX_X__, + _X_XX___, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F6[ 13] = { /* code 00F6 */ + ________, + ________, + _X__X___, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F7[ 26] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ___X____,________, + ___X____,________, + ________,________, + XXXXXXX_,________, + ________,________, + ___X____,________, + ___X____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F8[ 13] = { /* code 00F8 */ + ________, + ________, + ________, + _____X__, + __XXX___, + _X__X___, + X__X_X__, + X_X__X__, + X_X__X__, + _X__X___, + _XXX____, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00F9[ 13] = { /* code 00F9 */ + ________, + __X_____, + ___X____, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00FA[ 13] = { /* code 00FA */ + ________, + ___X____, + __X_____, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00FB[ 13] = { /* code 00FB */ + ________, + __XX____, + _X__X___, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00FC[ 13] = { /* code 00FC */ + ________, + ________, + _X__X___, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00FD[ 13] = { /* code 00FD */ + ________, + ___X____, + __X_____, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00FE[ 13] = { /* code 00FE */ + ________, + X_______, + X_______, + X_______, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + X____X__, + XXXXX___, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13H_1_00FF[ 13] = { /* code 00FF */ + ________, + ________, + _X__X___, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13H_1_CharInfo[96] = { + { 4, 4, 1, acFont13H_1_00A0 } /* code 00A0 */ + ,{ 4, 4, 1, acFont13H_1_00A1 } /* code 00A1 */ + ,{ 7, 7, 1, acFont13H_1_00A2 } /* code 00A2 */ + ,{ 7, 7, 1, acFont13H_1_00A3 } /* code 00A3 */ + ,{ 7, 7, 1, acFont13H_1_00A4 } /* code 00A4 */ + ,{ 7, 7, 1, acFont13H_1_00A5 } /* code 00A5 */ + ,{ 5, 5, 1, acFont13H_1_00A6 } /* code 00A6 */ + ,{ 7, 7, 1, acFont13H_1_00A7 } /* code 00A7 */ + ,{ 7, 7, 1, acFont13H_1_00A8 } /* code 00A8 */ + ,{ 12, 12, 2, acFont13H_1_00A9 } /* code 00A9 */ + ,{ 6, 6, 1, acFont13H_1_00AA } /* code 00AA */ + ,{ 7, 7, 1, acFont13H_1_00AB } /* code 00AB */ + ,{ 9, 9, 2, acFont13H_1_00AC } /* code 00AC */ + ,{ 5, 5, 1, acFont13H_1_00AD } /* code 00AD */ + ,{ 12, 12, 2, acFont13H_1_00AE } /* code 00AE */ + ,{ 7, 7, 1, acFont13H_1_00AF } /* code 00AF */ + ,{ 6, 6, 1, acFont13H_1_00B0 } /* code 00B0 */ + ,{ 8, 8, 1, acFont13H_1_00B1 } /* code 00B1 */ + ,{ 6, 6, 1, acFont13H_1_00B2 } /* code 00B2 */ + ,{ 6, 6, 1, acFont13H_1_00B3 } /* code 00B3 */ + ,{ 7, 7, 1, acFont13H_1_00B4 } /* code 00B4 */ + ,{ 7, 7, 1, acFont13H_1_00B5 } /* code 00B5 */ + ,{ 7, 7, 1, acFont13H_1_00B6 } /* code 00B6 */ + ,{ 4, 4, 1, acFont13H_1_00B7 } /* code 00B7 */ + ,{ 7, 7, 1, acFont13H_1_00B8 } /* code 00B8 */ + ,{ 6, 6, 1, acFont13H_1_00B9 } /* code 00B9 */ + ,{ 6, 6, 1, acFont13H_1_00BA } /* code 00BA */ + ,{ 7, 7, 1, acFont13H_1_00BB } /* code 00BB */ + ,{ 13, 13, 2, acFont13H_1_00BC } /* code 00BC */ + ,{ 13, 13, 2, acFont13H_1_00BD } /* code 00BD */ + ,{ 13, 13, 2, acFont13H_1_00BE } /* code 00BE */ + ,{ 6, 6, 1, acFont13H_1_00BF } /* code 00BF */ + ,{ 8, 8, 1, acFont13H_1_00C0 } /* code 00C0 */ + ,{ 8, 8, 1, acFont13H_1_00C1 } /* code 00C1 */ + ,{ 8, 8, 1, acFont13H_1_00C2 } /* code 00C2 */ + ,{ 8, 8, 1, acFont13H_1_00C3 } /* code 00C3 */ + ,{ 8, 8, 1, acFont13H_1_00C4 } /* code 00C4 */ + ,{ 8, 8, 1, acFont13H_1_00C5 } /* code 00C5 */ + ,{ 12, 12, 2, acFont13H_1_00C6 } /* code 00C6 */ + ,{ 8, 8, 1, acFont13H_1_00C7 } /* code 00C7 */ + ,{ 7, 7, 1, acFont13H_1_00C8 } /* code 00C8 */ + ,{ 7, 7, 1, acFont13H_1_00C9 } /* code 00C9 */ + ,{ 7, 7, 1, acFont13H_1_00CA } /* code 00CA */ + ,{ 7, 7, 1, acFont13H_1_00CB } /* code 00CB */ + ,{ 4, 4, 1, acFont13H_1_00CC } /* code 00CC */ + ,{ 4, 4, 1, acFont13H_1_00CD } /* code 00CD */ + ,{ 4, 4, 1, acFont13H_1_00CE } /* code 00CE */ + ,{ 4, 4, 1, acFont13H_1_00CF } /* code 00CF */ + ,{ 9, 9, 2, acFont13H_1_00D0 } /* code 00D0 */ + ,{ 8, 8, 1, acFont13H_1_00D1 } /* code 00D1 */ + ,{ 9, 9, 2, acFont13H_1_00D2 } /* code 00D2 */ + ,{ 9, 9, 2, acFont13H_1_00D3 } /* code 00D3 */ + ,{ 9, 9, 2, acFont13H_1_00D4 } /* code 00D4 */ + ,{ 9, 9, 2, acFont13H_1_00D5 } /* code 00D5 */ + ,{ 9, 9, 2, acFont13H_1_00D6 } /* code 00D6 */ + ,{ 9, 9, 2, acFont13H_1_00D7 } /* code 00D7 */ + ,{ 9, 9, 2, acFont13H_1_00D8 } /* code 00D8 */ + ,{ 8, 8, 1, acFont13H_1_00D9 } /* code 00D9 */ + ,{ 8, 8, 1, acFont13H_1_00DA } /* code 00DA */ + ,{ 8, 8, 1, acFont13H_1_00DB } /* code 00DB */ + ,{ 8, 8, 1, acFont13H_1_00DC } /* code 00DC */ + ,{ 7, 7, 1, acFont13H_1_00DD } /* code 00DD */ + ,{ 7, 7, 1, acFont13H_1_00DE } /* code 00DE */ + ,{ 7, 7, 1, acFont13H_1_00DF } /* code 00DF */ + ,{ 7, 7, 1, acFont13H_1_00E0 } /* code 00E0 */ + ,{ 7, 7, 1, acFont13H_1_00E1 } /* code 00E1 */ + ,{ 7, 7, 1, acFont13H_1_00E2 } /* code 00E2 */ + ,{ 7, 7, 1, acFont13H_1_00E3 } /* code 00E3 */ + ,{ 7, 7, 1, acFont13H_1_00E4 } /* code 00E4 */ + ,{ 7, 7, 1, acFont13H_1_00E5 } /* code 00E5 */ + ,{ 11, 11, 2, acFont13H_1_00E6 } /* code 00E6 */ + ,{ 6, 6, 1, acFont13H_1_00E7 } /* code 00E7 */ + ,{ 7, 7, 1, acFont13H_1_00E8 } /* code 00E8 */ + ,{ 7, 7, 1, acFont13H_1_00E9 } /* code 00E9 */ + ,{ 7, 7, 1, acFont13H_1_00EA } /* code 00EA */ + ,{ 7, 7, 1, acFont13H_1_00EB } /* code 00EB */ + ,{ 3, 3, 1, acFont13H_1_00EC } /* code 00EC */ + ,{ 3, 3, 1, acFont13H_1_00ED } /* code 00ED */ + ,{ 3, 3, 1, acFont13H_1_00EE } /* code 00EE */ + ,{ 3, 3, 1, acFont13H_1_00EF } /* code 00EF */ + ,{ 7, 7, 1, acFont13H_1_00F0 } /* code 00F0 */ + ,{ 7, 7, 1, acFont13H_1_00F1 } /* code 00F1 */ + ,{ 7, 7, 1, acFont13H_1_00F2 } /* code 00F2 */ + ,{ 7, 7, 1, acFont13H_1_00F3 } /* code 00F3 */ + ,{ 7, 7, 1, acFont13H_1_00F4 } /* code 00F4 */ + ,{ 7, 7, 1, acFont13H_1_00F5 } /* code 00F5 */ + ,{ 7, 7, 1, acFont13H_1_00F6 } /* code 00F6 */ + ,{ 9, 9, 2, acFont13H_1_00F7 } /* code 00F7 */ + ,{ 7, 7, 1, acFont13H_1_00F8 } /* code 00F8 */ + ,{ 7, 7, 1, acFont13H_1_00F9 } /* code 00F9 */ + ,{ 7, 7, 1, acFont13H_1_00FA } /* code 00FA */ + ,{ 7, 7, 1, acFont13H_1_00FB } /* code 00FB */ + ,{ 7, 7, 1, acFont13H_1_00FC } /* code 00FC */ + ,{ 6, 6, 1, acFont13H_1_00FD } /* code 00FD */ + ,{ 7, 7, 1, acFont13H_1_00FE } /* code 00FE */ + ,{ 6, 6, 1, acFont13H_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13H_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font13H_1_CharInfo[0] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13H_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font13H_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font13H_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13H_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13H_1_Prop1} + , 11, 7, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13H_ASCII.c b/User/system/lib/lcd/gui/Font/F13H_ASCII.c new file mode 100644 index 0000000..b49eec7 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13H_ASCII.c @@ -0,0 +1,1565 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13H_ASCII.C +Purpose : Proportional 13 pixel high font, ASCII character set +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0020[ 13] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0021[ 13] = { /* code 0021 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0022[ 13] = { /* code 0022 */ + ________, + _X_X____, + _X_X____, + _X_X____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0023[ 26] = { /* code 0023 */ + ________,________, + ________,________, + ____X_X_,________, + ____X_X_,________, + __XXXXXX,________, + ___X_X__,________, + ___X_X__,________, + _XXXXXX_,________, + ___X_X__,________, + __X_X___,________, + __X_X___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0024[ 13] = { /* code 0024 */ + ________, + __X_____, + __X_____, + _XXXXX__, + X_X_____, + X_X_____, + _XX_____, + __XXX___, + __X__X__, + __X__X__, + XXXXX___, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0025[ 26] = { /* code 0025 */ + ________,________, + ________,________, + __XX____,X_______, + _X__X__X,________, + _X__X__X,________, + _X__X_X_,________, + __XX_X__,XX______, + _____X_X,__X_____, + ____X__X,__X_____, + ____X__X,__X_____, + ___X____,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0026[ 26] = { /* code 0026 */ + ________,________, + ________,________, + _XXXX___,________, + X____X__,________, + X____X__,________, + _X__X___,________, + _XXX__X_,________, + X___X_X_,________, + X____XX_,________, + X____XX_,________, + _XXXX__X,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0027[ 13] = { /* code 0027 */ + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0028[ 13] = { /* code 0028 */ + ________, + ____X___, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + ___X____, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0029[ 13] = { /* code 0029 */ + ________, + X_______, + _X______, + __X_____, + __X_____, + ___X____, + ___X____, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_002A[ 13] = { /* code 002A */ + ________, + ___X____, + _X_X_X__, + __XXX___, + _X_X_X__, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_002B[ 13] = { /* code 002B */ + ________, + ________, + ________, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_002C[ 13] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_002D[ 13] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_002E[ 13] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_002F[ 13] = { /* code 002F */ + ________, + ____X___, + ____X___, + ___X____, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0030[ 13] = { /* code 0030 */ + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0031[ 13] = { /* code 0031 */ + ________, + ________, + ___X____, + _XXX____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0032[ 13] = { /* code 0032 */ + ________, + ________, + _XXXX___, + X____X__, + _____X__, + _____X__, + ____X___, + __XX____, + _X______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0033[ 13] = { /* code 0033 */ + ________, + ________, + _XXXX___, + X____X__, + _____X__, + _____X__, + __XXX___, + _____X__, + _____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0034[ 13] = { /* code 0034 */ + ________, + ________, + ____X___, + ___XX___, + __X_X___, + _X__X___, + X___X___, + XXXXXX__, + ____X___, + ____X___, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0035[ 13] = { /* code 0035 */ + ________, + ________, + XXXXXX__, + X_______, + X_______, + XXXXX___, + _____X__, + _____X__, + _____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0036[ 13] = { /* code 0036 */ + ________, + ________, + __XXX___, + _X______, + X_______, + XXXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0037[ 13] = { /* code 0037 */ + ________, + ________, + XXXXXX__, + _____X__, + ____X___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0038[ 13] = { /* code 0038 */ + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0039[ 13] = { /* code 0039 */ + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXXX__, + _____X__, + ____X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_003A[ 13] = { /* code 003A */ + ________, + ________, + ________, + ________, + __X_____, + __X_____, + ________, + ________, + ________, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_003B[ 13] = { /* code 003B */ + ________, + ________, + ________, + ________, + __X_____, + __X_____, + ________, + ________, + ________, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_003C[ 26] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + _______X,________, + _____XX_,________, + ___XX___,________, + _XX_____,________, + ___XX___,________, + _____XX_,________, + _______X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_003D[ 26] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + ________,________, + ________,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_003E[ 26] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + _X______,________, + __XX____,________, + ____XX__,________, + ______XX,________, + ____XX__,________, + __XX____,________, + _X______,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_003F[ 13] = { /* code 003F */ + ________, + ________, + _XXX____, + X___X___, + ____X___, + ___X____, + __X_____, + _X______, + ________, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0040[ 26] = { /* code 0040 */ + ________,________, + ________,________, + ___XXXXX,________, + _XX_____,XX______, + _X__XXXX,_X______, + X__X___X,__X_____, + X__X___X,__X_____, + X__X___X,__X_____, + X__X___X,__X_____, + _X__XXXX,XX______, + _XX_____,________, + ___XXXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0041[ 13] = { /* code 0041 */ + ________, + ________, + ___X____, + ___X____, + __X_X___, + __X_X___, + _X___X__, + _X___X__, + _XXXXX__, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0042[ 13] = { /* code 0042 */ + ________, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + XXXXX___, + X____X__, + X____X__, + X____X__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0043[ 13] = { /* code 0043 */ + ________, + ________, + __XXXX__, + _X____X_, + X_______, + X_______, + X_______, + X_______, + X_______, + _X____X_, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0044[ 13] = { /* code 0044 */ + ________, + ________, + XXXXX___, + X____X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X____X__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0045[ 13] = { /* code 0045 */ + ________, + ________, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0046[ 13] = { /* code 0046 */ + ________, + ________, + XXXXXX__, + X_______, + X_______, + X_______, + XXXXXX__, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0047[ 13] = { /* code 0047 */ + ________, + ________, + __XXXX__, + _X____X_, + X_______, + X_______, + X_______, + X___XXX_, + X_____X_, + _X____X_, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0048[ 13] = { /* code 0048 */ + ________, + ________, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + XXXXXXX_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0049[ 13] = { /* code 0049 */ + ________, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_004A[ 13] = { /* code 004A */ + ________, + ________, + _XXX____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_004B[ 13] = { /* code 004B */ + ________, + ________, + X____X__, + X___X___, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + X___X___, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_004C[ 13] = { /* code 004C */ + ________, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_004D[ 26] = { /* code 004D */ + ________,________, + ________,________, + XX_____X,X_______, + XX_____X,X_______, + X_X___X_,X_______, + X_X___X_,X_______, + X__X_X__,X_______, + X__X_X__,X_______, + X___X___,X_______, + X___X___,X_______, + X_______,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_004E[ 13] = { /* code 004E */ + ________, + ________, + XX____X_, + XX____X_, + X_X___X_, + X_X___X_, + X__X__X_, + X___X_X_, + X___X_X_, + X____XX_, + X____XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_004F[ 26] = { /* code 004F */ + ________,________, + ________,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0050[ 13] = { /* code 0050 */ + ________, + ________, + XXXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + XXXXX___, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0051[ 26] = { /* code 0051 */ + ________,________, + ________,________, + __XXXX__,________, + _X____X_,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + X______X,________, + _X____X_,________, + __XXXX__,________, + ____X___,________, + _____XXX,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0052[ 13] = { /* code 0052 */ + ________, + ________, + XXXXX___, + X____X__, + X____X__, + X____X__, + X___X___, + XXXX____, + X___X___, + X____X__, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0053[ 13] = { /* code 0053 */ + ________, + ________, + _XXXXX__, + X_____X_, + X_______, + X_______, + _XXXXX__, + ______X_, + ______X_, + X_____X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0054[ 13] = { /* code 0054 */ + ________, + ________, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0055[ 13] = { /* code 0055 */ + ________, + ________, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0056[ 13] = { /* code 0056 */ + ________, + ________, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0057[ 26] = { /* code 0057 */ + ________,________, + ________,________, + X____X__,__X_____, + X____X__,__X_____, + X___X_X_,__X_____, + X___X_X_,__X_____, + _X__X_X_,_X______, + _X_X___X,_X______, + _X_X___X,_X______, + _X_X___X,_X______, + __X_____,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0058[ 13] = { /* code 0058 */ + ________, + ________, + X_____X_, + _X___X__, + __X_X___, + __X_X___, + ___X____, + __X_X___, + __X_X___, + _X___X__, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0059[ 13] = { /* code 0059 */ + ________, + ________, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_005A[ 13] = { /* code 005A */ + ________, + ________, + XXXXXX__, + _____X__, + ____X___, + ___X____, + __X_____, + __X_____, + _X______, + X_______, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_005B[ 13] = { /* code 005B */ + ________, + _XXX____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_005C[ 13] = { /* code 005C */ + ________, + X_______, + X_______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + ___X____, + ___X____, + ___X____, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_005D[ 13] = { /* code 005D */ + ________, + _XXX____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_005E[ 26] = { /* code 005E */ + ________,________, + ________,________, + ____XX__,________, + ___X__X_,________, + __X____X,________, + _X______,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_005F[ 13] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0060[ 13] = { /* code 0060 */ + ________, + ___X____, + ____X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0061[ 13] = { /* code 0061 */ + ________, + ________, + ________, + ________, + _XXXX___, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0062[ 13] = { /* code 0062 */ + ________, + X_______, + X_______, + X_______, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + X____X__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0063[ 13] = { /* code 0063 */ + ________, + ________, + ________, + ________, + _XXXX___, + X_______, + X_______, + X_______, + X_______, + X_______, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0064[ 13] = { /* code 0064 */ + ________, + _____X__, + _____X__, + _____X__, + _XXXXX__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0065[ 13] = { /* code 0065 */ + ________, + ________, + ________, + ________, + _XXXX___, + X____X__, + X____X__, + XXXXXX__, + X_______, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0066[ 13] = { /* code 0066 */ + ________, + __XX____, + _X______, + _X______, + XXXX____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0067[ 13] = { /* code 0067 */ + ________, + ________, + ________, + ________, + _XXXXX__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + _____X__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0068[ 13] = { /* code 0068 */ + ________, + X_______, + X_______, + X_______, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0069[ 13] = { /* code 0069 */ + ________, + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_006A[ 13] = { /* code 006A */ + ________, + ________, + __X_____, + ________, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_006B[ 13] = { /* code 006B */ + ________, + X_______, + X_______, + X_______, + X___X___, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_006C[ 13] = { /* code 006C */ + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_006D[ 26] = { /* code 006D */ + ________,________, + ________,________, + ________,________, + ________,________, + _X_XX__X,X_______, + _XX__XX_,_X______, + _X___X__,_X______, + _X___X__,_X______, + _X___X__,_X______, + _X___X__,_X______, + _X___X__,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_006E[ 13] = { /* code 006E */ + ________, + ________, + ________, + ________, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_006F[ 13] = { /* code 006F */ + ________, + ________, + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0070[ 13] = { /* code 0070 */ + ________, + ________, + ________, + ________, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + X____X__, + XXXXX___, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0071[ 13] = { /* code 0071 */ + ________, + ________, + ________, + ________, + _XXXXX__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + _____X__, + _____X__}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0072[ 13] = { /* code 0072 */ + ________, + ________, + ________, + ________, + X_XX____, + XX______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0073[ 13] = { /* code 0073 */ + ________, + ________, + ________, + ________, + _XXX____, + X___X___, + X_______, + _XXX____, + ____X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0074[ 13] = { /* code 0074 */ + ________, + ________, + _X______, + _X______, + XXXX____, + _X______, + _X______, + _X______, + _X______, + _X______, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0075[ 13] = { /* code 0075 */ + ________, + ________, + ________, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0076[ 13] = { /* code 0076 */ + ________, + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0077[ 26] = { /* code 0077 */ + ________,________, + ________,________, + ________,________, + ________,________, + X___X___,X_______, + X___X___,X_______, + _X_X_X_X,________, + _X_X_X_X,________, + _X_X_X_X,________, + __X___X_,________, + __X___X_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0078[ 13] = { /* code 0078 */ + ________, + ________, + ________, + ________, + X___X___, + _X_X____, + _X_X____, + __X_____, + _X_X____, + _X_X____, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_0079[ 13] = { /* code 0079 */ + ________, + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_007A[ 13] = { /* code 007A */ + ________, + ________, + ________, + ________, + XXXXX___, + ____X___, + ___X____, + __X_____, + _X______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_007B[ 13] = { /* code 007B */ + ________, + ___XX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + XX______, + __X_____, + __X_____, + __X_____, + __X_____, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_007C[ 13] = { /* code 007C */ + ________, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_007D[ 13] = { /* code 007D */ + ________, + XX______, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ___XX___, + __X_____, + __X_____, + __X_____, + __X_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13H_ASCII_007E[ 26] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX___X,________, + _X__X__X,________, + _X___XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13H_ASCII_CharInfo[95] = { + { 4, 4, 1, acFont13H_ASCII_0020 } /* code 0020 */ + ,{ 4, 4, 1, acFont13H_ASCII_0021 } /* code 0021 */ + ,{ 5, 5, 1, acFont13H_ASCII_0022 } /* code 0022 */ + ,{ 9, 9, 2, acFont13H_ASCII_0023 } /* code 0023 */ + ,{ 7, 7, 1, acFont13H_ASCII_0024 } /* code 0024 */ + ,{ 12, 12, 2, acFont13H_ASCII_0025 } /* code 0025 */ + ,{ 9, 9, 2, acFont13H_ASCII_0026 } /* code 0026 */ + ,{ 3, 3, 1, acFont13H_ASCII_0027 } /* code 0027 */ + ,{ 5, 5, 1, acFont13H_ASCII_0028 } /* code 0028 */ + ,{ 5, 5, 1, acFont13H_ASCII_0029 } /* code 0029 */ + ,{ 8, 8, 1, acFont13H_ASCII_002A } /* code 002A */ + ,{ 8, 8, 1, acFont13H_ASCII_002B } /* code 002B */ + ,{ 4, 4, 1, acFont13H_ASCII_002C } /* code 002C */ + ,{ 5, 5, 1, acFont13H_ASCII_002D } /* code 002D */ + ,{ 4, 4, 1, acFont13H_ASCII_002E } /* code 002E */ + ,{ 5, 5, 1, acFont13H_ASCII_002F } /* code 002F */ + ,{ 7, 7, 1, acFont13H_ASCII_0030 } /* code 0030 */ + ,{ 7, 7, 1, acFont13H_ASCII_0031 } /* code 0031 */ + ,{ 7, 7, 1, acFont13H_ASCII_0032 } /* code 0032 */ + ,{ 7, 7, 1, acFont13H_ASCII_0033 } /* code 0033 */ + ,{ 7, 7, 1, acFont13H_ASCII_0034 } /* code 0034 */ + ,{ 7, 7, 1, acFont13H_ASCII_0035 } /* code 0035 */ + ,{ 7, 7, 1, acFont13H_ASCII_0036 } /* code 0036 */ + ,{ 7, 7, 1, acFont13H_ASCII_0037 } /* code 0037 */ + ,{ 7, 7, 1, acFont13H_ASCII_0038 } /* code 0038 */ + ,{ 7, 7, 1, acFont13H_ASCII_0039 } /* code 0039 */ + ,{ 5, 5, 1, acFont13H_ASCII_003A } /* code 003A */ + ,{ 5, 5, 1, acFont13H_ASCII_003B } /* code 003B */ + ,{ 9, 9, 2, acFont13H_ASCII_003C } /* code 003C */ + ,{ 9, 9, 2, acFont13H_ASCII_003D } /* code 003D */ + ,{ 9, 9, 2, acFont13H_ASCII_003E } /* code 003E */ + ,{ 6, 6, 1, acFont13H_ASCII_003F } /* code 003F */ + ,{ 12, 12, 2, acFont13H_ASCII_0040 } /* code 0040 */ + ,{ 8, 8, 1, acFont13H_ASCII_0041 } /* code 0041 */ + ,{ 7, 7, 1, acFont13H_ASCII_0042 } /* code 0042 */ + ,{ 8, 8, 1, acFont13H_ASCII_0043 } /* code 0043 */ + ,{ 8, 8, 1, acFont13H_ASCII_0044 } /* code 0044 */ + ,{ 7, 7, 1, acFont13H_ASCII_0045 } /* code 0045 */ + ,{ 7, 7, 1, acFont13H_ASCII_0046 } /* code 0046 */ + ,{ 8, 8, 1, acFont13H_ASCII_0047 } /* code 0047 */ + ,{ 8, 8, 1, acFont13H_ASCII_0048 } /* code 0048 */ + ,{ 4, 4, 1, acFont13H_ASCII_0049 } /* code 0049 */ + ,{ 5, 5, 1, acFont13H_ASCII_004A } /* code 004A */ + ,{ 7, 7, 1, acFont13H_ASCII_004B } /* code 004B */ + ,{ 6, 6, 1, acFont13H_ASCII_004C } /* code 004C */ + ,{ 10, 10, 2, acFont13H_ASCII_004D } /* code 004D */ + ,{ 8, 8, 1, acFont13H_ASCII_004E } /* code 004E */ + ,{ 9, 9, 2, acFont13H_ASCII_004F } /* code 004F */ + ,{ 7, 7, 1, acFont13H_ASCII_0050 } /* code 0050 */ + ,{ 9, 9, 2, acFont13H_ASCII_0051 } /* code 0051 */ + ,{ 8, 8, 1, acFont13H_ASCII_0052 } /* code 0052 */ + ,{ 8, 8, 1, acFont13H_ASCII_0053 } /* code 0053 */ + ,{ 8, 8, 1, acFont13H_ASCII_0054 } /* code 0054 */ + ,{ 8, 8, 1, acFont13H_ASCII_0055 } /* code 0055 */ + ,{ 8, 8, 1, acFont13H_ASCII_0056 } /* code 0056 */ + ,{ 12, 12, 2, acFont13H_ASCII_0057 } /* code 0057 */ + ,{ 8, 8, 1, acFont13H_ASCII_0058 } /* code 0058 */ + ,{ 7, 7, 1, acFont13H_ASCII_0059 } /* code 0059 */ + ,{ 7, 7, 1, acFont13H_ASCII_005A } /* code 005A */ + ,{ 5, 5, 1, acFont13H_ASCII_005B } /* code 005B */ + ,{ 5, 5, 1, acFont13H_ASCII_005C } /* code 005C */ + ,{ 5, 5, 1, acFont13H_ASCII_005D } /* code 005D */ + ,{ 9, 9, 2, acFont13H_ASCII_005E } /* code 005E */ + ,{ 7, 7, 1, acFont13H_ASCII_005F } /* code 005F */ + ,{ 7, 7, 1, acFont13H_ASCII_0060 } /* code 0060 */ + ,{ 7, 7, 1, acFont13H_ASCII_0061 } /* code 0061 */ + ,{ 7, 7, 1, acFont13H_ASCII_0062 } /* code 0062 */ + ,{ 6, 6, 1, acFont13H_ASCII_0063 } /* code 0063 */ + ,{ 7, 7, 1, acFont13H_ASCII_0064 } /* code 0064 */ + ,{ 7, 7, 1, acFont13H_ASCII_0065 } /* code 0065 */ + ,{ 4, 4, 1, acFont13H_ASCII_0066 } /* code 0066 */ + ,{ 7, 7, 1, acFont13H_ASCII_0067 } /* code 0067 */ + ,{ 7, 7, 1, acFont13H_ASCII_0068 } /* code 0068 */ + ,{ 3, 3, 1, acFont13H_ASCII_0069 } /* code 0069 */ + ,{ 4, 4, 1, acFont13H_ASCII_006A } /* code 006A */ + ,{ 6, 6, 1, acFont13H_ASCII_006B } /* code 006B */ + ,{ 3, 3, 1, acFont13H_ASCII_006C } /* code 006C */ + ,{ 11, 11, 2, acFont13H_ASCII_006D } /* code 006D */ + ,{ 7, 7, 1, acFont13H_ASCII_006E } /* code 006E */ + ,{ 7, 7, 1, acFont13H_ASCII_006F } /* code 006F */ + ,{ 7, 7, 1, acFont13H_ASCII_0070 } /* code 0070 */ + ,{ 7, 7, 1, acFont13H_ASCII_0071 } /* code 0071 */ + ,{ 5, 5, 1, acFont13H_ASCII_0072 } /* code 0072 */ + ,{ 6, 6, 1, acFont13H_ASCII_0073 } /* code 0073 */ + ,{ 4, 4, 1, acFont13H_ASCII_0074 } /* code 0074 */ + ,{ 7, 7, 1, acFont13H_ASCII_0075 } /* code 0075 */ + ,{ 6, 6, 1, acFont13H_ASCII_0076 } /* code 0076 */ + ,{ 10, 10, 2, acFont13H_ASCII_0077 } /* code 0077 */ + ,{ 6, 6, 1, acFont13H_ASCII_0078 } /* code 0078 */ + ,{ 6, 6, 1, acFont13H_ASCII_0079 } /* code 0079 */ + ,{ 6, 6, 1, acFont13H_ASCII_007A } /* code 007A */ + ,{ 6, 6, 1, acFont13H_ASCII_007B } /* code 007B */ + ,{ 6, 6, 1, acFont13H_ASCII_007C } /* code 007C */ + ,{ 6, 6, 1, acFont13H_ASCII_007D } /* code 007D */ + ,{ 9, 9, 2, acFont13H_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13H_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font13H_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13H_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13H_ASCII_Prop1} + , 11, 7, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13_1.c b/User/system/lib/lcd/gui/Font/F13_1.c new file mode 100644 index 0000000..9d470de --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13_1.c @@ -0,0 +1,1581 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13_1.c +Purpose : ISO 8859-1 West European Character Set similar to Swiss +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* Start of unicode area */ + +GUI_CONST_STORAGE unsigned char acFont13_1_00A0[13] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A1[13] = { /* code 00A1 */ + ________, + ________, + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A2[13] = { /* code 00A2 */ + ________, + ________, + ________, + __X_____, + __X_____, + _XXXX___, + X_X_____, + X_X_____, + X_X_____, + X_X_____, + _XXXX___, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A3[13] = { /* code 00A3 */ + ________, + ________, + ________, + __XXX___, + _X______, + _X______, + _X______, + XXXX____, + _X______, + _X______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A4[13] = { /* code 00A4 */ + ________, + ________, + ________, + ________, + ________, + X___X___, + _XXX____, + _X_X____, + _XXX____, + X___X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A5[13] = { /* code 00A5 */ + ________, + ________, + ________, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A6[13] = { /* code 00A6 */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A7[13] = { /* code 00A7 */ + ________, + ________, + ________, + _XXXX___, + X_______, + X_______, + _XXX____, + X___X___, + X___X___, + _XXX____, + ____X___, + ____X___, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A8[13] = { /* code 00A8 */ + ________, + ________, + ________, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00A9[26] = { /* code 00A9 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X__XXX__,X_______, + X_X_____,X_______, + X_X_____,X_______, + X_X_____,X_______, + X__XXX__,X_______, + _X_____X,________, + __XXXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00AA[13] = { /* code 00AA */ + ________, + ________, + ________, + XXX_____, + ___X____, + _XXX____, + X__X____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00AB[13] = { /* code 00AB */ + ________, + ________, + ________, + ________, + ________, + __X_X___, + _X_X____, + X_X_____, + _X_X____, + __X_X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00AC[13] = { /* code 00AC */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + ______X_, + ______X_, + ______X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00AD[13] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00AE[26] = { /* code 00AE */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X__XXX__,X_______, + X__X__X_,X_______, + X__XXX__,X_______, + X__X_X__,X_______, + X__X__X_,X_______, + _X_____X,________, + __XXXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00AF[13] = { /* code 00AF */ + ________, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B0[13] = { /* code 00B0 */ + ________, + ________, + ________, + _XX_____, + X__X____, + X__X____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B1[13] = { /* code 00B1 */ + ________, + ________, + ________, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B2[13] = { /* code 00B2 */ + ________, + ________, + ________, + _XX_____, + ___X____, + ___X____, + __X_____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B3[13] = { /* code 00B3 */ + ________, + ________, + ________, + _XX_____, + ___X____, + __X_____, + ___X____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B4[13] = { /* code 00B4 */ + ________, + ________, + ___X____, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B5[13] = { /* code 00B5 */ + ________, + ________, + ________, + ________, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X__XX___, + XXX_X___, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B6[13] = { /* code 00B6 */ + ________, + ________, + ________, + _XXXX___, + XXX_X___, + XXX_X___, + XXX_X___, + _XX_X___, + __X_X___, + __X_X___, + __X_X___, + __X_X___, + __X_X___}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B7[13] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B8[13] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00B9[13] = { /* code 00B9 */ + ________, + ________, + ________, + __X_____, + _XX_____, + __X_____, + __X_____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00BA[13] = { /* code 00BA */ + ________, + ________, + ________, + _XX_____, + X__X____, + X__X____, + X__X____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00BB[13] = { /* code 00BB */ + ________, + ________, + ________, + ________, + ________, + X_X_____, + _X_X____, + __X_X___, + _X_X____, + X_X_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00BC[26] = { /* code 00BC */ + ________,________, + ________,________, + ________,________, + __X____X,________, + _XX___X_,________, + __X___X_,________, + __X__X__,X_______, + __X__X_X,X_______, + ____X_X_,X_______, + ____X_XX,XX______, + ___X____,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00BD[26] = { /* code 00BD */ + ________,________, + ________,________, + ________,________, + __X____X,________, + _XX___X_,________, + __X___X_,________, + __X__X_X,X_______, + __X__X__,_X______, + ____X___,_X______, + ____X___,X_______, + ___X___X,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00BE[26] = { /* code 00BE */ + ________,________, + ________,________, + ________,________, + _XXX___X,________, + ____X_X_,________, + __XX__X_,________, + ____XX__,X_______, + _XXX_X_X,X_______, + ____X_X_,X_______, + ____X_XX,XX______, + ___X____,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00BF[13] = { /* code 00BF */ + ________, + ________, + ________, + __X_____, + ________, + __X_____, + __X_____, + _X______, + X_______, + X_______, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C0[13] = { /* code 00C0 */ + __X_____, + ___X____, + ________, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C1[13] = { /* code 00C1 */ + ___X____, + __X_____, + ________, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C2[13] = { /* code 00C2 */ + __XX____, + _X__X___, + ________, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C3[13] = { /* code 00C3 */ + _XX_X___, + _X_XX___, + ________, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C4[13] = { /* code 00C4 */ + ________, + _X__X___, + ________, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C5[13] = { /* code 00C5 */ + __XX____, + _X__X___, + _X__X___, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C6[26] = { /* code 00C6 */ + ________,________, + ________,________, + ________,________, + __XXXXXX,X_______, + __X_X___,________, + _X__X___,________, + _X__XXXX,________, + _XXXX___,________, + X___X___,________, + X___X___,________, + X___XXXX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C7[13] = { /* code 00C7 */ + ________, + ________, + ________, + __XXXX__, + _X______, + X_______, + X_______, + X_______, + X_______, + _X______, + __XXXX__, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C8[13] = { /* code 00C8 */ + __X_____, + ___X____, + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00C9[13] = { /* code 00C9 */ + ___X____, + __X_____, + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00CA[13] = { /* code 00CA */ + __XX____, + _X__X___, + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00CB[13] = { /* code 00CB */ + ________, + _X_X____, + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00CC[13] = { /* code 00CC */ + X_______, + _X______, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00CD[13] = { /* code 00CD */ + __X_____, + _X______, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00CE[13] = { /* code 00CE */ + _XX_____, + X__X____, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00CF[13] = { /* code 00CF */ + ________, + X_X_____, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D0[13] = { /* code 00D0 */ + ________, + ________, + ________, + _XXXX___, + _X___X__, + _X____X_, + XXXX__X_, + _X____X_, + _X____X_, + _X___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D1[13] = { /* code 00D1 */ + _XX_X___, + _X_XX___, + ________, + XX___X__, + XX___X__, + X_X__X__, + X_X__X__, + X__X_X__, + X__X_X__, + X___XX__, + X___XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D2[13] = { /* code 00D2 */ + __X_____, + ___X____, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D3[13] = { /* code 00D3 */ + ____X___, + ___X____, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D4[13] = { /* code 00D4 */ + ___XX___, + __X__X__, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D5[13] = { /* code 00D5 */ + __XX_X__, + __X_XX__, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D6[13] = { /* code 00D6 */ + ________, + __X_X___, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D7[13] = { /* code 00D7 */ + ________, + ________, + ________, + ________, + ________, + __X___X_, + ___X_X__, + ____X___, + ___X_X__, + __X___X_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D8[13] = { /* code 00D8 */ + ________, + ________, + ________, + __XXX_X_, + _X___X__, + X___X_X_, + X__X__X_, + X__X__X_, + X_X___X_, + _X___X__, + X_XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00D9[13] = { /* code 00D9 */ + __X_____, + ___X____, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00DA[13] = { /* code 00DA */ + ___X____, + __X_____, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00DB[13] = { /* code 00DB */ + __XX____, + _X__X___, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00DC[13] = { /* code 00DC */ + ________, + _X__X___, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00DD[13] = { /* code 00DD */ + ___X____, + __X_____, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00DE[13] = { /* code 00DE */ + ________, + ________, + ________, + X_______, + X_______, + XXXX____, + X___X___, + X___X___, + XXXX____, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00DF[13] = { /* code 00DF */ + ________, + ________, + _XXX____, + X___X___, + X___X___, + X_XX____, + X___X___, + X___X___, + X___X___, + X___X___, + X_XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E0[13] = { /* code 00E0 */ + ________, + ________, + __X_____, + ___X____, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E1[13] = { /* code 00E1 */ + ________, + ________, + ___X____, + __X_____, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E2[13] = { /* code 00E2 */ + ________, + ________, + __XX____, + _X__X___, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E3[13] = { /* code 00E3 */ + ________, + ________, + _XX_X___, + _X_XX___, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E4[13] = { /* code 00E4 */ + ________, + ________, + ________, + _X_X____, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E5[13] = { /* code 00E5 */ + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E6[26] = { /* code 00E6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX_XXX,________, + ____X___,X_______, + _XXXXXXX,X_______, + X___X___,________, + X___XX__,X_______, + _XXX__XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E7[13] = { /* code 00E7 */ + ________, + ________, + ________, + ________, + ________, + _XXX____, + X_______, + X_______, + X_______, + X_______, + _XXX____, + __X_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E8[13] = { /* code 00E8 */ + ________, + ________, + _X______, + __X_____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00E9[13] = { /* code 00E9 */ + ________, + ________, + ___X____, + __X_____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00EA[13] = { /* code 00EA */ + ________, + ________, + __XX____, + _X__X___, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00EB[13] = { /* code 00EB */ + ________, + ________, + ________, + _X_X____, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00EC[13] = { /* code 00EC */ + ________, + ________, + ________, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00ED[13] = { /* code 00ED */ + ________, + ________, + _X______, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00EE[13] = { /* code 00EE */ + ________, + ________, + X_______, + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00EF[13] = { /* code 00EF */ + ________, + ________, + ________, + _X______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F0[13] = { /* code 00F0 */ + ________, + ________, + ________, + __XX____, + _X_X____, + ____X___, + _XXXX___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F1[13] = { /* code 00F1 */ + ________, + ________, + _XX_X___, + _X_XX___, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F2[13] = { /* code 00F2 */ + ________, + ________, + _X______, + __X_____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F3[13] = { /* code 00F3 */ + ________, + ________, + ___X____, + __X_____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F4[13] = { /* code 00F4 */ + ________, + ________, + __XX____, + _X__X___, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F5[13] = { /* code 00F5 */ + ________, + ________, + _XX_X___, + _X_XX___, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F6[13] = { /* code 00F6 */ + ________, + ________, + ________, + _X_X____, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F7[13] = { /* code 00F7 */ + ________, + ________, + ________, + ________, + ___X____, + ___X____, + ________, + XXXXXXX_, + ________, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F8[13] = { /* code 00F8 */ + ________, + ________, + ________, + ________, + ____X___, + _XXX____, + X__XX___, + X_X_X___, + X_X_X___, + XX__X___, + _XXX____, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00F9[13] = { /* code 00F9 */ + ________, + ________, + _X______, + __X_____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00FA[13] = { /* code 00FA */ + ________, + ________, + ___X____, + __X_____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00FB[13] = { /* code 00FB */ + ________, + ________, + __XX____, + _X__X___, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00FC[13] = { /* code 00FC */ + ________, + ________, + ________, + _X_X____, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00FD[13] = { /* code 00FD */ + ________, + ________, + ___X____, + __X_____, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00FE[13] = { /* code 00FE */ + ________, + ________, + X_______, + X_______, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + XXXX____, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13_1_00FF[13] = { /* code 00FF */ + ________, + ________, + ________, + _X_X____, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______, + _X______}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13_1_CharInfo[96] = { + { 3, 3, 1, acFont13_1_00A0 } /* code 00A0 */ + ,{ 4, 4, 1, acFont13_1_00A1 } /* code 00A1 */ + ,{ 6, 6, 1, acFont13_1_00A2 } /* code 00A2 */ + ,{ 6, 6, 1, acFont13_1_00A3 } /* code 00A3 */ + ,{ 6, 6, 1, acFont13_1_00A4 } /* code 00A4 */ + ,{ 6, 6, 1, acFont13_1_00A5 } /* code 00A5 */ + ,{ 4, 4, 1, acFont13_1_00A6 } /* code 00A6 */ + ,{ 6, 6, 1, acFont13_1_00A7 } /* code 00A7 */ + ,{ 6, 6, 1, acFont13_1_00A8 } /* code 00A8 */ + ,{ 10, 10, 2, acFont13_1_00A9 } /* code 00A9 */ + ,{ 5, 5, 1, acFont13_1_00AA } /* code 00AA */ + ,{ 6, 6, 1, acFont13_1_00AB } /* code 00AB */ + ,{ 8, 8, 1, acFont13_1_00AC } /* code 00AC */ + ,{ 4, 4, 1, acFont13_1_00AD } /* code 00AD */ + ,{ 10, 10, 2, acFont13_1_00AE } /* code 00AE */ + ,{ 6, 6, 1, acFont13_1_00AF } /* code 00AF */ + ,{ 5, 5, 1, acFont13_1_00B0 } /* code 00B0 */ + ,{ 8, 8, 1, acFont13_1_00B1 } /* code 00B1 */ + ,{ 5, 5, 1, acFont13_1_00B2 } /* code 00B2 */ + ,{ 5, 5, 1, acFont13_1_00B3 } /* code 00B3 */ + ,{ 6, 6, 1, acFont13_1_00B4 } /* code 00B4 */ + ,{ 6, 6, 1, acFont13_1_00B5 } /* code 00B5 */ + ,{ 6, 6, 1, acFont13_1_00B6 } /* code 00B6 */ + ,{ 3, 3, 1, acFont13_1_00B7 } /* code 00B7 */ + ,{ 6, 6, 1, acFont13_1_00B8 } /* code 00B8 */ + ,{ 5, 5, 1, acFont13_1_00B9 } /* code 00B9 */ + ,{ 5, 5, 1, acFont13_1_00BA } /* code 00BA */ + ,{ 6, 6, 1, acFont13_1_00BB } /* code 00BB */ + ,{ 11, 11, 2, acFont13_1_00BC } /* code 00BC */ + ,{ 11, 11, 2, acFont13_1_00BD } /* code 00BD */ + ,{ 11, 11, 2, acFont13_1_00BE } /* code 00BE */ + ,{ 5, 5, 1, acFont13_1_00BF } /* code 00BF */ + ,{ 7, 7, 1, acFont13_1_00C0 } /* code 00C0 */ + ,{ 7, 7, 1, acFont13_1_00C1 } /* code 00C1 */ + ,{ 7, 7, 1, acFont13_1_00C2 } /* code 00C2 */ + ,{ 7, 7, 1, acFont13_1_00C3 } /* code 00C3 */ + ,{ 7, 7, 1, acFont13_1_00C4 } /* code 00C4 */ + ,{ 7, 7, 1, acFont13_1_00C5 } /* code 00C5 */ + ,{ 10, 10, 2, acFont13_1_00C6 } /* code 00C6 */ + ,{ 7, 7, 1, acFont13_1_00C7 } /* code 00C7 */ + ,{ 6, 6, 1, acFont13_1_00C8 } /* code 00C8 */ + ,{ 6, 6, 1, acFont13_1_00C9 } /* code 00C9 */ + ,{ 6, 6, 1, acFont13_1_00CA } /* code 00CA */ + ,{ 6, 6, 1, acFont13_1_00CB } /* code 00CB */ + ,{ 4, 4, 1, acFont13_1_00CC } /* code 00CC */ + ,{ 4, 4, 1, acFont13_1_00CD } /* code 00CD */ + ,{ 4, 4, 1, acFont13_1_00CE } /* code 00CE */ + ,{ 4, 4, 1, acFont13_1_00CF } /* code 00CF */ + ,{ 8, 8, 1, acFont13_1_00D0 } /* code 00D0 */ + ,{ 7, 7, 1, acFont13_1_00D1 } /* code 00D1 */ + ,{ 8, 8, 1, acFont13_1_00D2 } /* code 00D2 */ + ,{ 8, 8, 1, acFont13_1_00D3 } /* code 00D3 */ + ,{ 8, 8, 1, acFont13_1_00D4 } /* code 00D4 */ + ,{ 8, 8, 1, acFont13_1_00D5 } /* code 00D5 */ + ,{ 8, 8, 1, acFont13_1_00D6 } /* code 00D6 */ + ,{ 8, 8, 1, acFont13_1_00D7 } /* code 00D7 */ + ,{ 8, 8, 1, acFont13_1_00D8 } /* code 00D8 */ + ,{ 7, 7, 1, acFont13_1_00D9 } /* code 00D9 */ + ,{ 7, 7, 1, acFont13_1_00DA } /* code 00DA */ + ,{ 7, 7, 1, acFont13_1_00DB } /* code 00DB */ + ,{ 7, 7, 1, acFont13_1_00DC } /* code 00DC */ + ,{ 6, 6, 1, acFont13_1_00DD } /* code 00DD */ + ,{ 6, 6, 1, acFont13_1_00DE } /* code 00DE */ + ,{ 6, 6, 1, acFont13_1_00DF } /* code 00DF */ + ,{ 6, 6, 1, acFont13_1_00E0 } /* code 00E0 */ + ,{ 6, 6, 1, acFont13_1_00E1 } /* code 00E1 */ + ,{ 6, 6, 1, acFont13_1_00E2 } /* code 00E2 */ + ,{ 6, 6, 1, acFont13_1_00E3 } /* code 00E3 */ + ,{ 6, 6, 1, acFont13_1_00E4 } /* code 00E4 */ + ,{ 6, 6, 1, acFont13_1_00E5 } /* code 00E5 */ + ,{ 10, 10, 2, acFont13_1_00E6 } /* code 00E6 */ + ,{ 5, 5, 1, acFont13_1_00E7 } /* code 00E7 */ + ,{ 6, 6, 1, acFont13_1_00E8 } /* code 00E8 */ + ,{ 6, 6, 1, acFont13_1_00E9 } /* code 00E9 */ + ,{ 6, 6, 1, acFont13_1_00EA } /* code 00EA */ + ,{ 6, 6, 1, acFont13_1_00EB } /* code 00EB */ + ,{ 2, 2, 1, acFont13_1_00EC } /* code 00EC */ + ,{ 2, 2, 1, acFont13_1_00ED } /* code 00ED */ + ,{ 2, 2, 1, acFont13_1_00EE } /* code 00EE */ + ,{ 2, 2, 1, acFont13_1_00EF } /* code 00EF */ + ,{ 6, 6, 1, acFont13_1_00F0 } /* code 00F0 */ + ,{ 6, 6, 1, acFont13_1_00F1 } /* code 00F1 */ + ,{ 6, 6, 1, acFont13_1_00F2 } /* code 00F2 */ + ,{ 6, 6, 1, acFont13_1_00F3 } /* code 00F3 */ + ,{ 6, 6, 1, acFont13_1_00F4 } /* code 00F4 */ + ,{ 6, 6, 1, acFont13_1_00F5 } /* code 00F5 */ + ,{ 6, 6, 1, acFont13_1_00F6 } /* code 00F6 */ + ,{ 8, 8, 1, acFont13_1_00F7 } /* code 00F7 */ + ,{ 6, 6, 1, acFont13_1_00F8 } /* code 00F8 */ + ,{ 6, 6, 1, acFont13_1_00F9 } /* code 00F9 */ + ,{ 6, 6, 1, acFont13_1_00FA } /* code 00FA */ + ,{ 6, 6, 1, acFont13_1_00FB } /* code 00FB */ + ,{ 6, 6, 1, acFont13_1_00FC } /* code 00FC */ + ,{ 6, 6, 1, acFont13_1_00FD } /* code 00FD */ + ,{ 6, 6, 1, acFont13_1_00FE } /* code 00FE */ + ,{ 6, 6, 1, acFont13_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13_1_Prop1 = { + 160 /* first character */ + ,255 /* last character */ + ,&GUI_Font13_1_CharInfo[0] /* address of first character */ + ,&GUI_Font13ASCII_Prop1 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13_1_Prop1} + , 11, 6, 8 +}; + diff --git a/User/system/lib/lcd/gui/Font/F13_ASCII.c b/User/system/lib/lcd/gui/Font/F13_ASCII.c new file mode 100644 index 0000000..677a847 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F13_ASCII.c @@ -0,0 +1,1565 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F13_ASCII.c +Purpose : ASCII character set +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0020[13] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0021[13] = { /* code 0021 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0022[13] = { /* code 0022 */ + ________, + ________, + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0023[13] = { /* code 0023 */ + ________, + ________, + ________, + ___X_X__, + ___X_X__, + _XXXXXX_, + __X_X___, + __X_X___, + XXXXXX__, + _X_X____, + _X_X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0024[13] = { /* code 0024 */ + ________, + ________, + __X_____, + __X_____, + _XXXX___, + X_X_____, + X_X_____, + _XXX____, + __X_X___, + __X_X___, + XXXX____, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0025[26] = { /* code 0025 */ + ________,________, + ________,________, + ________,________, + _XX___X_,________, + X__X__X_,________, + X__X_X__,________, + _XX__X__,________, + ____X__X,X_______, + ____X_X_,_X______, + ___X__X_,_X______, + ___X___X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0026[13] = { /* code 0026 */ + ________, + ________, + ________, + _XX_____, + X__X____, + X__X____, + _XX__X__, + X__X_X__, + X___X___, + X___XX__, + _XXX__X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0027[13] = { /* code 0027 */ + ________, + ________, + X_______, + X_______, + X_______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0028[13] = { /* code 0028 */ + ________, + ________, + __X_____, + _X______, + _X______, + X_______, + X_______, + X_______, + X_______, + X_______, + _X______, + _X______, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0029[13] = { /* code 0029 */ + ________, + ________, + X_______, + _X______, + _X______, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_002A[13] = { /* code 002A */ + ________, + ________, + __X_____, + X_X_X___, + _XXX____, + X_X_X___, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_002B[13] = { /* code 002B */ + ________, + ________, + ________, + ________, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_002C[13] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_002D[13] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_002E[13] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_002F[13] = { /* code 002F */ + ________, + ________, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + _X______, + _X______, + X_______, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0030[13] = { /* code 0030 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0031[13] = { /* code 0031 */ + ________, + ________, + ________, + __X_____, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0032[13] = { /* code 0032 */ + ________, + ________, + ________, + _XXX____, + X___X___, + ____X___, + ___X____, + __X_____, + _X______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0033[13] = { /* code 0033 */ + ________, + ________, + ________, + _XXX____, + X___X___, + ____X___, + __XX____, + ____X___, + ____X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0034[13] = { /* code 0034 */ + ________, + ________, + ________, + ___X____, + __XX____, + _X_X____, + X__X____, + XXXXX___, + ___X____, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0035[13] = { /* code 0035 */ + ________, + ________, + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + ____X___, + ____X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0036[13] = { /* code 0036 */ + ________, + ________, + ________, + __XX____, + _X______, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0037[13] = { /* code 0037 */ + ________, + ________, + ________, + XXXXX___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0038[13] = { /* code 0038 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X___X___, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0039[13] = { /* code 0039 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXXX___, + ____X___, + ___X____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_003A[13] = { /* code 003A */ + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________, + ________, + _X______, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_003B[13] = { /* code 003B */ + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + ________, + ________, + _X______, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_003C[13] = { /* code 003C */ + ________, + ________, + ________, + ________, + ______X_, + ____XX__, + __XX____, + _X______, + __XX____, + ____XX__, + ______X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_003D[13] = { /* code 003D */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_003E[13] = { /* code 003E */ + ________, + ________, + ________, + ________, + _X______, + __XX____, + ____XX__, + ______X_, + ____XX__, + __XX____, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_003F[13] = { /* code 003F */ + ________, + ________, + ________, + XXX_____, + ___X____, + ___X____, + __X_____, + _X______, + _X______, + ________, + _X______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0040[26] = { /* code 0040 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + X__XXX__,X_______, + X_X__X__,X_______, + X_X__X__,X_______, + X_X__X__,X_______, + X__XXXXX,________, + _X______,________, + __XXXX__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0041[13] = { /* code 0041 */ + ________, + ________, + ________, + __XX____, + __XX____, + _X__X___, + _X__X___, + _X__X___, + XXXXXX__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0042[13] = { /* code 0042 */ + ________, + ________, + ________, + XXXX____, + X___X___, + X___X___, + XXXX____, + X___X___, + X___X___, + X___X___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0043[13] = { /* code 0043 */ + ________, + ________, + ________, + __XXXX__, + _X______, + X_______, + X_______, + X_______, + X_______, + _X______, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0044[13] = { /* code 0044 */ + ________, + ________, + ________, + XXXX____, + X___X___, + X____X__, + X____X__, + X____X__, + X____X__, + X___X___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0045[13] = { /* code 0045 */ + ________, + ________, + ________, + XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0046[13] = { /* code 0046 */ + ________, + ________, + ________, + XXXXX___, + X_______, + X_______, + XXXXX___, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0047[13] = { /* code 0047 */ + ________, + ________, + ________, + __XXXX__, + _X______, + X_______, + X_______, + X__XXX__, + X____X__, + _X___X__, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0048[13] = { /* code 0048 */ + ________, + ________, + ________, + X____X__, + X____X__, + X____X__, + XXXXXX__, + X____X__, + X____X__, + X____X__, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0049[13] = { /* code 0049 */ + ________, + ________, + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_004A[13] = { /* code 004A */ + ________, + ________, + ________, + _XXX____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_004B[13] = { /* code 004B */ + ________, + ________, + ________, + X___X___, + X__X____, + X_X_____, + XX______, + XX______, + X_X_____, + X__X____, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_004C[13] = { /* code 004C */ + ________, + ________, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_004D[13] = { /* code 004D */ + ________, + ________, + ________, + XX___XX_, + XX___XX_, + X_X_X_X_, + X_X_X_X_, + X__X__X_, + X__X__X_, + X_____X_, + X_____X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_004E[13] = { /* code 004E */ + ________, + ________, + ________, + XX___X__, + XX___X__, + X_X__X__, + X_X__X__, + X__X_X__, + X__X_X__, + X___XX__, + X___XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_004F[13] = { /* code 004F */ + ________, + ________, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0050[13] = { /* code 0050 */ + ________, + ________, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + XXXX____, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0051[13] = { /* code 0051 */ + ________, + ________, + ________, + __XXX___, + _X___X__, + X_____X_, + X_____X_, + X_____X_, + X_____X_, + _X___X__, + __XXX___, + ____X___, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0052[13] = { /* code 0052 */ + ________, + ________, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + XXXX____, + X__X____, + X___X___, + X____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0053[13] = { /* code 0053 */ + ________, + ________, + ________, + _XXXX___, + X_______, + X_______, + _XXX____, + ____X___, + ____X___, + ____X___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0054[13] = { /* code 0054 */ + ________, + ________, + ________, + XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0055[13] = { /* code 0055 */ + ________, + ________, + ________, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0056[13] = { /* code 0056 */ + ________, + ________, + ________, + X___X___, + X___X___, + X___X___, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0057[26] = { /* code 0057 */ + ________,________, + ________,________, + ________,________, + X___X___,X_______, + X___X___,X_______, + X___X___,X_______, + _X_X_X_X,________, + _X_X_X_X,________, + _X_X_X_X,________, + __X___X_,________, + __X___X_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0058[13] = { /* code 0058 */ + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + __X_____, + __X_____, + _X_X____, + X___X___, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0059[13] = { /* code 0059 */ + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_005A[13] = { /* code 005A */ + ________, + ________, + ________, + XXXXX___, + ____X___, + ___X____, + __X_____, + __X_____, + _X______, + X_______, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_005B[13] = { /* code 005B */ + ________, + ________, + XXX_____, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_005C[13] = { /* code 005C */ + ________, + ________, + X_______, + X_______, + X_______, + _X______, + _X______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_005D[13] = { /* code 005D */ + ________, + ________, + XXX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_005E[13] = { /* code 005E */ + ________, + ________, + ________, + ___X____, + __X_X___, + _X___X__, + X_____X_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_005F[13] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0060[13] = { /* code 0060 */ + ________, + ________, + _X______, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0061[13] = { /* code 0061 */ + ________, + ________, + ________, + ________, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0062[13] = { /* code 0062 */ + ________, + ________, + X_______, + X_______, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0063[13] = { /* code 0063 */ + ________, + ________, + ________, + ________, + ________, + _XXX____, + X_______, + X_______, + X_______, + X_______, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0064[13] = { /* code 0064 */ + ________, + ________, + ____X___, + ____X___, + ____X___, + _XXXX___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0065[13] = { /* code 0065 */ + ________, + ________, + ________, + ________, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0066[13] = { /* code 0066 */ + ________, + ________, + _XX_____, + X_______, + X_______, + XXX_____, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0067[13] = { /* code 0067 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ____X___, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0068[13] = { /* code 0068 */ + ________, + ________, + X_______, + X_______, + X_______, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0069[13] = { /* code 0069 */ + ________, + ________, + ________, + X_______, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_006A[13] = { /* code 006A */ + ________, + ________, + ________, + _X______, + ________, + XX______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_006B[13] = { /* code 006B */ + ________, + ________, + X_______, + X_______, + X_______, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_006C[13] = { /* code 006C */ + ________, + ________, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_006D[13] = { /* code 006D */ + ________, + ________, + ________, + ________, + ________, + XXX_XX__, + X__X__X_, + X__X__X_, + X__X__X_, + X__X__X_, + X__X__X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_006E[13] = { /* code 006E */ + ________, + ________, + ________, + ________, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_006F[13] = { /* code 006F */ + ________, + ________, + ________, + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0070[13] = { /* code 0070 */ + ________, + ________, + ________, + ________, + ________, + XXXX____, + X___X___, + X___X___, + X___X___, + X___X___, + XXXX____, + X_______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0071[13] = { /* code 0071 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0072[13] = { /* code 0072 */ + ________, + ________, + ________, + ________, + ________, + X_X_____, + XX______, + X_______, + X_______, + X_______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0073[13] = { /* code 0073 */ + ________, + ________, + ________, + ________, + ________, + _XXX____, + X_______, + XX______, + __XX____, + ___X____, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0074[13] = { /* code 0074 */ + ________, + ________, + ________, + X_______, + X_______, + XXX_____, + X_______, + X_______, + X_______, + X_______, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0075[13] = { /* code 0075 */ + ________, + ________, + ________, + ________, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0076[13] = { /* code 0076 */ + ________, + ________, + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0077[13] = { /* code 0077 */ + ________, + ________, + ________, + ________, + ________, + X__X__X_, + X__X__X_, + X_X_X_X_, + X_X_X_X_, + _X___X__, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0078[13] = { /* code 0078 */ + ________, + ________, + ________, + ________, + ________, + X___X___, + _X_X____, + __X_____, + __X_____, + _X_X____, + X___X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_0079[13] = { /* code 0079 */ + ________, + ________, + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + __X_____, + __X_____, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_007A[13] = { /* code 007A */ + ________, + ________, + ________, + ________, + ________, + XXXX____, + ___X____, + __X_____, + _X______, + X_______, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_007B[13] = { /* code 007B */ + ________, + ________, + ___X____, + __X_____, + __X_____, + __X_____, + __X_____, + XX______, + __X_____, + __X_____, + __X_____, + __X_____, + ___X____}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_007C[13] = { /* code 007C */ + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_007D[13] = { /* code 007D */ + ________, + ________, + X_______, + _X______, + _X______, + _X______, + _X______, + __XX____, + _X______, + _X______, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont13ASCII_007E[13] = { /* code 007E */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX___X_, + X__X__X_, + X___XX__, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13ASCII_CharInfo[95] = { + { 3, 3, 1, acFont13ASCII_0020 } /* code 0020 */ + ,{ 4, 4, 1, acFont13ASCII_0021 } /* code 0021 */ + ,{ 4, 4, 1, acFont13ASCII_0022 } /* code 0022 */ + ,{ 8, 8, 1, acFont13ASCII_0023 } /* code 0023 */ + ,{ 6, 6, 1, acFont13ASCII_0024 } /* code 0024 */ + ,{ 11, 11, 2, acFont13ASCII_0025 } /* code 0025 */ + ,{ 7, 7, 1, acFont13ASCII_0026 } /* code 0026 */ + ,{ 2, 2, 1, acFont13ASCII_0027 } /* code 0027 */ + ,{ 4, 4, 1, acFont13ASCII_0028 } /* code 0028 */ + ,{ 4, 4, 1, acFont13ASCII_0029 } /* code 0029 */ + ,{ 6, 6, 1, acFont13ASCII_002A } /* code 002A */ + ,{ 8, 8, 1, acFont13ASCII_002B } /* code 002B */ + ,{ 4, 4, 1, acFont13ASCII_002C } /* code 002C */ + ,{ 4, 4, 1, acFont13ASCII_002D } /* code 002D */ + ,{ 4, 4, 1, acFont13ASCII_002E } /* code 002E */ + ,{ 4, 4, 1, acFont13ASCII_002F } /* code 002F */ + ,{ 6, 6, 1, acFont13ASCII_0030 } /* code 0030 */ + ,{ 6, 6, 1, acFont13ASCII_0031 } /* code 0031 */ + ,{ 6, 6, 1, acFont13ASCII_0032 } /* code 0032 */ + ,{ 6, 6, 1, acFont13ASCII_0033 } /* code 0033 */ + ,{ 6, 6, 1, acFont13ASCII_0034 } /* code 0034 */ + ,{ 6, 6, 1, acFont13ASCII_0035 } /* code 0035 */ + ,{ 6, 6, 1, acFont13ASCII_0036 } /* code 0036 */ + ,{ 6, 6, 1, acFont13ASCII_0037 } /* code 0037 */ + ,{ 6, 6, 1, acFont13ASCII_0038 } /* code 0038 */ + ,{ 6, 6, 1, acFont13ASCII_0039 } /* code 0039 */ + ,{ 4, 4, 1, acFont13ASCII_003A } /* code 003A */ + ,{ 4, 4, 1, acFont13ASCII_003B } /* code 003B */ + ,{ 8, 8, 1, acFont13ASCII_003C } /* code 003C */ + ,{ 8, 8, 1, acFont13ASCII_003D } /* code 003D */ + ,{ 8, 8, 1, acFont13ASCII_003E } /* code 003E */ + ,{ 5, 5, 1, acFont13ASCII_003F } /* code 003F */ + ,{ 10, 10, 2, acFont13ASCII_0040 } /* code 0040 */ + ,{ 7, 7, 1, acFont13ASCII_0041 } /* code 0041 */ + ,{ 6, 6, 1, acFont13ASCII_0042 } /* code 0042 */ + ,{ 7, 7, 1, acFont13ASCII_0043 } /* code 0043 */ + ,{ 7, 7, 1, acFont13ASCII_0044 } /* code 0044 */ + ,{ 6, 6, 1, acFont13ASCII_0045 } /* code 0045 */ + ,{ 6, 6, 1, acFont13ASCII_0046 } /* code 0046 */ + ,{ 7, 7, 1, acFont13ASCII_0047 } /* code 0047 */ + ,{ 7, 7, 1, acFont13ASCII_0048 } /* code 0048 */ + ,{ 4, 4, 1, acFont13ASCII_0049 } /* code 0049 */ + ,{ 5, 5, 1, acFont13ASCII_004A } /* code 004A */ + ,{ 6, 6, 1, acFont13ASCII_004B } /* code 004B */ + ,{ 5, 5, 1, acFont13ASCII_004C } /* code 004C */ + ,{ 8, 8, 1, acFont13ASCII_004D } /* code 004D */ + ,{ 7, 7, 1, acFont13ASCII_004E } /* code 004E */ + ,{ 8, 8, 1, acFont13ASCII_004F } /* code 004F */ + ,{ 6, 6, 1, acFont13ASCII_0050 } /* code 0050 */ + ,{ 8, 8, 1, acFont13ASCII_0051 } /* code 0051 */ + ,{ 7, 7, 1, acFont13ASCII_0052 } /* code 0052 */ + ,{ 6, 6, 1, acFont13ASCII_0053 } /* code 0053 */ + ,{ 6, 6, 1, acFont13ASCII_0054 } /* code 0054 */ + ,{ 7, 7, 1, acFont13ASCII_0055 } /* code 0055 */ + ,{ 6, 6, 1, acFont13ASCII_0056 } /* code 0056 */ + ,{ 10, 10, 2, acFont13ASCII_0057 } /* code 0057 */ + ,{ 6, 6, 1, acFont13ASCII_0058 } /* code 0058 */ + ,{ 6, 6, 1, acFont13ASCII_0059 } /* code 0059 */ + ,{ 6, 6, 1, acFont13ASCII_005A } /* code 005A */ + ,{ 4, 4, 1, acFont13ASCII_005B } /* code 005B */ + ,{ 4, 4, 1, acFont13ASCII_005C } /* code 005C */ + ,{ 4, 4, 1, acFont13ASCII_005D } /* code 005D */ + ,{ 8, 8, 1, acFont13ASCII_005E } /* code 005E */ + ,{ 6, 6, 1, acFont13ASCII_005F } /* code 005F */ + ,{ 6, 6, 1, acFont13ASCII_0060 } /* code 0060 */ + ,{ 6, 6, 1, acFont13ASCII_0061 } /* code 0061 */ + ,{ 6, 6, 1, acFont13ASCII_0062 } /* code 0062 */ + ,{ 5, 5, 1, acFont13ASCII_0063 } /* code 0063 */ + ,{ 6, 6, 1, acFont13ASCII_0064 } /* code 0064 */ + ,{ 6, 6, 1, acFont13ASCII_0065 } /* code 0065 */ + ,{ 4, 4, 1, acFont13ASCII_0066 } /* code 0066 */ + ,{ 6, 6, 1, acFont13ASCII_0067 } /* code 0067 */ + ,{ 6, 6, 1, acFont13ASCII_0068 } /* code 0068 */ + ,{ 2, 2, 1, acFont13ASCII_0069 } /* code 0069 */ + ,{ 3, 3, 1, acFont13ASCII_006A } /* code 006A */ + ,{ 5, 5, 1, acFont13ASCII_006B } /* code 006B */ + ,{ 2, 2, 1, acFont13ASCII_006C } /* code 006C */ + ,{ 8, 8, 1, acFont13ASCII_006D } /* code 006D */ + ,{ 6, 6, 1, acFont13ASCII_006E } /* code 006E */ + ,{ 6, 6, 1, acFont13ASCII_006F } /* code 006F */ + ,{ 6, 6, 1, acFont13ASCII_0070 } /* code 0070 */ + ,{ 6, 6, 1, acFont13ASCII_0071 } /* code 0071 */ + ,{ 4, 4, 1, acFont13ASCII_0072 } /* code 0072 */ + ,{ 5, 5, 1, acFont13ASCII_0073 } /* code 0073 */ + ,{ 4, 4, 1, acFont13ASCII_0074 } /* code 0074 */ + ,{ 6, 6, 1, acFont13ASCII_0075 } /* code 0075 */ + ,{ 6, 6, 1, acFont13ASCII_0076 } /* code 0076 */ + ,{ 8, 8, 1, acFont13ASCII_0077 } /* code 0077 */ + ,{ 6, 6, 1, acFont13ASCII_0078 } /* code 0078 */ + ,{ 6, 6, 1, acFont13ASCII_0079 } /* code 0079 */ + ,{ 5, 5, 1, acFont13ASCII_007A } /* code 007A */ + ,{ 5, 5, 1, acFont13ASCII_007B } /* code 007B */ + ,{ 4, 4, 1, acFont13ASCII_007C } /* code 007C */ + ,{ 5, 5, 1, acFont13ASCII_007D } /* code 007D */ + ,{ 8, 8, 1, acFont13ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13ASCII_Prop1 = { + 32 /* first character */ + ,126 /* last character */ + ,&GUI_Font13ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font13_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font13ASCII_Prop1} + , 11, 6, 8 +}; + + diff --git a/User/system/lib/lcd/gui/Font/F16B_1.c b/User/system/lib/lcd/gui/Font/F16B_1.c new file mode 100644 index 0000000..08d9a62 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F16B_1.c @@ -0,0 +1,1873 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F16_1.C +Purpose : ISO 8859-1 West European Character Set, bold +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont16B_1_00A0[ 16] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A1[ 16] = { /* code 00A1 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A2[ 16] = { /* code 00A2 */ + ________, + ________, + ________, + ____X___, + ____X___, + ___X____, + _XXXX___, + XX_XXX__, + XX_X____, + XX_X____, + XX_X____, + XXX__X__, + _XXXX___, + __X_____, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A3[ 16] = { /* code 00A3 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + XXXXXX__, + __XX____, + _XXX____, + XXXXX_X_, + _X__XXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A4[ 16] = { /* code 00A4 */ + ________, + ________, + ________, + ________, + ________, + X____X__, + XXXXXXX_, + XX__XX__, + X____X__, + X____X__, + XX__XX__, + XXXXXXX_, + X____X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A5[ 16] = { /* code 00A5 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + _XXXX___, + _XXXX___, + XXXXXX__, + __XX____, + XXXXXX__, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A6[ 16] = { /* code 00A6 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A7[ 16] = { /* code 00A7 */ + ________, + ________, + ________, + __XXX___, + _XX_XX__, + _XX_____, + _XXX____, + XXXXX___, + XX_XXX__, + XX__XX__, + XXX_XX__, + _XXXX___, + __XXX___, + ___XX___, + XX_XX___, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A8[ 16] = { /* code 00A8 */ + ________, + ________, + ________, + X__X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00A9[ 32] = { /* code 00A9 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + _XX____X,X_______, + _X__XX__,X_______, + X__X__X_,_X______, + X__X____,_X______, + X__X____,_X______, + X__X__X_,_X______, + _X__XX__,X_______, + _XX____X,X_______, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00AA[ 16] = { /* code 00AA */ + ________, + ________, + ________, + _XXX____, + X__X____, + _XXX____, + X__X____, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00AB[ 16] = { /* code 00AB */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __X__X__, + _XX_XX__, + XX_XX___, + XX_XX___, + _XX_XX__, + __X__X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00AC[ 16] = { /* code 00AC */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + _____XX_, + _____XX_, + _____XX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00AD[ 16] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00AE[ 32] = { /* code 00AE */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + _XX____X,X_______, + _X_XXX__,X_______, + X__X__X_,_X______, + X__X__X_,_X______, + X__XXX__,_X______, + X__X_X__,_X______, + _X_X__X_,X_______, + _XX____X,X_______, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00AF[ 16] = { /* code 00AF */ + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B0[ 16] = { /* code 00B0 */ + ________, + ________, + ________, + _XX_____, + X__X____, + X__X____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B1[ 16] = { /* code 00B1 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + XXXXXX__, + __XX____, + __XX____, + ________, + XXXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B2[ 16] = { /* code 00B2 */ + ________, + ________, + ________, + _XXX____, + X__X____, + __X_____, + _X______, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B3[ 16] = { /* code 00B3 */ + ________, + ________, + ________, + _XX_____, + X__X____, + __X_____, + X__X____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B4[ 16] = { /* code 00B4 */ + ________, + ________, + ________, + __XX____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B5[ 16] = { /* code 00B5 */ + ________, + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXXX__, + XX______, + XX______, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B6[ 16] = { /* code 00B6 */ + ________, + ________, + ________, + _XXXXXX_, + XXXX_X__, + XXXX_X__, + XXXX_X__, + _XXX_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B7[ 16] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B8[ 16] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + __X_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00B9[ 16] = { /* code 00B9 */ + ________, + ________, + ________, + __X_____, + _XX_____, + __X_____, + __X_____, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00BA[ 16] = { /* code 00BA */ + ________, + ________, + ________, + __XX____, + _X__X___, + _X__X___, + _X__X___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00BB[ 16] = { /* code 00BB */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X__X___, + _XX_XX__, + __XX_XX_, + __XX_XX_, + _XX_XX__, + _X__X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00BC[ 32] = { /* code 00BC */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + XX____X_,________, + _X___X__,________, + _X___X__,________, + _X__X___,________, + ____X___,X_______, + ___X___X,X_______, + __X___X_,X_______, + __X___XX,XX______, + _X______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00BD[ 32] = { /* code 00BD */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + XX____X_,________, + _X____X_,________, + _X___X__,________, + _X__X___,________, + ____X__X,XX______, + ___X__X_,_X______, + ___X____,X_______, + __X____X,________, + _X____XX,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00BE[ 32] = { /* code 00BE */ + ________,________, + ________,________, + ________,________, + _XX_____,X_______, + X__X___X,________, + __X____X,________, + X__X__X_,________, + _XX___X_,________, + _____X__,_X______, + ____X___,XX______, + ____X__X,_X______, + ___X___X,XXX_____, + ___X____,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00BF[ 16] = { /* code 00BF */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ___XX___, + __XX____, + _XX_____, + XX______, + XX______, + XX___XX_, + _XXXXX__}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C0[ 32] = { /* code 00C0 */ + ___XX___,________, + ____XX__,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C1[ 32] = { /* code 00C1 */ + _____XX_,________, + ____XX__,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C2[ 32] = { /* code 00C2 */ + ____X___,________, + ___X_X__,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C3[ 32] = { /* code 00C3 */ + ___XX_X_,________, + ___X_XX_,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C4[ 32] = { /* code 00C4 */ + ________,________, + ___X__X_,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C5[ 32] = { /* code 00C5 */ + ____XX__,________, + ___X__X_,________, + ___X__X_,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C6[ 32] = { /* code 00C6 */ + ________,________, + ________,________, + ________,________, + ____XXXX,XXXX____, + ___XX_XX,________, + ___XX_XX,________, + ___XX_XX,________, + __XX__XX,XXXX____, + __XX__XX,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + XX____XX,XXXX____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C7[ 32] = { /* code 00C7 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XX___X,X_______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + __XX___X,X_______, + ___XXXXX,________, + ____XX__,________, + _____X__,________, + ___XX___,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C8[ 16] = { /* code 00C8 */ + __XX____, + ___XX___, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00C9[ 16] = { /* code 00C9 */ + _____XX_, + ____XX__, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00CA[ 16] = { /* code 00CA */ + ____X___, + ___X_X__, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00CB[ 16] = { /* code 00CB */ + ________, + __X__X__, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00CC[ 16] = { /* code 00CC */ + XX______, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00CD[ 16] = { /* code 00CD */ + __XX____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00CE[ 16] = { /* code 00CE */ + __X_____, + _X_X____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00CF[ 16] = { /* code 00CF */ + ________, + X__X____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D0[ 32] = { /* code 00D0 */ + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + XXXXX_XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XX_,________, + _XXXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D1[ 32] = { /* code 00D1 */ + ___XX_X_,________, + ___X_XX_,________, + ________,________, + _XX___XX,________, + _XXX__XX,________, + _XXX__XX,________, + _XXXX_XX,________, + _XX_X_XX,________, + _XX_XXXX,________, + _XX__XXX,________, + _XX__XXX,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D2[ 32] = { /* code 00D2 */ + ___XX___,________, + ____XX__,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D3[ 32] = { /* code 00D3 */ + _____XX_,________, + ____XX__,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D4[ 32] = { /* code 00D4 */ + _____X__,________, + ____X_X_,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D5[ 32] = { /* code 00D5 */ + ___XX_X_,________, + ___X_XX_,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D6[ 32] = { /* code 00D6 */ + ________,________, + ___X__X_,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D7[ 16] = { /* code 00D7 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + _XX_XX__, + __XXX___, + __XXX___, + _XX_XX__, + _X___X__, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D8[ 32] = { /* code 00D8 */ + ________,________, + ________,________, + ________,X_______, + ___XXXX_,XX______, + __XX__XX,X_______, + _XX___XX,X_______, + _XX__XXX,X_______, + _XX__X_X,X_______, + _XX_X__X,X_______, + _XXXX__X,X_______, + _XXX___X,X_______, + _XXX__XX,________, + XX_XXXX_,________, + _X______,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00D9[ 32] = { /* code 00D9 */ + ___XX___,________, + ____XX__,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00DA[ 32] = { /* code 00DA */ + ____XX__,________, + ___XX___,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00DB[ 32] = { /* code 00DB */ + ____X___,________, + ___X_X__,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00DC[ 32] = { /* code 00DC */ + ________,________, + ___X__X_,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00DD[ 16] = { /* code 00DD */ + ____XX__, + ___XX___, + ________, + XX____XX, + XX____XX, + _XX__XX_, + __XXXX__, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00DE[ 32] = { /* code 00DE */ + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XX_____,________, + _XX_____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00DF[ 16] = { /* code 00DF */ + ________, + ________, + ________, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_X___, + _XXXX___, + _XXXXX__, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E0[ 16] = { /* code 00E0 */ + ________, + ________, + ________, + __XX____, + ___XX___, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E1[ 16] = { /* code 00E1 */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E2[ 16] = { /* code 00E2 */ + ________, + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E3[ 16] = { /* code 00E3 */ + ________, + ________, + ________, + __XX_X__, + __X_XX__, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E4[ 16] = { /* code 00E4 */ + ________, + ________, + ________, + ________, + __X__X__, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E5[ 16] = { /* code 00E5 */ + ________, + ___XX___, + __X__X__, + __X__X__, + ___XX___, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E6[ 32] = { /* code 00E6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX_X,XX______, + _X___XX_,_XX_____, + ___XXXX_,_XX_____, + __XX_XXX,XXX_____, + _XX__XX_,________, + _XX__XX_,_XX_____, + __XXX_XX,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E7[ 16] = { /* code 00E7 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + __XXXX__, + ___XX___, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E8[ 16] = { /* code 00E8 */ + ________, + ________, + ________, + __XX____, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00E9[ 16] = { /* code 00E9 */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00EA[ 16] = { /* code 00EA */ + ________, + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00EB[ 16] = { /* code 00EB */ + ________, + ________, + ________, + ________, + __X__X__, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00EC[ 16] = { /* code 00EC */ + ________, + ________, + ________, + XX______, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00ED[ 16] = { /* code 00ED */ + ________, + ________, + ________, + __XX____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00EE[ 16] = { /* code 00EE */ + ________, + ________, + ________, + __X_____, + _X_X____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00EF[ 16] = { /* code 00EF */ + ________, + ________, + ________, + ________, + X__X____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F0[ 16] = { /* code 00F0 */ + ________, + ________, + ________, + ___X_X__, + ____X___, + ___X_X__, + __XXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F1[ 16] = { /* code 00F1 */ + ________, + ________, + ________, + __XX_X__, + __X_XX__, + ________, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F2[ 16] = { /* code 00F2 */ + ________, + ________, + ________, + ___XX___, + ____XX__, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F3[ 16] = { /* code 00F3 */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F4[ 16] = { /* code 00F4 */ + ________, + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F5[ 16] = { /* code 00F5 */ + ________, + ________, + ________, + __XX_X__, + __X_XX__, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F6[ 16] = { /* code 00F6 */ + ________, + ________, + ________, + ________, + __X__X__, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F7[ 16] = { /* code 00F7 */ + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + XXXXXX__, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F8[ 16] = { /* code 00F8 */ + ________, + ________, + ________, + ________, + ________, + _____X__, + __XXXXX_, + _XX_XX__, + _XX_XXX_, + _XXXXXX_, + _XXX_XX_, + __XX_XX_, + _XXXXX__, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00F9[ 16] = { /* code 00F9 */ + ________, + ________, + ________, + __XX____, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00FA[ 16] = { /* code 00FA */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00FB[ 16] = { /* code 00FB */ + ________, + ________, + ________, + ____X___, + ___X_X__, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00FC[ 16] = { /* code 00FC */ + ________, + ________, + ________, + ________, + __X__X__, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00FD[ 16] = { /* code 00FD */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ________, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + __XXX___, + __XX____, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00FE[ 16] = { /* code 00FE */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16B_1_00FF[ 16] = { /* code 00FF */ + ________, + ________, + ________, + ________, + __X__X__, + ________, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + __XXX___, + __XX____, + XXXX____}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16B_1_CharInfo[96] = { + { 4, 4, 1, acFont16B_1_00A0 } /* code 00A0 */ + ,{ 4, 4, 1, acFont16B_1_00A1 } /* code 00A1 */ + ,{ 7, 7, 1, acFont16B_1_00A2 } /* code 00A2 */ + ,{ 7, 7, 1, acFont16B_1_00A3 } /* code 00A3 */ + ,{ 7, 7, 1, acFont16B_1_00A4 } /* code 00A4 */ + ,{ 7, 7, 1, acFont16B_1_00A5 } /* code 00A5 */ + ,{ 3, 3, 1, acFont16B_1_00A6 } /* code 00A6 */ + ,{ 7, 7, 1, acFont16B_1_00A7 } /* code 00A7 */ + ,{ 4, 4, 1, acFont16B_1_00A8 } /* code 00A8 */ + ,{ 10, 10, 2, acFont16B_1_00A9 } /* code 00A9 */ + ,{ 5, 5, 1, acFont16B_1_00AA } /* code 00AA */ + ,{ 7, 7, 1, acFont16B_1_00AB } /* code 00AB */ + ,{ 8, 8, 1, acFont16B_1_00AC } /* code 00AC */ + ,{ 4, 4, 1, acFont16B_1_00AD } /* code 00AD */ + ,{ 10, 10, 2, acFont16B_1_00AE } /* code 00AE */ + ,{ 7, 7, 1, acFont16B_1_00AF } /* code 00AF */ + ,{ 5, 5, 1, acFont16B_1_00B0 } /* code 00B0 */ + ,{ 7, 7, 1, acFont16B_1_00B1 } /* code 00B1 */ + ,{ 4, 4, 1, acFont16B_1_00B2 } /* code 00B2 */ + ,{ 4, 4, 1, acFont16B_1_00B3 } /* code 00B3 */ + ,{ 4, 4, 1, acFont16B_1_00B4 } /* code 00B4 */ + ,{ 7, 7, 1, acFont16B_1_00B5 } /* code 00B5 */ + ,{ 7, 7, 1, acFont16B_1_00B6 } /* code 00B6 */ + ,{ 4, 4, 1, acFont16B_1_00B7 } /* code 00B7 */ + ,{ 4, 4, 1, acFont16B_1_00B8 } /* code 00B8 */ + ,{ 4, 4, 1, acFont16B_1_00B9 } /* code 00B9 */ + ,{ 5, 5, 1, acFont16B_1_00BA } /* code 00BA */ + ,{ 7, 7, 1, acFont16B_1_00BB } /* code 00BB */ + ,{ 11, 11, 2, acFont16B_1_00BC } /* code 00BC */ + ,{ 11, 11, 2, acFont16B_1_00BD } /* code 00BD */ + ,{ 11, 11, 2, acFont16B_1_00BE } /* code 00BE */ + ,{ 8, 8, 1, acFont16B_1_00BF } /* code 00BF */ + ,{ 9, 9, 2, acFont16B_1_00C0 } /* code 00C0 */ + ,{ 9, 9, 2, acFont16B_1_00C1 } /* code 00C1 */ + ,{ 9, 9, 2, acFont16B_1_00C2 } /* code 00C2 */ + ,{ 9, 9, 2, acFont16B_1_00C3 } /* code 00C3 */ + ,{ 9, 9, 2, acFont16B_1_00C4 } /* code 00C4 */ + ,{ 9, 9, 2, acFont16B_1_00C5 } /* code 00C5 */ + ,{ 13, 13, 2, acFont16B_1_00C6 } /* code 00C6 */ + ,{ 9, 9, 2, acFont16B_1_00C7 } /* code 00C7 */ + ,{ 8, 8, 1, acFont16B_1_00C8 } /* code 00C8 */ + ,{ 8, 8, 1, acFont16B_1_00C9 } /* code 00C9 */ + ,{ 8, 8, 1, acFont16B_1_00CA } /* code 00CA */ + ,{ 8, 8, 1, acFont16B_1_00CB } /* code 00CB */ + ,{ 4, 4, 1, acFont16B_1_00CC } /* code 00CC */ + ,{ 4, 4, 1, acFont16B_1_00CD } /* code 00CD */ + ,{ 4, 4, 1, acFont16B_1_00CE } /* code 00CE */ + ,{ 4, 4, 1, acFont16B_1_00CF } /* code 00CF */ + ,{ 9, 9, 2, acFont16B_1_00D0 } /* code 00D0 */ + ,{ 9, 9, 2, acFont16B_1_00D1 } /* code 00D1 */ + ,{ 10, 10, 2, acFont16B_1_00D2 } /* code 00D2 */ + ,{ 10, 10, 2, acFont16B_1_00D3 } /* code 00D3 */ + ,{ 10, 10, 2, acFont16B_1_00D4 } /* code 00D4 */ + ,{ 10, 10, 2, acFont16B_1_00D5 } /* code 00D5 */ + ,{ 10, 10, 2, acFont16B_1_00D6 } /* code 00D6 */ + ,{ 8, 8, 1, acFont16B_1_00D7 } /* code 00D7 */ + ,{ 10, 10, 2, acFont16B_1_00D8 } /* code 00D8 */ + ,{ 9, 9, 2, acFont16B_1_00D9 } /* code 00D9 */ + ,{ 9, 9, 2, acFont16B_1_00DA } /* code 00DA */ + ,{ 9, 9, 2, acFont16B_1_00DB } /* code 00DB */ + ,{ 9, 9, 2, acFont16B_1_00DC } /* code 00DC */ + ,{ 8, 8, 1, acFont16B_1_00DD } /* code 00DD */ + ,{ 9, 9, 2, acFont16B_1_00DE } /* code 00DE */ + ,{ 8, 8, 1, acFont16B_1_00DF } /* code 00DF */ + ,{ 8, 8, 1, acFont16B_1_00E0 } /* code 00E0 */ + ,{ 8, 8, 1, acFont16B_1_00E1 } /* code 00E1 */ + ,{ 8, 8, 1, acFont16B_1_00E2 } /* code 00E2 */ + ,{ 8, 8, 1, acFont16B_1_00E3 } /* code 00E3 */ + ,{ 8, 8, 1, acFont16B_1_00E4 } /* code 00E4 */ + ,{ 8, 8, 1, acFont16B_1_00E5 } /* code 00E5 */ + ,{ 12, 12, 2, acFont16B_1_00E6 } /* code 00E6 */ + ,{ 7, 7, 1, acFont16B_1_00E7 } /* code 00E7 */ + ,{ 8, 8, 1, acFont16B_1_00E8 } /* code 00E8 */ + ,{ 8, 8, 1, acFont16B_1_00E9 } /* code 00E9 */ + ,{ 8, 8, 1, acFont16B_1_00EA } /* code 00EA */ + ,{ 8, 8, 1, acFont16B_1_00EB } /* code 00EB */ + ,{ 4, 4, 1, acFont16B_1_00EC } /* code 00EC */ + ,{ 4, 4, 1, acFont16B_1_00ED } /* code 00ED */ + ,{ 4, 4, 1, acFont16B_1_00EE } /* code 00EE */ + ,{ 4, 4, 1, acFont16B_1_00EF } /* code 00EF */ + ,{ 8, 8, 1, acFont16B_1_00F0 } /* code 00F0 */ + ,{ 8, 8, 1, acFont16B_1_00F1 } /* code 00F1 */ + ,{ 8, 8, 1, acFont16B_1_00F2 } /* code 00F2 */ + ,{ 8, 8, 1, acFont16B_1_00F3 } /* code 00F3 */ + ,{ 8, 8, 1, acFont16B_1_00F4 } /* code 00F4 */ + ,{ 8, 8, 1, acFont16B_1_00F5 } /* code 00F5 */ + ,{ 8, 8, 1, acFont16B_1_00F6 } /* code 00F6 */ + ,{ 7, 7, 1, acFont16B_1_00F7 } /* code 00F7 */ + ,{ 8, 8, 1, acFont16B_1_00F8 } /* code 00F8 */ + ,{ 8, 8, 1, acFont16B_1_00F9 } /* code 00F9 */ + ,{ 8, 8, 1, acFont16B_1_00FA } /* code 00FA */ + ,{ 8, 8, 1, acFont16B_1_00FB } /* code 00FB */ + ,{ 8, 8, 1, acFont16B_1_00FC } /* code 00FC */ + ,{ 7, 7, 1, acFont16B_1_00FD } /* code 00FD */ + ,{ 8, 8, 1, acFont16B_1_00FE } /* code 00FE */ + ,{ 7, 7, 1, acFont16B_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16B_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font16B_1_CharInfo[0] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16B_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font16B_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font16B_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font16B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font16B_1_Prop1} + ,13 ,7 ,10 +}; diff --git a/User/system/lib/lcd/gui/Font/F16B_ASCII.c b/User/system/lib/lcd/gui/Font/F16B_ASCII.c new file mode 100644 index 0000000..a0ab889 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F16B_ASCII.c @@ -0,0 +1,1848 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F16B_ASCII.C +Purpose : ASCII Character Set similar to Swiss, bold +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0020[ 16] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0021[ 16] = { /* code 0021 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0022[ 16] = { /* code 0022 */ + ________, + ________, + ________, + _XX_XX__, + _XX_XX__, + _XX_XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0023[ 16] = { /* code 0023 */ + ________, + ________, + ________, + __X__X__, + __X__X__, + __X__X__, + XXXXXX__, + _X__X___, + _X__X___, + XXXXXX__, + X__X____, + X__X____, + X__X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0024[ 16] = { /* code 0024 */ + ________, + ________, + ___X____, + __XXX___, + _X_X_X__, + _X_X____, + _XXX____, + _XXXX___, + __XXXX__, + ___XXX__, + ___X_X__, + _X_X_X__, + __XXX___, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0025[ 32] = { /* code 0025 */ + ________,________, + ________,________, + ________,________, + _XXX__X_,________, + _X_X__X_,________, + _X_X__X_,________, + _X_X_X__,________, + _XXX_X__,________, + ____X_XX,X_______, + ____X_X_,X_______, + ____X_X_,X_______, + ___X__X_,X_______, + ___X__XX,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0026[ 32] = { /* code 0026 */ + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + ___XXXX_,________, + ___XX___,________, + __XXXX_X,________, + _XX_XX_X,________, + _XX__XXX,________, + _XX__XXX,________, + __XXXX_X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0027[ 16] = { /* code 0027 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0028[ 16] = { /* code 0028 */ + ________, + ________, + ________, + ___X____, + __XX____, + __X_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __X_____, + __XX____, + ___X____}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0029[ 16] = { /* code 0029 */ + ________, + ________, + ________, + X_______, + XX______, + _X______, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _X______, + XX______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_002A[ 16] = { /* code 002A */ + ________, + ________, + ________, + __X_____, + XXXXX___, + __X_____, + XX_XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_002B[ 16] = { /* code 002B */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_002C[ 16] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + __X_____, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_002D[ 16] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_002E[ 16] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_002F[ 16] = { /* code 002F */ + ________, + ________, + ________, + ___X____, + ___X____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + X_______, + X_______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0030[ 16] = { /* code 0030 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0031[ 16] = { /* code 0031 */ + ________, + ________, + ________, + ___XX___, + __XXX___, + _XXXX___, + _X_XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0032[ 16] = { /* code 0032 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + ____XX__, + ____XX__, + ___XX___, + __XXX___, + __XX____, + _XX_____, + XX______, + XXXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0033[ 16] = { /* code 0033 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + ____XX__, + ____XX__, + __XXX___, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0034[ 16] = { /* code 0034 */ + ________, + ________, + ________, + ___XX___, + ___XX___, + __XXX___, + __XXX___, + _X_XX___, + _X_XX___, + X__XX___, + XXXXXX__, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0035[ 16] = { /* code 0035 */ + ________, + ________, + ________, + _XXXXX__, + _XX_____, + XX______, + XXXXX___, + XX__XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0036[ 16] = { /* code 0036 */ + ________, + ________, + ________, + __XXX___, + _X__XX__, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0037[ 16] = { /* code 0037 */ + ________, + ________, + ________, + XXXXXX__, + ____XX__, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0038[ 16] = { /* code 0038 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0039[ 16] = { /* code 0039 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ____XX__, + XX__X___, + _XXX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_003A[ 16] = { /* code 003A */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_003B[ 16] = { /* code 003B */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + _XX_____, + _XX_____, + __X_____, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_003C[ 16] = { /* code 003C */ + ________, + ________, + ________, + ________, + ________, + _____X__, + ___XXX__, + _XXX____, + XX______, + _XXX____, + ___XXX__, + _____X__, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_003D[ 16] = { /* code 003D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_003E[ 16] = { /* code 003E */ + ________, + ________, + ________, + ________, + ________, + _X______, + _XXX____, + ___XXX__, + _____XX_, + ___XXX__, + _XXX____, + _X______, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_003F[ 16] = { /* code 003F */ + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + _____XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + ________, + __XX____, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0040[ 32] = { /* code 0040 */ + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + __XX____,__X_____, + _XX_____,___X____, + _X__XXX_,XX__X___, + X__XXXXX,XX__X___, + X_XXX__X,XX__X___, + X_XX___X,X___X___, + X_XX__XX,X__X____, + X_XXXXXX,X_XX____, + _X_XXX_X,XX______, + _X______,____X___, + __XX____,__XX____, + ____XXXX,XX______}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0041[ 32] = { /* code 0041 */ + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + XX_____X,X_______, + XX_____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0042[ 32] = { /* code 0042 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0043[ 32] = { /* code 0043 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XX___X,X_______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + __XX___X,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0044[ 32] = { /* code 0044 */ + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX__XX_,________, + _XXXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0045[ 16] = { /* code 0045 */ + ________, + ________, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0046[ 16] = { /* code 0046 */ + ________, + ________, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0047[ 32] = { /* code 0047 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XX___X,X_______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX__XXX,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX___X,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0048[ 32] = { /* code 0048 */ + ________,________, + ________,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0049[ 16] = { /* code 0049 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_004A[ 16] = { /* code 004A */ + ________, + ________, + ________, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_004B[ 32] = { /* code 004B */ + ________,________, + ________,________, + ________,________, + _XX___XX,________, + _XX__XX_,________, + _XX_XX__,________, + _XX_XX__,________, + _XXXXX__,________, + _XXX_XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_004C[ 16] = { /* code 004C */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_004D[ 32] = { /* code 004D */ + ________,________, + ________,________, + ________,________, + _XXX___X,XX______, + _XXX___X,XX______, + _XXXX_XX,XX______, + _XXXX_XX,XX______, + _XX_X_X_,XX______, + _XX_X_X_,XX______, + _XX_X_X_,XX______, + _XX_XXX_,XX______, + _XX_XXX_,XX______, + _XX__X__,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_004E[ 32] = { /* code 004E */ + ________,________, + ________,________, + ________,________, + _XX___XX,________, + _XXX__XX,________, + _XXX__XX,________, + _XXXX_XX,________, + _XX_X_XX,________, + _XX_XXXX,________, + _XX__XXX,________, + _XX__XXX,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_004F[ 32] = { /* code 004F */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0050[ 32] = { /* code 0050 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0051[ 32] = { /* code 0051 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XX__XX,________, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX__X_X,X_______, + __XX__XX,________, + ___XXXXX,________, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0052[ 32] = { /* code 0052 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + _XX____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0053[ 32] = { /* code 0053 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XX___XX,________, + _XX_____,________, + _XXX____,________, + __XXXX__,________, + ___XXXX_,________, + _____XXX,________, + ______XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0054[ 16] = { /* code 0054 */ + ________, + ________, + ________, + XXXXXXXX, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0055[ 32] = { /* code 0055 */ + ________,________, + ________,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0056[ 32] = { /* code 0056 */ + ________,________, + ________,________, + ________,________, + XX_____X,X_______, + XX_____X,X_______, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + __XX_XX_,________, + __XX_XX_,________, + __XX_XX_,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0057[ 32] = { /* code 0057 */ + ________,________, + ________,________, + ________,________, + XX___XXX,___XX___, + XX___XXX,___XX___, + _XX__XXX,__XX____, + _XX_XX_X,X_XX____, + _XX_XX_X,X_XX____, + _XX_XX_X,X_XX____, + _XX_XX_X,X_XX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0058[ 32] = { /* code 0058 */ + ________,________, + ________,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + __XX_XX_,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + __XX_XX_,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0059[ 16] = { /* code 0059 */ + ________, + ________, + ________, + XX____XX, + XX____XX, + _XX__XX_, + __XXXX__, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_005A[ 16] = { /* code 005A */ + ________, + ________, + ________, + XXXXXXX_, + _____XX_, + ____XX__, + ___XX___, + ___XX___, + __XX____, + __XX____, + _XX_____, + XX______, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_005B[ 16] = { /* code 005B */ + ________, + ________, + ________, + _XXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_005C[ 16] = { /* code 005C */ + ________, + ________, + ________, + X_______, + X_______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + __X_____, + ___X____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_005D[ 16] = { /* code 005D */ + ________, + ________, + ________, + XXX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_005E[ 16] = { /* code 005E */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + _XXXX___, + _X__X___, + XX__XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_005F[ 16] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0060[ 16] = { /* code 0060 */ + ________, + ________, + ________, + XX______, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0061[ 16] = { /* code 0061 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _X___XX_, + ___XXXX_, + __XX_XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0062[ 16] = { /* code 0062 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXX_XX_, + _XX_XX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0063[ 16] = { /* code 0063 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0064[ 16] = { /* code 0064 */ + ________, + ________, + ________, + _____XX_, + _____XX_, + _____XX_, + __XX_XX_, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0065[ 16] = { /* code 0065 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0066[ 16] = { /* code 0066 */ + ________, + ________, + ________, + __XX____, + _XX_____, + _XX_____, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0067[ 16] = { /* code 0067 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX_XX_, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + _____XX_, + _X___XX_, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0068[ 16] = { /* code 0068 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0069[ 16] = { /* code 0069 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_006A[ 16] = { /* code 006A */ + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_006B[ 16] = { /* code 006B */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XXXX___, + _XX_XX__, + _XX_XX__, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_006C[ 16] = { /* code 006C */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_006D[ 32] = { /* code 006D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_XXX_,XX______, + _XXX_XXX,_XX_____, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + _XX__XX_,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_006E[ 16] = { /* code 006E */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_006F[ 16] = { /* code 006F */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0070[ 16] = { /* code 0070 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXX_XX_, + _XX_XX__, + _XX_____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0071[ 16] = { /* code 0071 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX_XX_, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + _____XX_, + _____XX_, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0072[ 16] = { /* code 0072 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXX___, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0073[ 16] = { /* code 0073 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XXX_____, + _XXXX___, + ___XXX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0074[ 16] = { /* code 0074 */ + ________, + ________, + ________, + ________, + __X_____, + _XX_____, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0075[ 16] = { /* code 0075 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0076[ 16] = { /* code 0076 */ + ________, + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0077[ 32] = { /* code 0077 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX___X__,_XX_____, + XX__XXX_,_XX_____, + _XX_XXX_,XX______, + _XX_X_X_,XX______, + _XXXX_XX,XX______, + __XXX_XX,X_______, + __XX___X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0078[ 16] = { /* code 0078 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_0079[ 16] = { /* code 0079 */ + ________, + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + __XXX___, + __XX____, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_007A[ 16] = { /* code 007A */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + ____XX__, + ___XX___, + __XX____, + __XX____, + _XX_____, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_007B[ 16] = { /* code 007B */ + ________, + ________, + ________, + __XXX___, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XX______, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_007C[ 16] = { /* code 007C */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_007D[ 16] = { /* code 007D */ + ________, + ________, + ________, + XXX_____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XX___, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont16B_ASCII_007E[ 16] = { /* code 007E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX__X_, + X__XXX__, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16B_ASCII_CharInfo[95] = { + { 4, 4, 1, acFont16B_ASCII_0020 } /* code 0020 */ + ,{ 4, 4, 1, acFont16B_ASCII_0021 } /* code 0021 */ + ,{ 6, 6, 1, acFont16B_ASCII_0022 } /* code 0022 */ + ,{ 7, 7, 1, acFont16B_ASCII_0023 } /* code 0023 */ + ,{ 7, 7, 1, acFont16B_ASCII_0024 } /* code 0024 */ + ,{ 10, 10, 2, acFont16B_ASCII_0025 } /* code 0025 */ + ,{ 9, 9, 2, acFont16B_ASCII_0026 } /* code 0026 */ + ,{ 3, 3, 1, acFont16B_ASCII_0027 } /* code 0027 */ + ,{ 4, 4, 1, acFont16B_ASCII_0028 } /* code 0028 */ + ,{ 4, 4, 1, acFont16B_ASCII_0029 } /* code 0029 */ + ,{ 5, 5, 1, acFont16B_ASCII_002A } /* code 002A */ + ,{ 8, 8, 1, acFont16B_ASCII_002B } /* code 002B */ + ,{ 4, 4, 1, acFont16B_ASCII_002C } /* code 002C */ + ,{ 4, 4, 1, acFont16B_ASCII_002D } /* code 002D */ + ,{ 4, 4, 1, acFont16B_ASCII_002E } /* code 002E */ + ,{ 4, 4, 1, acFont16B_ASCII_002F } /* code 002F */ + ,{ 7, 7, 1, acFont16B_ASCII_0030 } /* code 0030 */ + ,{ 7, 7, 1, acFont16B_ASCII_0031 } /* code 0031 */ + ,{ 7, 7, 1, acFont16B_ASCII_0032 } /* code 0032 */ + ,{ 7, 7, 1, acFont16B_ASCII_0033 } /* code 0033 */ + ,{ 7, 7, 1, acFont16B_ASCII_0034 } /* code 0034 */ + ,{ 7, 7, 1, acFont16B_ASCII_0035 } /* code 0035 */ + ,{ 7, 7, 1, acFont16B_ASCII_0036 } /* code 0036 */ + ,{ 7, 7, 1, acFont16B_ASCII_0037 } /* code 0037 */ + ,{ 7, 7, 1, acFont16B_ASCII_0038 } /* code 0038 */ + ,{ 7, 7, 1, acFont16B_ASCII_0039 } /* code 0039 */ + ,{ 4, 4, 1, acFont16B_ASCII_003A } /* code 003A */ + ,{ 4, 4, 1, acFont16B_ASCII_003B } /* code 003B */ + ,{ 8, 8, 1, acFont16B_ASCII_003C } /* code 003C */ + ,{ 8, 8, 1, acFont16B_ASCII_003D } /* code 003D */ + ,{ 8, 8, 1, acFont16B_ASCII_003E } /* code 003E */ + ,{ 8, 8, 1, acFont16B_ASCII_003F } /* code 003F */ + ,{ 13, 13, 2, acFont16B_ASCII_0040 } /* code 0040 */ + ,{ 9, 9, 2, acFont16B_ASCII_0041 } /* code 0041 */ + ,{ 9, 9, 2, acFont16B_ASCII_0042 } /* code 0042 */ + ,{ 9, 9, 2, acFont16B_ASCII_0043 } /* code 0043 */ + ,{ 9, 9, 2, acFont16B_ASCII_0044 } /* code 0044 */ + ,{ 8, 8, 1, acFont16B_ASCII_0045 } /* code 0045 */ + ,{ 8, 8, 1, acFont16B_ASCII_0046 } /* code 0046 */ + ,{ 10, 10, 2, acFont16B_ASCII_0047 } /* code 0047 */ + ,{ 9, 9, 2, acFont16B_ASCII_0048 } /* code 0048 */ + ,{ 4, 4, 1, acFont16B_ASCII_0049 } /* code 0049 */ + ,{ 7, 7, 1, acFont16B_ASCII_004A } /* code 004A */ + ,{ 9, 9, 2, acFont16B_ASCII_004B } /* code 004B */ + ,{ 8, 8, 1, acFont16B_ASCII_004C } /* code 004C */ + ,{ 11, 11, 2, acFont16B_ASCII_004D } /* code 004D */ + ,{ 9, 9, 2, acFont16B_ASCII_004E } /* code 004E */ + ,{ 10, 10, 2, acFont16B_ASCII_004F } /* code 004F */ + ,{ 9, 9, 2, acFont16B_ASCII_0050 } /* code 0050 */ + ,{ 10, 10, 2, acFont16B_ASCII_0051 } /* code 0051 */ + ,{ 9, 9, 2, acFont16B_ASCII_0052 } /* code 0052 */ + ,{ 9, 9, 2, acFont16B_ASCII_0053 } /* code 0053 */ + ,{ 8, 8, 1, acFont16B_ASCII_0054 } /* code 0054 */ + ,{ 9, 9, 2, acFont16B_ASCII_0055 } /* code 0055 */ + ,{ 9, 9, 2, acFont16B_ASCII_0056 } /* code 0056 */ + ,{ 13, 13, 2, acFont16B_ASCII_0057 } /* code 0057 */ + ,{ 9, 9, 2, acFont16B_ASCII_0058 } /* code 0058 */ + ,{ 8, 8, 1, acFont16B_ASCII_0059 } /* code 0059 */ + ,{ 7, 7, 1, acFont16B_ASCII_005A } /* code 005A */ + ,{ 4, 4, 1, acFont16B_ASCII_005B } /* code 005B */ + ,{ 4, 4, 1, acFont16B_ASCII_005C } /* code 005C */ + ,{ 4, 4, 1, acFont16B_ASCII_005D } /* code 005D */ + ,{ 8, 8, 1, acFont16B_ASCII_005E } /* code 005E */ + ,{ 7, 7, 1, acFont16B_ASCII_005F } /* code 005F */ + ,{ 4, 4, 1, acFont16B_ASCII_0060 } /* code 0060 */ + ,{ 8, 8, 1, acFont16B_ASCII_0061 } /* code 0061 */ + ,{ 8, 8, 1, acFont16B_ASCII_0062 } /* code 0062 */ + ,{ 7, 7, 1, acFont16B_ASCII_0063 } /* code 0063 */ + ,{ 8, 8, 1, acFont16B_ASCII_0064 } /* code 0064 */ + ,{ 8, 8, 1, acFont16B_ASCII_0065 } /* code 0065 */ + ,{ 4, 4, 1, acFont16B_ASCII_0066 } /* code 0066 */ + ,{ 8, 8, 1, acFont16B_ASCII_0067 } /* code 0067 */ + ,{ 8, 8, 1, acFont16B_ASCII_0068 } /* code 0068 */ + ,{ 4, 4, 1, acFont16B_ASCII_0069 } /* code 0069 */ + ,{ 4, 4, 1, acFont16B_ASCII_006A } /* code 006A */ + ,{ 7, 7, 1, acFont16B_ASCII_006B } /* code 006B */ + ,{ 4, 4, 1, acFont16B_ASCII_006C } /* code 006C */ + ,{ 12, 12, 2, acFont16B_ASCII_006D } /* code 006D */ + ,{ 8, 8, 1, acFont16B_ASCII_006E } /* code 006E */ + ,{ 8, 8, 1, acFont16B_ASCII_006F } /* code 006F */ + ,{ 8, 8, 1, acFont16B_ASCII_0070 } /* code 0070 */ + ,{ 8, 8, 1, acFont16B_ASCII_0071 } /* code 0071 */ + ,{ 5, 5, 1, acFont16B_ASCII_0072 } /* code 0072 */ + ,{ 6, 6, 1, acFont16B_ASCII_0073 } /* code 0073 */ + ,{ 4, 4, 1, acFont16B_ASCII_0074 } /* code 0074 */ + ,{ 8, 8, 1, acFont16B_ASCII_0075 } /* code 0075 */ + ,{ 7, 7, 1, acFont16B_ASCII_0076 } /* code 0076 */ + ,{ 11, 11, 2, acFont16B_ASCII_0077 } /* code 0077 */ + ,{ 8, 8, 1, acFont16B_ASCII_0078 } /* code 0078 */ + ,{ 7, 7, 1, acFont16B_ASCII_0079 } /* code 0079 */ + ,{ 7, 7, 1, acFont16B_ASCII_007A } /* code 007A */ + ,{ 5, 5, 1, acFont16B_ASCII_007B } /* code 007B */ + ,{ 3, 3, 1, acFont16B_ASCII_007C } /* code 007C */ + ,{ 5, 5, 1, acFont16B_ASCII_007D } /* code 007D */ + ,{ 8, 8, 1, acFont16B_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16B_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font16B_ASCII_CharInfo[0] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font16B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font16B_ASCII_Prop1} + ,13, 7, 10 +}; + diff --git a/User/system/lib/lcd/gui/Font/F16_1.c b/User/system/lib/lcd/gui/Font/F16_1.c new file mode 100644 index 0000000..755469a --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F16_1.c @@ -0,0 +1,2453 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F16_1.C +Purpose : ISO 8859-1 West European Character Set similar to Swiss +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +/* The character codes 0x80 - 0x9f are not part of the + ISO 8859 extensions. If needed them you can include them + by using a modifyed copy of this file. +*/ + +#if 0 + +GUI_CONST_STORAGE unsigned char acFont16_1_128[16] = { /* code 128 */ + ________, + ________, + ________, + ___XXXX_, + __X_____, + _X______, + XXXXXXX_, + _X______, + XXXXXXX_, + _X______, + _X______, + __X_____, + ___XXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_129[32] = { /* code 129 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_130[16] = { /* code 130 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_131[16] = { /* code 131 */ + ________, + ________, + ________, + ____XXX_, + ____X___, + ____X___, + __XXXX__, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + __X_____, + __X_____, + __X_____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFont16_1_132[16] = { /* code 132 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + X_X_____, + X_X_____, + X_X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_133[32] = { /* code 133 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X___X__,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_134[16] = { /* code 134 */ + ________, + ________, + ________, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_135[16] = { /* code 135 */ + ________, + ________, + ________, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_136[16] = { /* code 136 */ + ________, + ________, + ________, + __XX____, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_137[32] = { /* code 137 */ + ________,________, + ________,________, + ________,________, + _XX___X_,________, + X__X_X__,________, + X__X_X__,________, + X__X_X__,________, + _XX_X___,________, + ____X_XX,___XX___, + ___X_X__,X_X__X__, + ___X_X__,X_X__X__, + ___X_X__,X_X__X__, + __X___XX,___XX___, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_138[32] = { /* code 138 */ + ___X__X_,________, + ____XX__,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + _X_____X,________, + _X______,________, + __XXX___,________, + _____XX_,________, + _______X,________, + _X_____X,________, + _X_____X,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_139[16] = { /* code 139 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___X____, + __X_____, + _X______, + _X______, + __X_____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_140[32] = { /* code 140 */ + ________,________, + ________,________, + ________,________, + ___XXX_X,XXXX____, + __X___XX,________, + _X_____X,________, + _X_____X,________, + _X_____X,XXXX____, + _X_____X,________, + _X_____X,________, + _X_____X,________, + __X___XX,________, + ___XXX_X,XXXX____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_141[32] = { /* code 141 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_142[16] = { /* code 142 */ + __X__X__, + ___XX___, + ________, + _XXXXXX_, + _____X__, + ____X___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_143[32] = { /* code 143 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_144[32] = { /* code 144 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_145[16] = { /* code 145 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_146[16] = { /* code 146 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_147[16] = { /* code 147 */ + ________, + ________, + ________, + X_X_____, + X_X_____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_148[16] = { /* code 148 */ + ________, + ________, + ________, + _X_X____, + _X_X____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_149[16] = { /* code 149 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_150[16] = { /* code 150 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_151[32] = { /* code 151 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_152[16] = { /* code 152 */ + ________, + ________, + ________, + _X_X____, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_153[32] = { /* code 153 */ + ________,________, + ________,________, + ________,________, + _XXXXX_X,___X____, + ___X___X,X_XX____, + ___X___X,X_XX____, + ___X___X,X_XX____, + ___X___X,_X_X____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_154[16] = { /* code 154 */ + ________, + ________, + ________, + __X__X__, + ___XX___, + ________, + __XXX___, + _X___X__, + _X______, + __XXX___, + _____X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_155[16] = { /* code 155 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + X_______, + _X______, + __X_____, + __X_____, + _X______, + X_______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_156[32] = { /* code 156 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX_XX,XX______, + _X___X__,__X_____, + _X___X__,__X_____, + _X___XXX,XXX_____, + _X___X__,________, + _X___X__,__X_____, + __XXX_XX,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_157[32] = { /* code 157 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_158[16] = { /* code 158 */ + ________, + ________, + ________, + __X__X__, + ___XX___, + ________, + _XXXXX__, + ____X___, + ____X___, + ___X____, + __X_____, + __X_____, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_159[32] = { /* code 159 */ + ________,________, + ___X_X__,________, + ________,________, + _X_____X,________, + __X___X_,________, + __X___X_,________, + ___X_X__,________, + ___X_X__,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________, + ________,________}; + +#endif + +GUI_CONST_STORAGE unsigned char acFont16_1_160[16] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_161[16] = { /* code 161 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16_1_162[16] = { /* code 162 */ + ________, + ________, + ________, + ____X___, + ____X___, + ____X___, + __XXX___, + _X_X_X__, + X__X____, + X_X_____, + X_X__X__, + XXX_X___, + _XXX____, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16_1_163[16] = { /* code 163 */ + ________, + ________, + ________, + __XXX___, + _X___X__, + _X______, + _X______, + XXXXX___, + __X_____, + __X_____, + _X______, + _XXX____, + X___XX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_164[16] = { /* code 164 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X_X_X__, + __X_X___, + _X___X__, + __X_X___, + _X_X_X__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_165[16] = { /* code 165 */ + ________, + ________, + ________, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + XXXXXXX_, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_166[16] = { /* code 166 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_167[16] = { /* code 167 */ + ________, + ________, + ________, + ___XX___, + __X__X__, + __X_____, + __XX____, + _X__XX__, + _X___XX_, + _XX___X_, + __XX_XX_, + ____X___, + _____X__, + _X___X__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_168[16] = { /* code 168 */ + ________, + ________, + ________, + X_X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_169[32] = { /* code 169 */ + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _X______,X_______, + X__XXXX_,_X______, + X_X____X,_X______, + X_X_____,_X______, + X_X_____,_X______, + X_X____X,_X______, + X__XXXX_,_X______, + _X______,X_______, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_170[16] = { /* code 170 */ + ________, + ________, + ________, + _XXX____, + X__X____, + _XXX____, + X__X____, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_171[16] = { /* code 171 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___X_X__, + __X_X___, + _X_X____, + _X_X____, + __X_X___, + ___X_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_172[16] = { /* code 172 */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ______X_, + ______X_, + ______X_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_173[16] = { /* code 173 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_174[32] = { /* code 174 */ + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _X______,X_______, + X__XXXX_,_X______, + X__X___X,_X______, + X__X___X,_X______, + X__XXXX_,_X______, + X__X__X_,_X______, + X__X___X,_X______, + _X______,X_______, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_175[16] = { /* code 175 */ + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_176[16] = { /* code 176 */ + ________, + ________, + ________, + __XX____, + _X__X___, + _X__X___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_177[16] = { /* code 177 */ + ________, + ________, + ________, + ________, + ________, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_178[16] = { /* code 178 */ + ________, + ________, + ________, + _XXX____, + X__X____, + __X_____, + _X______, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_179[16] = { /* code 179 */ + ________, + ________, + ________, + _XXX____, + X__X____, + __X_____, + X__X____, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_180[16] = { /* code 180 */ + ________, + ________, + ________, + __X_____, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_181[16] = { /* code 181 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _XXXXX__, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16_1_182[16] = { /* code 182 */ + ________, + ________, + ________, + _XXXXXX_, + XXXX_X__, + XXXX_X__, + XXXX_X__, + _XXX_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_183[16] = { /* code 183 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_184[16] = { /* code 184 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __X_____, + ___X____, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acFont16_1_185[16] = { /* code 185 */ + ________, + ________, + ________, + __X_____, + _XX_____, + __X_____, + __X_____, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_186[16] = { /* code 186 */ + ________, + ________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_187[16] = { /* code 187 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X_X____, + __X_X___, + ___X_X__, + ___X_X__, + __X_X___, + _X_X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_188[32] = { /* code 188 */ + ________,________, + ________,________, + ________,________, + __X_____,X_______, + _XX_____,X_______, + __X____X,________, + __X___X_,________, + __X___X_,________, + _____X__,_X______, + ____X___,XX______, + ___X___X,_X______, + ___X___X,XXX_____, + __X_____,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_189[32] = { /* code 189 */ + ________,________, + ________,________, + ________,________, + __X_____,X_______, + _XX____X,________, + __X____X,________, + __X___X_,________, + __X__X__,________, + _____X__,XX______, + ____X__X,__X_____, + ___X____,_X______, + ___X____,X_______, + __X____X,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_190[32] = { /* code 190 */ + ________,________, + ________,________, + ________,________, + _XXX____,X_______, + X__X____,X_______, + __X____X,________, + X__X__X_,________, + _XXX__X_,________, + _____X__,_X______, + ____X___,XX______, + ___X___X,_X______, + ___X___X,XXX_____, + __X_____,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_191[16] = { /* code 191 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___X____, + ________, + ___X____, + ___X____, + ___X____, + __X_____, + _X______, + _X____X_, + _X____X_, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acFont16_1_192[32] = { /* code 192 */ + ___X____,________, + ____X___,________, + ________,________, + ____X___,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_193[32] = { /* code 193 */ + _____X__,________, + ____X___,________, + ________,________, + ____X___,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_194[32] = { /* code 194 */ + ___XX___,________, + __X__X__,________, + ________,________, + ____X___,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_195[32] = { /* code 195 */ + ____X_X_,________, + ___X_X__,________, + ________,________, + ____X___,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_196[32] = { /* code 196 */ + ________,________, + ___X_X__,________, + ________,________, + ____X___,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_197[32] = { /* code 197 */ + ________,________, + ___XXX__,________, + ___X_X__,________, + ___XXX__,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_198[32] = { /* code 198 */ + ________,________, + ________,________, + ________,________, + ____XXXX,XXXX____, + ___X__X_,________, + ___X__X_,________, + ___X__X_,________, + __X___XX,XXXX____, + __X___X_,________, + _XXXXXX_,________, + _X____X_,________, + X_____X_,________, + X_____XX,XXXX____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_199[32] = { /* code 199 */ + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __X___X_,________, + _X_____X,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ____X___,________, + _____X__,________, + ___XXX__,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_200[32] = { /* code 200 */ + ___X____,________, + ____X___,________, + ________,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_201[32] = { /* code 201 */ + _____X__,________, + ____X___,________, + ________,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_202[32] = { /* code 202 */ + ____XX__,________, + ___X__X_,________, + ________,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_203[32] = { /* code 203 */ + ________,________, + ___X_X__,________, + ________,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_204[16] = { /* code 204 */ + X_______, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_205[16] = { /* code 205 */ + __X_____, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_206[16] = { /* code 206 */ + _XX_____, + X_______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_207[16] = { /* code 207 */ + ________, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_208[32] = { /* code 208 */ + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + _X____X_,________, + _X_____X,________, + _X_____X,________, + XXXXX__X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X____X_,________, + _XXXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_209[32] = { /* code 209 */ + ____X_X_,________, + ___X_X__,________, + ________,________, + _X_____X,________, + _XX____X,________, + _X_X___X,________, + _X_X___X,________, + _X__X__X,________, + _X__X__X,________, + _X___X_X,________, + _X___X_X,________, + _X____XX,________, + _X_____X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_210[32] = { /* code 210 */ + ____X___,________, + _____X__,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_211[32] = { /* code 211 */ + _____X__,________, + ____X___,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_212[32] = { /* code 212 */ + ____XX__,________, + ___X__X_,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_213[32] = { /* code 213 */ + ____X_X_,________, + ___X_X__,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_214[32] = { /* code 214 */ + ________,________, + ____X_X_,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_215[16] = { /* code 215 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + __XXX___, + ___X____, + __XXX___, + _X___X__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_216[32] = { /* code 216 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,X_______, + __X____X,________, + _X____X_,X_______, + _X____X_,X_______, + _X___X__,X_______, + _X__X___,X_______, + _X__X___,X_______, + _X_X____,X_______, + __X____X,________, + _X_XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_217[32] = { /* code 217 */ + ___X____,________, + ____X___,________, + ________,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_218[32] = { /* code 218 */ + _____X__,________, + ____X___,________, + ________,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_219[32] = { /* code 219 */ + ____XX__,________, + ___X__X_,________, + ________,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_220[32] = { /* code 220 */ + ________,________, + ___X_X__,________, + ________,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_221[32] = { /* code 221 */ + _____X__,________, + ____X___,________, + ________,________, + _X_____X,________, + __X___X_,________, + __X___X_,________, + ___X_X__,________, + ___X_X__,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_222[32] = { /* code 222 */ + ________,________, + ________,________, + ________,________, + _X______,________, + _X______,________, + _XXXXXX_,________, + _X____XX,________, + _X_____X,________, + _X_____X,________, + _X____XX,________, + _XXXXXX_,________, + _X______,________, + _X______,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_223[32] = { /* code 223 */ + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __X___X_,________, + _X____X_,________, + _X___X__,________, + _X___X__,________, + _X___X__,________, + _X____X_,________, + _X_____X,________, + _X_X___X,________, + _X__XXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_224[16] = { /* code 224 */ + ________, + ________, + ________, + ___X____, + ____X___, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_225[16] = { /* code 225 */ + ________, + ________, + ________, + ____X___, + ___X____, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_226[16] = { /* code 226 */ + ________, + ________, + ________, + ___XX___, + __X__X__, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_227[16] = { /* code 227 */ + ________, + ________, + ________, + ___X_X__, + __X_X___, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_228[16] = { /* code 228 */ + ________, + ________, + ________, + ________, + __X_X___, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_229[16] = { /* code 229 */ + ________, + ________, + __XXX___, + __X_X___, + __XXX___, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_230[32] = { /* code 230 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX_X,XX______, + _X___XX_,__X_____, + ___XXX__,__X_____, + __X__XXX,XXX_____, + _X___X__,________, + _X___XX_,__X_____, + __XXX__X,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_231[16] = { /* code 231 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _X___X__, + _X______, + _X______, + _X______, + _X___X__, + __XXX___, + ___X____, + ____X___, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acFont16_1_232[16] = { /* code 232 */ + ________, + ________, + ________, + __X_____, + ___X____, + ________, + __XXX___, + _X___X__, + _X___X__, + _XXXXX__, + _X______, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_233[16] = { /* code 233 */ + ________, + ________, + ________, + ____X___, + ___X____, + ________, + __XXX___, + _X___X__, + _X___X__, + _XXXXX__, + _X______, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_234[16] = { /* code 234 */ + ________, + ________, + ________, + ___XX___, + __X__X__, + ________, + __XXX___, + _X___X__, + _X___X__, + _XXXXX__, + _X______, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_235[16] = { /* code 235 */ + ________, + ________, + ________, + ________, + __X_X___, + ________, + __XXX___, + _X___X__, + _X___X__, + _XXXXX__, + _X______, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_236[16] = { /* code 236 */ + ________, + ________, + ________, + X_______, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_237[16] = { /* code 237 */ + ________, + ________, + ________, + __X_____, + _X______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_238[16] = { /* code 238 */ + ________, + ________, + ________, + _XX_____, + X_______, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_239[16] = { /* code 239 */ + ________, + ________, + ________, + ________, + X_X_____, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_240[16] = { /* code 240 */ + ________, + ________, + ________, + __X_X___, + __XX____, + _X__X___, + __XXX___, + _X__XX__, + X____X__, + X____X__, + X____X__, + _X__X___, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_241[16] = { /* code 241 */ + ________, + ________, + ________, + ___X_X__, + __X_X___, + ________, + _X_XX___, + _XX__X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_242[16] = { /* code 242 */ + ________, + ________, + ________, + __X_____, + ___X____, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_243[16] = { /* code 243 */ + ________, + ________, + ________, + ____X___, + ___X____, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_244[16] = { /* code 244 */ + ________, + ________, + ________, + ___XX___, + __X__X__, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_245[16] = { /* code 245 */ + ________, + ________, + ________, + ___X_X__, + __X_X___, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_246[16] = { /* code 246 */ + ________, + ________, + ________, + ________, + __X_X___, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_247[16] = { /* code 247 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___X____, + ________, + XXXXXXX_, + ________, + ___X____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_248[16] = { /* code 248 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX_X__, + _X__X___, + _X__XX__, + _X_X_X__, + _XX__X__, + __X__X__, + _X_XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_249[16] = { /* code 249 */ + ________, + ________, + ________, + __X_____, + ___X____, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_250[16] = { /* code 250 */ + ________, + ________, + ________, + ____X___, + ___X____, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_251[16] = { /* code 251 */ + ________, + ________, + ________, + ___XX___, + __X__X__, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_252[16] = { /* code 252 */ + ________, + ________, + ________, + ________, + __X_X___, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16_1_253[16] = { /* code 253 */ + ________, + ________, + ________, + ____X___, + ___X____, + ________, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16_1_254[16] = { /* code 254 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _XXX____, + _X__X___, + _X___X__, + _X___X__, + _X___X__, + _X__X___, + _XXX____, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16_1_255[16] = { /* code 255 */ + ________, + ________, + ________, + ________, + __X_X___, + ________, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + _XX_____}; + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfo_Font16_1[96] = { + { 4, 4, 1, acFont16_1_160 } /* code 160 */ + ,{ 3, 3, 1, acFont16_1_161 } /* code 161 */ + ,{ 7, 7, 1, acFont16_1_162 } /* code 162 */ + ,{ 7, 7, 1, acFont16_1_163 } /* code 163 */ + ,{ 7, 7, 1, acFont16_1_164 } /* code 164 */ + ,{ 7, 7, 1, acFont16_1_165 } /* code 165 */ + ,{ 3, 3, 1, acFont16_1_166 } /* code 166 */ + ,{ 7, 7, 1, acFont16_1_167 } /* code 167 */ + ,{ 4, 4, 1, acFont16_1_168 } /* code 168 */ + ,{ 10, 10, 2, acFont16_1_169 } /* code 169 */ + ,{ 4, 4, 1, acFont16_1_170 } /* code 170 */ + ,{ 7, 7, 1, acFont16_1_171 } /* code 171 */ + ,{ 8, 8, 1, acFont16_1_172 } /* code 172 */ + ,{ 4, 4, 1, acFont16_1_173 } /* code 173 */ + ,{ 10, 10, 2, acFont16_1_174 } /* code 174 */ + ,{ 7, 7, 1, acFont16_1_175 } /* code 175 */ + ,{ 5, 5, 1, acFont16_1_176 } /* code 176 */ + ,{ 7, 7, 1, acFont16_1_177 } /* code 177 */ + ,{ 4, 4, 1, acFont16_1_178 } /* code 178 */ + ,{ 4, 4, 1, acFont16_1_179 } /* code 179 */ + ,{ 4, 4, 1, acFont16_1_180 } /* code 180 */ + ,{ 7, 7, 1, acFont16_1_181 } /* code 181 */ + ,{ 7, 7, 1, acFont16_1_182 } /* code 182 */ + ,{ 4, 4, 1, acFont16_1_183 } /* code 183 */ + ,{ 4, 4, 1, acFont16_1_184 } /* code 184 */ + ,{ 4, 4, 1, acFont16_1_185 } /* code 185 */ + ,{ 5, 5, 1, acFont16_1_186 } /* code 186 */ + ,{ 7, 7, 1, acFont16_1_187 } /* code 187 */ + ,{ 11, 11, 2, acFont16_1_188 } /* code 188 */ + ,{ 11, 11, 2, acFont16_1_189 } /* code 189 */ + ,{ 11, 11, 2, acFont16_1_190 } /* code 190 */ + ,{ 8, 8, 1, acFont16_1_191 } /* code 191 */ + ,{ 9, 9, 2, acFont16_1_192 } /* code 192 */ + ,{ 9, 9, 2, acFont16_1_193 } /* code 193 */ + ,{ 9, 9, 2, acFont16_1_194 } /* code 194 */ + ,{ 9, 9, 2, acFont16_1_195 } /* code 195 */ + ,{ 9, 9, 2, acFont16_1_196 } /* code 196 */ + ,{ 9, 9, 2, acFont16_1_197 } /* code 197 */ + ,{ 13, 13, 2, acFont16_1_198 } /* code 198 */ + ,{ 9, 9, 2, acFont16_1_199 } /* code 199 */ + ,{ 9, 9, 2, acFont16_1_200 } /* code 200 */ + ,{ 9, 9, 2, acFont16_1_201 } /* code 201 */ + ,{ 9, 9, 2, acFont16_1_202 } /* code 202 */ + ,{ 9, 9, 2, acFont16_1_203 } /* code 203 */ + ,{ 3, 3, 1, acFont16_1_204 } /* code 204 */ + ,{ 3, 3, 1, acFont16_1_205 } /* code 205 */ + ,{ 3, 3, 1, acFont16_1_206 } /* code 206 */ + ,{ 3, 3, 1, acFont16_1_207 } /* code 207 */ + ,{ 9, 9, 2, acFont16_1_208 } /* code 208 */ + ,{ 9, 9, 2, acFont16_1_209 } /* code 209 */ + ,{ 10, 10, 2, acFont16_1_210 } /* code 210 */ + ,{ 10, 10, 2, acFont16_1_211 } /* code 211 */ + ,{ 10, 10, 2, acFont16_1_212 } /* code 212 */ + ,{ 10, 10, 2, acFont16_1_213 } /* code 213 */ + ,{ 10, 10, 2, acFont16_1_214 } /* code 214 */ + ,{ 8, 8, 1, acFont16_1_215 } /* code 215 */ + ,{ 10, 10, 2, acFont16_1_216 } /* code 216 */ + ,{ 9, 9, 2, acFont16_1_217 } /* code 217 */ + ,{ 9, 9, 2, acFont16_1_218 } /* code 218 */ + ,{ 9, 9, 2, acFont16_1_219 } /* code 219 */ + ,{ 9, 9, 2, acFont16_1_220 } /* code 220 */ + ,{ 9, 9, 2, acFont16_1_221 } /* code 221 */ + ,{ 9, 9, 2, acFont16_1_222 } /* code 222 */ + ,{ 9, 9, 2, acFont16_1_223 } /* code 223 */ + ,{ 7, 7, 1, acFont16_1_224 } /* code 224 */ + ,{ 7, 7, 1, acFont16_1_225 } /* code 225 */ + ,{ 7, 7, 1, acFont16_1_226 } /* code 226 */ + ,{ 7, 7, 1, acFont16_1_227 } /* code 227 */ + ,{ 7, 7, 1, acFont16_1_228 } /* code 228 */ + ,{ 7, 7, 1, acFont16_1_229 } /* code 229 */ + ,{ 12, 12, 2, acFont16_1_230 } /* code 230 */ + ,{ 7, 7, 1, acFont16_1_231 } /* code 231 */ + ,{ 7, 7, 1, acFont16_1_232 } /* code 232 */ + ,{ 7, 7, 1, acFont16_1_233 } /* code 233 */ + ,{ 7, 7, 1, acFont16_1_234 } /* code 234 */ + ,{ 7, 7, 1, acFont16_1_235 } /* code 235 */ + ,{ 3, 3, 1, acFont16_1_236 } /* code 236 */ + ,{ 3, 3, 1, acFont16_1_237 } /* code 237 */ + ,{ 3, 3, 1, acFont16_1_238 } /* code 238 */ + ,{ 3, 3, 1, acFont16_1_239 } /* code 239 */ + ,{ 7, 7, 1, acFont16_1_240 } /* code 240 */ + ,{ 7, 7, 1, acFont16_1_241 } /* code 241 */ + ,{ 7, 7, 1, acFont16_1_242 } /* code 242 */ + ,{ 7, 7, 1, acFont16_1_243 } /* code 243 */ + ,{ 7, 7, 1, acFont16_1_244 } /* code 244 */ + ,{ 7, 7, 1, acFont16_1_245 } /* code 245 */ + ,{ 7, 7, 1, acFont16_1_246 } /* code 246 */ + ,{ 7, 7, 1, acFont16_1_247 } /* code 247 */ + ,{ 7, 7, 1, acFont16_1_248 } /* code 248 */ + ,{ 7, 7, 1, acFont16_1_249 } /* code 249 */ + ,{ 7, 7, 1, acFont16_1_250 } /* code 250 */ + ,{ 7, 7, 1, acFont16_1_251 } /* code 251 */ + ,{ 7, 7, 1, acFont16_1_252 } /* code 252 */ + ,{ 7, 7, 1, acFont16_1_253 } /* code 253 */ + ,{ 7, 7, 1, acFont16_1_254 } /* code 254 */ + ,{ 7, 7, 1, acFont16_1_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_1_FontProp1 = { + 160 /* first character */ + ,255 /* last character */ + ,&GUI_CharInfo_Font16_1[0] /* address of first character */ + ,&GUI_Font16ASCIIProp1 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font16_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font16_1_FontProp1} + , 13, 7, 10 +}; + diff --git a/User/system/lib/lcd/gui/Font/F16_1HK.c b/User/system/lib/lcd/gui/Font/F16_1HK.c new file mode 100644 index 0000000..6f6fc3a --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F16_1HK.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F16_1HK.C +Purpose : ASCII, West European, Hiragana & Katakana +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_1HK_Prop2 = { + 0x30A1 /* first character */ + ,0x30F6 /* last character */ + ,&GUI_Font16_HK_CharInfo[83] /* address of first character */ + ,(const GUI_FONT_PROP GUI_UNI_PTR *)&GUI_Font16_1_FontProp1 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_1HK_Prop1 = { + 0x3041 /* first character */ + ,0x3093 /* last character */ + ,&GUI_Font16_HK_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP GUI_UNI_PTR *)&GUI_Font16_1HK_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font16_1HK = { + GUI_FONTTYPE_PROP /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{(const GUI_FONT_PROP GUI_UNI_PTR *)&GUI_Font16_1HK_Prop1} + , 13, 7, 10 +}; + diff --git a/User/system/lib/lcd/gui/Font/F16_ASCII.c b/User/system/lib/lcd/gui/Font/F16_ASCII.c new file mode 100644 index 0000000..cb3d460 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F16_ASCII.c @@ -0,0 +1,1849 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F16_ASCII.C +Purpose : ASCII Character Set similar to Swiss +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont16ASCII_32[16] = { /* code 32 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_33[16] = { /* code 33 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_34[16] = { /* code 34 */ + ________, + ________, + ________, + _X_X____, + _X_X____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_35[16] = { /* code 35 */ + ________, + ________, + ________, + ___X__X_, + ___X__X_, + __X___X_, + XXXXXXX_, + __X__X__, + __X__X__, + XXXXXXX_, + _X__X___, + _X__X___, + _X__X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_36[16] = { /* code 36 */ + ________, + ________, + ________, + __XXX___, + _X_X_X__, + _X_X____, + _X_X____, + _XXX____, + ___XXX__, + ___X_X__, + _X_X_X__, + _X_X_X__, + __XXX___, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_37[32] = { /* code 37 */ + ________,________, + ________,________, + ________,________, + __XX____,X_______, + _X__X__X,________, + _X__X__X,________, + _X__X_X_,________, + __XX__X_,________, + _____X__,XX______, + _____X_X,__X_____, + ____X__X,__X_____, + ____X__X,__X_____, + ___X____,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_38[32] = { /* code 38 */ + ________,________, + ________,________, + ________,________, + ___XX___,________, + __X__X__,________, + __X__X__,________, + __X__X__,________, + ___XX___,________, + __XX____,________, + _X__X__X,________, + _X___X_X,________, + _X___XX_,________, + __XXX__X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_39[16] = { /* code 39 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_40[16] = { /* code 40 */ + ________, + ________, + ________, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + ___X____}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_41[16] = { /* code 41 */ + ________, + ________, + ________, + X_______, + _X______, + _X______, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_42[16] = { /* code 42 */ + ________, + ________, + ________, + __X_____, + XXXXX___, + __X_____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_43[16] = { /* code 43 */ + ________, + ________, + ________, + ________, + ________, + ____X___, + ____X___, + ____X___, + _XXXXXXX, + ____X___, + ____X___, + ____X___, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_44[16] = { /* code 44 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __X_____, + __X_____, + __X_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_45[16] = { /* code 45 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_46[16] = { /* code 46 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_47[16] = { /* code 47 */ + ________, + ________, + ________, + ___X____, + ___X____, + __X_____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + X_______, + X_______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_48[16] = { /* code 48 */ + ________, + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_49[16] = { /* code 49 */ + ________, + ________, + ________, + ___X____, + __XX____, + _X_X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_50[16] = { /* code 50 */ + ________, + ________, + ________, + _XXXX___, + X____X__, + _____X__, + _____X__, + _____X__, + ____X___, + ___X____, + __X_____, + _X______, + XXXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_51[16] = { /* code 51 */ + ________, + ________, + ________, + _XXXX___, + X____X__, + _____X__, + _____X__, + __XXX___, + _____X__, + _____X__, + _____X__, + X____X__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_52[16] = { /* code 52 */ + ________, + ________, + ________, + ____X___, + ___XX___, + ___XX___, + __X_X___, + __X_X___, + _X__X___, + _X__X___, + XXXXXX__, + ____X___, + ____X___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_53[16] = { /* code 53 */ + ________, + ________, + ________, + _XXXXX__, + _X______, + _X______, + X_______, + XXXXX___, + X____X__, + _____X__, + _____X__, + X____X__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_54[16] = { /* code 54 */ + ________, + ________, + ________, + _XXXX___, + X____X__, + X_______, + X_______, + X_XXX___, + XX___X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_55[16] = { /* code 55 */ + ________, + ________, + ________, + XXXXXX__, + ____X___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_56[16] = { /* code 56 */ + ________, + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + _XXXX___, + X____X__, + X____X__, + X____X__, + X____X__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_57[16] = { /* code 57 */ + ________, + ________, + ________, + _XXXX___, + X____X__, + X____X__, + X____X__, + X___XX__, + _XXX_X__, + _____X__, + _____X__, + X___X___, + _XXX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_58[16] = { /* code 58 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_59[16] = { /* code 59 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X______, + ________, + ________, + ________, + ________, + ________, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_60[16] = { /* code 60 */ + ________, + ________, + ________, + ________, + ________, + ______X_, + ____XX__, + __XX____, + _X______, + __XX____, + ____XX__, + ______X_, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_61[16] = { /* code 61 */ + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_62[16] = { /* code 62 */ + ________, + ________, + ________, + ________, + ________, + _X______, + __XX____, + ____XX__, + ______X_, + ____XX__, + __XX____, + _X______, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_63[16] = { /* code 63 */ + ________, + ________, + ________, + __XXX___, + _X___X__, + _X___X__, + _____X__, + ____X___, + ___X____, + __X_____, + __X_____, + ________, + __X_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_64[32] = { /* code 64 */ + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XX____,_X______, + _X______,__X_____, + _X__XXX_,X__X____, + X__X___X,X__X____, + X_X_____,X__X____, + X_X____X,___X____, + X_X____X,__X_____, + X_X___XX,__X_____, + X__XXX_X,XX______, + _X______,___X____, + __X_____,_XX_____, + ___XXXXX,X_______}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_65[32] = { /* code 65 */ + ________,________, + ________,________, + ________,________, + ____X___,________, + ___X_X__,________, + ___X_X__,________, + ___X_X__,________, + __X___X_,________, + __X___X_,________, + _XXXXXXX,________, + _X_____X,________, + X_______,X_______, + X_______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_66[32] = { /* code 66 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXX_,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_67[32] = { /* code 67 */ + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __X___X_,________, + _X_____X,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_68[32] = { /* code 68 */ + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + _X____X_,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X____X_,________, + _XXXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_69[32] = { /* code 69 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_70[16] = { /* code 70 */ + ________, + ________, + ________, + _XXXXXX_, + _X______, + _X______, + _X______, + _XXXXX__, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_71[32] = { /* code 71 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,________, + _X______,________, + _X___XXX,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_72[32] = { /* code 72 */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXXX,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_73[16] = { /* code 73 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_74[16] = { /* code 74 */ + ________, + ________, + ________, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_75[32] = { /* code 75 */ + ________,________, + ________,________, + ________,________, + _X______,X_______, + _X_____X,________, + _X____X_,________, + _X___X__,________, + _X__X___,________, + _X_XX___,________, + _XX__X__,________, + _X____X_,________, + _X_____X,________, + _X______,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_76[16] = { /* code 76 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_77[32] = { /* code 77 */ + ________,________, + ________,________, + ________,________, + _X______,_X______, + _XX_____,XX______, + _XX_____,XX______, + _X_X___X,_X______, + _X_X___X,_X______, + _X__X_X_,_X______, + _X__X_X_,_X______, + _X__X_X_,_X______, + _X___X__,_X______, + _X___X__,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_78[32] = { /* code 78 */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + _XX____X,________, + _X_X___X,________, + _X_X___X,________, + _X__X__X,________, + _X__X__X,________, + _X___X_X,________, + _X___X_X,________, + _X____XX,________, + _X_____X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_79[32] = { /* code 79 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + __X____X,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_80[32] = { /* code 80 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXX_,________, + _X______,________, + _X______,________, + _X______,________, + _X______,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_81[32] = { /* code 81 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __X____X,________, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X______,X_______, + _X___XX_,X_______, + __X____X,________, + ___XXXX_,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_82[32] = { /* code 82 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _XXXXXX_,________, + _X___X__,________, + _X____X_,________, + _X____X_,________, + _X_____X,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_83[32] = { /* code 83 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _X_____X,________, + _X_____X,________, + _X______,________, + __XXX___,________, + _____XX_,________, + _______X,________, + _X_____X,________, + _X_____X,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_84[16] = { /* code 84 */ + ________, + ________, + ________, + XXXXXXX_, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_85[32] = { /* code 85 */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + _X_____X,________, + __X___X_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_86[32] = { /* code 86 */ + ________,________, + ________,________, + ________,________, + X_______,X_______, + X_______,X_______, + _X_____X,________, + _X_____X,________, + __X___X_,________, + __X___X_,________, + ___X_X__,________, + ___X_X__,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_87[32] = { /* code 87 */ + ________,________, + ________,________, + ________,________, + X_____X_,____X___, + X____X_X,____X___, + _X___X_X,___X____, + _X___X_X,___X____, + _X___X_X,___X____, + __X_X___,X_X_____, + __X_X___,X_X_____, + __X_X___,X_X_____, + ___X____,_X______, + ___X____,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_88[16] = { /* code 88 */ + ________, + ________, + ________, + X_____X_, + _X___X__, + _X___X__, + __X_X___, + ___X____, + ___X____, + __X_X___, + _X___X__, + _X___X__, + X_____X_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_89[32] = { /* code 89 */ + ________,________, + ________,________, + ________,________, + _X_____X,________, + __X___X_,________, + __X___X_,________, + ___X_X__,________, + ___X_X__,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_90[16] = { /* code 90 */ + ________, + ________, + ________, + _XXXXXX_, + _____X__, + ____X___, + ____X___, + ___X____, + ___X____, + __X_____, + __X_____, + _X______, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_91[16] = { /* code 91 */ + ________, + ________, + ________, + _XX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_92[16] = { /* code 92 */ + ________, + ________, + ________, + X_______, + X_______, + _X______, + _X______, + _X______, + __X_____, + __X_____, + __X_____, + ___X____, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_93[16] = { /* code 93 */ + ________, + ________, + ________, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_94[16] = { /* code 94 */ + ________, + ________, + ________, + ________, + __X_____, + _X_X____, + _X_X____, + _X_X____, + X___X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_95[16] = { /* code 95 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_96[16] = { /* code 96 */ + ________, + ________, + ________, + _X______, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_97[16] = { /* code 97 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _X___X__, + _____X__, + __XXXX__, + _X___X__, + _X__XX__, + __XX_X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_98[16] = { /* code 98 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X_XX___, + _XX__X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_99[16] = { /* code 99 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _X___X__, + _X______, + _X______, + _X______, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_100[16] = { /* code 100 */ + ________, + ________, + ________, + _____X__, + _____X__, + _____X__, + __XX_X__, + _X__XX__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_101[16] = { /* code 101 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _X___X__, + _X___X__, + _XXXXX__, + _X______, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_102[16] = { /* code 102 */ + ________, + ________, + ________, + __X_____, + _X______, + _X______, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_103[16] = { /* code 103 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX_X__, + _X__XX__, + _X___X__, + _X___X__, + _X___X__, + _X__XX__, + __XX_X__, + _____X__, + _X___X__, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_104[16] = { /* code 104 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X_XX___, + _XX__X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_105[16] = { /* code 105 */ + ________, + ________, + ________, + _X______, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_106[16] = { /* code 106 */ + ________, + ________, + ________, + _X______, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + X_______}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_107[16] = { /* code 107 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X___X__, + _X__X___, + _X_X____, + _XXX____, + _X__X___, + _X__X___, + _X___X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_108[16] = { /* code 108 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_109[32] = { /* code 109 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X_XX__X,X_______, + _XX__XX_,_X______, + _X___X__,_X______, + _X___X__,_X______, + _X___X__,_X______, + _X___X__,_X______, + _X___X__,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_110[16] = { /* code 110 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X_XX___, + _XX__X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_111[16] = { /* code 111 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_112[16] = { /* code 112 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X_XX___, + _XX__X__, + _X___X__, + _X___X__, + _X___X__, + _XX__X__, + _X_XX___, + _X______, + _X______, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_113[16] = { /* code 113 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX_X__, + _X__XX__, + _X___X__, + _X___X__, + _X___X__, + _X__XX__, + __XX_X__, + _____X__, + _____X__, + _____X__}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_114[16] = { /* code 114 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X_X____, + _XX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_115[16] = { /* code 115 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _X___X__, + _X______, + __XXX___, + _____X__, + _X___X__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_116[16] = { /* code 116 */ + ________, + ________, + ________, + ________, + _X______, + _X______, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_117[16] = { /* code 117 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_118[16] = { /* code 118 */ + ________, + ________, + ________, + ________, + ________, + ________, + X___X___, + X___X___, + _X_X____, + _X_X____, + _X_X____, + __X_____, + __X_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_119[32] = { /* code 119 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + X___X___,X_______, + X___X___,X_______, + _X_X_X_X,________, + _X_X_X_X,________, + _X_X_X_X,________, + __X___X_,________, + __X___X_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_120[16] = { /* code 120 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + __X_X___, + __X_X___, + ___X____, + __X_X___, + __X_X___, + _X___X__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_121[16] = { /* code 121 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + __X_X___, + ___X____, + ___X____, + ___X____, + ___X____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_122[16] = { /* code 122 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + ____X___, + ____X___, + ___X____, + __X_____, + __X_____, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_123[16] = { /* code 123 */ + ________, + ________, + ________, + __X_____, + _X______, + _X______, + _X______, + _X______, + _X______, + X_______, + _X______, + _X______, + _X______, + _X______, + _X______, + __X_____}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_124[16] = { /* code 124 */ + ________, + ________, + ________, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_125[16] = { /* code 125 */ + ________, + ________, + ________, + _X______, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ___X____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acFont16ASCII_126[16] = { /* code 126 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX__X_, + X__XXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfo_Font16ASCII[96] = { + { 4, 4, 1, acFont16ASCII_32 } /* code 32 */ + ,{ 3, 3, 1, acFont16ASCII_33 } /* code 33 */ + ,{ 5, 5, 1, acFont16ASCII_34 } /* code 34 */ + ,{ 7, 7, 1, acFont16ASCII_35 } /* code 35 */ + ,{ 7, 7, 1, acFont16ASCII_36 } /* code 36 */ + ,{ 12, 12, 2, acFont16ASCII_37 } /* code 37 */ + ,{ 9, 9, 2, acFont16ASCII_38 } /* code 38 */ + ,{ 2, 2, 1, acFont16ASCII_39 } /* code 39 */ + ,{ 4, 4, 1, acFont16ASCII_40 } /* code 40 */ + ,{ 4, 4, 1, acFont16ASCII_41 } /* code 41 */ + ,{ 5, 5, 1, acFont16ASCII_42 } /* code 42 */ + ,{ 8, 8, 1, acFont16ASCII_43 } /* code 43 */ + ,{ 4, 4, 1, acFont16ASCII_44 } /* code 44 */ + ,{ 4, 4, 1, acFont16ASCII_45 } /* code 45 */ + ,{ 4, 4, 1, acFont16ASCII_46 } /* code 46 */ + ,{ 4, 4, 1, acFont16ASCII_47 } /* code 47 */ + ,{ 7, 7, 1, acFont16ASCII_48 } /* code 48 */ + ,{ 7, 7, 1, acFont16ASCII_49 } /* code 49 */ + ,{ 7, 7, 1, acFont16ASCII_50 } /* code 50 */ + ,{ 7, 7, 1, acFont16ASCII_51 } /* code 51 */ + ,{ 7, 7, 1, acFont16ASCII_52 } /* code 52 */ + ,{ 7, 7, 1, acFont16ASCII_53 } /* code 53 */ + ,{ 7, 7, 1, acFont16ASCII_54 } /* code 54 */ + ,{ 7, 7, 1, acFont16ASCII_55 } /* code 55 */ + ,{ 7, 7, 1, acFont16ASCII_56 } /* code 56 */ + ,{ 7, 7, 1, acFont16ASCII_57 } /* code 57 */ + ,{ 4, 4, 1, acFont16ASCII_58 } /* code 58 */ + ,{ 4, 4, 1, acFont16ASCII_59 } /* code 59 */ + ,{ 8, 8, 1, acFont16ASCII_60 } /* code 60 */ + ,{ 8, 8, 1, acFont16ASCII_61 } /* code 61 */ + ,{ 8, 8, 1, acFont16ASCII_62 } /* code 62 */ + ,{ 7, 7, 1, acFont16ASCII_63 } /* code 63 */ + ,{ 13, 13, 2, acFont16ASCII_64 } /* code 64 */ + ,{ 9, 9, 2, acFont16ASCII_65 } /* code 65 */ + ,{ 9, 9, 2, acFont16ASCII_66 } /* code 66 */ + ,{ 9, 9, 2, acFont16ASCII_67 } /* code 67 */ + ,{ 9, 9, 2, acFont16ASCII_68 } /* code 68 */ + ,{ 9, 9, 2, acFont16ASCII_69 } /* code 69 */ + ,{ 8, 8, 1, acFont16ASCII_70 } /* code 70 */ + ,{ 10, 10, 2, acFont16ASCII_71 } /* code 71 */ + ,{ 9, 9, 2, acFont16ASCII_72 } /* code 72 */ + ,{ 3, 3, 1, acFont16ASCII_73 } /* code 73 */ + ,{ 6, 6, 1, acFont16ASCII_74 } /* code 74 */ + ,{ 9, 9, 2, acFont16ASCII_75 } /* code 75 */ + ,{ 7, 7, 1, acFont16ASCII_76 } /* code 76 */ + ,{ 11, 11, 2, acFont16ASCII_77 } /* code 77 */ + ,{ 9, 9, 2, acFont16ASCII_78 } /* code 78 */ + ,{ 10, 10, 2, acFont16ASCII_79 } /* code 79 */ + ,{ 9, 9, 2, acFont16ASCII_80 } /* code 80 */ + ,{ 10, 10, 2, acFont16ASCII_81 } /* code 81 */ + ,{ 9, 9, 2, acFont16ASCII_82 } /* code 82 */ + ,{ 9, 9, 2, acFont16ASCII_83 } /* code 83 */ + ,{ 7, 7, 1, acFont16ASCII_84 } /* code 84 */ + ,{ 9, 9, 2, acFont16ASCII_85 } /* code 85 */ + ,{ 9, 9, 2, acFont16ASCII_86 } /* code 86 */ + ,{ 13, 13, 2, acFont16ASCII_87 } /* code 87 */ + ,{ 7, 7, 1, acFont16ASCII_88 } /* code 88 */ + ,{ 9, 9, 2, acFont16ASCII_89 } /* code 89 */ + ,{ 7, 7, 1, acFont16ASCII_90 } /* code 90 */ + ,{ 4, 4, 1, acFont16ASCII_91 } /* code 91 */ + ,{ 4, 4, 1, acFont16ASCII_92 } /* code 92 */ + ,{ 4, 4, 1, acFont16ASCII_93 } /* code 93 */ + ,{ 5, 5, 1, acFont16ASCII_94 } /* code 94 */ + ,{ 7, 7, 1, acFont16ASCII_95 } /* code 95 */ + ,{ 4, 4, 1, acFont16ASCII_96 } /* code 96 */ + ,{ 7, 7, 1, acFont16ASCII_97 } /* code 97 */ + ,{ 7, 7, 1, acFont16ASCII_98 } /* code 98 */ + ,{ 7, 7, 1, acFont16ASCII_99 } /* code 99 */ + ,{ 7, 7, 1, acFont16ASCII_100 } /* code 100 */ + ,{ 7, 7, 1, acFont16ASCII_101 } /* code 101 */ + ,{ 3, 3, 1, acFont16ASCII_102 } /* code 102 */ + ,{ 7, 7, 1, acFont16ASCII_103 } /* code 103 */ + ,{ 7, 7, 1, acFont16ASCII_104 } /* code 104 */ + ,{ 3, 3, 1, acFont16ASCII_105 } /* code 105 */ + ,{ 3, 3, 1, acFont16ASCII_106 } /* code 106 */ + ,{ 7, 7, 1, acFont16ASCII_107 } /* code 107 */ + ,{ 3, 3, 1, acFont16ASCII_108 } /* code 108 */ + ,{ 11, 11, 2, acFont16ASCII_109 } /* code 109 */ + ,{ 7, 7, 1, acFont16ASCII_110 } /* code 110 */ + ,{ 7, 7, 1, acFont16ASCII_111 } /* code 111 */ + ,{ 7, 7, 1, acFont16ASCII_112 } /* code 112 */ + ,{ 7, 7, 1, acFont16ASCII_113 } /* code 113 */ + ,{ 4, 4, 1, acFont16ASCII_114 } /* code 114 */ + ,{ 7, 7, 1, acFont16ASCII_115 } /* code 115 */ + ,{ 4, 4, 1, acFont16ASCII_116 } /* code 116 */ + ,{ 7, 7, 1, acFont16ASCII_117 } /* code 117 */ + ,{ 5, 5, 1, acFont16ASCII_118 } /* code 118 */ + ,{ 9, 9, 2, acFont16ASCII_119 } /* code 119 */ + ,{ 7, 7, 1, acFont16ASCII_120 } /* code 120 */ + ,{ 7, 7, 1, acFont16ASCII_121 } /* code 121 */ + ,{ 7, 7, 1, acFont16ASCII_122 } /* code 122 */ + ,{ 4, 4, 1, acFont16ASCII_123 } /* code 123 */ + ,{ 3, 3, 1, acFont16ASCII_124 } /* code 124 */ + ,{ 4, 4, 1, acFont16ASCII_125 } /* code 125 */ + ,{ 8, 8, 1, acFont16ASCII_126 } /* code 126 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16ASCIIProp1 = { + 32 /* first character */ + ,126 /* last character */ + ,&GUI_CharInfo_Font16ASCII[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font16_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font16ASCIIProp1} + , 13, 7, 10 +}; + diff --git a/User/system/lib/lcd/gui/Font/F16_HK.c b/User/system/lib/lcd/gui/Font/F16_HK.c new file mode 100644 index 0000000..9f0b98f --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F16_HK.c @@ -0,0 +1,3266 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F16_HK.C +Purpose : Hiragana & Katakana characters +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "stdio.h" +#include "GUI_FontIntern.h" + +/* Start of unicode area */ + +GUI_CONST_STORAGE unsigned char acFont16_HK_3041[32] = { /* code 3041 */ + ________,________, + ________,________, + ________,________, + ______X_,________, + _______X,________, + _______X,_XX_____, + ____XXXX,X_______, + _______X,________, + ______XX,XXX_____, + _____X_X,___X____, + ____X__X,_X__X___, + ____X__X,X___X___, + _____XXX,____X___, + _______X,___X____, + ________,_XX_____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3042[32] = { /* code 3042 */ + ________,________, + ______X_,________, + _______X,________, + _______X,__X_____, + ____XXXX,XX______, + _______X,________, + _______X,XXX_____, + _____XXX,___X____, + ____X__X,____X___, + ___X___X,_X___X__, + __X____X,X____X__, + __X___XX,_____X__, + ___XXX__,X____X__, + ________,____X___, + ________,_XXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3043[32] = { /* code 3043 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___X____,________, + ____X___,________, + ____X___,__X_____, + ____X___,___X____, + ____X___,____X___, + ____X___,____X___, + ____X__X,________, + _____XX_,________, + ______X_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3044[32] = { /* code 3044 */ + ________,________, + ________,________, + __X_____,________, + ___X____,________, + ___X____,________, + ___X____,________, + ___X____,__X_____, + ___X____,___X____, + ___X____,____X___, + ___X____,____X___, + ___X___X,____X___, + ____XXX_,________, + _____X__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3045[32] = { /* code 3045 */ + ________,________, + ________,________, + ________,________, + ______X_,________, + _______X,XX______, + ________,________, + ________,________, + _______X,XX______, + _____XX_,__X_____, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3046[32] = { /* code 3046 */ + ________,________, + ______X_,________, + _______X,XX______, + ________,________, + ________,________, + _______X,XX______, + ____XXX_,__X_____, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + ______XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3047[32] = { /* code 3047 */ + ________,________, + ________,________, + ________,________, + _______X,________, + ________,XX______, + ________,_X______, + ________,________, + _____X__,XXX_____, + ______XX,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______XX,X_______, + _____X__,_XXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3048[32] = { /* code 3048 */ + ________,________, + _______X,________, + ________,XX______, + ________,_X______, + ________,________, + ________,__X_____, + ____X_XX,XXX_____, + _____X__,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ____X_XX,________, + ___X____,X_______, + ________,_XXXX___, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3049[32] = { /* code 3049 */ + ________,________, + ________,________, + ________,________, + _____X__,________, + ______X_,________, + ______XX,X__X____, + ___X_XX_,____X___, + ____X_X_,________, + ______XX,XXX_____, + _____XX_,___X____, + ____X_X_,___X____, + ___X__X_,X_X_____, + ____XX__,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_304A[32] = { /* code 304A */ + ________,________, + _____X__,________, + ______X_,________, + ______X_,____X___, + ______X_,XX___X__, + __X__XXX,_____X__, + ___XX_X_,________, + ______X_,________, + ______XX,XXXX____, + _____XX_,____X___, + ____X_X_,_____X__, + ___X__X_,_____X__, + ___X__X_,_X__X___, + ____XX__,_XXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_304B[32] = { /* code 304B */ + ________,________, + ______X_,________, + _______X,________, + _______X,________, + _______X,________, + _______X,XX__X___, + ___XXXX_,__X__X__, + ______X_,__X___X_, + _____X__,__X__XX_, + _____X__,__X_____, + ____X___,__X_____, + ____X___,_X______, + ___X___X,XX______, + __X_____,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_304C[32] = { /* code 304C */ + ________,________, + ______X_,________, + _______X,______X_, + _______X,_____X_X, + _______X,______X_, + _______X,XX__X___, + ___XXXX_,__X__X__, + ______X_,__X___X_, + _____X__,__X__XX_, + _____X__,__X_____, + ____X___,__X_____, + ____X___,_X______, + ___X___X,XX______, + __X_____,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_304D[32] = { /* code 304D */ + ________,________, + ______X_,________, + ______X_,________, + _______X,XXX_____, + ____XXXX,________, + ________,X_______, + ________,XXXX____, + ____XXXX,_X______, + ________,_X______, + _____XXX,X_X_____, + ____X___,__X_____, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_304E[32] = { /* code 304E */ + ________,________, + ______X_,________, + ______X_,______X_, + _______X,XXX_X__X, + ____XXXX,_____X__, + ________,X_______, + ________,XXXX____, + ____XXXX,_X______, + ________,_X______, + _____XXX,X_X_____, + ____X___,__X_____, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_304F[32] = { /* code 304F */ + ________,________, + ________,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ____X___,________, + _____X__,________, + ______X_,________, + _______X,________, + ________,X_______, + ________,X_______, + ________,_X______, + ________,_X______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3050[32] = { /* code 3050 */ + ________,________, + ________,_X______, + ________,_X___X__, + ________,X__X__X_, + _______X,____X___, + ______X_,________, + _____X__,________, + ____X___,________, + _____X__,________, + ______X_,________, + _______X,________, + ________,X_______, + ________,X_______, + ________,_X______, + ________,_X______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3051[32] = { /* code 3051 */ + ________,________, + ___X____,_X______, + ____X___,__X_____, + ____X___,__X_____, + ___X____,__XXXX__, + ___X__XX,XXX_____, + ___X____,__X_____, + ___X____,__X_____, + ___X____,__X_____, + ___X_X__,__X_____, + ___X_X__,__X_____, + ___XX___,__X_____, + ___XX___,_X______, + ___X____,_X______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3052[32] = { /* code 3052 */ + ________,________, + ___X____,_X____X_, + ____X___,__X_X__X, + ____X___,__X__X__, + ___X____,__XXXX__, + ___X__XX,XXX_____, + ___X____,__X_____, + ___X____,__X_____, + ___X____,__X_____, + ___X_X__,__X_____, + ___X_X__,__X_____, + ___XX___,__X_____, + ___XX___,_X______, + ___X____,_X______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3053[32] = { /* code 3053 */ + ________,________, + ________,________, + ________,________, + _____X__,________, + ______XX,XXXX____, + ________,_XX_____, + ________,X_______, + _______X,________, + ________,________, + ________,________, + ________,________, + ___X____,________, + ____XX__,___XX___, + ______XX,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3054[32] = { /* code 3054 */ + ________,________, + ________,________, + ________,______X_, + ____X___,____X__X, + _____XXX,XXX__X__, + ________,XX______, + _______X,________, + ______X_,________, + ________,________, + ________,________, + ________,________, + __X_____,________, + ___XX___,__XX____, + _____XXX,XXX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3055[32] = { /* code 3055 */ + ________,________, + ______X_,________, + ______X_,________, + _______X,___XX___, + ________,XXX_____, + ____XXXX,_X______, + ________,_X______, + ________,__X_____, + ______XX,XXXX____, + _____X__,___X____, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3056[32] = { /* code 3056 */ + ________,________, + ______X_,______X_, + ______X_,____X__X, + _______X,___X_X__, + ________,XXX_____, + ____XXXX,_X______, + ________,_X______, + ________,__X_____, + ______XX,XXXX____, + _____X__,___X____, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3057[32] = { /* code 3057 */ + ________,________, + ____X___,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,_____X__, + _____X__,____X___, + _____X__,__XX____, + ______XX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3058[32] = { /* code 3058 */ + ________,________, + ____X___,________, + _____X__,________, + _____X__,___X____, + _____X__,_X__X___, + _____X__,__X_____, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____X__,_____X__, + _____X__,____X___, + _____X__,__XX____, + ______XX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3059[32] = { /* code 3059 */ + ________,________, + ________,X_______, + ________,X_______, + ________,X_______, + __X__XXX,XXXXX___, + ___XX___,X_______, + ________,X_______, + ______XX,X_______, + _____X__,X_______, + _____X__,X_______, + ______XX,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_305A[32] = { /* code 305A */ + ________,________, + ________,X____X__, + ________,X__X__X_, + ________,X___X___, + __X__XXX,XXXX____, + ___XX___,X_______, + ________,X_______, + ______XX,X_______, + _____X__,X_______, + _____X__,X_______, + ______XX,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_305B[32] = { /* code 305B */ + ________,________, + ________,________, + ________,_XX_____, + ____XX__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____XXX,XXXXXX__, + ___XXX__,__X_____, + __X__X__,X_X_____, + _____X__,_XX_____, + _____X__,__X_____, + _____X__,________, + ______X_,________, + _______X,XXXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_305C[32] = { /* code 305C */ + ________,________, + ________,______X_, + ________,_XX_X__X, + ____XX__,__X__X__, + _____X__,__X_____, + _____X__,__X_____, + _____XXX,XXXXXX__, + ___XXX__,__X_____, + __X__X__,X_X_____, + _____X__,_XX_____, + _____X__,__X_____, + _____X__,________, + ______X_,________, + _______X,XXXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_305D[32] = { /* code 305D */ + ________,________, + ________,________, + ______XX,XXX_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,__XXX___, + _____XXX,XX______, + ___XX___,X_______, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + ________,XX______, + ________,__XX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_305E[32] = { /* code 305E */ + ________,________, + ________,______X_, + ______XX,XXX_X__X, + ________,_X___X__, + ________,X_______, + _______X,________, + ______X_,__XXX___, + _____XXX,XX______, + ___XX___,X_______, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + ________,XX______, + ________,__XX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_305F[32] = { /* code 305F */ + ________,________, + ________,________, + _____XX_,________, + ______X_,________, + ______XX,X_______, + __XXXX__,__XXXX__, + _____X__,XX__X___, + _____X__,___X____, + ____X___,________, + ____X___,________, + ___X___X,________, + ___X___X,________, + __X_____,XX______, + ________,__XXXX__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3060[32] = { /* code 3060 */ + ________,________, + ________,_____X__, + _____XX_,___X__X_, + ______X_,____X___, + ______XX,X_______, + __XXXX__,__XXXX__, + _____X__,XX__X___, + _____X__,___X____, + ____X___,________, + ____X___,________, + ___X___X,________, + ___X___X,________, + __X_____,XX______, + ________,__XXXX__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3061[32] = { /* code 3061 */ + ________,________, + _____X__,________, + ______X_,________, + ______X_,XX______, + ___X__XX,________, + ____X_X_,________, + _____X__,________, + _____X__,________, + _____X__,XXXX____, + ____X_XX,____X___, + ____XX__,_____X__, + ____X___,_____X__, + ________,____X___, + ________,__XX____, + ________,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3062[32] = { /* code 3062 */ + ________,________, + _____X__,_____X__, + ______X_,___X__X_, + ______X_,XX__X___, + ___X__XX,________, + ____X_X_,________, + _____X__,________, + _____X__,________, + _____X__,XXXX____, + ____X_XX,____X___, + ____XX__,_____X__, + ____X___,_____X__, + ________,____X___, + ________,__XX____, + ________,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3063[32] = { /* code 3063 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXX_____, + ___X__XX,___X____, + ____XX__,____X___, + ________,____X___, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3064[32] = { /* code 3064 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXXX____, + ______XX,____X___, + _X__XX__,_____X__, + __XX____,_____X__, + ________,_____X__, + ________,_____X__, + ________,____X___, + ________,__XX____, + ________,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3065[32] = { /* code 3065 */ + ________,________, + ________,______X_, + ________,____X__X, + ________,_____X__, + ________,XXXX____, + ______XX,____X___, + _X__XX__,_____X__, + __XX____,_____X__, + ________,_____X__, + ________,_____X__, + ________,____X___, + ________,__XX____, + ________,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3066[32] = { /* code 3066 */ + ________,________, + ________,________, + ________,___XXX__, + _______X,XXX_____, + _X__XXX_,_X______, + __XX____,X_______, + _______X,________, + _______X,________, + ______X_,________, + ______X_,________, + ______X_,________, + _______X,________, + ________,X_______, + ________,_XXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3067[32] = { /* code 3067 */ + ________,________, + ________,______X_, + ________,__X_X__X, + _______X,XX___X__, + _X__XXX_,_X______, + __XX____,X_______, + _______X,________, + _______X,________, + ______X_,________, + ______X_,________, + ______X_,________, + _______X,________, + ________,X_______, + ________,_XXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3068[32] = { /* code 3068 */ + ________,________, + ________,________, + ______XX,________, + _______X,________, + _______X,________, + _______X,________, + _______X,_XXX____, + _______X,X_______, + ______X_,________, + _____X__,________, + ____X___,________, + ____X___,________, + ____X___,________, + _____XXX,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3069[32] = { /* code 3069 */ + ________,________, + ________,________, + ______XX,________, + _______X,______X_, + _______X,____X__X, + _______X,_____X__, + _______X,_XXX____, + _______X,X_______, + ______X_,________, + _____X__,________, + ____X___,________, + ____X___,________, + ____X___,________, + _____XXX,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_306A[32] = { /* code 306A */ + ________,________, + ______X_,________, + _______X,________, + ______X_,XX______, + __XXXXXX,________, + _____X__,__XX____, + ____X___,___XX___, + ____X___,__X_____, + ___X____,_X______, + ___X____,_X______, + ________,_X______, + ________,_X______, + ______XX,XXXX____, + _____X__,_X__X___, + ______XX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_306B[32] = { /* code 306B */ + ________,________, + ________,________, + ___X____,________, + ___X____,________, + ___X___X,XXXXX___, + ___X____,__XX____, + ___X____,_X______, + __X_____,________, + __X_____,________, + __X___X_,________, + __X_X_X_,________, + __XX___X,________, + __XX____,XXXXXX__, + ___X____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_306C[32] = { /* code 306C */ + ________,________, + ________,________, + ______X_,________, + _______X,________, + _______X,XX______, + __X__XXX,__XX____, + __X_X__X,____X___, + ___X___X,_____X__, + ___X__X_,______X_, + __X_X_X_,______X_, + _X___X__,______X_, + _X__XX__,_XXX_X__, + __XX__X_,X___XX__, + ________,_XXX__X_, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_306D[32] = { /* code 306D */ + ________,________, + ________,________, + _____X__,________, + _____X__,________, + _____X__,________, + _____XX_,________, + __XXXX__,XXXX____, + _____X_X,____X___, + _____XX_,_____X__, + ____XX__,_____X__, + ____XX__,_____X__, + ___X_X__,_XXX_X__, + __XX_X__,X___XX__, + ____XX__,_XXXX_X_, + _____X__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_306E[32] = { /* code 306E */ + ________,________, + ________,________, + ________,________, + _______X,XXX_____, + _____XX_,__XX____, + ____X___,_X__X___, + ___X____,X___X___, + __X____X,_____X__, + __X___X_,_____X__, + __X__X__,_____X__, + __X_X___,____X___, + __XX____,____X___, + ________,___X____, + ________,__X_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_306F[32] = { /* code 306F */ + ________,________, + ________,________, + ___X____,__XX____, + ___X____,___X____, + ___X____,___X____, + __X___X_,___XXX__, + __X____X,XXXX____, + __X_____,___X____, + __X_____,___X____, + __X_____,___X____, + __X_____,___X____, + __XX___X,XXXXX___, + __XX__X_,__X__X__, + __X____X,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3070[32] = { /* code 3070 */ + ________,________, + ________,______X_, + ___X____,_XX_X__X, + ___X____,__X__X__, + ___X____,__X_____, + __X__X__,__XXX___, + __X___XX,XXX_____, + __X_____,__X_____, + __X_____,__X_____, + __X_____,__X_____, + __X_____,__X_____, + __XX__XX,XXXX____, + __XX_X__,_X__X___, + __X___XX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3071[32] = { /* code 3071 */ + ________,________, + ________,_____X__, + ___X____,_XX_X_X_, + ___X____,__X__X__, + ___X____,__X_____, + __X__X__,__XXX___, + __X___XX,XXX_____, + __X_____,__X_____, + __X_____,__X_____, + __X_____,__X_____, + __X_____,__X_____, + __XX__XX,XXXX____, + __XX_X__,_X__X___, + __X___XX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3072[32] = { /* code 3072 */ + ________,________, + ________,________, + ________,________, + _____XX_,___X____, + ___XXX__,___X____, + _____X__,___X____, + ____X___,__X_X___, + ____X___,__X__X__, + ___X____,__X___X_, + ___X____,__X_____, + ___X____,_X______, + ___X____,_X______, + ____X___,X_______, + _____XXX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3073[32] = { /* code 3073 */ + ________,________, + ________,______X_, + ________,____X__X, + _____XX_,___X_X__, + ___XXX__,___X____, + _____X__,___X____, + ____X___,___XX___, + ____X___,__X__X__, + ___X____,__X___X_, + ___X____,__X_____, + ___X____,_X______, + ___X____,_X______, + ____X___,X_______, + _____XXX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3074[32] = { /* code 3074 */ + ________,________, + ________,______X_, + ________,_____X_X, + _____XX_,___X__X_, + ___XXX__,___X____, + _____X__,___X____, + ____X___,___XX___, + ____X___,__X__X__, + ___X____,__X___X_, + ___X____,__X_____, + ___X____,_X______, + ___X____,_X______, + ____X___,X_______, + _____XXX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3075[32] = { /* code 3075 */ + ________,________, + ________,________, + _______X,________, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + _______X,XXXXX___, + _____XX_,X____X__, + _X__X___,_X____X_, + __XX__X_,_X___XX_, + __X____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3076[32] = { /* code 3076 */ + ________,________, + ________,________, + _______X,_____X__, + ________,X__X__X_, + ________,X___X___, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + _______X,XXXXX___, + _____XX_,X____X__, + _X__X___,_X____X_, + __XX__X_,_X___XX_, + __X____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3077[32] = { /* code 3077 */ + ________,________, + ________,________, + _______X,____X___, + ________,X__X_X__, + ________,X___X___, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + _______X,XXXXX___, + _____XX_,X____X__, + _X__X___,_X____X_, + __XX__X_,_X___XX_, + __X____X,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3078[32] = { /* code 3078 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____X__X,________, + _X_X____,X_______, + __X_____,_X______, + ________,__X_____, + ________,___XX___, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3079[32] = { /* code 3079 */ + ________,________, + ________,________, + ________,_____X__, + ________,___X__X_, + ________,____X___, + _____XX_,________, + ____X__X,________, + _X_X____,X_______, + __X_____,_X______, + ________,__X_____, + ________,___XX___, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_307A[32] = { /* code 307A */ + ________,________, + ________,________, + ________,____X___, + ________,___X_X__, + ________,____X___, + _____XX_,________, + ____X__X,________, + _X_X____,X_______, + __X_____,_X______, + ________,__X_____, + ________,___XX___, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_307B[32] = { /* code 307B */ + ________,________, + ________,________, + __X_____,___XX___, + ___X___X,XXX_____, + ___X____,__X_____, + __X_____,___XXX__, + __X____X,XXXX____, + __X_____,___X____, + __X_X___,___X____, + __X_X___,___X____, + __XX____,___X____, + __XX____,XXXXX___, + __XX___X,___X_X__, + ___X____,XXX___X_, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_307C[32] = { /* code 307C */ + ________,______X_, + ________,____X__X, + __X_____,__XX_X__, + ___X__XX,XX______, + ___X____,_X______, + __X_____,__XXX___, + __X___XX,XXX_____, + __X_____,__X_____, + __X_X___,__X_____, + __X_X___,__X_____, + __XX____,__X_____, + __XX___X,XXXX____, + __XX__X_,__X_X___, + ___X___X,XX___X__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_307D[32] = { /* code 307D */ + ________,_____X__, + ________,____X_X_, + __X_____,__XX_X__, + ___X__XX,XX______, + ___X____,_X______, + __X_____,__XXX___, + __X___XX,XXX_____, + __X_____,__X_____, + __X_X___,__X_____, + __X_X___,__X_____, + __XX____,__X_____, + __XX___X,XXXX____, + __XX__X_,__X_X___, + ___X___X,XX___X__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_307E[32] = { /* code 307E */ + ________,________, + _______X,________, + ________,XX______, + ________,X_______, + ___X____,XXXXX___, + ____XXXX,X_______, + ________,X__X____, + ____X___,XXXXX___, + _____XXX,X_______, + ________,X_______, + ________,X_______, + ____XXXX,XXX_____, + ___X____,X__XX___, + ___X___X,_____X__, + ____XXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_307F[32] = { /* code 307F */ + ________,________, + ________,________, + ____X__X,XX______, + _____XX_,X_______, + ________,X_______, + _______X,________, + _______X,___XX___, + ______X_,____X___, + ____XXXX,XX__X___, + ___X_X__,__XXX___, + __X_X___,___X_XX_, + __X_X___,__X___X_, + ___X____,__X_____, + ________,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3080[32] = { /* code 3080 */ + ________,________, + ________,________, + ____XX__,________, + _____X_X,________, + _X__XXX_,________, + __XX_X__,____XX__, + _____X__,___X__X_, + ___XXX__,___X_XX_, + __X__X__,___X____, + __X__X__,___X____, + ___XX___,____X___, + ____X___,____X___, + ____X___,____X___, + _____XXX,XXXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3081[32] = { /* code 3081 */ + ________,________, + ________,________, + ________,XX______, + ________,_X______, + ___X____,_X______, + ___X__XX,X_XX____, + ____XX__,X___X___, + ___XX__X,_____X__, + __X_X__X,______X_, + _X___XX_,______X_, + _X___X__,______X_, + _X__X_X_,_____X__, + _X_X___X,____X___, + __X_____,___X____, + ________,__X_____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3082[32] = { /* code 3082 */ + ________,________, + _______X,X_______, + ________,X_______, + ____X___,X_______, + _____X_X,________, + ______XX,XX______, + _____XX_,________, + ____X_X_,________, + ____X_X_,___X____, + _____XXX,XX__X___, + ______X_,____X___, + ______X_,____X___, + ______X_,____X___, + _______X,___X____, + ________,XXX_____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3083[32] = { /* code 3083 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,________, + _____X__,X_______, + ____X___,XXXX____, + _____XXX,_X__X___, + ___X_X__,____X___, + ____X_X_,___X____, + _______X,________, + _______X,________, + ________,X_______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3084[32] = { /* code 3084 */ + ________,________, + ________,________, + ____X___,X_______, + ___X____,_X______, + ___X____,_XXXX___, + ____X_XX,X_X__X__, + _X__XX__,____X___, + __XX_X__,__XX____, + ______X_,________, + ______X_,________, + _______X,________, + _______X,________, + ________,X_______, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3085[32] = { /* code 3085 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,________, + __X_____,X_______, + ___XX___,_XX_____, + ___X__XX,XX_X____, + ___X_X__,_X__X___, + ___XX___,_X__X___, + ___XX___,_X_X____, + ___X___X,XXX_____, + ___X____,X_______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3086[32] = { /* code 3086 */ + ________,________, + ________,________, + _______X,X_______, + _X____X_,_X______, + __X__X__,XXXX____, + __X__X_X,_X__X___, + __X__XX_,_X___X__, + __X__X__,_X___X__, + __X_XX__,_X___X__, + __XX__X_,_X___X__, + __XX___X,_X__X___, + __X_____,XXXX____, + __X_____,X_______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3087[32] = { /* code 3087 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,________, + ________,X_______, + ________,X__X____, + ________,XXX_____, + ________,X_______, + ________,X_______, + ________,X_______, + _____XXX,X_______, + ____X___,XXX_____, + _____XXX,___X____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3088[32] = { /* code 3088 */ + ________,________, + _______X,________, + ________,X_______, + ________,X_______, + ________,X__X____, + ________,XXX_____, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ____XXXX,XX______, + ___X____,X_XX____, + ___X____,X___X___, + ____XXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3089[32] = { /* code 3089 */ + ________,________, + ______X_,________, + _______X,________, + ________,X_______, + _____X_X,X_______, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,XXX_____, + ____X_XX,___X____, + ____XX__,____X___, + ____X___,____X___, + ________,____X___, + ________,__XX____, + ________,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_308A[32] = { /* code 308A */ + ________,________, + ____X___,XX______, + _____X_X,__X_____, + _____XX_,__X_____, + _____XX_,__X_____, + _____X__,__X_____, + ____XX__,__X_____, + ____X___,__X_____, + ____X___,__X_____, + ____X___,__X_____, + ________,__X_____, + ________,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_308B[32] = { /* code 308B */ + ________,________, + ________,________, + ____X__X,XXX_____, + _____XX_,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X_X,XXX_____, + _____XX_,___X____, + ____X___,____X___, + ___X____,____X___, + ______XX,X__X____, + _____X__,_X_X____, + _____X__,_XX_____, + ______XX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_308C[32] = { /* code 308C */ + ________,________, + ___X____,________, + ____XX__,________, + _____X__,________, + _____X__,XXX_____, + ____XX_X,___X____, + __XX_XX_,___X____, + _____X__,___X____, + ____X___,___X____, + ____X___,___X____, + ___XX___,__X_____, + __X_X___,__X_____, + _X__X___,__X_____, + ___XX___,___XXX__, + ____X___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_308D[32] = { /* code 308D */ + ________,________, + ________,_X______, + _____XXX,XX______, + ________,X_______, + ________,X_______, + _______X,________, + ______X_,________, + _____XXX,XXXX____, + ____XX__,____X___, + ___X____,_____X__, + __X_____,_____X__, + ________,____X___, + ________,___X____, + ________,_XX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_308E[32] = { /* code 308E */ + ________,________, + ________,________, + ________,________, + ________,________, + ______X_,________, + ______X_,________, + ______X_,________, + ______XX,________, + ____XXX_,XXXX____, + ___X__XX,____X___, + ______X_,_____X__, + _____XX_,_____X__, + ____X_X_,____X___, + ___X_XX_,___X____, + ______X_,__X_____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_308F[32] = { /* code 308F */ + ________,________, + _____X__,________, + ______X_,________, + ______X_,________, + ______X_,________, + _____XX_,________, + ___XXXX_,XXXXX___, + _____X_X,_____X__, + _____XX_,______X_, + ____XX__,______X_, + ___X_X__,______X_, + __X__X__,_____X__, + ____XX__,___XX___, + _____X__,_XX_____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3090[32] = { /* code 3090 */ + ________,________, + ________,________, + _____X_X,XX______, + ______X_,X_______, + ________,X_______, + _______X,________, + _______X,XXXX____, + _____XX_,____X___, + ____X_X_,_____X__, + ___X__X_,_____X__, + ___X_X__,_____X__, + ___X_X__,_XXX_X__, + ___XX___,X___X___, + ________,_XXX____, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3091[32] = { /* code 3091 */ + ________,________, + _____X__,_X______, + ______XX,XX______, + ________,X_______, + _______X,________, + _______X,XXX_____, + ______X_,___X____, + _____X__,___X____, + ____X__X,___X____, + ______X_,XXX_____, + _______X,________, + _____XX_,________, + ____XX__,__XXXX__, + __XX__XX,XX___XX_, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3092[32] = { /* code 3092 */ + ________,________, + ______X_,________, + _______X,________, + _______X,XXX_____, + ___XXXX_,________, + ______X_,________, + _____XXX,____X___, + _____X__,X_XXXX__, + ____X___,XX______, + ___X___X,X_______, + ______X_,X_______, + _____X__,X_______, + _____X__,________, + _____X__,________, + ______XX,XXXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_3093[32] = { /* code 3093 */ + ________,________, + ________,________, + ______X_,________, + _______X,________, + _______X,________, + ______X_,________, + ______X_,________, + _____X__,________, + _____XXX,________, + ____X___,X_______, + ____X___,X_______, + ___X____,X_______, + __X_____,X____X__, + __X_____,_XXXX___, + ________,________, + ________,________}; + +/* Start of unicode area */ + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A1[32] = { /* code 30A1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___X_XXX,XXXXX___, + ____X___,___X____, + _______X,X_X_____, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A2[32] = { /* code 30A2 */ + ________,________, + ________,________, + ____XXXX,XXXXXXX_, + ________,_____X__, + _______X,___XX___, + ________,X_X_____, + ________,X_______, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ______X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A3[32] = { /* code 30A3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XX______, + ________,_X______, + ________,X_______, + _______X,X_______, + ______X_,X_______, + _____X__,X_______, + ____X___,X_______, + ___X____,X_______, + ________,X_______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A4[32] = { /* code 30A4 */ + ________,________, + ________,_X______, + ________,__XX____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,X_______, + ______X_,X_______, + _____X__,X_______, + ____X___,X_______, + ___X____,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A5[32] = { /* code 30A5 */ + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + ________,X_______, + ________,X__X____, + ____XXXX,XXXXX___, + _____X__,___X____, + _____X__,___X____, + _____X__,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + ______XX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A6[32] = { /* code 30A6 */ + ________,________, + ________,________, + ______XX,________, + ________,X_______, + ________,X___X___, + ___XXXXX,XXXXXX__, + ____X___,____X___, + ____X___,____X___, + ____X___,____X___, + ____X___,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + ______XX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A7[32] = { /* code 30A7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,_XX_____, + _____XXX,X_______, + ________,X_______, + ________,X_______, + ___X____,X_______, + ____XXXX,XXXXX___, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A8[32] = { /* code 30A8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___X____,_XXX____, + ____XXXX,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + __X_____,X_______, + ___XXXXX,XXXXXX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30A9[32] = { /* code 30A9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,________, + ________,X_______, + ________,XXXX____, + ____XXXX,X_______, + _______X,X_______, + ______X_,X_______, + _____X__,X_______, + ____X___,X_______, + ___X___X,X_______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30AA[32] = { /* code 30AA */ + ________,________, + ________,________, + ________,XX______, + ________,_X______, + ________,_XXXXX__, + ___XXXXX,XX______, + ________,XX______, + _______X,_X______, + ______X_,_X______, + _____X__,_X______, + ____X___,_X______, + ___X____,_X______, + ________,XX______, + ________,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30AB[32] = { /* code 30AB */ + ________,________, + ________,________, + ________,XX______, + ________,_X______, + ________,X_______, + ___X____,XXXXX___, + ____XXXX,____X___, + _______X,____X___, + ______X_,____X___, + ______X_,____X___, + _____X__,___X____, + ____X___,___X____, + ___X___X,X_X_____, + __X_____,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30AC[32] = { /* code 30AC */ + ________,________, + ________,________, + _______X,X_____X_, + ________,X___X__X, + _______X,_____X__, + __X____X,XXXX____, + ___XXXX_,___X____, + ______X_,___X____, + _____X__,___X____, + ____X___,___X____, + ___X____,__X_____, + __X_____,__X_____, + _X____XX,_X______, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30AD[32] = { /* code 30AD */ + ________,________, + ______X_,________, + ______X_,________, + _______X,________, + _______X,XXXX____, + ___X_XXX,________, + ____X__X,________, + ________,XXXXXX__, + __X__XXX,X_______, + ___XX___,X_______, + ________,X_______, + ________,_X______, + ________,_X______, + ________,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30AE[32] = { /* code 30AE */ + ________,________, + ______X_,______X_, + ______X_,____X__X, + _______X,_____X__, + _______X,XXXX____, + ___X_XXX,________, + ____X__X,________, + ________,XXXXXX__, + __X__XXX,X_______, + ___XX___,X_______, + ________,X_______, + ________,_X______, + ________,_X______, + ________,_X______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30AF[32] = { /* code 30AF */ + ________,________, + ________,________, + _______X,X_______, + ________,XXXXX___, + _______X,____X___, + ______X_,___X____, + _____X__,___X____, + ____X___,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ___XX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B0[32] = { /* code 30B0 */ + ________,________, + ________,______X_, + ______XX,____X__X, + _______X,XXXX_X__, + ______X_,___X____, + _____X__,__X_____, + ____X___,__X_____, + ___X____,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ____X___,________, + __XX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B1[32] = { /* code 30B1 */ + ________,________, + ________,________, + ______X_,________, + ______XX,________, + ______X_,________, + _____X_X,XXXXXX__, + ____X___,_X______, + ___X____,_X______, + ________,_X______, + ________,X_______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B2[32] = { /* code 30B2 */ + ________,________, + ________,________, + ______X_,______X_, + ______XX,____X__X, + ______X_,_____X__, + _____X_X,XXXXX___, + ____X___,_X______, + ___X____,_X______, + ________,_X______, + ________,X_______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B3[32] = { /* code 30B3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___X_XXX,XXXXX___, + ____X___,____X___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,___X____, + ________,___X____, + ____XXXX,XXXXX___, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B4[32] = { /* code 30B4 */ + ________,________, + ________,________, + ________,______X_, + ________,____X__X, + ________,_____X__, + ___X_XXX,XXXXX___, + ____X___,____X___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,___X____, + ________,___X____, + ____XXXX,XXXXX___, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B5[32] = { /* code 30B5 */ + ________,________, + ________,_X______, + ____X___,__X_____, + _____X__,__X_____, + _____X__,__XXXXX_, + _X___XXX,XXX_____, + __XXXX__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + ________,_X______, + ________,_X______, + ________,X_______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B6[32] = { /* code 30B6 */ + ________,________, + ________,_X____X_, + ____X___,__X_X__X, + _____X__,__X__X__, + _____X__,__XXX___, + _X___XXX,XXX_____, + __XXXX__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + ________,_X______, + ________,_X______, + ________,X_______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B7[32] = { /* code 30B7 */ + ________,________, + ________,________, + ____X___,________, + _____XX_,________, + ________,______X_, + ________,_____X__, + ___X____,____X___, + ____XX__,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ___XX_X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B8[32] = { /* code 30B8 */ + ________,________, + ________,_____X__, + ____X___,___X__X_, + _____XX_,____X___, + ________,________, + ________,_____X__, + ___X____,____X___, + ____XX__,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ___XX_X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30B9[32] = { /* code 30B9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,XXXX____, + _____XXX,__X_____, + ________,_X______, + ________,X_______, + _______X,X_______, + ______X_,_X______, + _____X__,__X_____, + ____X___,___XX___, + ___X____,____X___, + _XX_____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30BA[32] = { /* code 30BA */ + ________,________, + ________,______X_, + ________,____X__X, + ________,_____X__, + ____X___,XXXX____, + _____XXX,__X_____, + ________,_X______, + ________,X_______, + _______X,X_______, + ______X_,_X______, + _____X__,__X_____, + ____X___,___XX___, + ___X____,____X___, + _XX_____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30BB[32] = { /* code 30BB */ + ________,________, + ________,________, + ________,________, + ______XX,________, + _______X,________, + _______X,___XXX__, + _______X,XXX__X__, + ______XX,____X___, + __XXXX_X,___X____, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + ________,XXXXXX__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30BC[32] = { /* code 30BC */ + ________,________, + ________,______X_, + ________,____X__X, + ______XX,_____X__, + _______X,________, + _______X,___XXX__, + _______X,XXX__X__, + ______XX,____X___, + __XXXX_X,___X____, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + ________,XXXXXX__, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30BD[32] = { /* code 30BD */ + ________,________, + ________,________, + ________,________, + ________,___X____, + ____X___,____X___, + _____X__,____X___, + ______X_,___X____, + ______X_,___X____, + ________,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30BE[32] = { /* code 30BE */ + ________,________, + ________,______X_, + ________,____X__X, + ________,_____X__, + ________,__X_____, + ___X____,___X____, + ____X___,__X_____, + _____X__,__X_____, + _____X__,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ____X___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30BF[32] = { /* code 30BF */ + ________,________, + ________,________, + ________,X_______, + ________,XXXXX___, + _______X,____X___, + ______X_,___X____, + _____X_X,___X____, + ____X___,X_X_____, + ________,_X______, + ________,_XX_____, + ________,X__X____, + _______X,________, + ______X_,________, + _____X__,________, + ___XX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C0[32] = { /* code 30C0 */ + ________,________, + ________,______X_, + _______X,____X__X, + _______X,XXXX_X__, + ______X_,___X____, + _____X__,__X_____, + ____X_X_,__X_____, + ___X___X,_X______, + ________,X_______, + ________,XX______, + _______X,__X_____, + ______X_,________, + _____X__,________, + ____X___,________, + __XX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C1[32] = { /* code 30C1 */ + ________,________, + ________,________, + ________,_X______, + ________,_XX_____, + _______X,X_______, + _____XX_,X_______, + ________,X_______, + ________,XXXXXX__, + __XXXXXX,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C2[32] = { /* code 30C2 */ + ________,________, + ________,______X_, + ________,_X__X__X, + ________,_XX__X__, + _______X,X_______, + _____XX_,X_______, + ________,X_______, + ________,XXXXXX__, + __XXXXXX,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C3[32] = { /* code 30C3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,___XX___, + _______X,____X___, + ____X___,X___X___, + _____X__,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C4[32] = { /* code 30C4 */ + ________,________, + ________,________, + ________,________, + ______X_,___XX___, + __X____X,____X___, + ___X___X,____X___, + ___X____,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C5[32] = { /* code 30C5 */ + ________,________, + ________,______X_, + ________,____X__X, + _____X__,_XX__X__, + _X____X_,__X_____, + __X___X_,__X_____, + __X_____,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ____X___,________, + ___X____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C6[32] = { /* code 30C6 */ + ________,________, + ________,________, + ____X___,________, + _____XXX,XXXX____, + ________,________, + ________,________, + __X_XXXX,XXXXXX__, + ___X____,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C7[32] = { /* code 30C7 */ + ________,________, + ________,______X_, + ___X____,____X__X, + ____XXXX,XXX__X__, + ________,________, + ________,________, + _X_XXXXX,XXXXX___, + __X____X,________, + _______X,________, + _______X,________, + _______X,________, + _______X,________, + ______X_,________, + ______X_,________, + _____X__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C8[32] = { /* code 30C8 */ + ________,________, + _____X__,________, + ______XX,________, + ______X_,________, + ______X_,________, + ______X_,________, + ______XX,________, + ______X_,XX______, + ______X_,__X_____, + ______X_,________, + ______X_,________, + ______X_,________, + ______X_,________, + ______X_,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30C9[32] = { /* code 30C9 */ + ________,________, + _____X__,_____X__, + ______XX,___X__X_, + ______X_,____X___, + ______X_,________, + ______X_,________, + ______XX,________, + ______X_,XX______, + ______X_,__X_____, + ______X_,________, + ______X_,________, + ______X_,________, + ______X_,________, + ______X_,________, + ______X_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30CA[32] = { /* code 30CA */ + ________,________, + _______X,________, + ________,XX______, + ________,X_______, + ________,X_______, + ________,XXXXXX__, + __XXXXXX,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,________, + _____X__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30CB[32] = { /* code 30CB */ + ________,________, + ________,________, + ________,________, + ________,________, + ___X____,________, + ____XXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + _X_XXXXX,XXXXXX__, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30CC[32] = { /* code 30CC */ + ________,________, + ________,________, + ________,___X____, + _____XXX,XXXXX___, + ________,___X____, + ________,__X_____, + ________,__X_____, + ______X_,_X______, + _______X,_X______, + ________,X_______, + _______X,_X______, + ______X_,__X_____, + _____X__,________, + ____X___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30CD[32] = { /* code 30CD */ + ________,________, + _______X,________, + ________,XX______, + ________,________, + ________,XXX_____, + ____XXXX,_X______, + ________,X_______, + _______X,________, + ______XX,XX______, + _____X_X,__XX____, + ____X__X,____XX__, + __XX___X,________, + _______X,________, + _______X,________, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30CE[32] = { /* code 30CE */ + ________,________, + ________,________, + ________,___XX___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ___XX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30CF[32] = { /* code 30CF */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,_X______, + _____XX_,__X_____, + _____X__,___X____, + ____X___,____X___, + ___X____,_____X__, + __X_____,_____X__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D0[32] = { /* code 30D0 */ + ________,________, + ________,________, + ________,_____X__, + ________,___X__X_, + ________,____X___, + ____X___,_X______, + _____XX_,__X_____, + _____X__,___X____, + ____X___,____X___, + ___X____,_____X__, + __X_____,_____X__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D1[32] = { /* code 30D1 */ + ________,________, + ________,________, + ________,____X___, + ________,___X_X__, + ________,____X___, + ____X___,_X______, + _____XX_,__X_____, + _____X__,___X____, + ____X___,____X___, + ___X____,_____X__, + __X_____,_____X__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D2[32] = { /* code 30D2 */ + ________,________, + ________,________, + ___X____,________, + ____XX__,________, + ____X___,________, + ____X___,___X____, + ____X___,_XX_____, + ____XXXX,X_______, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D3[32] = { /* code 30D3 */ + ________,________, + ________,________, + ___X____,_____X__, + ____XX__,___X__X_, + ____X___,____X___, + ____X___,__X_____, + ____X___,XX______, + ____XXXX,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D4[32] = { /* code 30D4 */ + ________,________, + ________,________, + ___X____,_____X__, + ____XX__,____X_X_, + ____X___,_____X__, + ____X___,__X_____, + ____X___,XX______, + ____XXXX,________, + ____X___,________, + ____X___,________, + ____X___,________, + ____X___,________, + _____X__,________, + ______XX,XXXXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D5[32] = { /* code 30D5 */ + ________,________, + ________,________, + ________,________, + ________,____X___, + __X_XXXX,XXXXX___, + ___X____,____X___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D6[32] = { /* code 30D6 */ + ________,________, + ________,______X_, + ________,____X__X, + ________,_____X__, + __X_XXXX,XXXXX___, + ___X____,____X___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D7[32] = { /* code 30D7 */ + ________,________, + ________,_____X__, + ________,____X_X_, + ________,_____X__, + __X_XXXX,XXXXX___, + ___X____,____X___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D8[32] = { /* code 30D8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____X___,X_______, + _XXX____,_XX_____, + ________,___X____, + ________,____X___, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30D9[32] = { /* code 30D9 */ + ________,________, + ________,________, + ________,________, + ________,_____X__, + ________,___X__X_, + ________,____X___, + _____XXX,________, + ____X___,X_______, + _XXX____,_XX_____, + ________,___X____, + ________,____X___, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30DA[32] = { /* code 30DA */ + ________,________, + ________,________, + ________,________, + ________,____X___, + ________,___X_X__, + ________,____X___, + _____XXX,________, + ____X___,X_______, + _XXX____,_XX_____, + ________,___X____, + ________,____X___, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30DB[32] = { /* code 30DB */ + ________,________, + ________,________, + _______X,________, + ________,X_______, + ________,X_______, + __X_XXXX,XXXXXX__, + ___X____,X_______, + ________,X_______, + ____X___,X__X____, + ____X___,X___X___, + ___X____,X____X__, + __X___X_,X____X__, + _______X,X_______, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30DC[32] = { /* code 30DC */ + ________,________, + ________,______X_, + _______X,____X__X, + ________,X____X__, + ________,X_______, + __X_XXXX,XXXXXX__, + ___X____,X_______, + ________,X_______, + ____X___,X__X____, + ____X___,X___X___, + ___X____,X____X__, + __X___X_,X____X__, + _______X,X_______, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30DD[32] = { /* code 30DD */ + ________,________, + ________,_____X__, + _______X,____X_X_, + ________,X____X__, + ________,X_______, + __X_XXXX,XXXXXX__, + ___X____,X_______, + ________,X_______, + ____X___,X__X____, + ____X___,X___X___, + ___X____,X____X__, + __X___X_,X____X__, + _______X,X_______, + ________,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30DE[32] = { /* code 30DE */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X__XXXX,XXXXXX__, + __XX____,____X___, + ________,___X____, + ______X_,__X_____, + _______X,_X______, + ________,X_______, + ________,_X______, + ________,_X______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30DF[32] = { /* code 30DF */ + ________,________, + ________,________, + ______X_,________, + _______X,X_______, + ________,_XX_____, + ________,________, + _____X__,________, + ______XX,________, + ________,XX______, + ________,________, + ________,________, + _____X__,________, + ______XX,________, + ________,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E0[32] = { /* code 30E0 */ + ________,________, + ________,________, + ________,________, + _______X,________, + ________,XX______, + ________,X_______, + _______X,________, + _______X,________, + ______X_,__X_____, + ______X_,___X____, + _____X__,____X___, + ____X___,_XXXXX__, + __XXXXXX,X____X__, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E1[32] = { /* code 30E1 */ + ________,________, + ________,________, + ________,__XX____, + ________,___X____, + ________,__X_____, + ______X_,__X_____, + _______X,_X______, + ________,XX______, + ________,X_X_____, + _______X,___X____, + ______X_,________, + _____X__,________, + ____X___,________, + ___X____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E2[32] = { /* code 30E2 */ + ________,________, + ________,________, + ________,________, + _______X,XXXX____, + ___X_XXX,________, + ____X__X,________, + _______X,________, + _______X,XXXXX___, + __X_XXXX,________, + ___X___X,________, + _______X,________, + _______X,________, + ________,XXXXXX__, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E3[32] = { /* code 30E3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______X_,________, + _______X,__XXX___, + _______X,XX__XX__, + ___XXXXX,___X____, + ________,X_X_____, + ________,X_______, + ________,X_______, + ________,X_______, + ________,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E4[32] = { /* code 30E4 */ + ________,________, + ________,________, + _____X__,________, + ______X_,________, + ______X_,___XXX__, + ______X_,XXX___X_, + ______XX,_____X__, + __XXXX_X,____X___, + _______X,________, + ________,X_______, + ________,X_______, + ________,X_______, + ________,_X______, + ________,_X______, + ________,_X______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E5[32] = { /* code 30E5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ________,_X______, + ________,_X______, + ________,_X______, + __X_XXXX,XXXXX___, + ___X____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E6[32] = { /* code 30E6 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXXX____, + ________,__X_____, + ________,__X_____, + ________,__X_____, + ________,__X_____, + ________,__X_____, + __X_XXXX,XXXXXXX_, + ___X____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E7[32] = { /* code 30E7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,________, + _____XXX,XXXX____, + ________,__X_____, + ____X___,__X_____, + _____XXX,XXX_____, + ________,__X_____, + ________,__X_____, + _____XXX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E8[32] = { /* code 30E8 */ + ________,________, + ________,________, + ________,________, + ____X___,________, + _____XXX,XXXXX___, + ________,___X____, + ________,___X____, + ____X___,___X____, + _____XXX,XXXX____, + ________,___X____, + ________,___X____, + ________,___X____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30E9[32] = { /* code 30E9 */ + ________,________, + ____X___,________, + _____XXX,XXXX____, + ________,________, + ___X____,________, + ____XXXX,XXXXX___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + ____XX__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30EA[32] = { /* code 30EA */ + ________,________, + ____X___,_X______, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + _____X__,__X_____, + ________,_X______, + ________,_X______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30EB[32] = { /* code 30EB */ + ________,________, + ________,________, + ________,________, + ________,X_______, + ____X___,_X______, + _____X__,_X______, + _____X__,_X______, + _____X__,_X______, + _____X__,_X____X_, + ____X___,_X___X__, + ____X___,_X_XX___, + ___X____,_XX_____, + __X_____,_X______, + _X______,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30EC[32] = { /* code 30EC */ + ________,________, + ________,________, + ___X____,________, + ____XX__,________, + ____X___,________, + ____X___,________, + ____X___,_____X__, + ____X___,____X___, + ____X___,__XX____, + ____X___,_X______, + ____X__X,X_______, + ____XXX_,________, + ____X___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30ED[32] = { /* code 30ED */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ____XXXX,XXXXX___, + _____X__,____X___, + _____X__,____X___, + _____X__,____X___, + _____X__,___X____, + _____X__,___X____, + _____XXX,XXXXX___, + _____X__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30EE[32] = { /* code 30EE */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,___X____, + ____XXXX,XXXXX___, + _____X__,___X____, + _____X__,___X____, + _____X__,___X____, + _____X__,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30EF[32] = { /* code 30EF */ + ________,________, + ________,________, + ________,____X___, + ___XXXXX,XXXXXX__, + ____X___,____X___, + ____X___,____X___, + ____X___,___X____, + ____X___,___X____, + ________,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F0[32] = { /* code 30F0 */ + ________,________, + ________,XX______, + ________,_XX_____, + ________,_X______, + ___X____,_X______, + ____XXXX,XXXXX___, + ________,_X______, + _____X__,_X______, + __X__X__,_X______, + ___XXXXX,XXXXXX__, + ________,_X______, + ________,_X______, + ________,_X______, + ________,_X______, + ________,_X______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F1[32] = { /* code 30F1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___X_XXX,XXXX____, + ____X___,__X_____, + ______X_,_X______, + _______X,X_______, + _______X,________, + _______X,________, + _______X,________, + __XXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F2[32] = { /* code 30F2 */ + ________,________, + ________,________, + ____X___,____X___, + _____XXX,XXXXXX__, + ________,____X___, + ________,____X___, + ___X____,___X____, + ____XXXX,XXXX____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + ______X_,________, + _____X__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F3[32] = { /* code 30F3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___X____,________, + ____XXX_,_____X__, + ________,____X___, + ________,___X____, + ________,__X_____, + ________,_X______, + _______X,X_______, + __X__XX_,________, + ___XX___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F4[32] = { /* code 30F4 */ + ________,________, + ________,______X_, + _____XX_,____X__X, + _______X,_____X__, + _______X,___X____, + __XXXXXX,XXXXX___, + ___X____,___X____, + ___X____,___X____, + ___X____,___X____, + ___X____,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + _____XX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F5[32] = { /* code 30F5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,X_______, + ________,X_______, + ____X_XX,XXXX____, + _____X__,X__X____, + ________,X__X____, + _______X,___X____, + _______X,___X____, + ______X_,___X____, + _____X__,X_X_____, + ___XX___,_X______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont16_HK_30F6[32] = { /* code 30F6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + _____X__,________, + _____XXX,XXXX____, + _____X__,X_______, + ____X___,X_______, + ___X____,X_______, + _______X,________, + _______X,________, + ______X_,________, + _____X__,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16_HK_CharInfo[169] = { + { 16, 16, 2, acFont16_HK_3041 } /* code 3041 */ + ,{ 16, 16, 2, acFont16_HK_3042 } /* code 3042 */ + ,{ 16, 16, 2, acFont16_HK_3043 } /* code 3043 */ + ,{ 16, 16, 2, acFont16_HK_3044 } /* code 3044 */ + ,{ 16, 16, 2, acFont16_HK_3045 } /* code 3045 */ + ,{ 16, 16, 2, acFont16_HK_3046 } /* code 3046 */ + ,{ 16, 16, 2, acFont16_HK_3047 } /* code 3047 */ + ,{ 16, 16, 2, acFont16_HK_3048 } /* code 3048 */ + ,{ 16, 16, 2, acFont16_HK_3049 } /* code 3049 */ + ,{ 16, 16, 2, acFont16_HK_304A } /* code 304A */ + ,{ 16, 16, 2, acFont16_HK_304B } /* code 304B */ + ,{ 16, 16, 2, acFont16_HK_304C } /* code 304C */ + ,{ 16, 16, 2, acFont16_HK_304D } /* code 304D */ + ,{ 16, 16, 2, acFont16_HK_304E } /* code 304E */ + ,{ 16, 16, 2, acFont16_HK_304F } /* code 304F */ + ,{ 16, 16, 2, acFont16_HK_3050 } /* code 3050 */ + ,{ 16, 16, 2, acFont16_HK_3051 } /* code 3051 */ + ,{ 16, 16, 2, acFont16_HK_3052 } /* code 3052 */ + ,{ 16, 16, 2, acFont16_HK_3053 } /* code 3053 */ + ,{ 16, 16, 2, acFont16_HK_3054 } /* code 3054 */ + ,{ 16, 16, 2, acFont16_HK_3055 } /* code 3055 */ + ,{ 16, 16, 2, acFont16_HK_3056 } /* code 3056 */ + ,{ 16, 16, 2, acFont16_HK_3057 } /* code 3057 */ + ,{ 16, 16, 2, acFont16_HK_3058 } /* code 3058 */ + ,{ 16, 16, 2, acFont16_HK_3059 } /* code 3059 */ + ,{ 16, 16, 2, acFont16_HK_305A } /* code 305A */ + ,{ 16, 16, 2, acFont16_HK_305B } /* code 305B */ + ,{ 16, 16, 2, acFont16_HK_305C } /* code 305C */ + ,{ 16, 16, 2, acFont16_HK_305D } /* code 305D */ + ,{ 16, 16, 2, acFont16_HK_305E } /* code 305E */ + ,{ 16, 16, 2, acFont16_HK_305F } /* code 305F */ + ,{ 16, 16, 2, acFont16_HK_3060 } /* code 3060 */ + ,{ 16, 16, 2, acFont16_HK_3061 } /* code 3061 */ + ,{ 16, 16, 2, acFont16_HK_3062 } /* code 3062 */ + ,{ 16, 16, 2, acFont16_HK_3063 } /* code 3063 */ + ,{ 16, 16, 2, acFont16_HK_3064 } /* code 3064 */ + ,{ 16, 16, 2, acFont16_HK_3065 } /* code 3065 */ + ,{ 16, 16, 2, acFont16_HK_3066 } /* code 3066 */ + ,{ 16, 16, 2, acFont16_HK_3067 } /* code 3067 */ + ,{ 16, 16, 2, acFont16_HK_3068 } /* code 3068 */ + ,{ 16, 16, 2, acFont16_HK_3069 } /* code 3069 */ + ,{ 16, 16, 2, acFont16_HK_306A } /* code 306A */ + ,{ 16, 16, 2, acFont16_HK_306B } /* code 306B */ + ,{ 16, 16, 2, acFont16_HK_306C } /* code 306C */ + ,{ 16, 16, 2, acFont16_HK_306D } /* code 306D */ + ,{ 16, 16, 2, acFont16_HK_306E } /* code 306E */ + ,{ 16, 16, 2, acFont16_HK_306F } /* code 306F */ + ,{ 16, 16, 2, acFont16_HK_3070 } /* code 3070 */ + ,{ 16, 16, 2, acFont16_HK_3071 } /* code 3071 */ + ,{ 16, 16, 2, acFont16_HK_3072 } /* code 3072 */ + ,{ 16, 16, 2, acFont16_HK_3073 } /* code 3073 */ + ,{ 16, 16, 2, acFont16_HK_3074 } /* code 3074 */ + ,{ 16, 16, 2, acFont16_HK_3075 } /* code 3075 */ + ,{ 16, 16, 2, acFont16_HK_3076 } /* code 3076 */ + ,{ 16, 16, 2, acFont16_HK_3077 } /* code 3077 */ + ,{ 16, 16, 2, acFont16_HK_3078 } /* code 3078 */ + ,{ 16, 16, 2, acFont16_HK_3079 } /* code 3079 */ + ,{ 16, 16, 2, acFont16_HK_307A } /* code 307A */ + ,{ 16, 16, 2, acFont16_HK_307B } /* code 307B */ + ,{ 16, 16, 2, acFont16_HK_307C } /* code 307C */ + ,{ 16, 16, 2, acFont16_HK_307D } /* code 307D */ + ,{ 16, 16, 2, acFont16_HK_307E } /* code 307E */ + ,{ 16, 16, 2, acFont16_HK_307F } /* code 307F */ + ,{ 16, 16, 2, acFont16_HK_3080 } /* code 3080 */ + ,{ 16, 16, 2, acFont16_HK_3081 } /* code 3081 */ + ,{ 16, 16, 2, acFont16_HK_3082 } /* code 3082 */ + ,{ 16, 16, 2, acFont16_HK_3083 } /* code 3083 */ + ,{ 16, 16, 2, acFont16_HK_3084 } /* code 3084 */ + ,{ 16, 16, 2, acFont16_HK_3085 } /* code 3085 */ + ,{ 16, 16, 2, acFont16_HK_3086 } /* code 3086 */ + ,{ 16, 16, 2, acFont16_HK_3087 } /* code 3087 */ + ,{ 16, 16, 2, acFont16_HK_3088 } /* code 3088 */ + ,{ 16, 16, 2, acFont16_HK_3089 } /* code 3089 */ + ,{ 16, 16, 2, acFont16_HK_308A } /* code 308A */ + ,{ 16, 16, 2, acFont16_HK_308B } /* code 308B */ + ,{ 16, 16, 2, acFont16_HK_308C } /* code 308C */ + ,{ 16, 16, 2, acFont16_HK_308D } /* code 308D */ + ,{ 16, 16, 2, acFont16_HK_308E } /* code 308E */ + ,{ 16, 16, 2, acFont16_HK_308F } /* code 308F */ + ,{ 16, 16, 2, acFont16_HK_3090 } /* code 3090 */ + ,{ 16, 16, 2, acFont16_HK_3091 } /* code 3091 */ + ,{ 16, 16, 2, acFont16_HK_3092 } /* code 3092 */ + ,{ 16, 16, 2, acFont16_HK_3093 } /* code 3093 */ + ,{ 16, 16, 2, acFont16_HK_30A1 } /* code 30A1 */ + ,{ 16, 16, 2, acFont16_HK_30A2 } /* code 30A2 */ + ,{ 16, 16, 2, acFont16_HK_30A3 } /* code 30A3 */ + ,{ 16, 16, 2, acFont16_HK_30A4 } /* code 30A4 */ + ,{ 16, 16, 2, acFont16_HK_30A5 } /* code 30A5 */ + ,{ 16, 16, 2, acFont16_HK_30A6 } /* code 30A6 */ + ,{ 16, 16, 2, acFont16_HK_30A7 } /* code 30A7 */ + ,{ 16, 16, 2, acFont16_HK_30A8 } /* code 30A8 */ + ,{ 16, 16, 2, acFont16_HK_30A9 } /* code 30A9 */ + ,{ 16, 16, 2, acFont16_HK_30AA } /* code 30AA */ + ,{ 16, 16, 2, acFont16_HK_30AB } /* code 30AB */ + ,{ 16, 16, 2, acFont16_HK_30AC } /* code 30AC */ + ,{ 16, 16, 2, acFont16_HK_30AD } /* code 30AD */ + ,{ 16, 16, 2, acFont16_HK_30AE } /* code 30AE */ + ,{ 16, 16, 2, acFont16_HK_30AF } /* code 30AF */ + ,{ 16, 16, 2, acFont16_HK_30B0 } /* code 30B0 */ + ,{ 16, 16, 2, acFont16_HK_30B1 } /* code 30B1 */ + ,{ 16, 16, 2, acFont16_HK_30B2 } /* code 30B2 */ + ,{ 16, 16, 2, acFont16_HK_30B3 } /* code 30B3 */ + ,{ 16, 16, 2, acFont16_HK_30B4 } /* code 30B4 */ + ,{ 16, 16, 2, acFont16_HK_30B5 } /* code 30B5 */ + ,{ 16, 16, 2, acFont16_HK_30B6 } /* code 30B6 */ + ,{ 16, 16, 2, acFont16_HK_30B7 } /* code 30B7 */ + ,{ 16, 16, 2, acFont16_HK_30B8 } /* code 30B8 */ + ,{ 16, 16, 2, acFont16_HK_30B9 } /* code 30B9 */ + ,{ 16, 16, 2, acFont16_HK_30BA } /* code 30BA */ + ,{ 16, 16, 2, acFont16_HK_30BB } /* code 30BB */ + ,{ 16, 16, 2, acFont16_HK_30BC } /* code 30BC */ + ,{ 16, 16, 2, acFont16_HK_30BD } /* code 30BD */ + ,{ 16, 16, 2, acFont16_HK_30BE } /* code 30BE */ + ,{ 16, 16, 2, acFont16_HK_30BF } /* code 30BF */ + ,{ 16, 16, 2, acFont16_HK_30C0 } /* code 30C0 */ + ,{ 16, 16, 2, acFont16_HK_30C1 } /* code 30C1 */ + ,{ 16, 16, 2, acFont16_HK_30C2 } /* code 30C2 */ + ,{ 16, 16, 2, acFont16_HK_30C3 } /* code 30C3 */ + ,{ 16, 16, 2, acFont16_HK_30C4 } /* code 30C4 */ + ,{ 16, 16, 2, acFont16_HK_30C5 } /* code 30C5 */ + ,{ 16, 16, 2, acFont16_HK_30C6 } /* code 30C6 */ + ,{ 16, 16, 2, acFont16_HK_30C7 } /* code 30C7 */ + ,{ 16, 16, 2, acFont16_HK_30C8 } /* code 30C8 */ + ,{ 16, 16, 2, acFont16_HK_30C9 } /* code 30C9 */ + ,{ 16, 16, 2, acFont16_HK_30CA } /* code 30CA */ + ,{ 16, 16, 2, acFont16_HK_30CB } /* code 30CB */ + ,{ 16, 16, 2, acFont16_HK_30CC } /* code 30CC */ + ,{ 16, 16, 2, acFont16_HK_30CD } /* code 30CD */ + ,{ 16, 16, 2, acFont16_HK_30CE } /* code 30CE */ + ,{ 16, 16, 2, acFont16_HK_30CF } /* code 30CF */ + ,{ 16, 16, 2, acFont16_HK_30D0 } /* code 30D0 */ + ,{ 16, 16, 2, acFont16_HK_30D1 } /* code 30D1 */ + ,{ 16, 16, 2, acFont16_HK_30D2 } /* code 30D2 */ + ,{ 16, 16, 2, acFont16_HK_30D3 } /* code 30D3 */ + ,{ 16, 16, 2, acFont16_HK_30D4 } /* code 30D4 */ + ,{ 16, 16, 2, acFont16_HK_30D5 } /* code 30D5 */ + ,{ 16, 16, 2, acFont16_HK_30D6 } /* code 30D6 */ + ,{ 16, 16, 2, acFont16_HK_30D7 } /* code 30D7 */ + ,{ 16, 16, 2, acFont16_HK_30D8 } /* code 30D8 */ + ,{ 16, 16, 2, acFont16_HK_30D9 } /* code 30D9 */ + ,{ 16, 16, 2, acFont16_HK_30DA } /* code 30DA */ + ,{ 16, 16, 2, acFont16_HK_30DB } /* code 30DB */ + ,{ 16, 16, 2, acFont16_HK_30DC } /* code 30DC */ + ,{ 16, 16, 2, acFont16_HK_30DD } /* code 30DD */ + ,{ 16, 16, 2, acFont16_HK_30DE } /* code 30DE */ + ,{ 16, 16, 2, acFont16_HK_30DF } /* code 30DF */ + ,{ 16, 16, 2, acFont16_HK_30E0 } /* code 30E0 */ + ,{ 16, 16, 2, acFont16_HK_30E1 } /* code 30E1 */ + ,{ 16, 16, 2, acFont16_HK_30E2 } /* code 30E2 */ + ,{ 16, 16, 2, acFont16_HK_30E3 } /* code 30E3 */ + ,{ 16, 16, 2, acFont16_HK_30E4 } /* code 30E4 */ + ,{ 16, 16, 2, acFont16_HK_30E5 } /* code 30E5 */ + ,{ 16, 16, 2, acFont16_HK_30E6 } /* code 30E6 */ + ,{ 16, 16, 2, acFont16_HK_30E7 } /* code 30E7 */ + ,{ 16, 16, 2, acFont16_HK_30E8 } /* code 30E8 */ + ,{ 16, 16, 2, acFont16_HK_30E9 } /* code 30E9 */ + ,{ 16, 16, 2, acFont16_HK_30EA } /* code 30EA */ + ,{ 16, 16, 2, acFont16_HK_30EB } /* code 30EB */ + ,{ 16, 16, 2, acFont16_HK_30EC } /* code 30EC */ + ,{ 16, 16, 2, acFont16_HK_30ED } /* code 30ED */ + ,{ 16, 16, 2, acFont16_HK_30EE } /* code 30EE */ + ,{ 16, 16, 2, acFont16_HK_30EF } /* code 30EF */ + ,{ 16, 16, 2, acFont16_HK_30F0 } /* code 30F0 */ + ,{ 16, 16, 2, acFont16_HK_30F1 } /* code 30F1 */ + ,{ 16, 16, 2, acFont16_HK_30F2 } /* code 30F2 */ + ,{ 16, 16, 2, acFont16_HK_30F3 } /* code 30F3 */ + ,{ 16, 16, 2, acFont16_HK_30F4 } /* code 30F4 */ + ,{ 16, 16, 2, acFont16_HK_30F5 } /* code 30F5 */ + ,{ 16, 16, 2, acFont16_HK_30F6 } /* code 30F6 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_HK_Prop2 = { + 0x30A1 /* first character */ + ,0x30F6 /* last character */ + ,&GUI_Font16_HK_CharInfo[83] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_HK_Prop1 = { + 0x3041 /* first character */ + ,0x3093 /* last character */ + ,&GUI_Font16_HK_CharInfo[0] /* address of first character */ + ,&GUI_Font16_HK_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font16_HK = { + GUI_FONTTYPE_PROP /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font16_HK_Prop1} + , 13, 7, 10 +}; + + diff --git a/User/system/lib/lcd/gui/Font/F24B_1.c b/User/system/lib/lcd/gui/Font/F24B_1.c new file mode 100644 index 0000000..4f4db48 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F24B_1.c @@ -0,0 +1,2642 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F24B_1.C +Purpose : ISO 8859-1, West European Character Set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont24B_1_00A0[ 24] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A1[ 24] = { /* code 00A1 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + ________, + ___X____, + ___X____, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A2[ 48] = { /* code 00A2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,_X______, + ________,_X______, + ________,X_______, + ________,X_______, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX__X,XXX_____, + _XXX___X,_XXX____, + _XXX__X_,________, + _XXX__X_,________, + _XXX__X_,________, + _XXXXX__,_XXX____, + __XXXX__,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ____X___,________, + ____X___,________, + ___X____,________, + ___X____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A3[ 48] = { /* code 00A3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + _XXXX__X,XXX_____, + _XXX____,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + XXXXXXXX,________, + XXXXXXXX,________, + __XXX___,________, + __XXX___,________, + _XXX____,________, + XXXXXX__,_X______, + XXXXXXXX,XXX_____, + _X____XX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A4[ 48] = { /* code 00A4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,X_______, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + __X_____,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A5[ 48] = { /* code 00A5 */ + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,XXX_____, + _XXX___X,XX______, + _XXX___X,XX______, + __XXX_XX,X_______, + __XXX_XX,X_______, + __XXX_XX,X_______, + ___XXXXX,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ____XXX_,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A6[ 24] = { /* code 00A6 */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A7[ 48] = { /* code 00A7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,X_______, + __XXX__X,XX______, + __XXX__X,XX______, + __XXXX__,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXX_XXX,XX______, + _XXX___X,XXX_____, + _XXX____,XXX_____, + _XXXX___,XXX_____, + __XXXXX_,XXX_____, + ___XXXXX,XX______, + _____XXX,X_______, + ______XX,XX______, + __XXX__X,XX______, + __XXX__X,XX______, + ___XXXXX,X_______, + ____XXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A8[ 24] = { /* code 00A8 */ + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00A9[ 48] = { /* code 00A9 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + _XXX____,___XXX__, + _XX__XXX,X___XX__, + XX__XX__,XX___XX_, + XX__XX__,_____XX_, + XX__XX__,_____XX_, + XX__XX__,_____XX_, + XX__XX__,XX___XX_, + _XX__XXX,X___XX__, + _XXX____,___XXX__, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00AA[ 24] = { /* code 00AA */ + ________, + ________, + ________, + ________, + _XXXXX__, + XXXXXXX_, + _____XX_, + __XXXXX_, + XXXX_XX_, + XX___XX_, + XXXXXXX_, + _XXX_XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00AB[ 48] = { /* code 00AB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,_XX_____, + ___XX___,XX______, + __XXX__X,XX______, + __XX___X,X_______, + _XXX__XX,X_______, + _XXX__XX,X_______, + __XX___X,X_______, + __XXX__X,XX______, + ___XX___,XX______, + ____XX__,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00AC[ 48] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00AD[ 24] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00AE[ 48] = { /* code 00AE */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + _XXX____,___XXX__, + _XX__XXX,X___XX__, + XX___XX_,XX___XX_, + XX___XX_,XX___XX_, + XX___XXX,X____XX_, + XX___XX_,XX___XX_, + XX___XX_,XX___XX_, + _XX__XX_,XX__XX__, + _XXX____,___XXX__, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00AF[ 48] = { /* code 00AF */ + ________,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B0[ 24] = { /* code 00B0 */ + ________, + ________, + ________, + ________, + ___XXX__, + __XXXXX_, + _XX___XX, + _XX___XX, + _XX___XX, + __XXXXX_, + ___XXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B1[ 48] = { /* code 00B1 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B2[ 24] = { /* code 00B2 */ + ________, + ________, + ________, + ________, + _XXXX___, + XXXXXX__, + XX__XX__, + ____XX__, + ___XX___, + __XX____, + _XXXXX__, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B3[ 24] = { /* code 00B3 */ + ________, + ________, + ________, + ________, + __XXXX__, + _XXXXXX_, + _XX__XX_, + ___XXX__, + _____XX_, + _XX__XX_, + _XXXXXX_, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B4[ 24] = { /* code 00B4 */ + ________, + ________, + ________, + ________, + ___XXX__, + ___XX___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B5[ 48] = { /* code 00B5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XXX_____, + _XXXXXXX,XXX_____, + _XXX_XX_,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B6[ 48] = { /* code 00B6 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + _XXXXXXX,XXX_____, + XXXXXX__,XX______, + XXXXXX__,XX______, + XXXXXX__,XX______, + XXXXXX__,XX______, + _XXXXX__,XX______, + __XXXX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B7[ 24] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B8[ 24] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXX___, + ____XX__, + ____XX__, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00B9[ 24] = { /* code 00B9 */ + ________, + ________, + ________, + ________, + ___XX___, + __XXX___, + _XXXX___, + _X_XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00BA[ 24] = { /* code 00BA */ + ________, + ________, + ________, + ________, + ___XXX__, + __XXXXX_, + _XX___XX, + _XX___XX, + _XX___XX, + _XX___XX, + __XXXXX_, + ___XXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00BB[ 48] = { /* code 00BB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX___XX,________, + __XX___X,X_______, + __XXX__X,XX______, + ___XX___,XX______, + ___XXX__,XXX_____, + ___XXX__,XXX_____, + ___XX___,XX______, + __XXX__X,XX______, + __XX___X,X_______, + _XX___XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00BC[ 72] = { /* code 00BC */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XX___,____XX__,________, + __XXX___,___XXX__,________, + _XXXX___,___XX___,________, + _X_XX___,__XX____,________, + ___XX___,__XX____,________, + ___XX___,_XX_____,________, + ___XX___,XX______,________, + ___XX___,XX_____X,X_______, + _______X,X_____XX,X_______, + ______XX,X____X_X,X_______, + ______XX,____X__X,X_______, + _____XX_,___XXXXX,XX______, + ____XXX_,___XXXXX,XX______, + ____XX__,_______X,X_______, + ___XX___,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00BD[ 72] = { /* code 00BD */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XX___,____XX__,________, + __XXX___,___XX___,________, + _XXXX___,__XXX___,________, + _X_XX___,__XX____,________, + ___XX___,_XX_____,________, + ___XX___,_XX_____,________, + ___XX___,XX______,________, + ___XX__X,XX__XXXX,________, + _______X,X__XXXXX,X_______, + ______XX,___XX__X,X_______, + ______XX,_______X,X_______, + _____XX_,______XX,________, + ____XXX_,_____XX_,________, + ____XX__,____XXXX,X_______, + ___XX___,___XXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00BE[ 72] = { /* code 00BE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXX___,____XX__,________, + XXXXXX__,____XX__,________, + XX__XX__,___XX___,________, + __XXX___,__XXX___,________, + ____XX__,__XX____,________, + XX__XX__,_XX_____,________, + XXXXXX__,XXX_____,________, + _XXXX___,XX_____X,X_______, + _______X,X_____XX,X_______, + ______XX,X____X_X,X_______, + ______XX,____X__X,X_______, + _____XX_,___XXXXX,XX______, + _____XX_,___XXXXX,XX______, + ____XX__,_______X,X_______, + ___XX___,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00BF[ 48] = { /* code 00BF */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + _____XXX,________, + _____XXX,________, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + _XXXX___,________, + _XXX____,________, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C0[ 48] = { /* code 00C0 */ + _____XXX,________, + ______XX,________, + _______X,X_______, + ________,________, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C1[ 48] = { /* code 00C1 */ + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C2[ 48] = { /* code 00C2 */ + ______XX,X_______, + _____XX_,XX______, + ____XX__,_XX_____, + ________,________, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C3[ 48] = { /* code 00C3 */ + _____XXX,__X_____, + ____XXXX,XXX_____, + ____X__X,XX______, + ________,________, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C4[ 48] = { /* code 00C4 */ + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ________,________, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C5[ 48] = { /* code 00C5 */ + ________,________, + _______X,X_______, + ______X_,_X______, + ______X_,_X______, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C6[ 72] = { /* code 00C6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,XXXX____, + _____XXX,_XXXXXXX,XXXX____, + ____XXX_,_XXX____,________, + ____XXX_,_XXX____,________, + ___XXX__,_XXXXXXX,XXX_____, + ___XXX__,_XXXXXXX,XXX_____, + __XXXX__,_XXXXXXX,XXX_____, + __XXXXXX,XXXX____,________, + __XXXXXX,XXXX____,________, + _XXXXXXX,XXXX____,________, + _XXX____,_XXX____,________, + XXX_____,_XXXXXXX,XXXX____, + XXX_____,_XXXXXXX,XXXX____, + XX______,_XXXXXXX,XXXX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C7[ 48] = { /* code 00C7 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,__XXXX__, + _XXXX___,___XX___, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXX___,___XX___, + __XXXX__,__XXXX__, + __XXXXXX,XXXXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + _____XXX,X_______, + ________,XX______, + ________,XX______, + ____XXXX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C8[ 48] = { /* code 00C8 */ + _____XXX,________, + ______XX,________, + _______X,X_______, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00C9[ 48] = { /* code 00C9 */ + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00CA[ 48] = { /* code 00CA */ + ______XX,X_______, + _____XX_,XX______, + ____XX__,_XX_____, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00CB[ 48] = { /* code 00CB */ + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00CC[ 24] = { /* code 00CC */ + XXX_____, + _XX_____, + __XX____, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00CD[ 24] = { /* code 00CD */ + __XXX___, + __XX____, + _XX_____, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00CE[ 24] = { /* code 00CE */ + _XXX____, + XX_XX___, + X___X___, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00CF[ 24] = { /* code 00CF */ + ________, + X___X___, + X___X___, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D0[ 48] = { /* code 00D0 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXXX__, + __XXX___,___XXX__, + XXXXXXXX,___XXX__, + XXXXXXXX,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D1[ 48] = { /* code 00D1 */ + _____XXX,__X_____, + ____XXXX,XXX_____, + ____X__X,XX______, + ________,________, + _XXX____,__XXX___, + _XXXX___,__XXX___, + _XXXX___,__XXX___, + _XXXXX__,__XXX___, + _XXXXXX_,__XXX___, + _XXX_XX_,__XXX___, + _XXX_XXX,__XXX___, + _XXX__XX,__XXX___, + _XXX__XX,X_XXX___, + _XXX___X,X_XXX___, + _XXX___X,XXXXX___, + _XXX____,XXXXX___, + _XXX____,XXXXX___, + _XXX____,_XXXX___, + _XXX____,__XXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D2[ 48] = { /* code 00D2 */ + ______XX,X_______, + _______X,X_______, + ________,XX______, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXXX___,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D3[ 48] = { /* code 00D3 */ + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXXX___,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D4[ 48] = { /* code 00D4 */ + _______X,XX______, + ______XX,_XX_____, + _____XX_,__XX____, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXXX___,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D5[ 48] = { /* code 00D5 */ + ______XX,X__X____, + _____XXX,XXXX____, + _____X__,XXX_____, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXXX___,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D6[ 48] = { /* code 00D6 */ + ________,________, + _____XX_,__XX____, + _____XX_,__XX____, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXXX___,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D7[ 48] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,_X______, + _XXX____,XXX_____, + __XXX__X,XX______, + ___XXXXX,X_______, + ____XXXX,________, + ____XXXX,________, + ___XXXXX,X_______, + __XXX__X,XX______, + _XXX____,XXX_____, + __X_____,_X______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D8[ 48] = { /* code 00D8 */ + ________,________, + ________,________, + ________,________, + ________,_____X__, + _____XXX,XXXX_XXX, + ___XXXXX,XXXXXXX_, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,_XXXXXX_, + _XXX____,XXX_XXX_, + _XXX___X,XX__XXX_, + _XXX___X,X___XXX_, + _XXX__XX,X___XXX_, + _XXX_XXX,____XXX_, + _XXXXXX_,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + _XXXXXXX,XXXXX___, + XXX__XXX,XXX_____, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00D9[ 48] = { /* code 00D9 */ + _____XXX,________, + ______XX,________, + _______X,X_______, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,_XXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00DA[ 48] = { /* code 00DA */ + ______XX,X_______, + ______XX,________, + _____XX_,________, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,_XXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00DB[ 48] = { /* code 00DB */ + ______XX,X_______, + _____XX_,XX______, + ____XX__,_XX_____, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,_XXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00DC[ 48] = { /* code 00DC */ + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,_XXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00DD[ 48] = { /* code 00DD */ + ______XX,X_______, + ______XX,________, + _____XX_,________, + ________,________, + XXX_____,__XXX___, + XXX_____,__XXX___, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ___XXX_X,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00DE[ 48] = { /* code 00DE */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00DF[ 48] = { /* code 00DF */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX__XX,X_______, + _XXX__XX,X_______, + _XXX__XX,XX______, + _XXX___X,XX______, + _XXX___X,XXX_____, + _XXX____,XXXX____, + _XXX____,_XXX____, + _XXX__X_,_XXX____, + _XXX_XXX,XXX_____, + _XXX__XX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E0[ 48] = { /* code 00E0 */ + ________,________, + ________,________, + ________,________, + ____XXX_,________, + _____XX_,________, + ______XX,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E1[ 48] = { /* code 00E1 */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XX_,________, + ____XX__,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E2[ 48] = { /* code 00E2 */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XX_X,X_______, + ___XX___,XX______, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E3[ 48] = { /* code 00E3 */ + ________,________, + ________,________, + ________,________, + ____XXX_,_X______, + ___XXXXX,XX______, + ___X__XX,X_______, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E4[ 48] = { /* code 00E4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,XX______, + ___XX___,XX______, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E5[ 48] = { /* code 00E5 */ + ________,________, + ________,________, + _____XX_,________, + ____X__X,________, + ____X__X,________, + _____XX_,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E6[ 72] = { /* code 00E6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XXXXX,X__XXXX_,________, + __XXXXXX,XXXXXXXX,X_______, + _XX_____,XXXX__XX,X_______, + ________,XXX____X,XX______, + ______XX,XXXXXXXX,XX______, + __XXXXXX,XXXXXXXX,XX______, + _XXXXX__,XXX_____,________, + _XXX____,XXX____X,XX______, + _XXX___X,XXXX__XX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + ___XXXXX,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E7[ 48] = { /* code 00E7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ____XXXX,________, + _______X,X_______, + _______X,X_______, + ___XXXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E8[ 48] = { /* code 00E8 */ + ________,________, + ________,________, + ________,________, + ____XXX_,________, + _____XX_,________, + ______XX,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00E9[ 48] = { /* code 00E9 */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XX_,________, + ____XX__,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00EA[ 48] = { /* code 00EA */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XX_X,X_______, + ___XX___,XX______, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00EB[ 48] = { /* code 00EB */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,XX______, + ___XX___,XX______, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00EC[ 24] = { /* code 00EC */ + ________, + ________, + ________, + XXX_____, + _XX_____, + __XX____, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00ED[ 24] = { /* code 00ED */ + ________, + ________, + ________, + __XXX___, + __XX____, + _XX_____, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00EE[ 24] = { /* code 00EE */ + ________, + ________, + ________, + _XXX____, + XX_XX___, + X___X___, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00EF[ 24] = { /* code 00EF */ + ________, + ________, + ________, + ________, + X___X___, + X___X___, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F0[ 48] = { /* code 00F0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,XX______, + _____XXX,________, + ____XX_X,X_______, + _______X,XX______, + ____XXXX,XXX_____, + __XXXXXX,XXX_____, + __XXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F1[ 48] = { /* code 00F1 */ + ________,________, + ________,________, + ________,________, + ____XXX_,_X______, + ___XXXXX,XX______, + ___X__XX,X_______, + ________,________, + ________,________, + _XXX__XX,XX______, + _XXXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F2[ 48] = { /* code 00F2 */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + ______XX,________, + _______X,X_______, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F3[ 48] = { /* code 00F3 */ + ________,________, + ________,________, + ________,________, + ______XX,X_______, + ______XX,________, + _____XX_,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F4[ 48] = { /* code 00F4 */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XX_X,X_______, + ___XX___,XX______, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F5[ 48] = { /* code 00F5 */ + ________,________, + ________,________, + ________,________, + ____XXX_,_X______, + ___XXXXX,XX______, + ___X__XX,X_______, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F6[ 48] = { /* code 00F6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,XX______, + ___XX___,XX______, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F7[ 48] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + XXXXXXXX,XXX_____, + XXXXXXXX,XXX_____, + XXXXXXXX,XXX_____, + ________,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F8[ 48] = { /* code 00F8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,__X_____, + ____XXXX,X_XX____, + ___XXXXX,XXX_____, + __XXX___,XXX_____, + _XXX___X,XXXX____, + _XXX__XX,_XXX____, + _XXX__X_,_XXX____, + _XXX_XX_,_XXX____, + _XXXXX__,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XX______, + _XX_XXXX,X_______, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00F9[ 48] = { /* code 00F9 */ + ________,________, + ________,________, + ________,________, + ____XXX_,________, + _____XX_,________, + ______XX,________, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00FA[ 48] = { /* code 00FA */ + ________,________, + ________,________, + ________,________, + ______XX,X_______, + ______XX,________, + _____XX_,________, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00FB[ 48] = { /* code 00FB */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XX_X,X_______, + ___XX___,XX______, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00FC[ 48] = { /* code 00FC */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,XX______, + ___XX___,XX______, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00FD[ 48] = { /* code 00FD */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XX_,________, + ____XX__,________, + ________,________, + ________,________, + XXX_____,XXX_____, + XXX_____,XXX_____, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,X_______, + __XXX_XX,X_______, + __XXX_XX,X_______, + ___XX_XX,________, + ___XXXXX,________, + ___XXXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXX__,________, + _XXXXX__,________, + _XXXX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00FE[ 48] = { /* code 00FE */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX_XXX,X_______, + _XXXXXXX,XXX_____, + _XXXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXX_____, + _XXXXXXX,XXX_____, + _XXX_XXX,X_______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_1_00FF[ 48] = { /* code 00FF */ + ________,________, + ________,________, + ________,________, + ________,________, + __XX___X,X_______, + __XX___X,X_______, + ________,________, + ________,________, + XXX_____,XXX_____, + XXX_____,XXX_____, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,X_______, + __XXX_XX,X_______, + __XXX_XX,X_______, + ___XX_XX,________, + ___XXXXX,________, + ___XXXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXX__,________, + _XXXXX__,________, + _XXXX___,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24B_1_CharInfo[96] = { + { 6, 6, 1, acFont24B_1_00A0 } /* code 00A0 */ + ,{ 7, 7, 1, acFont24B_1_00A1 } /* code 00A1 */ + ,{ 12, 12, 2, acFont24B_1_00A2 } /* code 00A2 */ + ,{ 12, 12, 2, acFont24B_1_00A3 } /* code 00A3 */ + ,{ 12, 12, 2, acFont24B_1_00A4 } /* code 00A4 */ + ,{ 12, 12, 2, acFont24B_1_00A5 } /* code 00A5 */ + ,{ 6, 6, 1, acFont24B_1_00A6 } /* code 00A6 */ + ,{ 12, 12, 2, acFont24B_1_00A7 } /* code 00A7 */ + ,{ 7, 7, 1, acFont24B_1_00A8 } /* code 00A8 */ + ,{ 15, 15, 2, acFont24B_1_00A9 } /* code 00A9 */ + ,{ 8, 8, 1, acFont24B_1_00AA } /* code 00AA */ + ,{ 12, 12, 2, acFont24B_1_00AB } /* code 00AB */ + ,{ 12, 12, 2, acFont24B_1_00AC } /* code 00AC */ + ,{ 7, 7, 1, acFont24B_1_00AD } /* code 00AD */ + ,{ 15, 15, 2, acFont24B_1_00AE } /* code 00AE */ + ,{ 12, 12, 2, acFont24B_1_00AF } /* code 00AF */ + ,{ 8, 8, 1, acFont24B_1_00B0 } /* code 00B0 */ + ,{ 12, 12, 2, acFont24B_1_00B1 } /* code 00B1 */ + ,{ 7, 7, 1, acFont24B_1_00B2 } /* code 00B2 */ + ,{ 7, 7, 1, acFont24B_1_00B3 } /* code 00B3 */ + ,{ 7, 7, 1, acFont24B_1_00B4 } /* code 00B4 */ + ,{ 12, 12, 2, acFont24B_1_00B5 } /* code 00B5 */ + ,{ 12, 12, 2, acFont24B_1_00B6 } /* code 00B6 */ + ,{ 6, 6, 1, acFont24B_1_00B7 } /* code 00B7 */ + ,{ 7, 7, 1, acFont24B_1_00B8 } /* code 00B8 */ + ,{ 7, 7, 1, acFont24B_1_00B9 } /* code 00B9 */ + ,{ 8, 8, 1, acFont24B_1_00BA } /* code 00BA */ + ,{ 12, 12, 2, acFont24B_1_00BB } /* code 00BB */ + ,{ 18, 18, 3, acFont24B_1_00BC } /* code 00BC */ + ,{ 18, 18, 3, acFont24B_1_00BD } /* code 00BD */ + ,{ 18, 18, 3, acFont24B_1_00BE } /* code 00BE */ + ,{ 13, 13, 2, acFont24B_1_00BF } /* code 00BF */ + ,{ 15, 15, 2, acFont24B_1_00C0 } /* code 00C0 */ + ,{ 15, 15, 2, acFont24B_1_00C1 } /* code 00C1 */ + ,{ 15, 15, 2, acFont24B_1_00C2 } /* code 00C2 */ + ,{ 15, 15, 2, acFont24B_1_00C3 } /* code 00C3 */ + ,{ 15, 15, 2, acFont24B_1_00C4 } /* code 00C4 */ + ,{ 15, 15, 2, acFont24B_1_00C5 } /* code 00C5 */ + ,{ 21, 21, 3, acFont24B_1_00C6 } /* code 00C6 */ + ,{ 15, 15, 2, acFont24B_1_00C7 } /* code 00C7 */ + ,{ 14, 14, 2, acFont24B_1_00C8 } /* code 00C8 */ + ,{ 14, 14, 2, acFont24B_1_00C9 } /* code 00C9 */ + ,{ 14, 14, 2, acFont24B_1_00CA } /* code 00CA */ + ,{ 14, 14, 2, acFont24B_1_00CB } /* code 00CB */ + ,{ 5, 5, 1, acFont24B_1_00CC } /* code 00CC */ + ,{ 5, 5, 1, acFont24B_1_00CD } /* code 00CD */ + ,{ 5, 5, 1, acFont24B_1_00CE } /* code 00CE */ + ,{ 5, 5, 1, acFont24B_1_00CF } /* code 00CF */ + ,{ 15, 15, 2, acFont24B_1_00D0 } /* code 00D0 */ + ,{ 14, 14, 2, acFont24B_1_00D1 } /* code 00D1 */ + ,{ 16, 16, 2, acFont24B_1_00D2 } /* code 00D2 */ + ,{ 16, 16, 2, acFont24B_1_00D3 } /* code 00D3 */ + ,{ 16, 16, 2, acFont24B_1_00D4 } /* code 00D4 */ + ,{ 16, 16, 2, acFont24B_1_00D5 } /* code 00D5 */ + ,{ 16, 16, 2, acFont24B_1_00D6 } /* code 00D6 */ + ,{ 12, 12, 2, acFont24B_1_00D7 } /* code 00D7 */ + ,{ 16, 16, 2, acFont24B_1_00D8 } /* code 00D8 */ + ,{ 14, 14, 2, acFont24B_1_00D9 } /* code 00D9 */ + ,{ 14, 14, 2, acFont24B_1_00DA } /* code 00DA */ + ,{ 14, 14, 2, acFont24B_1_00DB } /* code 00DB */ + ,{ 14, 14, 2, acFont24B_1_00DC } /* code 00DC */ + ,{ 13, 13, 2, acFont24B_1_00DD } /* code 00DD */ + ,{ 14, 14, 2, acFont24B_1_00DE } /* code 00DE */ + ,{ 13, 13, 2, acFont24B_1_00DF } /* code 00DF */ + ,{ 12, 12, 2, acFont24B_1_00E0 } /* code 00E0 */ + ,{ 12, 12, 2, acFont24B_1_00E1 } /* code 00E1 */ + ,{ 12, 12, 2, acFont24B_1_00E2 } /* code 00E2 */ + ,{ 12, 12, 2, acFont24B_1_00E3 } /* code 00E3 */ + ,{ 12, 12, 2, acFont24B_1_00E4 } /* code 00E4 */ + ,{ 12, 12, 2, acFont24B_1_00E5 } /* code 00E5 */ + ,{ 19, 19, 3, acFont24B_1_00E6 } /* code 00E6 */ + ,{ 12, 12, 2, acFont24B_1_00E7 } /* code 00E7 */ + ,{ 12, 12, 2, acFont24B_1_00E8 } /* code 00E8 */ + ,{ 12, 12, 2, acFont24B_1_00E9 } /* code 00E9 */ + ,{ 12, 12, 2, acFont24B_1_00EA } /* code 00EA */ + ,{ 12, 12, 2, acFont24B_1_00EB } /* code 00EB */ + ,{ 5, 5, 1, acFont24B_1_00EC } /* code 00EC */ + ,{ 5, 5, 1, acFont24B_1_00ED } /* code 00ED */ + ,{ 5, 5, 1, acFont24B_1_00EE } /* code 00EE */ + ,{ 5, 5, 1, acFont24B_1_00EF } /* code 00EF */ + ,{ 13, 13, 2, acFont24B_1_00F0 } /* code 00F0 */ + ,{ 13, 13, 2, acFont24B_1_00F1 } /* code 00F1 */ + ,{ 13, 13, 2, acFont24B_1_00F2 } /* code 00F2 */ + ,{ 13, 13, 2, acFont24B_1_00F3 } /* code 00F3 */ + ,{ 13, 13, 2, acFont24B_1_00F4 } /* code 00F4 */ + ,{ 13, 13, 2, acFont24B_1_00F5 } /* code 00F5 */ + ,{ 13, 13, 2, acFont24B_1_00F6 } /* code 00F6 */ + ,{ 12, 12, 2, acFont24B_1_00F7 } /* code 00F7 */ + ,{ 13, 13, 2, acFont24B_1_00F8 } /* code 00F8 */ + ,{ 13, 13, 2, acFont24B_1_00F9 } /* code 00F9 */ + ,{ 13, 13, 2, acFont24B_1_00FA } /* code 00FA */ + ,{ 13, 13, 2, acFont24B_1_00FB } /* code 00FB */ + ,{ 13, 13, 2, acFont24B_1_00FC } /* code 00FC */ + ,{ 11, 11, 2, acFont24B_1_00FD } /* code 00FD */ + ,{ 13, 13, 2, acFont24B_1_00FE } /* code 00FE */ + ,{ 11, 11, 2, acFont24B_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font24B_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font24B_1_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font24B_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font24B_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font24B_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font24B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,24 /* height of font */ + ,24 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font24B_1_Prop1} + ,19, 11, 15 +}; + diff --git a/User/system/lib/lcd/gui/Font/F24B_ASCII.c b/User/system/lib/lcd/gui/Font/F24B_ASCII.c new file mode 100644 index 0000000..6f4bd50 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F24B_ASCII.c @@ -0,0 +1,2608 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F24B_ASCII.C +Purpose : ASCII character set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0020[ 24] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0021[ 24] = { /* code 0021 */ + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ___X____, + ___X____, + ________, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0022[ 48] = { /* code 0022 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX__XX,X_______, + _XXX__XX,X_______, + _XXX__XX,X_______, + _XXX__XX,X_______, + _XXX__XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0023[ 48] = { /* code 0023 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX___,XX______, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ___XX___,XX______, + __XXX__X,XX______, + __XX___X,X_______, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + __XX___X,X_______, + _XXX__XX,X_______, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0024[ 48] = { /* code 0024 */ + ________,________, + ________,________, + ________,________, + _____XX_,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXX_XX_,XXX_____, + _XXX_XX_,XXX_____, + _XXX_XX_,________, + _XXXXXX_,________, + __XXXXXX,________, + ___XXXXX,XX______, + _____XXX,XXX_____, + _____XX_,XXX_____, + _____XX_,XXX_____, + _XXX_XX_,XXX_____, + _XXX_XX_,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0025[ 72] = { /* code 0025 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,___XX___,________, + _XXXXXX_,__XXX___,________, + _XX__XX_,__XX____,________, + _XX__XX_,__XX____,________, + _XX__XX_,_XX_____,________, + _XX__XX_,_XX_____,________, + _XXXXXX_,XX______,________, + __XXXX__,XX______,________, + _______X,X__XXXX_,________, + _______X,X_XXXXXX,________, + ______XX,X_XX__XX,________, + ______XX,__XX__XX,________, + ______XX,__XX__XX,________, + _____XX_,__XX__XX,________, + _____XX_,__XXXXXX,________, + ____XX__,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0026[ 48] = { /* code 0026 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ____XXXX,XX______, + ___XXX__,XXX_____, + ___XXX__,XXX_____, + ___XXXX_,XXX_____, + ____XXXX,XX______, + ____XXXX,X_______, + ___XXXXX,X_______, + __XXXXXX,X__XXX__, + _XXX___X,XXXXXX__, + _XXX___X,XXXXX___, + _XXX____,XXXX____, + _XXXX__X,XXXXXX__, + __XXXXXX,XXXXXXX_, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0027[ 24] = { /* code 0027 */ + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0028[ 24] = { /* code 0028 */ + ________, + ________, + ________, + ________, + ____XX__, + ___XX___, + ___XX___, + __XXX___, + __XXX___, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __XX____, + __XXX___, + __XXX___, + ___XX___, + ___XX___, + ____XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0029[ 24] = { /* code 0029 */ + ________, + ________, + ________, + ________, + _XX_____, + __XX____, + __XX____, + __XXX___, + __XXX___, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XX___, + __XXX___, + __XXX___, + __XX____, + __XX____, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_002A[ 24] = { /* code 002A */ + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + XX_XX_XX, + XXXXXXXX, + ___XXX__, + __XXXX__, + _XX__XX_, + __X__X__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_002B[ 48] = { /* code 002B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_002C[ 24] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + ___X____, + __XX____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_002D[ 24] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_002E[ 24] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_002F[ 24] = { /* code 002F */ + ________, + ________, + ________, + ________, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + ___XX___, + __XXX___, + __XX____, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XX______, + XX______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0030[ 48] = { /* code 0030 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0031[ 48] = { /* code 0031 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,X_______, + ______XX,X_______, + _____XXX,X_______, + ___XXXXX,X_______, + __XXXXXX,X_______, + __XXX_XX,X_______, + __X___XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0032[ 48] = { /* code 0032 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXXX__X,XXX_____, + _XXX____,XXX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XX______, + ______XX,XX______, + _____XXX,X_______, + ____XXXX,________, + ___XXXX_,________, + ___XXX__,________, + __XXX___,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0033[ 48] = { /* code 0033 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXX___X,XX______, + _XXX___X,XX______, + _______X,XX______, + ______XX,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _______X,XX______, + ________,XXX_____, + ________,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XX______, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0034[ 48] = { /* code 0034 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + ___XX_XX,X_______, + __XX__XX,X_______, + __XX__XX,X_______, + _XX___XX,X_______, + XX____XX,X_______, + XXXXXXXX,XXX_____, + XXXXXXXX,XXX_____, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0035[ 48] = { /* code 0035 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,X_______, + _XXXXXXX,XX______, + _XXX___X,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XX______, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0036[ 48] = { /* code 0036 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + __XXX__X,XXX_____, + _XXX____,X_______, + _XXX____,________, + _XXX_XXX,X_______, + _XXXXXXX,XX______, + _XXXX__X,XX______, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0037[ 48] = { /* code 0037 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,XXX_____, + _______X,XX______, + ______XX,X_______, + ______XX,X_______, + _____XXX,________, + _____XXX,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0038[ 48] = { /* code 0038 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXXX__X,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XXX__X,XX______, + ___XXXXX,X_______, + ___XXXXX,X_______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0039[ 48] = { /* code 0039 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __XXX__X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,XXX_____, + ________,XXX_____, + __XX____,XXX_____, + _XXXX__X,XX______, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_003A[ 24] = { /* code 003A */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_003B[ 24] = { /* code 003B */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + ____X___, + ___XX___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_003C[ 48] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,__X_____, + ________,XXX_____, + _____XXX,XXX_____, + ___XXXXX,X_______, + _XXXXX__,________, + _XXX____,________, + _XXXXXX_,________, + ___XXXXX,XX______, + _____XXX,XXX_____, + ________,XXX_____, + ________,__X_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_003D[ 48] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_003E[ 48] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X______,________, + _XXX____,________, + _XXXXXX_,________, + ___XXXXX,X_______, + ______XX,XXX_____, + ________,XXX_____, + _____XXX,XXX_____, + __XXXXXX,X_______, + _XXXXXX_,________, + _XXX____,________, + _X______,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_003F[ 48] = { /* code 003F */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + ________,_XXX____, + ________,XXXX____, + _______X,XXX_____, + ______XX,XX______, + _____XXX,X_______, + _____XXX,________, + _____XXX,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0040[ 72] = { /* code 0040 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,______XX,X_______, + ___XXX__,_______X,XX______, + ___XX__X,XX_XXXX_,XX______, + __XX__XX,XXXXXX__,_XX_____, + __XX__XX,XXXXXX__,_XX_____, + _XX___XX,X_XXXX__,_XX_____, + _XX__XXX,__XXXX__,_XX_____, + _XX__XXX,__XXXX__,_XX_____, + _XX__XXX,__XXX___,XX______, + _XX__XXX,_XXXX___,XX______, + _XX__XXX,XXXXX__X,X_______, + _XX___XX,XXXXXXXX,________, + __XX__XX,X_XXXX__,________, + __XXX___,________,_XXX____, + ___XXX__,________,XXX_____, + ____XXXX,______XX,XX______, + _____XXX,XXXXXXXX,X_______, + _______X,XXXXXXX_,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0041[ 48] = { /* code 0041 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + XXX_____,____XXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0042[ 48] = { /* code 0042 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXXXXX,XXXXXX__, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0043[ 48] = { /* code 0043 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,__XXXX__, + _XXXX___,___XX___, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXX___,___XX___, + __XXXX__,__XXXX__, + __XXXXXX,XXXXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0044[ 48] = { /* code 0044 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,___XXX__, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0045[ 48] = { /* code 0045 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0046[ 48] = { /* code 0046 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0047[ 48] = { /* code 0047 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XXX_____, + ____XXXX,XXXXX___, + ___XXXXX,XXXXXX__, + __XXXX__,___XXXX_, + _XXXX___,____XX__, + _XXX____,________, + _XXX____,________, + _XXX____,XXXXXXX_, + _XXX____,XXXXXXX_, + _XXX____,XXXXXXX_, + __XXX___,____XXX_, + __XXXX__,___XXXX_, + ___XXXXX,XXXXXXX_, + ____XXXX,XXXXXX__, + ______XX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0048[ 48] = { /* code 0048 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0049[ 24] = { /* code 0049 */ + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_004A[ 48] = { /* code 004A */ + ________,________, + ________,________, + ________,________, + ________,________, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX___X,XX______, + _XXXXXXX,XX______, + _XXXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_004B[ 48] = { /* code 004B */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,__XXXX__, + __XXX___,_XXXX___, + __XXX___,XXXX____, + __XXX___,XXX_____, + __XXX__X,XX______, + __XXX_XX,X_______, + __XXXXXX,XX______, + __XXXXXX,XX______, + __XXXXX_,XXX_____, + __XXXX__,XXX_____, + __XXX___,_XXX____, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXX___,___XXX__, + __XXX___,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_004C[ 48] = { /* code 004C */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_004D[ 72] = { /* code 004D */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXXX__,___XXXXX,________, + _XXXXXX_,__XXXXXX,________, + _XXXXXX_,__XXXXXX,________, + _XXX_XX_,__XX_XXX,________, + _XXX_XX_,__XX_XXX,________, + _XXX_XX_,__XX_XXX,________, + _XXX_XXX,_XXX_XXX,________, + _XXX_XXX,_XXX_XXX,________, + _XXX__XX,_XX__XXX,________, + _XXX__XX,_XX__XXX,________, + _XXX__XX,XXX__XXX,________, + _XXX__XX,XXX__XXX,________, + _XXX__XX,XXX__XXX,________, + _XXX___X,XX___XXX,________, + _XXX___X,XX___XXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_004E[ 48] = { /* code 004E */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,__XXX___, + _XXXX___,__XXX___, + _XXXX___,__XXX___, + _XXXXX__,__XXX___, + _XXXXXX_,__XXX___, + _XXX_XX_,__XXX___, + _XXX_XXX,__XXX___, + _XXX__XX,__XXX___, + _XXX__XX,X_XXX___, + _XXX___X,X_XXX___, + _XXX___X,XXXXX___, + _XXX____,XXXXX___, + _XXX____,XXXXX___, + _XXX____,_XXXX___, + _XXX____,__XXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_004F[ 48] = { /* code 004F */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXXX___,___XXXX_, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0050[ 48] = { /* code 0050 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,_XXXX___, + __XXX___,__XXX___, + __XXX___,_XXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + __XXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0051[ 48] = { /* code 0051 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXXX__, + __XXXX__,__XXXX__, + _XXXX___,___XXXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,____XXX_, + _XXX____,X___XXX_, + _XXXX__X,XX_XXXX_, + __XXXX__,XXXXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXXXX_, + _____XXX,XXX_XXXX, + ________,_____XX_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0052[ 48] = { /* code 0052 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XX______, + __XXX___,XXX_____, + __XXX___,XXXX____, + __XXX___,_XXX____, + __XXX___,__XXX___, + __XXX___,__XXX___, + __XXX___,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0053[ 48] = { /* code 0053 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX___,_XXXX___, + __XXX___,__XXX___, + __XXXX__,________, + ___XXXXX,X_______, + ____XXXX,XXXX____, + ______XX,XXXX____, + ________,_XXXX___, + _XXX____,__XXX___, + _XXXX___,_XXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0054[ 48] = { /* code 0054 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0055[ 48] = { /* code 0055 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,_XXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0056[ 48] = { /* code 0056 */ + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,__XXX___, + XXX_____,_XXXX___, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ___XXX_X,XX______, + ___XXX_X,XX______, + ___XXX_X,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0057[ 72] = { /* code 0057 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XXX_____,_XXX____,__XXX___, + XXX_____,XXXXX___,__XXX___, + _XXX____,XXXXX___,_XXX____, + _XXX____,XXXXX___,_XXX____, + _XXX___X,XX_XXX__,_XXX____, + _XXX___X,XX_XXX__,_XXX____, + __XXX__X,XX_XXX__,XXX_____, + __XXX_XX,X___XXX_,XXX_____, + __XXX_XX,X___XXX_,XXX_____, + __XXX_XX,X___XXX_,XXX_____, + ___XXXXX,_____XXX,XXX_____, + ___XXXXX,_____XXX,XX______, + ___XXXXX,_____XXX,XX______, + ___XXXX_,______XX,XX______, + ___XXXX_,______XX,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0058[ 48] = { /* code 0058 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,__XXX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XXX__,XXX_____, + ___XXX__,XXX_____, + ____XXXX,XX______, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ____XXXX,XX______, + ___XXX__,XXX_____, + ___XXX__,XXX_____, + __XXX___,_XXX____, + _XXX____,__XXX___, + _XXX____,__XXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0059[ 48] = { /* code 0059 */ + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,__XXX___, + XXX_____,__XXX___, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ___XXX_X,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_005A[ 48] = { /* code 005A */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + ________,XXXX____, + _______X,XXX_____, + ______XX,XX______, + _____XXX,X_______, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + _XXXX___,________, + XXXX____,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_005B[ 24] = { /* code 005B */ + ________, + ________, + ________, + ________, + __XXXXX_, + __XXXXX_, + __XXXXX_, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXXXX_, + __XXXXX_, + __XXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_005C[ 24] = { /* code 005C */ + ________, + ________, + ________, + ________, + XX______, + XX______, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + __XX____, + __XX____, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ____XX__, + ____XX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_005D[ 24] = { /* code 005D */ + ________, + ________, + ________, + ________, + XXXXX___, + XXXXX___, + XXXXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + XXXXX___, + XXXXX___, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_005E[ 48] = { /* code 005E */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + ____XXXX,________, + ___XXXXX,X_______, + ___XX__X,X_______, + __XXX__X,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_005F[ 48] = { /* code 005F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0060[ 24] = { /* code 0060 */ + ________, + ________, + ________, + ________, + XXX_____, + _XX_____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0061[ 48] = { /* code 0061 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XX_____,XXX_____, + ______XX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0062[ 48] = { /* code 0062 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX_XXX,X_______, + _XXXXXXX,XXX_____, + _XXXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXX_____, + _XXXXXXX,XXX_____, + _XXX_XXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0063[ 48] = { /* code 0063 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0064[ 48] = { /* code 0064 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,_XXX____, + ________,_XXX____, + ________,_XXX____, + ________,_XXX____, + ____XXXX,_XXX____, + __XXXXXX,XXXX____, + __XXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0065[ 48] = { /* code 0065 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0066[ 24] = { /* code 0066 */ + ________, + ________, + ________, + ________, + ___XXXX_, + __XXXXX_, + __XXX___, + __XXX___, + XXXXXXX_, + XXXXXXX_, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0067[ 48] = { /* code 0067 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,_XXX____, + __XXXXXX,XXXX____, + __XXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,_XXX____, + ________,_XXX____, + _XXX____,XXXX____, + _XXXXXXX,XXX_____, + ___XXXXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0068[ 48] = { /* code 0068 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX__XX,XX______, + _XXXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0069[ 24] = { /* code 0069 */ + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_006A[ 24] = { /* code 006A */ + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + XXXX____, + XXX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_006B[ 48] = { /* code 006B */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,XXX_____, + _XXX___X,XX______, + _XXX__XX,X_______, + _XXXXXXX,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XXXX_XX,X_______, + _XXX___X,X_______, + _XXX___X,XX______, + _XXX____,XXX_____, + _XXX____,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_006C[ 24] = { /* code 006C */ + ________, + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_006D[ 72] = { /* code 006D */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXX_XXX,XX__XXXX,________, + _XXXXXXX,XXXXXXXX,X_______, + _XXXX___,XXXX___X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + _XXX____,XXX____X,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_006E[ 48] = { /* code 006E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX__XX,XX______, + _XXXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_006F[ 48] = { /* code 006F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0070[ 48] = { /* code 0070 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX_XXX,X_______, + _XXXXXXX,XXX_____, + _XXXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXX_____, + _XXXXXXX,XXX_____, + _XXX_XXX,X_______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0071[ 48] = { /* code 0071 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,_XXX____, + __XXXXXX,XXXX____, + __XXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXXX____, + __XXXXXX,XXXX____, + ____XXXX,_XXX____, + ________,_XXX____, + ________,_XXX____, + ________,_XXX____, + ________,_XXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0072[ 24] = { /* code 0072 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXX_XXX, + _XXXXXXX, + _XXXX___, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0073[ 48] = { /* code 0073 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXX____,XXX_____, + _XXX____,________, + _XXXXXX_,________, + __XXXXXX,XX______, + _____XXX,XXX_____, + ________,XXX_____, + _XXX____,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0074[ 24] = { /* code 0074 */ + ________, + ________, + ________, + ________, + ________, + ___X____, + __XX____, + _XXX____, + XXXXXX__, + XXXXXX__, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0075[ 48] = { /* code 0075 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0076[ 48] = { /* code 0076 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + ___XXX_X,XX______, + ___XXX_X,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0077[ 48] = { /* code 0077 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX___XX,X___XXX_, + XXX___XX,X___XXX_, + _XX___XX,X___XX__, + _XXX_XXX,XX_XXX__, + _XXX_XX_,XX_XXX__, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + __XXXXX_,XXXXX___, + __XXXX__,_XXXX___, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0078[ 48] = { /* code 0078 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,XXX_____, + __XXX__X,XX______, + __XXX__X,XX______, + ___XXXXX,X_______, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ___XXXXX,X_______, + __XXX__X,XX______, + __XXX__X,XX______, + _XXX____,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_0079[ 48] = { /* code 0079 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,XXX_____, + XXX_____,XXX_____, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,X_______, + __XXX_XX,X_______, + __XXX_XX,X_______, + ___XX_XX,________, + ___XXXXX,________, + ___XXXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXX__,________, + _XXXXX__,________, + _XXXX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_007A[ 48] = { /* code 007A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + ____XXX_,________, + ___XXX__,________, + __XXX___,________, + _XXX____,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_007B[ 24] = { /* code 007B */ + ________, + ________, + ________, + ________, + _____XXX, + ____XXXX, + ___XXXXX, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + __XXXX__, + _XXXX___, + _XXXX___, + __XXXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXXXX, + ___XXXXX, + ____XXXX, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_007C[ 24] = { /* code 007C */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_007D[ 24] = { /* code 007D */ + ________, + ________, + ________, + ________, + XXX_____, + XXXX____, + XXXXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXXX__, + ___XXXX_, + ___XXXX_, + __XXXX__, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + XXXXX___, + XXXXX___, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24B_ASCII_007E[ 48] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXX__,__X_____, + XXXXXXXX,XXX_____, + XXXXXXXX,XXX_____, + X____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24B_ASCII_CharInfo[95] = { + { 6, 6, 1, acFont24B_ASCII_0020 } /* code 0020 */ + ,{ 7, 7, 1, acFont24B_ASCII_0021 } /* code 0021 */ + ,{ 10, 10, 2, acFont24B_ASCII_0022 } /* code 0022 */ + ,{ 12, 12, 2, acFont24B_ASCII_0023 } /* code 0023 */ + ,{ 12, 12, 2, acFont24B_ASCII_0024 } /* code 0024 */ + ,{ 17, 17, 3, acFont24B_ASCII_0025 } /* code 0025 */ + ,{ 15, 15, 2, acFont24B_ASCII_0026 } /* code 0026 */ + ,{ 5, 5, 1, acFont24B_ASCII_0027 } /* code 0027 */ + ,{ 7, 7, 1, acFont24B_ASCII_0028 } /* code 0028 */ + ,{ 7, 7, 1, acFont24B_ASCII_0029 } /* code 0029 */ + ,{ 8, 8, 1, acFont24B_ASCII_002A } /* code 002A */ + ,{ 12, 12, 2, acFont24B_ASCII_002B } /* code 002B */ + ,{ 6, 6, 1, acFont24B_ASCII_002C } /* code 002C */ + ,{ 7, 7, 1, acFont24B_ASCII_002D } /* code 002D */ + ,{ 6, 6, 1, acFont24B_ASCII_002E } /* code 002E */ + ,{ 6, 6, 1, acFont24B_ASCII_002F } /* code 002F */ + ,{ 12, 12, 2, acFont24B_ASCII_0030 } /* code 0030 */ + ,{ 12, 12, 2, acFont24B_ASCII_0031 } /* code 0031 */ + ,{ 12, 12, 2, acFont24B_ASCII_0032 } /* code 0032 */ + ,{ 12, 12, 2, acFont24B_ASCII_0033 } /* code 0033 */ + ,{ 12, 12, 2, acFont24B_ASCII_0034 } /* code 0034 */ + ,{ 12, 12, 2, acFont24B_ASCII_0035 } /* code 0035 */ + ,{ 12, 12, 2, acFont24B_ASCII_0036 } /* code 0036 */ + ,{ 12, 12, 2, acFont24B_ASCII_0037 } /* code 0037 */ + ,{ 12, 12, 2, acFont24B_ASCII_0038 } /* code 0038 */ + ,{ 12, 12, 2, acFont24B_ASCII_0039 } /* code 0039 */ + ,{ 7, 7, 1, acFont24B_ASCII_003A } /* code 003A */ + ,{ 7, 7, 1, acFont24B_ASCII_003B } /* code 003B */ + ,{ 12, 12, 2, acFont24B_ASCII_003C } /* code 003C */ + ,{ 12, 12, 2, acFont24B_ASCII_003D } /* code 003D */ + ,{ 12, 12, 2, acFont24B_ASCII_003E } /* code 003E */ + ,{ 13, 13, 2, acFont24B_ASCII_003F } /* code 003F */ + ,{ 20, 20, 3, acFont24B_ASCII_0040 } /* code 0040 */ + ,{ 15, 15, 2, acFont24B_ASCII_0041 } /* code 0041 */ + ,{ 15, 15, 2, acFont24B_ASCII_0042 } /* code 0042 */ + ,{ 15, 15, 2, acFont24B_ASCII_0043 } /* code 0043 */ + ,{ 15, 15, 2, acFont24B_ASCII_0044 } /* code 0044 */ + ,{ 14, 14, 2, acFont24B_ASCII_0045 } /* code 0045 */ + ,{ 13, 13, 2, acFont24B_ASCII_0046 } /* code 0046 */ + ,{ 16, 16, 2, acFont24B_ASCII_0047 } /* code 0047 */ + ,{ 14, 14, 2, acFont24B_ASCII_0048 } /* code 0048 */ + ,{ 5, 5, 1, acFont24B_ASCII_0049 } /* code 0049 */ + ,{ 12, 12, 2, acFont24B_ASCII_004A } /* code 004A */ + ,{ 15, 15, 2, acFont24B_ASCII_004B } /* code 004B */ + ,{ 13, 13, 2, acFont24B_ASCII_004C } /* code 004C */ + ,{ 17, 17, 3, acFont24B_ASCII_004D } /* code 004D */ + ,{ 14, 14, 2, acFont24B_ASCII_004E } /* code 004E */ + ,{ 16, 16, 2, acFont24B_ASCII_004F } /* code 004F */ + ,{ 14, 14, 2, acFont24B_ASCII_0050 } /* code 0050 */ + ,{ 16, 16, 2, acFont24B_ASCII_0051 } /* code 0051 */ + ,{ 15, 15, 2, acFont24B_ASCII_0052 } /* code 0052 */ + ,{ 14, 14, 2, acFont24B_ASCII_0053 } /* code 0053 */ + ,{ 13, 13, 2, acFont24B_ASCII_0054 } /* code 0054 */ + ,{ 14, 14, 2, acFont24B_ASCII_0055 } /* code 0055 */ + ,{ 13, 13, 2, acFont24B_ASCII_0056 } /* code 0056 */ + ,{ 21, 21, 3, acFont24B_ASCII_0057 } /* code 0057 */ + ,{ 14, 14, 2, acFont24B_ASCII_0058 } /* code 0058 */ + ,{ 13, 13, 2, acFont24B_ASCII_0059 } /* code 0059 */ + ,{ 12, 12, 2, acFont24B_ASCII_005A } /* code 005A */ + ,{ 7, 7, 1, acFont24B_ASCII_005B } /* code 005B */ + ,{ 6, 6, 1, acFont24B_ASCII_005C } /* code 005C */ + ,{ 7, 7, 1, acFont24B_ASCII_005D } /* code 005D */ + ,{ 12, 12, 2, acFont24B_ASCII_005E } /* code 005E */ + ,{ 12, 12, 2, acFont24B_ASCII_005F } /* code 005F */ + ,{ 7, 7, 1, acFont24B_ASCII_0060 } /* code 0060 */ + ,{ 12, 12, 2, acFont24B_ASCII_0061 } /* code 0061 */ + ,{ 13, 13, 2, acFont24B_ASCII_0062 } /* code 0062 */ + ,{ 12, 12, 2, acFont24B_ASCII_0063 } /* code 0063 */ + ,{ 13, 13, 2, acFont24B_ASCII_0064 } /* code 0064 */ + ,{ 12, 12, 2, acFont24B_ASCII_0065 } /* code 0065 */ + ,{ 7, 7, 1, acFont24B_ASCII_0066 } /* code 0066 */ + ,{ 13, 13, 2, acFont24B_ASCII_0067 } /* code 0067 */ + ,{ 13, 13, 2, acFont24B_ASCII_0068 } /* code 0068 */ + ,{ 5, 5, 1, acFont24B_ASCII_0069 } /* code 0069 */ + ,{ 5, 5, 1, acFont24B_ASCII_006A } /* code 006A */ + ,{ 12, 12, 2, acFont24B_ASCII_006B } /* code 006B */ + ,{ 5, 5, 1, acFont24B_ASCII_006C } /* code 006C */ + ,{ 19, 19, 3, acFont24B_ASCII_006D } /* code 006D */ + ,{ 13, 13, 2, acFont24B_ASCII_006E } /* code 006E */ + ,{ 13, 13, 2, acFont24B_ASCII_006F } /* code 006F */ + ,{ 13, 13, 2, acFont24B_ASCII_0070 } /* code 0070 */ + ,{ 13, 13, 2, acFont24B_ASCII_0071 } /* code 0071 */ + ,{ 8, 8, 1, acFont24B_ASCII_0072 } /* code 0072 */ + ,{ 12, 12, 2, acFont24B_ASCII_0073 } /* code 0073 */ + ,{ 7, 7, 1, acFont24B_ASCII_0074 } /* code 0074 */ + ,{ 13, 13, 2, acFont24B_ASCII_0075 } /* code 0075 */ + ,{ 13, 13, 2, acFont24B_ASCII_0076 } /* code 0076 */ + ,{ 15, 15, 2, acFont24B_ASCII_0077 } /* code 0077 */ + ,{ 12, 12, 2, acFont24B_ASCII_0078 } /* code 0078 */ + ,{ 11, 11, 2, acFont24B_ASCII_0079 } /* code 0079 */ + ,{ 11, 11, 2, acFont24B_ASCII_007A } /* code 007A */ + ,{ 8, 8, 1, acFont24B_ASCII_007B } /* code 007B */ + ,{ 6, 6, 1, acFont24B_ASCII_007C } /* code 007C */ + ,{ 8, 8, 1, acFont24B_ASCII_007D } /* code 007D */ + ,{ 12, 12, 2, acFont24B_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font24B_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font24B_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font24B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,24 /* height of font */ + ,24 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font24B_ASCII_Prop1} + ,19, 11, 15 +}; + diff --git a/User/system/lib/lcd/gui/Font/F24_1.c b/User/system/lib/lcd/gui/Font/F24_1.c new file mode 100644 index 0000000..7544783 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F24_1.c @@ -0,0 +1,2642 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F24_1.C +Purpose : ISO 8859-1, West European Character Set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont24_1_00A0[ 24] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A1[ 24] = { /* code 00A1 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A2[ 48] = { /* code 00A2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,X_______, + ________,X_______, + ________,X_______, + _______X,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX___X,XX______, + _XX___X_,_XX_____, + _XX___X_,________, + _XX___X_,________, + _XX__X__,________, + _XXX_X__,_XX_____, + __XXXX__,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ____X___,________, + ___X____,________, + ___X____,________, + ___X____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A3[ 48] = { /* code 00A3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,XX______, + __XXX___,XXX_____, + __XX____,_XX_____, + __XX____,________, + __XX____,________, + __XX____,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + _XXXXXX_,_X______, + XXXXXXXX,XXX_____, + X_____XX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A4[ 48] = { /* code 00A4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_XXXX,_X______, + __XXXXXX,XX______, + ___XX__X,X_______, + __XX____,XX______, + __XX____,XX______, + ___XX__X,X_______, + __XXXXXX,XX______, + __X_XXXX,_X______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A5[ 48] = { /* code 00A5 */ + ________,________, + ________,________, + ________,________, + ________,________, + XX______,__XX____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + ___XX__X,X_______, + ___XX__X,X_______, + ____XXXX,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + _____XX_,________, + _____XX_,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A6[ 24] = { /* code 00A6 */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A7[ 48] = { /* code 00A7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,X_______, + __XX___X,XX______, + __XX____,XX______, + __XX____,________, + ___XXX__,________, + __XXXXX_,________, + _XX___XX,X_______, + _XX____X,XX______, + _XX_____,XXX_____, + __XXX___,_XX_____, + ___XXX__,_XX_____, + _____XXX,X_______, + ______XX,X_______, + ________,XX______, + _XX_____,XX______, + _XXX___X,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A8[ 24] = { /* code 00A8 */ + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00A9[ 48] = { /* code 00A9 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XX___,__XX____, + __X_____,____X___, + _X____XX,XX___X__, + _X___X__,__X__X__, + X___X___,______X_, + X___X___,______X_, + X___X___,______X_, + X___X___,______X_, + X___X___,__X___X_, + _X___X__,_X___X__, + _X____XX,X____X__, + __X_____,____X___, + ___XX___,__XX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00AA[ 24] = { /* code 00AA */ + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + _____XX_, + __XXXXX_, + XXXX_XX_, + XX___XX_, + XX__XXX_, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00AB[ 48] = { /* code 00AB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,XX______, + ___XX__X,X_______, + __XX__XX,________, + __XX__XX,________, + _XX__XX_,________, + __XX__XX,________, + __XX__XX,________, + ___XX__X,X_______, + ____XX__,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00AC[ 48] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00AD[ 24] = { /* code 00AD */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00AE[ 48] = { /* code 00AE */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XX___,__XX____, + __X_____,____X___, + _X__XXXX,X____X__, + _X__X___,_X___X__, + X___X___,_X____X_, + X___X___,_X____X_, + X___XXXX,X_____X_, + X___X__X,______X_, + X___X___,X_____X_, + _X__X___,_X___X__, + _X__X___,__X__X__, + __X_____,____X___, + ___XX___,__XX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00AF[ 48] = { /* code 00AF */ + ________,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B0[ 24] = { /* code 00B0 */ + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _X____X_, + _X____X_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B1[ 48] = { /* code 00B1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B2[ 24] = { /* code 00B2 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + ____XX__, + ___XXX__, + __XXX___, + _XXX____, + _XX_____, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B3[ 24] = { /* code 00B3 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + ____XX__, + __XX____, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B4[ 24] = { /* code 00B4 */ + ________, + ________, + ________, + ________, + ___XX___, + __XX____, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B5[ 48] = { /* code 00B5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + _XXXXXXX,XX______, + _XX_XXX_,XX______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B6[ 48] = { /* code 00B6 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + _XXXXXXX,XXX_____, + XXXXXX__,XX______, + XXXXXX__,XX______, + XXXXXX__,XX______, + XXXXXX__,XX______, + _XXXXX__,XX______, + __XXXX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ____XX__,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B7[ 24] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B8[ 24] = { /* code 00B8 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___X____, + ___XX___, + ____XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00B9[ 24] = { /* code 00B9 */ + ________, + ________, + ________, + ________, + ___XX___, + __XXX___, + _XXXX___, + _X_XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00BA[ 24] = { /* code 00BA */ + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + XX____XX, + XX____XX, + XX____XX, + XX____XX, + _XX__XX_, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00BB[ 48] = { /* code 00BB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX__XX,________, + ___XX__X,X_______, + ____XX__,XX______, + ____XX__,XX______, + _____XX_,_XX_____, + ____XX__,XX______, + ____XX__,XX______, + ___XX__X,X_______, + __XX__XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00BC[ 72] = { /* code 00BC */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XX__,_____XXX,________, + ___XXX__,_____XX_,________, + __XXXX__,____XX__,________, + __X_XX__,___XX___,________, + ____XX__,__XX____,________, + ____XX__,__XX____,________, + ____XX__,_XX_____,________, + ____XX__,XX_____X,X_______, + _______X,X_____XX,X_______, + _______X,X_____XX,X_______, + ______XX,_____X_X,X_______, + _____XX_,____XX_X,X_______, + ____XX__,____XXXX,XX______, + ___XX___,_______X,X_______, + ___XX___,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00BD[ 72] = { /* code 00BD */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XX__,______XX,________, + ___XXX__,_____XX_,________, + __XXXX__,____XX__,________, + __X_XX__,___XX___,________, + ____XX__,___XX___,________, + ____XX__,__XX____,________, + ____XX__,_XX_____,________, + ____XX__,XX___XXX,X_______, + _______X,X___XX__,XX______, + _______X,X_______,XX______, + ______XX,_______X,XX______, + _____XX_,_______X,X_______, + ____XX__,______XX,________, + ____XX__,_____XX_,________, + ___XX___,____XXXX,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00BE[ 72] = { /* code 00BE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXX___,______XX,________, + XX__XX__,_____XX_,________, + ____XX__,____XX__,________, + __XX____,____XX__,________, + ____XX__,___XX___,________, + ____XX__,__XX____,________, + XX__XX__,_XX_____,________, + _XXXX___,XX_____X,X_______, + ________,XX____XX,X_______, + _______X,X_____XX,X_______, + ______XX,_____XXX,X_______, + _____XX_,____XX_X,X_______, + _____XX_,____XXXX,XX______, + ____XX__,_______X,X_______, + ___XX___,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00BF[ 48] = { /* code 00BF */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + _____XXX,________, + ____XXX_,________, + ___XXX__,________, + ___XX___,________, + __XX____,________, + __XX____,_XX_____, + __XXX___,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C0[ 48] = { /* code 00C0 */ + _____XX_,________, + ______XX,________, + _______X,________, + ________,________, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C1[ 48] = { /* code 00C1 */ + ______XX,________, + _____XX_,________, + _____X__,________, + ________,________, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C2[ 48] = { /* code 00C2 */ + _____XX_,________, + ____XXXX,________, + ___XX__X,X_______, + ________,________, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C3[ 48] = { /* code 00C3 */ + ____XXX_,XX______, + ___XXXXX,XX______, + ___XX_XX,X_______, + ________,________, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C4[ 48] = { /* code 00C4 */ + ________,________, + ____XX__,XX______, + ____XX__,XX______, + ________,________, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C5[ 48] = { /* code 00C5 */ + _____XXX,________, + ____X___,X_______, + ____X___,X_______, + ____X___,X_______, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C6[ 72] = { /* code 00C6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXXXX,XXXX____, + ______XX,XXXXXXXX,XXXX____, + ______XX,__XX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XX__,__XX____,________, + ____XX__,__XXXXXX,XXX_____, + ___XX___,__XXXXXX,XXX_____, + ___XX___,__XX____,________, + __XXXXXX,XXXX____,________, + __XXXXXX,XXXX____,________, + _XX_____,__XX____,________, + _XX_____,__XX____,________, + XX______,__XXXXXX,XXXX____, + XX______,__XXXXXX,XXXX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C7[ 48] = { /* code 00C7 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,___XXX__, + _XXX____,____XX__, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXX____,____XX__, + __XX____,___XX___, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + _______X,________, + _______X,X_______, + ________,XX______, + _____XXX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C8[ 48] = { /* code 00C8 */ + ______XX,________, + _______X,X_______, + ________,X_______, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00C9[ 48] = { /* code 00C9 */ + ________,XX______, + _______X,X_______, + _______X,________, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00CA[ 48] = { /* code 00CA */ + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00CB[ 48] = { /* code 00CB */ + ________,________, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00CC[ 24] = { /* code 00CC */ + _XX_____, + __XX____, + ___X____, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00CD[ 24] = { /* code 00CD */ + ___XX___, + __XX____, + __X_____, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00CE[ 24] = { /* code 00CE */ + __XX____, + _XXXX___, + XX__XX__, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00CF[ 24] = { /* code 00CF */ + ________, + XX__XX__, + XX__XX__, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D0[ 48] = { /* code 00D0 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XXXX____, + __XX____,__XXX___, + __XX____,___XX___, + __XX____,____XX__, + __XX____,____XX__, + XXXXXXXX,____XX__, + XXXXXXXX,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,___XX___, + __XX____,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D1[ 48] = { /* code 00D1 */ + _____XXX,_XX_____, + ____XXXX,XXX_____, + ____XX_X,XX______, + ________,________, + _XX_____,___XX___, + _XXX____,___XX___, + _XXXX___,___XX___, + _XXXX___,___XX___, + _XX_XX__,___XX___, + _XX__XX_,___XX___, + _XX__XX_,___XX___, + _XX___XX,___XX___, + _XX____X,X__XX___, + _XX____X,X__XX___, + _XX_____,XX_XX___, + _XX_____,_XXXX___, + _XX_____,_XXXX___, + _XX_____,__XXX___, + _XX_____,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D2[ 48] = { /* code 00D2 */ + ______XX,________, + _______X,X_______, + ________,X_______, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XXX_, + __XX____,____XX__, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D3[ 48] = { /* code 00D3 */ + ________,XX______, + _______X,X_______, + _______X,________, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XXX_, + __XX____,____XX__, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D4[ 48] = { /* code 00D4 */ + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XXX_, + __XX____,____XX__, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D5[ 48] = { /* code 00D5 */ + ______XX,X_XX____, + _____XXX,XXXX____, + _____XX_,XXX_____, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XXX_, + __XX____,____XX__, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D6[ 48] = { /* code 00D6 */ + ________,________, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XXX_, + __XX____,____XX__, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D7[ 48] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,XX______, + _XXX___X,XX______, + __XXX_XX,X_______, + ___XXXXX,________, + ____XXX_,________, + ___XXXXX,________, + __XXX_XX,X_______, + _XXX___X,XX______, + _XX_____,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D8[ 48] = { /* code 00D8 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX__XX_, + ____XXXX,XXXXXX__, + ___XXX__,__XXXX__, + __XX____,___XXX__, + __XX____,__XXXXX_, + _XX_____,_XX__XX_, + _XX_____,XX___XX_, + _XX____X,X____XX_, + _XX___XX,_____XX_, + _XX__XX_,_____XX_, + _XXX_XX_,____XX__, + __XXXX__,____XX__, + ___XXX__,__XXX___, + __XXXXXX,XXXX____, + _XX__XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00D9[ 48] = { /* code 00D9 */ + _____XX_,________, + ______XX,________, + _______X,________, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00DA[ 48] = { /* code 00DA */ + _______X,X_______, + ______XX,________, + ______X_,________, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00DB[ 48] = { /* code 00DB */ + ______XX,________, + _____XXX,X_______, + ____XX__,XX______, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00DC[ 48] = { /* code 00DC */ + ________,________, + ____XX__,XX______, + ____XX__,XX______, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00DD[ 48] = { /* code 00DD */ + _______X,X_______, + ______XX,________, + ______X_,________, + ________,________, + XXX_____,___XXX__, + _XX_____,___XX___, + __XX____,__XX____, + __XXX___,_XXX____, + ___XXX__,XXX_____, + ____XX__,XX______, + _____XXX,X_______, + _____XXX,X_______, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00DE[ 48] = { /* code 00DE */ + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00DF[ 48] = { /* code 00DF */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,XX______, + __XXX___,XXX_____, + __XX____,_XX_____, + __XX____,_XX_____, + __XX____,XX______, + __XX___X,X_______, + __XX___X,X_______, + __XX____,XXX_____, + __XX____,_XXX____, + __XX____,___XX___, + __XX____,___XX___, + __XX_XXX,__XXX___, + __XX__XX,XXXX____, + __XX___X,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E0[ 48] = { /* code 00E0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + _____XX_,________, + ______X_,________, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E1[ 48] = { /* code 00E1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XX_,________, + _____X__,________, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E2[ 48] = { /* code 00E2 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + ___XX__X,X_______, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E3[ 48] = { /* code 00E3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX_X,X_______, + __XXXXXX,X_______, + __XX_XXX,________, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E4[ 48] = { /* code 00E4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX__X,X_______, + ___XX__X,X_______, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E5[ 48] = { /* code 00E5 */ + ________,________, + ________,________, + ____XXX_,________, + ___X___X,________, + ___X___X,________, + ___X___X,________, + ____XXX_,________, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E6[ 72] = { /* code 00E6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XXXXX,X__XXXX_,________, + __XXXXXX,XXXXXXXX,X_______, + _XX_____,XXX____X,X_______, + ______XX,XX______,XX______, + __XXXXXX,XXXXXXXX,XX______, + __XXXX__,XXXXXXXX,XX______, + _XX_____,XX______,________, + _XX_____,XX______,XX______, + _XX____X,XXX____X,X_______, + __XXXXXX,X_XXXXXX,X_______, + ___XXXX_,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E7[ 48] = { /* code 00E7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,X_______, + __XX___X,XX______, + _XX_____,XX______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + _____X__,________, + _____XX_,________, + ______XX,________, + ___XXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E8[ 48] = { /* code 00E8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + _____XX_,________, + ______X_,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XX_____,________, + _XX_____,________, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00E9[ 48] = { /* code 00E9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XX_,________, + _____X__,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XX_____,________, + _XX_____,________, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00EA[ 48] = { /* code 00EA */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + ___XX__X,X_______, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XX_____,________, + _XX_____,________, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00EB[ 48] = { /* code 00EB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX__X,X_______, + ___XX__X,X_______, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XX_____,________, + _XX_____,________, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00EC[ 24] = { /* code 00EC */ + ________, + ________, + ________, + ________, + _XX_____, + __XX____, + ___X____, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00ED[ 24] = { /* code 00ED */ + ________, + ________, + ________, + ________, + ___XX___, + __XX____, + __X_____, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00EE[ 24] = { /* code 00EE */ + ________, + ________, + ________, + ________, + __XX____, + _XXXX___, + XX__XX__, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00EF[ 24] = { /* code 00EF */ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F0[ 48] = { /* code 00F0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,X_______, + _____XXX,X_______, + ____XXXX,________, + ___XX__X,X_______, + ___XXXX_,XX______, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F1[ 48] = { /* code 00F1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX_X,X_______, + __XXXXXX,X_______, + __XX_XXX,________, + ________,________, + _XX_XXXX,________, + _XXXXXXX,X_______, + _XXX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F2[ 48] = { /* code 00F2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + _____XX_,________, + ______X_,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F3[ 48] = { /* code 00F3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XX_,________, + _____X__,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F4[ 48] = { /* code 00F4 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + ___XX__X,X_______, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F5[ 48] = { /* code 00F5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,XX______, + ___XXXXX,XX______, + ___XX_XX,X_______, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F6[ 48] = { /* code 00F6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX__X,X_______, + ___XX__X,X_______, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F7[ 48] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F8[ 48] = { /* code 00F8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,_XX_____, + ___XXXXX,_XX_____, + __XXXXXX,XX______, + __XX___X,XX______, + _XX____X,_XX_____, + _XX___XX,_XX_____, + _XX__XX_,_XX_____, + _XX_XX__,_XX_____, + _XX_X___,_XX_____, + _XXXX___,XX______, + __XXXXXX,XX______, + _XX_XXXX,________, + _XX_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00F9[ 48] = { /* code 00F9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ____XX__,________, + _____X__,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00FA[ 48] = { /* code 00FA */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XX_,________, + _____X__,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00FB[ 48] = { /* code 00FB */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + ___XX__X,X_______, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00FC[ 48] = { /* code 00FC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX__XX,________, + __XX__XX,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00FD[ 48] = { /* code 00FD */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XX_,________, + _____X__,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,X_______, + __XX___X,X_______, + __XXX__X,X_______, + ___XX__X,X_______, + ___XX_XX,________, + ____XXXX,________, + ____XXXX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + _XXXXX__,________, + _XXXX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00FE[ 48] = { /* code 00FE */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_XXXX,________, + _XXXXXXX,XX______, + _XXX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + _XXXXXXX,XX______, + _XX_XXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_1_00FF[ 48] = { /* code 00FF */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX__X,X_______, + ___XX__X,X_______, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,X_______, + __XX___X,X_______, + __XXX__X,X_______, + ___XX__X,X_______, + ___XX_XX,________, + ____XXXX,________, + ____XXXX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + _XXXXX__,________, + _XXXX___,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24_1_CharInfo[96] = { + { 6, 6, 1, acFont24_1_00A0 } /* code 00A0 */ + ,{ 6, 6, 1, acFont24_1_00A1 } /* code 00A1 */ + ,{ 12, 12, 2, acFont24_1_00A2 } /* code 00A2 */ + ,{ 12, 12, 2, acFont24_1_00A3 } /* code 00A3 */ + ,{ 12, 12, 2, acFont24_1_00A4 } /* code 00A4 */ + ,{ 12, 12, 2, acFont24_1_00A5 } /* code 00A5 */ + ,{ 6, 6, 1, acFont24_1_00A6 } /* code 00A6 */ + ,{ 12, 12, 2, acFont24_1_00A7 } /* code 00A7 */ + ,{ 7, 7, 1, acFont24_1_00A8 } /* code 00A8 */ + ,{ 15, 15, 2, acFont24_1_00A9 } /* code 00A9 */ + ,{ 7, 7, 1, acFont24_1_00AA } /* code 00AA */ + ,{ 12, 12, 2, acFont24_1_00AB } /* code 00AB */ + ,{ 12, 12, 2, acFont24_1_00AC } /* code 00AC */ + ,{ 7, 7, 1, acFont24_1_00AD } /* code 00AD */ + ,{ 15, 15, 2, acFont24_1_00AE } /* code 00AE */ + ,{ 12, 12, 2, acFont24_1_00AF } /* code 00AF */ + ,{ 8, 8, 1, acFont24_1_00B0 } /* code 00B0 */ + ,{ 12, 12, 2, acFont24_1_00B1 } /* code 00B1 */ + ,{ 7, 7, 1, acFont24_1_00B2 } /* code 00B2 */ + ,{ 7, 7, 1, acFont24_1_00B3 } /* code 00B3 */ + ,{ 7, 7, 1, acFont24_1_00B4 } /* code 00B4 */ + ,{ 11, 11, 2, acFont24_1_00B5 } /* code 00B5 */ + ,{ 11, 11, 2, acFont24_1_00B6 } /* code 00B6 */ + ,{ 6, 6, 1, acFont24_1_00B7 } /* code 00B7 */ + ,{ 7, 7, 1, acFont24_1_00B8 } /* code 00B8 */ + ,{ 7, 7, 1, acFont24_1_00B9 } /* code 00B9 */ + ,{ 8, 8, 1, acFont24_1_00BA } /* code 00BA */ + ,{ 12, 12, 2, acFont24_1_00BB } /* code 00BB */ + ,{ 18, 18, 3, acFont24_1_00BC } /* code 00BC */ + ,{ 18, 18, 3, acFont24_1_00BD } /* code 00BD */ + ,{ 18, 18, 3, acFont24_1_00BE } /* code 00BE */ + ,{ 13, 13, 2, acFont24_1_00BF } /* code 00BF */ + ,{ 13, 13, 2, acFont24_1_00C0 } /* code 00C0 */ + ,{ 13, 13, 2, acFont24_1_00C1 } /* code 00C1 */ + ,{ 13, 13, 2, acFont24_1_00C2 } /* code 00C2 */ + ,{ 13, 13, 2, acFont24_1_00C3 } /* code 00C3 */ + ,{ 13, 13, 2, acFont24_1_00C4 } /* code 00C4 */ + ,{ 13, 13, 2, acFont24_1_00C5 } /* code 00C5 */ + ,{ 21, 21, 3, acFont24_1_00C6 } /* code 00C6 */ + ,{ 15, 15, 2, acFont24_1_00C7 } /* code 00C7 */ + ,{ 14, 14, 2, acFont24_1_00C8 } /* code 00C8 */ + ,{ 14, 14, 2, acFont24_1_00C9 } /* code 00C9 */ + ,{ 14, 14, 2, acFont24_1_00CA } /* code 00CA */ + ,{ 14, 14, 2, acFont24_1_00CB } /* code 00CB */ + ,{ 6, 6, 1, acFont24_1_00CC } /* code 00CC */ + ,{ 6, 6, 1, acFont24_1_00CD } /* code 00CD */ + ,{ 6, 6, 1, acFont24_1_00CE } /* code 00CE */ + ,{ 6, 6, 1, acFont24_1_00CF } /* code 00CF */ + ,{ 15, 15, 2, acFont24_1_00D0 } /* code 00D0 */ + ,{ 14, 14, 2, acFont24_1_00D1 } /* code 00D1 */ + ,{ 16, 16, 2, acFont24_1_00D2 } /* code 00D2 */ + ,{ 16, 16, 2, acFont24_1_00D3 } /* code 00D3 */ + ,{ 16, 16, 2, acFont24_1_00D4 } /* code 00D4 */ + ,{ 16, 16, 2, acFont24_1_00D5 } /* code 00D5 */ + ,{ 16, 16, 2, acFont24_1_00D6 } /* code 00D6 */ + ,{ 12, 12, 2, acFont24_1_00D7 } /* code 00D7 */ + ,{ 16, 16, 2, acFont24_1_00D8 } /* code 00D8 */ + ,{ 14, 14, 2, acFont24_1_00D9 } /* code 00D9 */ + ,{ 14, 14, 2, acFont24_1_00DA } /* code 00DA */ + ,{ 14, 14, 2, acFont24_1_00DB } /* code 00DB */ + ,{ 14, 14, 2, acFont24_1_00DC } /* code 00DC */ + ,{ 14, 14, 2, acFont24_1_00DD } /* code 00DD */ + ,{ 14, 14, 2, acFont24_1_00DE } /* code 00DE */ + ,{ 13, 13, 2, acFont24_1_00DF } /* code 00DF */ + ,{ 12, 12, 2, acFont24_1_00E0 } /* code 00E0 */ + ,{ 12, 12, 2, acFont24_1_00E1 } /* code 00E1 */ + ,{ 12, 12, 2, acFont24_1_00E2 } /* code 00E2 */ + ,{ 12, 12, 2, acFont24_1_00E3 } /* code 00E3 */ + ,{ 12, 12, 2, acFont24_1_00E4 } /* code 00E4 */ + ,{ 12, 12, 2, acFont24_1_00E5 } /* code 00E5 */ + ,{ 19, 19, 3, acFont24_1_00E6 } /* code 00E6 */ + ,{ 11, 11, 2, acFont24_1_00E7 } /* code 00E7 */ + ,{ 12, 12, 2, acFont24_1_00E8 } /* code 00E8 */ + ,{ 12, 12, 2, acFont24_1_00E9 } /* code 00E9 */ + ,{ 12, 12, 2, acFont24_1_00EA } /* code 00EA */ + ,{ 12, 12, 2, acFont24_1_00EB } /* code 00EB */ + ,{ 6, 6, 1, acFont24_1_00EC } /* code 00EC */ + ,{ 6, 6, 1, acFont24_1_00ED } /* code 00ED */ + ,{ 6, 6, 1, acFont24_1_00EE } /* code 00EE */ + ,{ 6, 6, 1, acFont24_1_00EF } /* code 00EF */ + ,{ 12, 12, 2, acFont24_1_00F0 } /* code 00F0 */ + ,{ 11, 11, 2, acFont24_1_00F1 } /* code 00F1 */ + ,{ 12, 12, 2, acFont24_1_00F2 } /* code 00F2 */ + ,{ 12, 12, 2, acFont24_1_00F3 } /* code 00F3 */ + ,{ 12, 12, 2, acFont24_1_00F4 } /* code 00F4 */ + ,{ 12, 12, 2, acFont24_1_00F5 } /* code 00F5 */ + ,{ 12, 12, 2, acFont24_1_00F6 } /* code 00F6 */ + ,{ 12, 12, 2, acFont24_1_00F7 } /* code 00F7 */ + ,{ 12, 12, 2, acFont24_1_00F8 } /* code 00F8 */ + ,{ 11, 11, 2, acFont24_1_00F9 } /* code 00F9 */ + ,{ 11, 11, 2, acFont24_1_00FA } /* code 00FA */ + ,{ 11, 11, 2, acFont24_1_00FB } /* code 00FB */ + ,{ 11, 11, 2, acFont24_1_00FC } /* code 00FC */ + ,{ 11, 11, 2, acFont24_1_00FD } /* code 00FD */ + ,{ 12, 12, 2, acFont24_1_00FE } /* code 00FE */ + ,{ 11, 11, 2, acFont24_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font24_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font24_1_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font24_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font24_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font24_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font24_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,24 /* height of font */ + ,24 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font24_1_Prop1} + ,19, 11, 15 +}; + diff --git a/User/system/lib/lcd/gui/Font/F24_ASCII.c b/User/system/lib/lcd/gui/Font/F24_ASCII.c new file mode 100644 index 0000000..8edb3d2 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F24_ASCII.c @@ -0,0 +1,2608 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F24_ASCII.C +Purpose : ASCII character set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0020[ 24] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0021[ 24] = { /* code 0021 */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0022[ 24] = { /* code 0022 */ + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0023[ 48] = { /* code 0023 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + ____XX__,XXX_____, + ___XX___,XX______, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ___XX___,XX______, + __XX___X,X_______, + __XX___X,X_______, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + __XX___X,X_______, + _XXX__XX,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0024[ 48] = { /* code 0024 */ + ________,________, + ________,________, + ________,________, + _____X__,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXX_X_X,XX______, + _XX__X__,XX______, + _XX__X__,________, + _XXX_X__,________, + __XXXXX_,________, + ____XXXX,X_______, + _____X_X,XX______, + _____X__,XX______, + _____X__,XX______, + _XX__X__,XX______, + _XXX_X_X,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + _____X__,________, + _____X__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0025[ 72] = { /* code 0025 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XXX__,_____XX_,________, + __XX_XX_,____XX__,________, + _XX___XX,____XX__,________, + _XX___XX,___XX___,________, + _XX___XX,___XX___,________, + _XX___XX,__XX____,________, + __XX_XX_,_XX_____,________, + ___XXX__,_XX__XXX,________, + ________,XX__XX_X,X_______, + ________,XX_XX___,XX______, + _______X,X__XX___,XX______, + _______X,X__XX___,XX______, + ______XX,___XX___,XX______, + _____XX_,____XX_X,X_______, + _____XX_,_____XXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0026[ 48] = { /* code 0026 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ____XXXX,XX______, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,XX______, + ____XX_X,X_______, + ____XXXX,________, + ___XXXXX,________, + __XX__XX,X__XX___, + _XX____X,XX_XX___, + _XX_____,XXXX____, + _XX_____,_XX_____, + _XXX____,XXXX____, + __XXXXXX,XX_XX___, + ___XXXXX,____X___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0027[ 24] = { /* code 0027 */ + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0028[ 24] = { /* code 0028 */ + ________, + ________, + ________, + ________, + _____X__, + ____X___, + ___XX___, + ___X____, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + __XX____, + ___X____, + ___XX___, + ____X___, + _____X__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0029[ 24] = { /* code 0029 */ + ________, + ________, + ________, + ________, + _X______, + __X_____, + __XX____, + ___X____, + ___XX___, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + ___X____, + __XX____, + __X_____, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_002A[ 24] = { /* code 002A */ + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + XXXXXXXX, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_002B[ 48] = { /* code 002B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_002C[ 24] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ___X____, + ___X____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_002D[ 24] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_002E[ 24] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_002F[ 24] = { /* code 002F */ + ________, + ________, + ________, + ________, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XX______, + XX______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0030[ 48] = { /* code 0030 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0031[ 48] = { /* code 0031 */ + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ____XXXX,________, + ___XXXXX,________, + __XX__XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0032[ 48] = { /* code 0032 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXX____,XXX_____, + _XX_____,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,XX______, + ________,XX______, + _______X,X_______, + _____XXX,________, + ____XXX_,________, + ___XX___,________, + __XX____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0033[ 48] = { /* code 0033 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXX___X,XX______, + _XX_____,XX______, + ________,XX______, + _______X,X_______, + _____XXX,________, + _____XXX,XX______, + ________,XXX_____, + ________,_XX_____, + ________,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0034[ 48] = { /* code 0034 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,X_______, + _______X,X_______, + ______XX,X_______, + _____XXX,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX__X,X_______, + __XX___X,X_______, + _XX____X,X_______, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0035[ 48] = { /* code 0035 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,________, + __XX____,________, + __XX____,________, + __XX_XXX,X_______, + _XXXXXXX,XX______, + _XX_____,XXX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0036[ 48] = { /* code 0036 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,________, + _XX__XXX,X_______, + _XXXXXXX,XX______, + _XXX____,XXX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + ___XXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0037[ 48] = { /* code 0037 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,XX______, + _______X,X_______, + _______X,X_______, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0038[ 48] = { /* code 0038 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,X_______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + ___XXXXX,X_______, + ___XXXXX,X_______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0039[ 48] = { /* code 0039 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,X_______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,_XX_____, + _XX_____,XX______, + _XXX____,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_003A[ 24] = { /* code 003A */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_003B[ 24] = { /* code 003B */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ___X____, + ___X____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_003C[ 48] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,__X_____, + ________,XXX_____, + ______XX,XX______, + ____XXXX,________, + __XXX___,________, + _XX_____,________, + __XXX___,________, + ____XXXX,________, + ______XX,XX______, + ________,XXX_____, + ________,__X_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_003D[ 48] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_003E[ 48] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X______,________, + _XXX____,________, + __XXXX__,________, + ____XXXX,________, + _______X,XX______, + ________,_XX_____, + _______X,XX______, + ____XXXX,________, + __XXXX__,________, + _XXX____,________, + _X______,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_003F[ 48] = { /* code 003F */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXX____,XXX_____, + _XX_____,_XX_____, + ________,_XX_____, + ________,XX______, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0040[ 72] = { /* code 0040 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,XXXXXXX_,________, + _____XXX,XXXXXXXX,X_______, + ____XXXX,______XX,XX______, + ___XXX__,________,XXX_____, + ___XX___,_XXX__XX,_XX_____, + __XX___X,XXXXX_XX,_XXX____, + __XX__XX,X___XXX_,__XX____, + _XX___XX,_____XX_,__XX____, + _XX__XX_,_____XX_,__XX____, + _XX__XX_,_____XX_,__XX____, + _XX__XX_,_____X__,_XXX____, + _XX__XX_,____XX__,_XX_____, + _XX__XXX,___XXX__,XX______, + __XX__XX,XXXXXXXX,X_______, + __XXX__X,XXX_XXXX,__XX____, + ___XXX__,________,_XX_____, + ____XXXX,_______X,XX______, + _____XXX,XXXXXXXX,X_______, + _______X,XXXXXXX_,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0041[ 48] = { /* code 0041 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + ____XX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX___,XX______, + ___XX___,XX______, + ___XX___,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0042[ 48] = { /* code 0042 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XXX_____, + __XX____,_XXX____, + __XX____,__XX____, + __XX____,__XX____, + __XX____,_XXX____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XX____,__XX____, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0043[ 48] = { /* code 0043 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,___XXX__, + _XXX____,____XX__, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXX____,____XX__, + __XX____,___XX___, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0044[ 48] = { /* code 0044 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XXXX____, + __XX____,__XXX___, + __XX____,___XX___, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,___XX___, + __XX____,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0045[ 48] = { /* code 0045 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0046[ 48] = { /* code 0046 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0047[ 48] = { /* code 0047 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXXX____, + ____XXXX,XXXXX___, + ___XXX__,___XXX__, + __XX____,____XXX_, + __XX____,_____X__, + _XX_____,________, + _XX_____,________, + _XX_____,XXXXXXX_, + _XX_____,XXXXXXX_, + _XX_____,_____XX_, + __XX____,_____XX_, + __XX____,_____XX_, + ___XXX__,___XXXX_, + ____XXXX,XXXXXX__, + ______XX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0048[ 48] = { /* code 0048 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0049[ 24] = { /* code 0049 */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_004A[ 48] = { /* code 004A */ + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XXX__XX,X_______, + __XXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_004B[ 48] = { /* code 004B */ + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,__XXX___, + __XX____,_XXX____, + __XX____,XXX_____, + __XX___X,XX______, + __XX__XX,X_______, + __XX_XXX,________, + __XX_XXX,________, + __XXXXXX,________, + __XXX_XX,X_______, + __XX___X,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + __XX____,_XXX____, + __XX____,__XXX___, + __XX____,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_004C[ 48] = { /* code 004C */ + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_004D[ 72] = { /* code 004D */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXX____,_____XXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XX_X___,____X_XX,________, + _XX_XX__,___XX_XX,________, + _XX_XX__,___XX_XX,________, + _XX__X__,___X__XX,________, + _XX__XX_,__XX__XX,________, + _XX__XX_,__XX__XX,________, + _XX___X_,__X___XX,________, + _XX___XX,_XX___XX,________, + _XX___XX,_XX___XX,________, + _XX____X,_X____XX,________, + _XX____X,XX____XX,________, + _XX____X,XX____XX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_004E[ 48] = { /* code 004E */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,___XX___, + _XXX____,___XX___, + _XXXX___,___XX___, + _XXXX___,___XX___, + _XX_XX__,___XX___, + _XX__XX_,___XX___, + _XX__XX_,___XX___, + _XX___XX,___XX___, + _XX____X,X__XX___, + _XX____X,X__XX___, + _XX_____,XX_XX___, + _XX_____,_XXXX___, + _XX_____,_XXXX___, + _XX_____,__XXX___, + _XX_____,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_004F[ 48] = { /* code 004F */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XXX_, + __XX____,____XX__, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0050[ 48] = { /* code 0050 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0051[ 48] = { /* code 0051 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ____XXXX,XXXXX___, + ___XXX__,__XXXX__, + __XX____,____XX__, + _XXX____,____XXX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XX_____,_____XX_, + _XXX____,____XX__, + __XX____,XXX_XX__, + ___XXX__,__XXX___, + ____XXXX,XXXXXX__, + _____XXX,XXX_XXX_, + ________,______X_, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0052[ 48] = { /* code 0052 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + __XX____,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + __XX____,_XXX____, + __XX____,__XXX___, + __XX____,___XX___, + __XX____,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0053[ 48] = { /* code 0053 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + __XX____,________, + __XXX___,________, + ___XXXXX,X_______, + _____XXX,XXX_____, + ________,_XXX____, + ________,___XX___, + _XX_____,___XX___, + _XXX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0054[ 48] = { /* code 0054 */ + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0055[ 48] = { /* code 0055 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0056[ 48] = { /* code 0056 */ + ________,________, + ________,________, + ________,________, + ________,________, + XX______,___XX___, + XXX_____,__XXX___, + _XX_____,__XX____, + _XX_____,__XX____, + _XXX____,_XXX____, + __XX____,_XX_____, + __XX____,_XX_____, + __XXX___,XXX_____, + ___XX___,XX______, + ___XX___,XX______, + ___XXX_X,XX______, + ____XX_X,X_______, + ____XX_X,X_______, + ____XXXX,X_______, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0057[ 72] = { /* code 0057 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XX______,_XXX____,___XX___, + XX______,_XXX____,___XX___, + _XX_____,XX_XX___,__XX____, + _XX_____,XX_XX___,__XX____, + _XX_____,XX_XX___,__XX____, + _XXX____,XX__X___,_XXX____, + __XX___X,X___XX__,_XX_____, + __XX___X,X___XX__,_XX_____, + __XX___X,X___XX__,_XX_____, + ___XX_XX,_____XX_,XX______, + ___XX_XX,_____XX_,XX______, + ___XX_XX,_____XX_,XX______, + ___XX_XX,_____XX_,XX______, + ____XXX_,______XX,X_______, + ____XXX_,______XX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0058[ 48] = { /* code 0058 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,__XXX___, + __XXX___,_XXX____, + ___XX___,_XX_____, + ____XX__,XX______, + ____XX__,XX______, + _____XXX,X_______, + ______XX,________, + _____XXX,X_______, + _____XXX,X_______, + ____XX_X,XX______, + ___XXX__,XXX_____, + ___XX___,_XX_____, + __XX____,__XX____, + _XXX____,__XXX___, + XXX_____,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0059[ 48] = { /* code 0059 */ + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,___XXX__, + _XX_____,___XX___, + __XX____,__XX____, + __XXX___,_XXX____, + ___XXX__,XXX_____, + ____XX__,XX______, + _____XXX,X_______, + _____XXX,X_______, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_005A[ 48] = { /* code 005A */ + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + ________,_XX_____, + ________,XX______, + _______X,X_______, + _______X,X_______, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + _XX_____,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_005B[ 24] = { /* code 005B */ + ________, + ________, + ________, + ________, + _XXXX___, + _XXXX___, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXX___, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_005C[ 24] = { /* code 005C */ + ________, + ________, + ________, + ________, + XX______, + XX______, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + __XX____, + __XX____, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ____XX__, + ____XX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_005D[ 24] = { /* code 005D */ + ________, + ________, + ________, + ________, + _XXXX___, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXX___, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_005E[ 24] = { /* code 005E */ + ________, + ________, + ________, + ________, + ___XX___, + __XXXX__, + __XXXX__, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XX____XX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_005F[ 48] = { /* code 005F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0060[ 24] = { /* code 0060 */ + ________, + ________, + ________, + ________, + _XX_____, + __XX____, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0061[ 48] = { /* code 0061 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,XX______, + ________,XX______, + _____XXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + _XX_____,XX______, + _XX____X,XX______, + _XXXXXXX,XX______, + __XXXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0062[ 48] = { /* code 0062 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_XXXX,________, + _XXXXXXX,X_______, + _XXX___X,X_______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,X_______, + _XXXXXXX,X_______, + _XX_XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0063[ 48] = { /* code 0063 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,X_______, + __XX___X,XX______, + _XX_____,XX______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0064[ 48] = { /* code 0064 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ___XXXX_,XX______, + __XXXXXX,XX______, + __XX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0065[ 48] = { /* code 0065 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XX_____,________, + _XX_____,________, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0066[ 24] = { /* code 0066 */ + ________, + ________, + ________, + ________, + ___XXX__, + __XXXX__, + __XX____, + __XX____, + XXXXXX__, + XXXXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0067[ 48] = { /* code 0067 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,XX______, + __XXXXXX,XX______, + __XX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,XX______, + _XX____X,XX______, + _XXXXXXX,X_______, + ___XXXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0068[ 48] = { /* code 0068 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_XXXX,________, + _XXXXXXX,X_______, + _XXX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0069[ 24] = { /* code 0069 */ + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_006A[ 24] = { /* code 006A */ + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXX_____, + XX______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_006B[ 48] = { /* code 006B */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX____X,XX______, + _XX___XX,X_______, + _XX__XXX,________, + _XX_XXX_,________, + _XXXXX__,________, + _XXXXXX_,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,X_______, + _XX____X,X_______, + _XX____X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_006C[ 24] = { /* code 006C */ + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_006D[ 48] = { /* code 006D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_XXXX,__XXXX__, + _XXXXXXX,_XXXXXX_, + _XXX___X,XX___XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + _XX____X,X____XX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_006E[ 48] = { /* code 006E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_XXXX,________, + _XXXXXXX,X_______, + _XXX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_006F[ 48] = { /* code 006F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0070[ 48] = { /* code 0070 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_XXXX,________, + _XXXXXXX,X_______, + _XXX___X,X_______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,X_______, + _XXXXXXX,X_______, + _XX_XXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0071[ 48] = { /* code 0071 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,XX______, + __XXXXXX,XX______, + __XX___X,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0072[ 24] = { /* code 0072 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_XXX_, + _XXXXXX_, + _XXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0073[ 48] = { /* code 0073 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XX_____,XX______, + _XX_____,________, + _XXXXX__,________, + __XXXXXX,X_______, + ______XX,XX______, + ________,XX______, + _XX_____,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0074[ 24] = { /* code 0074 */ + ________, + ________, + ________, + ________, + __X_____, + _XX_____, + _XX_____, + _XX_____, + XXXXX___, + XXXXX___, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0075[ 48] = { /* code 0075 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XX_____,XX______, + _XXX___X,XX______, + __XXXXXX,XX______, + ___XXXX_,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0076[ 48] = { /* code 0076 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,_XX_____, + XX______,_XX_____, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,X_______, + __XX___X,X_______, + ___XX_XX,________, + ___XX_XX,________, + ____XXX_,________, + ____XXX_,________, + _____X__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0077[ 48] = { /* code 0077 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_____X,_____XX_, + XX____XX,X____XX_, + _X____XX,X____X__, + _XX___X_,X___XX__, + _XX__XX_,XX__XX__, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + ___X_X__,_X_X____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ____XX__,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0078[ 48] = { /* code 0078 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX____X,XX______, + _XX____X,X_______, + __XX__XX,________, + __XX__XX,________, + ___XXXX_,________, + ____XX__,________, + ___XXXX_,________, + __XX__XX,________, + __XX__XX,________, + _XX____X,X_______, + XXX____X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_0079[ 48] = { /* code 0079 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,X_______, + __XX___X,X_______, + __XXX__X,X_______, + ___XX__X,X_______, + ___XX_XX,________, + ____XXXX,________, + ____XXXX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + _XXXXX__,________, + _XXXX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_007A[ 48] = { /* code 007A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ______XX,X_______, + _____XXX,________, + ____XXX_,________, + ___XXX__,________, + __XXX___,________, + _XXX____,________, + XXX_____,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_007B[ 24] = { /* code 007B */ + ________, + ________, + ________, + ________, + ___XXX__, + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXX____, + XXX_____, + XXX_____, + _XX_____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__, + ___XXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_007C[ 24] = { /* code 007C */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_007D[ 24] = { /* code 007D */ + ________, + ________, + ________, + ________, + _XXX____, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XXX__, + ____XXX_, + ____XXX_, + ___XXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXX___, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont24_ASCII_007E[ 48] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,________, + _XXXXXX_,__X_____, + _X___XXX,XXX_____, + _______X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24_ASCII_CharInfo[95] = { + { 6, 6, 1, acFont24_ASCII_0020 } /* code 0020 */ + ,{ 6, 6, 1, acFont24_ASCII_0021 } /* code 0021 */ + ,{ 7, 7, 1, acFont24_ASCII_0022 } /* code 0022 */ + ,{ 12, 12, 2, acFont24_ASCII_0023 } /* code 0023 */ + ,{ 12, 12, 2, acFont24_ASCII_0024 } /* code 0024 */ + ,{ 19, 19, 3, acFont24_ASCII_0025 } /* code 0025 */ + ,{ 14, 14, 2, acFont24_ASCII_0026 } /* code 0026 */ + ,{ 4, 4, 1, acFont24_ASCII_0027 } /* code 0027 */ + ,{ 7, 7, 1, acFont24_ASCII_0028 } /* code 0028 */ + ,{ 7, 7, 1, acFont24_ASCII_0029 } /* code 0029 */ + ,{ 8, 8, 1, acFont24_ASCII_002A } /* code 002A */ + ,{ 12, 12, 2, acFont24_ASCII_002B } /* code 002B */ + ,{ 6, 6, 1, acFont24_ASCII_002C } /* code 002C */ + ,{ 7, 7, 1, acFont24_ASCII_002D } /* code 002D */ + ,{ 6, 6, 1, acFont24_ASCII_002E } /* code 002E */ + ,{ 6, 6, 1, acFont24_ASCII_002F } /* code 002F */ + ,{ 12, 12, 2, acFont24_ASCII_0030 } /* code 0030 */ + ,{ 12, 12, 2, acFont24_ASCII_0031 } /* code 0031 */ + ,{ 12, 12, 2, acFont24_ASCII_0032 } /* code 0032 */ + ,{ 12, 12, 2, acFont24_ASCII_0033 } /* code 0033 */ + ,{ 12, 12, 2, acFont24_ASCII_0034 } /* code 0034 */ + ,{ 12, 12, 2, acFont24_ASCII_0035 } /* code 0035 */ + ,{ 12, 12, 2, acFont24_ASCII_0036 } /* code 0036 */ + ,{ 12, 12, 2, acFont24_ASCII_0037 } /* code 0037 */ + ,{ 12, 12, 2, acFont24_ASCII_0038 } /* code 0038 */ + ,{ 12, 12, 2, acFont24_ASCII_0039 } /* code 0039 */ + ,{ 6, 6, 1, acFont24_ASCII_003A } /* code 003A */ + ,{ 6, 6, 1, acFont24_ASCII_003B } /* code 003B */ + ,{ 12, 12, 2, acFont24_ASCII_003C } /* code 003C */ + ,{ 12, 12, 2, acFont24_ASCII_003D } /* code 003D */ + ,{ 12, 12, 2, acFont24_ASCII_003E } /* code 003E */ + ,{ 12, 12, 2, acFont24_ASCII_003F } /* code 003F */ + ,{ 21, 21, 3, acFont24_ASCII_0040 } /* code 0040 */ + ,{ 13, 13, 2, acFont24_ASCII_0041 } /* code 0041 */ + ,{ 14, 14, 2, acFont24_ASCII_0042 } /* code 0042 */ + ,{ 15, 15, 2, acFont24_ASCII_0043 } /* code 0043 */ + ,{ 15, 15, 2, acFont24_ASCII_0044 } /* code 0044 */ + ,{ 14, 14, 2, acFont24_ASCII_0045 } /* code 0045 */ + ,{ 13, 13, 2, acFont24_ASCII_0046 } /* code 0046 */ + ,{ 16, 16, 2, acFont24_ASCII_0047 } /* code 0047 */ + ,{ 14, 14, 2, acFont24_ASCII_0048 } /* code 0048 */ + ,{ 6, 6, 1, acFont24_ASCII_0049 } /* code 0049 */ + ,{ 11, 11, 2, acFont24_ASCII_004A } /* code 004A */ + ,{ 14, 14, 2, acFont24_ASCII_004B } /* code 004B */ + ,{ 12, 12, 2, acFont24_ASCII_004C } /* code 004C */ + ,{ 17, 17, 3, acFont24_ASCII_004D } /* code 004D */ + ,{ 14, 14, 2, acFont24_ASCII_004E } /* code 004E */ + ,{ 16, 16, 2, acFont24_ASCII_004F } /* code 004F */ + ,{ 14, 14, 2, acFont24_ASCII_0050 } /* code 0050 */ + ,{ 16, 16, 2, acFont24_ASCII_0051 } /* code 0051 */ + ,{ 15, 15, 2, acFont24_ASCII_0052 } /* code 0052 */ + ,{ 14, 14, 2, acFont24_ASCII_0053 } /* code 0053 */ + ,{ 12, 12, 2, acFont24_ASCII_0054 } /* code 0054 */ + ,{ 14, 14, 2, acFont24_ASCII_0055 } /* code 0055 */ + ,{ 13, 13, 2, acFont24_ASCII_0056 } /* code 0056 */ + ,{ 21, 21, 3, acFont24_ASCII_0057 } /* code 0057 */ + ,{ 14, 14, 2, acFont24_ASCII_0058 } /* code 0058 */ + ,{ 14, 14, 2, acFont24_ASCII_0059 } /* code 0059 */ + ,{ 13, 13, 2, acFont24_ASCII_005A } /* code 005A */ + ,{ 6, 6, 1, acFont24_ASCII_005B } /* code 005B */ + ,{ 6, 6, 1, acFont24_ASCII_005C } /* code 005C */ + ,{ 6, 6, 1, acFont24_ASCII_005D } /* code 005D */ + ,{ 8, 8, 1, acFont24_ASCII_005E } /* code 005E */ + ,{ 12, 12, 2, acFont24_ASCII_005F } /* code 005F */ + ,{ 7, 7, 1, acFont24_ASCII_0060 } /* code 0060 */ + ,{ 12, 12, 2, acFont24_ASCII_0061 } /* code 0061 */ + ,{ 11, 11, 2, acFont24_ASCII_0062 } /* code 0062 */ + ,{ 11, 11, 2, acFont24_ASCII_0063 } /* code 0063 */ + ,{ 11, 11, 2, acFont24_ASCII_0064 } /* code 0064 */ + ,{ 12, 12, 2, acFont24_ASCII_0065 } /* code 0065 */ + ,{ 6, 6, 1, acFont24_ASCII_0066 } /* code 0066 */ + ,{ 11, 11, 2, acFont24_ASCII_0067 } /* code 0067 */ + ,{ 11, 11, 2, acFont24_ASCII_0068 } /* code 0068 */ + ,{ 5, 5, 1, acFont24_ASCII_0069 } /* code 0069 */ + ,{ 4, 4, 1, acFont24_ASCII_006A } /* code 006A */ + ,{ 10, 10, 2, acFont24_ASCII_006B } /* code 006B */ + ,{ 4, 4, 1, acFont24_ASCII_006C } /* code 006C */ + ,{ 16, 16, 2, acFont24_ASCII_006D } /* code 006D */ + ,{ 11, 11, 2, acFont24_ASCII_006E } /* code 006E */ + ,{ 12, 12, 2, acFont24_ASCII_006F } /* code 006F */ + ,{ 11, 11, 2, acFont24_ASCII_0070 } /* code 0070 */ + ,{ 11, 11, 2, acFont24_ASCII_0071 } /* code 0071 */ + ,{ 7, 7, 1, acFont24_ASCII_0072 } /* code 0072 */ + ,{ 11, 11, 2, acFont24_ASCII_0073 } /* code 0073 */ + ,{ 6, 6, 1, acFont24_ASCII_0074 } /* code 0074 */ + ,{ 11, 11, 2, acFont24_ASCII_0075 } /* code 0075 */ + ,{ 11, 11, 2, acFont24_ASCII_0076 } /* code 0076 */ + ,{ 15, 15, 2, acFont24_ASCII_0077 } /* code 0077 */ + ,{ 10, 10, 2, acFont24_ASCII_0078 } /* code 0078 */ + ,{ 11, 11, 2, acFont24_ASCII_0079 } /* code 0079 */ + ,{ 9, 9, 2, acFont24_ASCII_007A } /* code 007A */ + ,{ 7, 7, 1, acFont24_ASCII_007B } /* code 007B */ + ,{ 6, 6, 1, acFont24_ASCII_007C } /* code 007C */ + ,{ 7, 7, 1, acFont24_ASCII_007D } /* code 007D */ + ,{ 12, 12, 2, acFont24_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font24_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font24_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font24_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,24 /* height of font */ + ,24 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font24_ASCII_Prop1} + ,19, 11, 15 +}; + diff --git a/User/system/lib/lcd/gui/Font/F32B_1.c b/User/system/lib/lcd/gui/Font/F32B_1.c new file mode 100644 index 0000000..1535554 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F32B_1.c @@ -0,0 +1,3410 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F32B_1.C +Purpose : ISO 8859-1, West European Character Set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont32B_1_00A0[ 32] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A1[ 32] = { /* code 00A1 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A2[ 64] = { /* code 00A2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,___XX___, + ________,__XXX___, + ________,__XX____, + ________,__XX____, + ________,_XXX____, + _____XXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,XXXXX___, + _XXXX___,XXXXXX__, + _XXXX___,XX______, + _XXXX__X,X_______, + _XXXX__X,X_______, + _XXXX__X,X_______, + _XXXX_XX,__XXXX__, + _XXXX_XX,__XXXX__, + __XXXXXX,_XXXX___, + __XXXXXX,XXXXX___, + ___XXXXX,XXXX____, + ____XXXX,XX______, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A3[ 64] = { /* code 00A3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + ___XXXXX,XXX_____, + __XXXXXX,XXXX____, + _XXXXX__,XXXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,________, + _XXXX___,________, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + _XXXX___,________, + _XXXX___,________, + XXXXXXXX,____X___, + XXXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _X_____X,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A4[ 64] = { /* code 00A4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,___X____, + _XXX_XXX,X_XXX___, + XXXXXXXX,XXXXXX__, + _XXXXXXX,XXXXX___, + __XXX___,_XXX____, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + __XXX___,_XXX____, + _XXXXXXX,XXXXX___, + XXXXXXXX,XXXXXX__, + _XXX_XXX,X_XXX___, + __X_____,___X____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A5[ 64] = { /* code 00A5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXX____,__XXXX__, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + __XXX___,_XXX____, + __XXXX__,XXXX____, + ___XXX__,XXX_____, + ___XXXXX,XXX_____, + ___XXXXX,XXX_____, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _____XXX,X_______, + _____XXX,X_______, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A6[ 32] = { /* code 00A6 */ + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A7[ 64] = { /* code 00A7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + __XXXXX_,________, + ___XXXXX,________, + ___XXXXX,X_______, + __XXXXXX,XXX_____, + _XXXX_XX,XXXX____, + _XXX___X,XXXXX___, + _XXX____,_XXXXX__, + _XXXX___,__XXXX__, + _XXXXX__,___XXX__, + __XXXXX_,___XXX__, + ___XXXXX,__XXXX__, + ____XXXX,XXXXX___, + _____XXX,XXXX____, + ______XX,XXXX____, + ________,XXXXX___, + ________,_XXXX___, + __XXXX__,_XXXX___, + __XXXXX_,_XXXX___, + ___XXXXX,XXXX____, + ____XXXX,XXXX____, + _____XXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A8[ 64] = { /* code 00A8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX___XX,X_______, + XXX___XX,X_______, + XXX___XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00A9[ 96] = { /* code 00A9 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXX___,________, + _____XXX,XXXXXXX_,________, + ___XXXX_,_____XXX,X_______, + __XXX___,_______X,XX______, + __XX____,XXXX____,XX______, + _XX___XX,XXXXX___,_XX_____, + _XX___XX,___XXX__,_XX_____, + XX___XX_,____XX__,__XX____, + XX___XX_,________,__XX____, + XX___XX_,________,__XX____, + XX___XX_,________,__XX____, + XX___XX_,________,__XX____, + XX___XX_,____XX__,__XX____, + _XX___XX,___XXX__,_XX_____, + _XX___XX,XXXXX___,_XX_____, + __XX____,XXXX____,XX______, + __XXX___,_______X,XX______, + ___XXXX_,_____XXX,X_______, + _____XXX,XXXXXXX_,________, + _______X,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00AA[ 64] = { /* code 00AA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XXXXXXX,X_______, + XXX___XX,X_______, + ______XX,X_______, + __XXXXXX,X_______, + XXXXXXXX,X_______, + XXX___XX,X_______, + XXX__XXX,X_______, + XXXXXXXX,X_______, + _XXXX_XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00AB[ 64] = { /* code 00AB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,___XXX__, + ____XXX_,__XXX___, + ___XXXX_,_XXXX___, + ___XXX__,_XXX____, + __XXXX__,XXXX____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + __XXXX__,XXXX____, + ___XXX__,_XXX____, + ___XXXX_,_XXXX___, + ____XXX_,__XXX___, + _____XXX,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00AC[ 64] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ________,___XXXX_, + ________,___XXXX_, + ________,___XXXX_, + ________,___XXXX_, + ________,___XXXX_, + ________,___XXXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00AD[ 64] = { /* code 00AD */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00AE[ 96] = { /* code 00AE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXX___,________, + _____XXX,XXXXXXX_,________, + ___XXXX_,_____XXX,X_______, + __XXX___,_______X,XX______, + __XX__XX,XXXX____,XX______, + _XX___XX,XXXXX___,_XX_____, + _XX___XX,___XX___,_XX_____, + XX____XX,___XX___,__XX____, + XX____XX,___XX___,__XX____, + XX____XX,XXXXX___,__XX____, + XX____XX,XXXX____,__XX____, + XX____XX,__XX____,__XX____, + XX____XX,__XXX___,__XX____, + _XX___XX,___XX___,_XX_____, + _XX___XX,___XXX__,_XX_____, + __XX__XX,____XX__,XX______, + __XXX___,_______X,XX______, + ___XXXX_,_____XXX,X_______, + _____XXX,XXXXXXX_,________, + _______X,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00AF[ 64] = { /* code 00AF */ + ________,________, + ________,________, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B0[ 64] = { /* code 00B0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XXXXXX,________, + _XXX__XX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XXX__XX,X_______, + __XXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B1[ 64] = { /* code 00B1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ________,________, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B2[ 64] = { /* code 00B2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + XXXXXXXX,________, + XXX__XXX,________, + _____XXX,________, + ____XXX_,________, + ___XXXX_,________, + __XXX___,________, + _XXX____,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B3[ 64] = { /* code 00B3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXX__XX,X_______, + ____XXXX,________, + ____XXXX,________, + ______XX,X_______, + ______XX,X_______, + _XXX__XX,X_______, + __XXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B4[ 64] = { /* code 00B4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXX_,________, + ___XXX__,________, + __XXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B5[ 64] = { /* code 00B5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXX__,___XXXX_, + __XXXXX_,__XXXXX_, + __XXXXXX,XXXXXXX_, + __XXXXXX,XXXXXXX_, + __XXXX_X,XX_XXXX_, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B6[ 64] = { /* code 00B6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + XXXXXXXX,__XXX___, + XXXXXXXX,__XXX___, + XXXXXXXX,__XXX___, + XXXXXXXX,__XXX___, + XXXXXXXX,__XXX___, + _XXXXXXX,__XXX___, + _XXXXXXX,__XXX___, + ___XXXXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + _____XXX,__XXX___, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B7[ 32] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B8[ 64] = { /* code 00B8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _XXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00B9[ 64] = { /* code 00B9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + __XXXX__,________, + _XXXXX__,________, + _X_XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00BA[ 64] = { /* code 00BA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXX_XX,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXXX_XX,XX______, + __XXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00BB[ 64] = { /* code 00BB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX___X,XX______, + __XXX___,XXX_____, + __XXXX__,XXXX____, + ___XXX__,_XXX____, + ___XXXX_,_XXXX___, + ____XXXX,__XXXX__, + ____XXXX,__XXXX__, + ___XXXX_,_XXXX___, + ___XXX__,_XXX____, + __XXXX__,XXXX____, + __XXX___,XXX_____, + _XXX___X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00BC[ 96] = { /* code 00BC */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXX_,_______X,XX______, + ___XXXX_,_______X,XX______, + _XXXXXX_,______XX,X_______, + _XX_XXX_,_____XXX,X_______, + ____XXX_,_____XXX,________, + ____XXX_,____XXX_,________, + ____XXX_,____XXX_,________, + ____XXX_,___XXX__,________, + ____XXX_,___XXX__,________, + ____XXX_,__XXX___,________, + ________,_XXX____,___XXX__, + ________,_XXX____,__XXXX__, + ________,XXX_____,_XXXXX__, + ________,XXX_____,XX_XXX__, + _______X,XX_____X,X__XXX__, + _______X,XX____XX,___XXX__, + ______XX,X_____XX,XXXXXXX_, + _____XXX,______XX,XXXXXXX_, + _____XXX,________,___XXX__, + ____XXX_,________,___XXX__, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00BD[ 96] = { /* code 00BD */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXX_,_______X,XX______, + ___XXXX_,______XX,X_______, + _XXXXXX_,______XX,X_______, + _XX_XXX_,_____XXX,________, + ____XXX_,_____XXX,________, + ____XXX_,____XXX_,________, + ____XXX_,___XXX__,________, + ____XXX_,___XXX__,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ________,_XXX____,XXXX____, + ________,_XXX__XX,XXXXXX__, + ________,XXX___XX,X__XXX__, + ________,XXX_____,___XXX__, + _______X,XX______,__XXX___, + ______XX,XX______,_XXXX___, + ______XX,X_______,XXX_____, + _____XXX,_______X,XX______, + _____XXX,______XX,XXXXXX__, + ____XXX_,______XX,XXXXXX__, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00BE[ 96] = { /* code 00BE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXX_,________,XXX_____, + _XXXXXXX,_______X,XX______, + XXX__XXX,______XX,X_______, + ___XXXX_,______XX,X_______, + ___XXXX_,_____XXX,________, + _____XXX,_____XXX,________, + _____XXX,____XXX_,________, + XXX__XXX,___XXX__,________, + _XXXXXX_,___XXX__,________, + __XXXX__,__XXX___,________, + ________,__XXX___,___XXX__, + ________,_XXX____,__XXXX__, + ________,XXX_____,_XXXXX__, + ________,XXX_____,XX_XXX__, + _______X,XX_____X,X__XXX__, + _______X,XX____XX,___XXX__, + ______XX,X_____XX,XXXXXXX_, + _____XXX,______XX,XXXXXXX_, + _____XXX,________,___XXX__, + ____XXX_,________,___XXX__, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00BF[ 96] = { /* code 00BF */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,________,________, + ________,________,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ______XX,XXX_____,________, + _____XXX,XX______,________, + ____XXXX,X_______,________, + ___XXXXX,________,________, + __XXXXX_,________,________, + __XXXX__,________,________, + __XXXX__,____XXXX,________, + __XXXX__,___XXXXX,________, + ___XXXX_,___XXXX_,________, + ___XXXXX,XXXXXXX_,________, + ____XXXX,XXXXXX__,________, + ______XX,XXXX____,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C0[ 96] = { /* code 00C0 */ + ______XX,XX______,________, + _______X,XXX_____,________, + ________,XXX_____,________, + ________,_XXX____,________, + ________,________,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C1[ 96] = { /* code 00C1 */ + ________,_XXXX___,________, + ________,XXXX____,________, + ________,XXX_____,________, + _______X,XX______,________, + ________,________,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C2[ 96] = { /* code 00C2 */ + ________,XXX_____,________, + _______X,XXXX____,________, + ______XX,X_XXX___,________, + _____XXX,___XXX__,________, + ________,________,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C3[ 96] = { /* code 00C3 */ + ________,________,________, + ______XX,X___XX__,________, + _____XXX,XXXXXX__,________, + _____XX_,__XXX___,________, + ________,________,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C4[ 96] = { /* code 00C4 */ + ________,________,________, + _____XXX,___XXX__,________, + _____XXX,___XXX__,________, + _____XXX,___XXX__,________, + ________,________,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C5[ 96] = { /* code 00C5 */ + ________,________,________, + ________,________,________, + ________,_XX_____,________, + ________,X__X____,________, + ________,X__X____,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C6[128] = { /* code 00C6 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,XXXXXXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXXXXX,XX______, + ______XX,XX_XXXX_,________,________, + ______XX,XX_XXXX_,________,________, + _____XXX,X__XXXX_,________,________, + _____XXX,X__XXXXX,XXXXXXXX,X_______, + ____XXXX,___XXXXX,XXXXXXXX,X_______, + ____XXXX,___XXXXX,XXXXXXXX,X_______, + ___XXXXX,___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXX_,________,________, + __XXXXXX,XXXXXXX_,________,________, + __XXXXXX,XXXXXXX_,________,________, + _XXXXXXX,XXXXXXX_,________,________, + _XXXX___,___XXXX_,________,________, + _XXXX___,___XXXXX,XXXXXXXX,XX______, + XXXX____,___XXXXX,XXXXXXXX,XX______, + XXXX____,___XXXXX,XXXXXXXX,XX______, + XXXX____,___XXXXX,XXXXXXXX,XX______, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C7[ 96] = { /* code 00C7 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XX______, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,X_______, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,_______X,X_______, + _XXXXX__,______XX,XXX_____, + __XXXX__,______XX,XXX_____, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,XXXXX___,________, + ________,___XXX__,________, + ________,___XXX__,________, + ________,___XXX__,________, + _______X,XXXX____,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C8[ 96] = { /* code 00C8 */ + ______XX,XX______,________, + _______X,XXX_____,________, + ________,XXX_____,________, + ________,_XXX____,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00C9[ 96] = { /* code 00C9 */ + ________,_XXXX___,________, + ________,XXXX____,________, + ________,XXX_____,________, + _______X,XX______,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00CA[ 96] = { /* code 00CA */ + ________,XXX_____,________, + _______X,XXXX____,________, + ______XX,X_XXX___,________, + _____XXX,___XXX__,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00CB[ 96] = { /* code 00CB */ + ________,________,________, + _____XXX,___XXX__,________, + _____XXX,___XXX__,________, + _____XXX,___XXX__,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00CC[ 32] = { /* code 00CC */ + _XXXX___, + __XXXX__, + ___XXX__, + ____XXX_, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00CD[ 32] = { /* code 00CD */ + ___XXXX_, + __XXXX__, + __XXX___, + _XXX____, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00CE[ 32] = { /* code 00CE */ + ___XXX__, + __XXXXX_, + _XXX_XXX, + XXX___XX, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00CF[ 32] = { /* code 00CF */ + ________, + XXX___XX, + XXX___XX, + XXX___XX, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D0[ 96] = { /* code 00D0 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + XXXXXXXX,XXX____X,XXX_____, + XXXXXXXX,XXX____X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,______XX,XX______, + __XXXX__,_____XXX,XX______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D1[ 96] = { /* code 00D1 */ + ________,________,________, + _______X,XX___XX_,________, + ______XX,XXXXXXX_,________, + ______XX,___XXX__,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,______XX,XX______, + __XXXXXX,______XX,XX______, + __XXXXXX,X_____XX,XX______, + __XXXXXX,X_____XX,XX______, + __XXXXXX,XX____XX,XX______, + __XXXX_X,XX____XX,XX______, + __XXXX_X,XXX___XX,XX______, + __XXXX__,XXXX__XX,XX______, + __XXXX__,XXXX__XX,XX______, + __XXXX__,_XXXX_XX,XX______, + __XXXX__,__XXX_XX,XX______, + __XXXX__,__XXXXXX,XX______, + __XXXX__,___XXXXX,XX______, + __XXXX__,___XXXXX,XX______, + __XXXX__,____XXXX,XX______, + __XXXX__,____XXXX,XX______, + __XXXX__,_____XXX,XX______, + __XXXX__,_____XXX,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D2[ 96] = { /* code 00D2 */ + _______X,XXX_____,________, + ________,XXXX____,________, + ________,_XXX____,________, + ________,__XXX___,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,_______X,XXXX____, + __XXXXX_,______XX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D3[ 96] = { /* code 00D3 */ + ________,__XXXX__,________, + ________,_XXXX___,________, + ________,_XXX____,________, + ________,XXX_____,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,_______X,XXXX____, + __XXXXX_,______XX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D4[ 96] = { /* code 00D4 */ + ________,_XXX____,________, + ________,XXXXX___,________, + _______X,XX_XXX__,________, + ______XX,X___XXX_,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,_______X,XXXX____, + __XXXXX_,______XX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D5[ 96] = { /* code 00D5 */ + ________,________,________, + _______X,XX___XX_,________, + ______XX,XXXXXXX_,________, + ______XX,___XXX__,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,_______X,XXXX____, + __XXXXX_,______XX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D6[ 96] = { /* code 00D6 */ + ________,________,________, + ______XX,X___XXX_,________, + ______XX,X___XXX_,________, + ______XX,X___XXX_,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,_______X,XXXX____, + __XXXXX_,______XX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D7[ 64] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___X____,___X____, + __XXX___,__XXX___, + _XXXXX__,_XXXXX__, + __XXXXX_,XXXXX___, + ___XXXXX,XXXX____, + ____XXXX,XXX_____, + _____XXX,XX______, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXX_,XXXXX___, + _XXXXX__,_XXXXX__, + __XXX___,__XXX___, + ___X____,___X____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D8[ 96] = { /* code 00D8 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,__X_____, + _______X,XXXXXX__,__XX____, + _____XXX,XXXXXXXX,_XXXX___, + ____XXXX,XXXXXXXX,XXXX____, + ___XXXXX,XXXXXXXX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,_____XXX,XXX_____, + _XXXXX__,____XXXX,XXX_____, + _XXXX___,___XXXX_,XXXX____, + _XXXX___,__XXXX__,XXXX____, + _XXXX___,_XXXX___,XXXX____, + _XXXX___,XXXX____,XXXX____, + _XXXX__X,XXX_____,XXXX____, + _XXXX_XX,XX______,XXXX____, + _XXXXXXX,X______X,XXXX____, + __XXXXXX,_______X,XXX_____, + __XXXXXX,_____XXX,XXX_____, + __XXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,X_______, + XXXX_XXX,XXXXXXXX,________, + _XX____X,XXXXXX__,________, + __X_____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00D9[ 96] = { /* code 00D9 */ + _______X,XXX_____,________, + ________,XXXX____,________, + ________,_XXX____,________, + ________,__XXX___,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,________, + ______XX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00DA[ 96] = { /* code 00DA */ + ________,__XXXX__,________, + ________,_XXXX___,________, + ________,_XXX____,________, + ________,XXX_____,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,________, + ______XX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00DB[ 96] = { /* code 00DB */ + ________,_XXX____,________, + ________,XXXXX___,________, + _______X,XX_XXX__,________, + ______XX,X___XXX_,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,________, + ______XX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00DC[ 96] = { /* code 00DC */ + ________,________,________, + ______XX,X___XXX_,________, + ______XX,X___XXX_,________, + ______XX,X___XXX_,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,________, + ______XX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00DD[ 96] = { /* code 00DD */ + ________,_XXXX___,________, + ________,XXXX____,________, + ________,XXX_____,________, + _______X,XX______,________, + ________,________,________, + XXXX____,______XX,XX______, + XXXXX___,_____XXX,XX______, + _XXXXX__,____XXXX,X_______, + __XXXX__,____XXXX,________, + __XXXXX_,___XXXXX,________, + ___XXXX_,___XXXX_,________, + ____XXXX,__XXXX__,________, + ____XXXX,XXXXXX__,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + ______XX,XXXX____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00DE[ 96] = { /* code 00DE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ___XXXXX,XXXXXX__,________, + ___XXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXXX,________, + ___XXXXX,XXXXXXXX,X_______, + ___XXXX_,____XXXX,X_______, + ___XXXX_,_____XXX,X_______, + ___XXXX_,_____XXX,X_______, + ___XXXX_,____XXXX,X_______, + ___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,________, + ___XXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXX__,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ___XXXX_,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00DF[ 96] = { /* code 00DF */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXX_____,________, + ___XXXXX,XXXX____,________, + ___XXXXX,XXXXX___,________, + __XXXXX_,_XXXX___,________, + __XXXX__,_XXXX___,________, + __XXXX__,_XXXX___,________, + __XXXX__,XXXX____,________, + __XXXX__,XXX_____,________, + __XXXX_X,XXX_____,________, + __XXXX_X,XXX_____,________, + __XXXX_X,XXXX____,________, + __XXXX__,XXXXXX__,________, + __XXXX__,_XXXXXX_,________, + __XXXX__,__XXXXX_,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX_X,X___XXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX_X,XXXXXXX_,________, + __XXXX__,_XXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E0[ 64] = { /* code 00E0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + ____XXXX,________, + _____XXX,________, + ______XX,X_______, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E1[ 64] = { /* code 00E1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,XXX_____, + ______XX,XX______, + ______XX,X_______, + _____XXX,________, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E2[ 64] = { /* code 00E2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,X_______, + _____XXX,XX______, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E3[ 64] = { /* code 00E3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,__XX____, + ___XXXXX,XXXX____, + ___XX___,XXX_____, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E4[ 64] = { /* code 00E4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E5[ 64] = { /* code 00E5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____X__,X_______, + _____X__,X_______, + ______XX,________, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E6[ 96] = { /* code 00E6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXX___XX,XXX_____, + ___XXXXX,XXXXXXXX,XXXXX___, + __XXXXXX,XXXXXXXX,XXXXX___, + __XXX___,_XXXXXX_,__XXXX__, + _XXX____,__XXXX__,___XXX__, + ________,__XXXX__,___XXXX_, + ________,XXXXXXXX,XXXXXXX_, + ____XXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,__XXXXXX,XXXXXXX_, + _XXXX___,__XXXX__,________, + _XXXX___,__XXXX__,________, + _XXXXX__,_XXXXXX_,___XX___, + _XXXXXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,XXX_XXXX,XXXXXX__, + ___XXXXX,X_____XX,XXXX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E7[ 64] = { /* code 00E7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXXX__, + _XXXX___,__XX____, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,__XX____, + __XXXX__,_XXXXX__, + __XXXXXX,XXXXX___, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + _____XXX,XX______, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E8[ 64] = { /* code 00E8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + _____XXX,X_______, + ______XX,X_______, + _______X,XX______, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXX___, + _XXXX___,__XXX___, + _XXXX___,__XXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXX___,________, + _XXXX___,________, + __XXXX__,__XX____, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00E9[ 64] = { /* code 00E9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,XXX_____, + ______XX,XX______, + ______XX,X_______, + _____XXX,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXX___, + _XXXX___,__XXX___, + _XXXX___,__XXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXX___,________, + _XXXX___,________, + __XXXX__,__XX____, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00EA[ 64] = { /* code 00EA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,X_______, + _____XXX,XX______, + ____XXX_,XXX_____, + ___XXX__,_XXX____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXX___, + _XXXX___,__XXX___, + _XXXX___,__XXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXX___,________, + _XXXX___,________, + __XXXX__,__XX____, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00EB[ 64] = { /* code 00EB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXX___, + _XXXX___,__XXX___, + _XXXX___,__XXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXX___,________, + _XXXX___,________, + __XXXX__,__XX____, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00EC[ 32] = { /* code 00EC */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + __XXXX__, + ___XXX__, + ____XXX_, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00ED[ 32] = { /* code 00ED */ + ________, + ________, + ________, + ________, + ________, + ___XXXX_, + __XXXX__, + __XXX___, + _XXX____, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00EE[ 32] = { /* code 00EE */ + ________, + ________, + ________, + ________, + ________, + ___XXX__, + __XXXXX_, + _XXX_XXX, + XXX___XX, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00EF[ 32] = { /* code 00EF */ + ________, + ________, + ________, + ________, + ________, + ________, + XXX___XX, + XXX___XX, + XXX___XX, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F0[ 96] = { /* code 00F0 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,X__XX___,________, + _______X,XXX_____,________, + _______X,XXXX____,________, + _____XX_,_XXXX___,________, + ________,_XXXX___,________, + _____XXX,X_XXXX__,________, + ___XXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + __XXXXX_,__XXXXX_,________, + _XXXXX__,___XXXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F1[ 96] = { /* code 00F1 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,___XX___,________, + ____XXXX,XXXXX___,________, + ____XX__,_XXX____,________, + ________,________,________, + __XXXX__,XXXXX___,________, + __XXXX_X,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F2[ 96] = { /* code 00F2 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,X_______,________, + ______XX,XX______,________, + _______X,XX______,________, + ________,XXX_____,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F3[ 96] = { /* code 00F3 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,_XXXX___,________, + ________,XXXX____,________, + ________,XXX_____,________, + _______X,XX______,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F4[ 96] = { /* code 00F4 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + ______XX,XXX_____,________, + _____XXX,_XXX____,________, + ____XXX_,__XXX___,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F5[ 96] = { /* code 00F5 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,___XX___,________, + ____XXXX,XXXXX___,________, + ____XX__,_XXX____,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F6[ 96] = { /* code 00F6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F7[ 64] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ________,________, + ________,________, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + ________,________, + ________,________, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + _____XXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F8[ 96] = { /* code 00F8 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,______X_,________, + ______XX,XXX___XX,________, + ____XXXX,XXXX_XX_,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXX__,________, + __XXXX__,__XXXXX_,________, + _XXXX___,_XX_XXXX,________, + _XXXX___,XX__XXXX,________, + _XXXX___,X___XXXX,________, + _XXXX__X,X___XXXX,________, + _XXXX_XX,____XXXX,________, + _XXXXXX_,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXX___,________, + _XX__XXX,XXX_____,________, + __X_____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00F9[ 96] = { /* code 00F9 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,X_______,________, + ______XX,XX______,________, + _______X,XX______,________, + ________,XXX_____,________, + ________,________,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + ____XXXX,X__XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00FA[ 96] = { /* code 00FA */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,_XXXX___,________, + ________,XXXX____,________, + ________,XXX_____,________, + _______X,XX______,________, + ________,________,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + ____XXXX,X__XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00FB[ 96] = { /* code 00FB */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + ______XX,XXX_____,________, + _____XXX,_XXX____,________, + ____XXX_,__XXX___,________, + ________,________,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + ____XXXX,X__XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00FC[ 96] = { /* code 00FC */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ________,________,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + ____XXXX,X__XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00FD[ 64] = { /* code 00FD */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXXX____, + _______X,XXX_____, + _______X,XX______, + ______XX,X_______, + ________,________, + XXXX____,___XXXX_, + XXXX____,___XXXX_, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXX___, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXXX_,XXXX____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,X_______, + ____XXXX,X_______, + _XXXXXXX,________, + _XXXXXXX,________, + _XXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00FE[ 96] = { /* code 00FE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,XXXX____,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,___XXXX_,________, + __XXXXX_,___XXXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXXX_,___XXXXX,________, + __XXXXXX,___XXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXX_X,XXXXXX__,________, + __XXXX__,XXXX____,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_1_00FF[ 64] = { /* code 00FF */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ________,________, + XXXX____,___XXXX_, + XXXX____,___XXXX_, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXX___, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXXX_,XXXX____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,X_______, + ____XXXX,X_______, + _XXXXXXX,________, + _XXXXXXX,________, + _XXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32B_1_CharInfo[96] = { + { 8, 8, 1, acFont32B_1_00A0 } /* code 00A0 */ + ,{ 8, 8, 1, acFont32B_1_00A1 } /* code 00A1 */ + ,{ 15, 15, 2, acFont32B_1_00A2 } /* code 00A2 */ + ,{ 15, 15, 2, acFont32B_1_00A3 } /* code 00A3 */ + ,{ 15, 15, 2, acFont32B_1_00A4 } /* code 00A4 */ + ,{ 15, 15, 2, acFont32B_1_00A5 } /* code 00A5 */ + ,{ 7, 7, 1, acFont32B_1_00A6 } /* code 00A6 */ + ,{ 15, 15, 2, acFont32B_1_00A7 } /* code 00A7 */ + ,{ 9, 9, 2, acFont32B_1_00A8 } /* code 00A8 */ + ,{ 20, 20, 3, acFont32B_1_00A9 } /* code 00A9 */ + ,{ 10, 10, 2, acFont32B_1_00AA } /* code 00AA */ + ,{ 15, 15, 2, acFont32B_1_00AB } /* code 00AB */ + ,{ 16, 16, 2, acFont32B_1_00AC } /* code 00AC */ + ,{ 9, 9, 2, acFont32B_1_00AD } /* code 00AD */ + ,{ 20, 20, 3, acFont32B_1_00AE } /* code 00AE */ + ,{ 15, 15, 2, acFont32B_1_00AF } /* code 00AF */ + ,{ 11, 11, 2, acFont32B_1_00B0 } /* code 00B0 */ + ,{ 15, 15, 2, acFont32B_1_00B1 } /* code 00B1 */ + ,{ 9, 9, 2, acFont32B_1_00B2 } /* code 00B2 */ + ,{ 9, 9, 2, acFont32B_1_00B3 } /* code 00B3 */ + ,{ 9, 9, 2, acFont32B_1_00B4 } /* code 00B4 */ + ,{ 16, 16, 2, acFont32B_1_00B5 } /* code 00B5 */ + ,{ 15, 15, 2, acFont32B_1_00B6 } /* code 00B6 */ + ,{ 8, 8, 1, acFont32B_1_00B7 } /* code 00B7 */ + ,{ 9, 9, 2, acFont32B_1_00B8 } /* code 00B8 */ + ,{ 9, 9, 2, acFont32B_1_00B9 } /* code 00B9 */ + ,{ 10, 10, 2, acFont32B_1_00BA } /* code 00BA */ + ,{ 15, 15, 2, acFont32B_1_00BB } /* code 00BB */ + ,{ 23, 23, 3, acFont32B_1_00BC } /* code 00BC */ + ,{ 23, 23, 3, acFont32B_1_00BD } /* code 00BD */ + ,{ 23, 23, 3, acFont32B_1_00BE } /* code 00BE */ + ,{ 17, 17, 3, acFont32B_1_00BF } /* code 00BF */ + ,{ 19, 19, 3, acFont32B_1_00C0 } /* code 00C0 */ + ,{ 19, 19, 3, acFont32B_1_00C1 } /* code 00C1 */ + ,{ 19, 19, 3, acFont32B_1_00C2 } /* code 00C2 */ + ,{ 19, 19, 3, acFont32B_1_00C3 } /* code 00C3 */ + ,{ 19, 19, 3, acFont32B_1_00C4 } /* code 00C4 */ + ,{ 19, 19, 3, acFont32B_1_00C5 } /* code 00C5 */ + ,{ 27, 27, 4, acFont32B_1_00C6 } /* code 00C6 */ + ,{ 20, 20, 3, acFont32B_1_00C7 } /* code 00C7 */ + ,{ 18, 18, 3, acFont32B_1_00C8 } /* code 00C8 */ + ,{ 18, 18, 3, acFont32B_1_00C9 } /* code 00C9 */ + ,{ 18, 18, 3, acFont32B_1_00CA } /* code 00CA */ + ,{ 18, 18, 3, acFont32B_1_00CB } /* code 00CB */ + ,{ 8, 8, 1, acFont32B_1_00CC } /* code 00CC */ + ,{ 8, 8, 1, acFont32B_1_00CD } /* code 00CD */ + ,{ 8, 8, 1, acFont32B_1_00CE } /* code 00CE */ + ,{ 8, 8, 1, acFont32B_1_00CF } /* code 00CF */ + ,{ 20, 20, 3, acFont32B_1_00D0 } /* code 00D0 */ + ,{ 20, 20, 3, acFont32B_1_00D1 } /* code 00D1 */ + ,{ 21, 21, 3, acFont32B_1_00D2 } /* code 00D2 */ + ,{ 21, 21, 3, acFont32B_1_00D3 } /* code 00D3 */ + ,{ 21, 21, 3, acFont32B_1_00D4 } /* code 00D4 */ + ,{ 21, 21, 3, acFont32B_1_00D5 } /* code 00D5 */ + ,{ 21, 21, 3, acFont32B_1_00D6 } /* code 00D6 */ + ,{ 16, 16, 2, acFont32B_1_00D7 } /* code 00D7 */ + ,{ 21, 21, 3, acFont32B_1_00D8 } /* code 00D8 */ + ,{ 20, 20, 3, acFont32B_1_00D9 } /* code 00D9 */ + ,{ 20, 20, 3, acFont32B_1_00DA } /* code 00DA */ + ,{ 20, 20, 3, acFont32B_1_00DB } /* code 00DB */ + ,{ 20, 20, 3, acFont32B_1_00DC } /* code 00DC */ + ,{ 18, 18, 3, acFont32B_1_00DD } /* code 00DD */ + ,{ 18, 18, 3, acFont32B_1_00DE } /* code 00DE */ + ,{ 17, 17, 3, acFont32B_1_00DF } /* code 00DF */ + ,{ 15, 15, 2, acFont32B_1_00E0 } /* code 00E0 */ + ,{ 15, 15, 2, acFont32B_1_00E1 } /* code 00E1 */ + ,{ 15, 15, 2, acFont32B_1_00E2 } /* code 00E2 */ + ,{ 15, 15, 2, acFont32B_1_00E3 } /* code 00E3 */ + ,{ 15, 15, 2, acFont32B_1_00E4 } /* code 00E4 */ + ,{ 15, 15, 2, acFont32B_1_00E5 } /* code 00E5 */ + ,{ 24, 24, 3, acFont32B_1_00E6 } /* code 00E6 */ + ,{ 15, 15, 2, acFont32B_1_00E7 } /* code 00E7 */ + ,{ 15, 15, 2, acFont32B_1_00E8 } /* code 00E8 */ + ,{ 15, 15, 2, acFont32B_1_00E9 } /* code 00E9 */ + ,{ 15, 15, 2, acFont32B_1_00EA } /* code 00EA */ + ,{ 15, 15, 2, acFont32B_1_00EB } /* code 00EB */ + ,{ 8, 8, 1, acFont32B_1_00EC } /* code 00EC */ + ,{ 8, 8, 1, acFont32B_1_00ED } /* code 00ED */ + ,{ 8, 8, 1, acFont32B_1_00EE } /* code 00EE */ + ,{ 8, 8, 1, acFont32B_1_00EF } /* code 00EF */ + ,{ 17, 17, 3, acFont32B_1_00F0 } /* code 00F0 */ + ,{ 17, 17, 3, acFont32B_1_00F1 } /* code 00F1 */ + ,{ 17, 17, 3, acFont32B_1_00F2 } /* code 00F2 */ + ,{ 17, 17, 3, acFont32B_1_00F3 } /* code 00F3 */ + ,{ 17, 17, 3, acFont32B_1_00F4 } /* code 00F4 */ + ,{ 17, 17, 3, acFont32B_1_00F5 } /* code 00F5 */ + ,{ 17, 17, 3, acFont32B_1_00F6 } /* code 00F6 */ + ,{ 15, 15, 2, acFont32B_1_00F7 } /* code 00F7 */ + ,{ 17, 17, 3, acFont32B_1_00F8 } /* code 00F8 */ + ,{ 17, 17, 3, acFont32B_1_00F9 } /* code 00F9 */ + ,{ 17, 17, 3, acFont32B_1_00FA } /* code 00FA */ + ,{ 17, 17, 3, acFont32B_1_00FB } /* code 00FB */ + ,{ 17, 17, 3, acFont32B_1_00FC } /* code 00FC */ + ,{ 15, 15, 2, acFont32B_1_00FD } /* code 00FD */ + ,{ 17, 17, 3, acFont32B_1_00FE } /* code 00FE */ + ,{ 15, 15, 2, acFont32B_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font32B_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font32B_1_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font32B_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font32B_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font32B_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font32B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,32 /* height of font */ + ,32 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font32B_1_Prop1} + ,25, 15, 20 +}; + diff --git a/User/system/lib/lcd/gui/Font/F32B_ASCII.c b/User/system/lib/lcd/gui/Font/F32B_ASCII.c new file mode 100644 index 0000000..3e31ebe --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F32B_ASCII.c @@ -0,0 +1,3368 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F32B_ASCII.C +Purpose : ASCII character set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0020[ 32] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0021[ 32] = { /* code 0021 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0022[ 64] = { /* code 0022 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + _XXXX__X,XXX_____, + __XX____,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0023[ 64] = { /* code 0023 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,___XXX__, + _____XXX,___XXX__, + ____XXXX,__XXXX__, + ____XXX_,__XXX___, + ____XXX_,__XXX___, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + __XXX___,XXX_____, + __XXX___,XXX_____, + _XXXX__X,XXX_____, + _XXX___X,XX______, + _XXX___X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0024[ 64] = { /* code 0024 */ + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + _____XXX,XXX_____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXX_X,X_XXXX__, + __XXX__X,X__XXX__, + __XXX__X,X_______, + __XXX__X,X_______, + __XXXXXX,X_______, + ___XXXXX,XX______, + ____XXXX,XXXX____, + _____XXX,XXXXX___, + _______X,XXXXXX__, + _______X,X_XXXX__, + _______X,X__XXX__, + __XXX__X,X__XXX__, + __XXXX_X,X__XXX__, + ___XXX_X,X_XXXX__, + ___XXXXX,XXXXX___, + ____XXXX,XXXX____, + _____XXX,XXX_____, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0025[ 96] = { /* code 0025 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XXXXX,_______X,XX______, + __XXXXXX,X______X,XX______, + _XXX___X,XX____XX,X_______, + _XXX___X,XX____XX,X_______, + _XXX___X,XX___XXX,X_______, + _XXX___X,XX___XXX,________, + _XXX___X,XX___XXX,________, + _XXX___X,XX__XXX_,________, + __XXXXXX,X___XXX_,________, + ___XXXXX,___XXX__,________, + ________,___XXX__,________, + ________,__XXX___,XXXXX___, + ________,__XXX__X,XXXXXX__, + ________,_XXX__XX,X___XXX_, + ________,_XXX__XX,X___XXX_, + ________,XXX___XX,X___XXX_, + ________,XXX___XX,X___XXX_, + _______X,XX____XX,X___XXX_, + _______X,XX____XX,X___XXX_, + ______XX,X______X,XXXXXX__, + ______XX,X_______,XXXXX___, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0026[ 96] = { /* code 0026 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + ___XXXX_,__XXXX__,________, + ___XXXX_,__XXXX__,________, + ___XXXX_,__XXXX__,________, + ____XXXX,_XXXX___,________, + ____XXXX,XXXXX___,________, + _____XXX,XXX_____,________, + ____XXXX,XXX_____,________, + ___XXXXX,XXX_____,________, + __XXXXXX,XXXX__XX,X_______, + _XXXXX__,XXXXXXXX,X_______, + _XXXX___,_XXXXXXX,X_______, + _XXXX___,__XXXXXX,________, + _XXXX___,__XXXXXX,________, + _XXXXX__,_XXXXXXX,XX______, + __XXXXXX,XXXXXXXX,XXX_____, + ___XXXXX,XXXXX_XX,XX______, + _____XXX,XXX_____,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0027[ 32] = { /* code 0027 */ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + _XXXX___, + _XXXX___, + _XXXX___, + _XXXX___, + _XXXX___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0028[ 64] = { /* code 0028 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + ___XXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + __XXX___,________, + __XXXX__,________, + __XXXX__,________, + ___XXX__,________, + ___XXXX_,________, + ____XXX_,________, + ____XXX_,________, + _____XXX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0029[ 64] = { /* code 0029 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + __XXX___,________, + __XXX___,________, + __XXXX__,________, + ___XXX__,________, + ___XXXX_,________, + ___XXXX_,________, + ____XXX_,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXX__,________, + __XXXX__,________, + __XXX___,________, + __XXX___,________, + _XXX____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_002A[ 64] = { /* code 002A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + ____XX__,________, + XX__XX__,XX______, + XXXXXXXX,XX______, + ___XXXX_,________, + ___XXXX_,________, + __XX__XX,________, + _XXX__XX,X_______, + __X____X,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_002B[ 64] = { /* code 002B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ______XX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_002C[ 32] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ____XX__, + ___XXX__, + __XXX___, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_002D[ 64] = { /* code 002D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_002E[ 32] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_002F[ 32] = { /* code 002F */ + ________, + ________, + ________, + ________, + ________, + _____XXX, + _____XXX, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + XXX_____, + XXX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0030[ 64] = { /* code 0030 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + ___XXXXX,XXXX____, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + ___XXXXX,XXXX____, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0031[ 64] = { /* code 0031 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXX_____, + _____XXX,XXX_____, + ___XXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + __X____X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + _______X,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0032[ 64] = { /* code 0032 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + ________,__XXXX__, + ________,__XXXX__, + ________,_XXXX___, + ________,XXXXX___, + _______X,XXXX____, + ______XX,XXX_____, + _____XXX,XX______, + ____XXXX,X_______, + ___XXXXX,________, + ___XXXX_,________, + __XXXX__,________, + __XXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0033[ 64] = { /* code 0033 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + ___XXXXX,XXX_____, + __XXXXXX,XXXX____, + _XXXXX__,XXXXX___, + _XXXX___,_XXXX___, + ________,_XXXX___, + ________,XXXX____, + ______XX,XXXX____, + ______XX,XX______, + ______XX,XXXX____, + ________,_XXXX___, + ________,__XXXX__, + ________,__XXXX__, + ________,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXXX__,_XXXX___, + __XXXXXX,XXXXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0034[ 64] = { /* code 0034 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXXX____, + ________,XXXX____, + _______X,XXXX____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,XXXX____, + ____XXX_,XXXX____, + ____XXX_,XXXX____, + ___XXX__,XXXX____, + __XXX___,XXXX____, + __XXX___,XXXX____, + _XXX____,XXXX____, + XXX_____,XXXX____, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + ________,XXXX____, + ________,XXXX____, + ________,XXXX____, + ________,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0035[ 64] = { /* code 0035 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXX__,________, + __XXX___,________, + __XXX___,________, + __XXX_XX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXXX___, + _XXXX___,_XXXX___, + ________,__XXXX__, + ________,__XXXX__, + ________,__XXXX__, + ________,__XXXX__, + ________,__XXXX__, + _XXXX___,__XXXX__, + _XXXXX__,_XXXX___, + __XXXXXX,XXXX____, + ___XXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0036[ 64] = { /* code 0036 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XXX_____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXX__,_XXXXX__, + __XXXX__,__XXXX__, + __XXX___,________, + _XXXX___,________, + _XXXX_XX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXXX___, + _XXXXX__,_XXXX___, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXX___,__XXXX__, + __XXXX__,_XXXX___, + ___XXXXX,XXXXX___, + ____XXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0037[ 64] = { /* code 0037 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + ________,_XXXXX__, + ________,XXXXX___, + ________,XXXX____, + _______X,XXX_____, + ______XX,XXX_____, + ______XX,XX______, + _____XXX,XX______, + _____XXX,X_______, + _____XXX,X_______, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ____XXXX,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0038[ 64] = { /* code 0038 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXXX__,_XXXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXXX__,_XXXX___, + ___XXXXX,XXXX____, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXX__,_XXXX___, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXXX__,_XXXXX__, + __XXXXXX,XXXXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0039[ 64] = { /* code 0039 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXX__,_XXXX___, + _XXXX___,__XXX___, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXXX__,_XXXXX__, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXXX__, + ____XXXX,X_XXXX__, + ________,__XXXX__, + ________,__XXX___, + _XXXX___,_XXXX___, + _XXXXX__,_XXXX___, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_003A[ 64] = { /* code 003A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_003B[ 64] = { /* code 003B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + _____XX_,________, + ____XXX_,________, + ___XXX__,________, + ____X___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_003C[ 64] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,_____X__, + ________,___XXX__, + ________,XXXXXX__, + ______XX,XXXXXX__, + ____XXXX,XXXXX___, + __XXXXXX,XX______, + _XXXXXX_,________, + _XXXX___,________, + _XXXXXX_,________, + __XXXXXX,XX______, + ____XXXX,XXXXX___, + ______XX,XXXXXX__, + ________,XXXXXX__, + ________,___XXX__, + ________,_____X__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_003D[ 64] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_003E[ 64] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _X______,________, + _XXX____,________, + _XXXXXX_,________, + _XXXXXXX,X_______, + __XXXXXX,XXX_____, + _____XXX,XXXXX___, + ________,XXXXXX__, + ________,__XXXX__, + ________,XXXXXX__, + _____XXX,XXXXX___, + __XXXXXX,XXX_____, + _XXXXXXX,X_______, + _XXXXXX_,________, + _XXX____,________, + _X______,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_003F[ 96] = { /* code 003F */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXX_____,________, + ___XXXXX,XXXXX___,________, + __XXXXXX,XXXXXX__,________, + __XXXX__,__XXXXX_,________, + _XXXXX__,___XXXX_,________, + _XXXX___,___XXXX_,________, + ________,___XXXX_,________, + ________,__XXXXX_,________, + ________,_XXXXX__,________, + _______X,XXXXX___,________, + _______X,XXXX____,________, + ______XX,XXX_____,________, + ______XX,XX______,________, + ______XX,XX______,________, + ________,________,________, + ________,________,________, + ______XX,XX______,________, + ______XX,XX______,________, + ______XX,XX______,________, + ______XX,XX______,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0040[128] = { /* code 0040 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,__XXXXXX,XX______,________, + ________,XXXXXXXX,XXXX____,________, + ______XX,XXXXXXXX,XXXXXX__,________, + _____XXX,XXX_____,_XXXXXX_,________, + ____XXXX,________,___XXXX_,________, + ___XXXX_,__XXXX_X,XXX_XXXX,________, + ___XXX__,_XXXXXXX,XXX__XXX,________, + __XXXX__,XXXXXXXX,XXX__XXX,X_______, + __XXX__X,XXX__XXX,XX____XX,X_______, + __XXX__X,XX____XX,XX____XX,X_______, + _XXXX__X,XX____XX,XX____XX,X_______, + _XXX__XX,X_____XX,XX____XX,X_______, + _XXX__XX,X_____XX,XX____XX,X_______, + _XXX__XX,X_____XX,X____XXX,________, + _XXX__XX,X____XXX,X____XXX,________, + _XXX__XX,X____XXX,X___XXXX,________, + _XXX__XX,XX__XXXX,X__XXXX_,________, + _XXX___X,XXXXXXXX,XXXXXX__,________, + __XXX__X,XXXXXXXX,XXXXX___,________, + __XXX___,XXXX__XX,XXX_____,________, + __XXXX__,________,______XX,XX______, + ___XXXX_,________,_____XXX,X_______, + ____XXXX,________,____XXXX,X_______, + ____XXXX,XX______,__XXXXXX,________, + ______XX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXX_____,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0041[ 96] = { /* code 0041 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXX____,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + ______XX,XXXXX___,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + _____XXX,X_XXXX__,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ____XXXX,___XXXX_,________, + ___XXXX_,____XXXX,________, + ___XXXX_,____XXXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,X_______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + _XXXX___,______XX,XX______, + XXXX____,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0042[ 96] = { /* code 0042 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,XX______, + __XXXX__,_____XXX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,_____XXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,XX______, + __XXXX__,______XX,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,______XX,XXX_____, + __XXXXXX,XXXXXXXX,XXX_____, + __XXXXXX,XXXXXXXX,XX______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0043[ 96] = { /* code 0043 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XX______, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,X_______, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,_______X,X_______, + _XXXXX__,______XX,XXX_____, + __XXXX__,______XX,XXX_____, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0044[ 96] = { /* code 0044 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,_____XXX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXX__,______XX,XXX_____, + __XXXX__,______XX,XX______, + __XXXX__,_____XXX,XX______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0045[ 96] = { /* code 0045 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0046[ 96] = { /* code 0046 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0047[ 96] = { /* code 0047 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,X_______, + _XXXX___,________,________, + _XXXX___,________,________, + _XXXX___,___XXXXX,XXX_____, + _XXXX___,___XXXXX,XXX_____, + _XXXX___,___XXXXX,XXX_____, + _XXXX___,___XXXXX,XXX_____, + __XXXX__,_______X,XXX_____, + __XXXXX_,_______X,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XXX_____, + ____XXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0048[ 96] = { /* code 0048 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXXXX,XXXXXXXX,XX______, + __XXXXXX,XXXXXXXX,XX______, + __XXXXXX,XXXXXXXX,XX______, + __XXXXXX,XXXXXXXX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0049[ 32] = { /* code 0049 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_004A[ 64] = { /* code 004A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + ________,_XXXX___, + XXXX____,_XXXX___, + XXXX____,_XXXX___, + XXXXX___,XXXXX___, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + __XXXXXX,XXX_____, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_004B[ 96] = { /* code 004B */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,______XX,XXX_____, + __XXXX__,_____XXX,XX______, + __XXXX__,____XXXX,X_______, + __XXXX__,___XXXXX,________, + __XXXX__,__XXXXX_,________, + __XXXX__,_XXXXX__,________, + __XXXX__,XXXXX___,________, + __XXXX_X,XXXX____,________, + __XXXXXX,XXXX____,________, + __XXXXXX,XXXXX___,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,__XXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,X_______, + __XXXX__,_____XXX,X_______, + __XXXX__,_____XXX,XX______, + __XXXX__,______XX,XXX_____, + __XXXX__,_______X,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_004C[ 96] = { /* code 004C */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_004D[ 96] = { /* code 004D */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXXXX_,______XX,XXXX____, + _XXXXXXX,_____XXX,XXXX____, + _XXXXXXX,_____XXX,XXXX____, + _XXXXXXX,_____XXX,XXXX____, + _XXXX_XX,_____XX_,XXXX____, + _XXXX_XX,X___XXX_,XXXX____, + _XXXX_XX,X___XXX_,XXXX____, + _XXXX_XX,X___XXX_,XXXX____, + _XXXX_XX,X___XXX_,XXXX____, + _XXXX__X,XX_XXX__,XXXX____, + _XXXX__X,XX_XXX__,XXXX____, + _XXXX__X,XX_XXX__,XXXX____, + _XXXX__X,XX_XXX__,XXXX____, + _XXXX___,XX_XX___,XXXX____, + _XXXX___,XXXXX___,XXXX____, + _XXXX___,XXXXX___,XXXX____, + _XXXX___,XXXXX___,XXXX____, + _XXXX___,XXXXX___,XXXX____, + _XXXX___,_XXX____,XXXX____, + _XXXX___,_XXX____,XXXX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_004E[ 96] = { /* code 004E */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,______XX,XX______, + __XXXXXX,______XX,XX______, + __XXXXXX,X_____XX,XX______, + __XXXXXX,X_____XX,XX______, + __XXXXXX,XX____XX,XX______, + __XXXX_X,XX____XX,XX______, + __XXXX_X,XXX___XX,XX______, + __XXXX__,XXXX__XX,XX______, + __XXXX__,XXXX__XX,XX______, + __XXXX__,_XXXX_XX,XX______, + __XXXX__,__XXX_XX,XX______, + __XXXX__,__XXXXXX,XX______, + __XXXX__,___XXXXX,XX______, + __XXXX__,___XXXXX,XX______, + __XXXX__,____XXXX,XX______, + __XXXX__,____XXXX,XX______, + __XXXX__,_____XXX,XX______, + __XXXX__,_____XXX,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_004F[ 96] = { /* code 004F */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXX__,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,_______X,XXXX____, + __XXXXX_,______XX,XXX_____, + __XXXXXX,_____XXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0050[ 96] = { /* code 0050 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXX__,____XXXX,X_______, + __XXXX__,_____XXX,X_______, + __XXXX__,_____XXX,X_______, + __XXXX__,____XXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXX___,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0051[ 96] = { /* code 0051 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XX______, + __XXXXXX,_____XXX,XXX_____, + __XXXXX_,______XX,XXX_____, + _XXXXX__,_______X,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXX___,________,XXXX____, + _XXXXX__,___XX__X,XXXX____, + __XXXXX_,__XXXXXX,XXX_____, + __XXXXXX,____XXXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXXX____, + _______X,XXXXXX__,XXXXX___, + ________,________,_XXX____, + ________,________,__XX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0052[ 96] = { /* code 0052 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,XX______, + __XXXX__,_____XXX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,_____XXX,XX______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXX___,________, + __XXXX__,__XXXXX_,________, + __XXXX__,___XXXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,X_______, + __XXXX__,_____XXX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XXX_____, + __XXXX__,_______X,XXXX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0053[ 96] = { /* code 0053 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXX____,________, + ____XXXX,XXXXXX__,________, + ___XXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,___XXXXX,________, + __XXXX__,____XXXX,________, + __XXXXX_,________,________, + __XXXXXX,XX______,________, + ___XXXXX,XXXXX___,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,________, + ________,_XXXXXXX,X_______, + ________,____XXXX,X_______, + _XXXX___,_____XXX,X_______, + _XXXXX__,_____XXX,X_______, + __XXXXX_,____XXXX,X_______, + __XXXXXX,XXXXXXXX,________, + ___XXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0054[ 96] = { /* code 0054 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0055[ 96] = { /* code 0055 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXX__,______XX,XX______, + __XXXXX_,______XX,XX______, + __XXXXXX,____XXXX,XX______, + ___XXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,________, + ______XX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0056[ 96] = { /* code 0056 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XXXX____,_____XXX,X_______, + XXXXX___,____XXXX,X_______, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + ___XXX__,___XXX__,________, + ___XXXX_,__XXXX__,________, + ___XXXX_,__XXXX__,________, + ___XXXX_,__XXXX__,________, + ____XXX_,__XXX___,________, + ____XXXX,_XXXX___,________, + ____XXXX,_XXXX___,________, + _____XXX,_XXX____,________, + _____XXX,_XXX____,________, + _____XXX,XXXX____,________, + ______XX,XXX_____,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0057[128] = { /* code 0057 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + XXXX____,__XXXXX_,_____XXX,X_______, + XXXX____,__XXXXX_,_____XXX,X_______, + _XXX____,__XXXXX_,_____XXX,________, + _XXXX___,_XXXXXXX,____XXXX,________, + _XXXX___,_XXX_XXX,____XXXX,________, + _XXXX___,_XXX_XXX,____XXXX,________, + _XXXX___,_XXX_XXX,____XXXX,________, + __XXX___,XXXX_XXX,X___XXX_,________, + __XXX___,XXX___XX,X___XXX_,________, + __XXXX__,XXX___XX,X__XXXX_,________, + __XXXX__,XXX___XX,X__XXXX_,________, + __XXXX__,XXX___XX,X__XXXX_,________, + ___XXX_X,XX_____X,XX_XXX__,________, + ___XXX_X,XX_____X,XX_XXX__,________, + ___XXX_X,XX_____X,XX_XXX__,________, + ___XXX_X,XX_____X,XX_XXX__,________, + ___XXXXX,X_______,XXXXXX__,________, + ____XXXX,X_______,XXXXX___,________, + ____XXXX,X_______,XXXXX___,________, + ____XXXX,X_______,XXXXX___,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0058[ 96] = { /* code 0058 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,____XXXX,________, + __XXXXX_,___XXXXX,________, + ___XXXX_,___XXXX_,________, + ____XXXX,__XXXX__,________, + ____XXXX,__XXXX__,________, + _____XXX,XXXXX___,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ______XX,XXXX____,________, + _____XXX,XXXX____,________, + _____XXX,XXXXX___,________, + ____XXXX,__XXXX__,________, + ____XXXX,__XXXX__,________, + ___XXXX_,___XXXX_,________, + ___XXXX_,___XXXX_,________, + __XXXX__,____XXXX,________, + _XXXXX__,____XXXX,X_______, + _XXXX___,_____XXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0059[ 96] = { /* code 0059 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XXXX____,______XX,XX______, + XXXXX___,_____XXX,XX______, + _XXXXX__,____XXXX,X_______, + __XXXX__,____XXXX,________, + __XXXXX_,___XXXXX,________, + ___XXXX_,___XXXX_,________, + ____XXXX,__XXXX__,________, + ____XXXX,XXXXXX__,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + ______XX,XXXX____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_005A[ 96] = { /* code 005A */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXXXXX,XXXXXXXX,________, + _XXXXXXX,XXXXXXXX,________, + _XXXXXXX,XXXXXXXX,________, + _XXXXXXX,XXXXXXXX,________, + ________,___XXXX_,________, + ________,__XXXX__,________, + ________,_XXXX___,________, + ________,XXXX____,________, + _______X,XXX_____,________, + ______XX,XX______,________, + _____XXX,XX______,________, + _____XXX,X_______,________, + ____XXXX,________,________, + ___XXXX_,________,________, + __XXXX__,________,________, + _XXXX___,________,________, + XXXXXXXX,XXXXXXXX,________, + XXXXXXXX,XXXXXXXX,________, + XXXXXXXX,XXXXXXXX,________, + XXXXXXXX,XXXXXXXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_005B[ 64] = { /* code 005B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,X_______, + __XXXXXX,X_______, + __XXXXXX,X_______, + __XXXXXX,X_______, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXXXX,X_______, + __XXXXXX,X_______, + __XXXXXX,X_______, + __XXXXXX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_005C[ 32] = { /* code 005C */ + ________, + ________, + ________, + ________, + ________, + XXX_____, + XXX_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + _____XXX, + _____XXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_005D[ 64] = { /* code 005D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + ___XXXX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + XXXXXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_005E[ 64] = { /* code 005E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + _____XXX,X_______, + ____XXXX,XX______, + ____XXXX,XX______, + ____XXXX,XX______, + ___XXX__,XXX_____, + ___XXX__,XXX_____, + __XXXX__,XXXX____, + __XXX___,_XXX____, + _XXXX___,_XXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_005F[ 64] = { /* code 005F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0060[ 64] = { /* code 0060 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXX____,________, + _XXXX___,________, + __XXX___,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0061[ 64] = { /* code 0061 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + _XXXX___,XXXXX___, + _XXX____,_XXXX___, + ________,_XXXX___, + _______X,XXXXX___, + ___XXXXX,XXXXX___, + __XXXXX_,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,_XXXX___, + _XXXX___,XXXXX___, + _XXXXXXX,XXXXX___, + __XXXXXX,X_XXX___, + ___XXXXX,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0062[ 96] = { /* code 0062 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,XXXX____,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,___XXXX_,________, + __XXXXX_,___XXXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXXX_,___XXXXX,________, + __XXXXXX,___XXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXX__,________, + __XXXX__,XXXX____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0063[ 64] = { /* code 0063 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XXX_____, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXXX__, + _XXXX___,__XX____, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,________, + _XXXX___,__XX____, + __XXXX__,_XXXXX__, + __XXXXXX,XXXXX___, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0064[ 96] = { /* code 0064 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + _____XXX,X__XXXX_,________, + ___XXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXX__,__XXXXX_,________, + _XXXXX__,__XXXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXXX__,__XXXXX_,________, + __XXXX__,__XXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + _____XXX,X__XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0065[ 64] = { /* code 0065 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXXXXX,XXXXX___, + __XXXX__,_XXXX___, + _XXXX___,__XXX___, + _XXXX___,__XXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XXXX___,________, + _XXXX___,________, + __XXXX__,__XX____, + __XXXXXX,XXXXXX__, + ___XXXXX,XXXXX___, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0066[ 64] = { /* code 0066 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,X_______, + __XXXXXX,X_______, + __XXXX__,________, + __XXXX__,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0067[ 96] = { /* code 0067 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,X__XXXX_,________, + ___XXXXX,XX_XXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXX__,__XXXXX_,________, + _XXXXX__,__XXXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXXX__,__XXXXX_,________, + __XXXX__,_XXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XX_XXXX_,________, + ____XXXX,X__XXXX_,________, + ________,___XXXX_,________, + _XX_____,__XXXXX_,________, + _XXXXXXX,XXXXXX__,________, + __XXXXXX,XXXXX___,________, + ____XXXX,XXXX____,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0068[ 96] = { /* code 0068 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,XXXXX___,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0069[ 32] = { /* code 0069 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_006A[ 32] = { /* code 006A */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + XXXXXX__, + XXXXX___, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_006B[ 64] = { /* code 006B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,__XXXX__, + __XXXX__,_XXXX___, + __XXXX__,_XXX____, + __XXXX__,XXXX____, + __XXXX_X,XXX_____, + __XXXX_X,XX______, + __XXXXXX,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXXX_,XXXX____, + __XXXX__,XXXX____, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + __XXXX__,__XXXX__, + __XXXX__,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_006C[ 32] = { /* code 006C */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_006D[128] = { /* code 006D */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + __XXXX__,XXXXX___,_XXXXX__,________, + __XXXXXX,XXXXXX_X,XXXXXXX_,________, + __XXXXXX,XXXXXXXX,XXXXXXXX,________, + __XXXXX_,__XXXXXX,___XXXXX,________, + __XXXX__,___XXXXX,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + __XXXX__,___XXXX_,____XXXX,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_006E[ 96] = { /* code 006E */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,XXXXX___,________, + __XXXX_X,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_006F[ 96] = { /* code 006F */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXXX___,________, + ___XXXXX,XXXXXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXX__,___XXXX_,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + _XXXX___,____XXXX,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + ___XXXXX,XXXXXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0070[ 96] = { /* code 0070 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,XXXXX___,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XXXXX_,___XXXX_,________, + __XXXXX_,___XXXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXX__,____XXXX,________, + __XXXXX_,___XXXXX,________, + __XXXXXX,___XXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXX_X,XXXXXX__,________, + __XXXX__,XXXX____,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + __XXXX__,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0071[ 96] = { /* code 0071 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,X__XXXX_,________, + ___XXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + __XXXX__,__XXXXX_,________, + _XXXXX__,__XXXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXX___,___XXXX_,________, + _XXXXX__,__XXXXX_,________, + __XXXX__,_XXXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + _____XXX,X__XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,___XXXX_,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0072[ 64] = { /* code 0072 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX_X,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXXX_,________, + __XXXXX_,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0073[ 64] = { /* code 0073 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + _XXXX___,__XX____, + _XXXX___,________, + _XXXXXX_,________, + __XXXXXX,XX______, + ___XXXXX,XXXX____, + _____XXX,XXXXX___, + ________,XXXXXX__, + ________,__XXXX__, + ___XX___,__XXXX__, + _XXXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + ____XXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0074[ 64] = { /* code 0074 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____X__,________, + ___XXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXX__,________, + __XXXXXX,X_______, + ___XXXXX,X_______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0075[ 96] = { /* code 0075 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXX__,___XXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXXXX_,________, + ____XXXX,X__XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0076[ 64] = { /* code 0076 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXX___,__XXX___, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXXX_,_XXX____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXXX,XXX_____, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0077[ 96] = { /* code 0077 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XXXX____,_XXX____,_XXXX___, + _XXX____,_XXX____,_XXX____, + _XXX____,_XXX____,_XXX____, + _XXXX___,XXXXX___,XXXX____, + __XXX___,XX_XX___,XXX_____, + __XXX___,XX_XX___,XXX_____, + __XXX___,XX_XX___,XXX_____, + ___XXX_X,XX_XXX_X,XX______, + ___XXX_X,X___XX_X,XX______, + ___XXX_X,X___XX_X,XX______, + ____XX_X,X___XX_X,X_______, + ____XXXX,X___XXXX,X_______, + ____XXXX,_____XXX,X_______, + _____XXX,_____XXX,________, + _____XXX,_____XXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0078[ 64] = { /* code 0078 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXXX__,_XXXX___, + ___XXXX_,XXXX____, + ___XXXX_,XXX_____, + ____XXXX,XXX_____, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + ____XXXX,XXX_____, + ___XXXX_,XXXX____, + ___XXXX_,XXXX____, + __XXXX__,_XXXX___, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_0079[ 64] = { /* code 0079 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXX____,___XXXX_, + XXXX____,___XXXX_, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXX___, + __XXXX__,_XXXX___, + __XXXX__,_XXXX___, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXXX_,XXXX____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,XX______, + _____XXX,X_______, + ____XXXX,X_______, + _XXXXXXX,________, + _XXXXXXX,________, + _XXXXX__,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_007A[ 64] = { /* code 007A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,_XXXX___, + ________,XXXX____, + _______X,XXX_____, + ______XX,XX______, + _____XXX,X_______, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + _XXXX___,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_007B[ 64] = { /* code 007B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XX______, + _____XXX,XX______, + ____XXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + _XXXXX__,________, + _XXXX___,________, + _XXXXX__,________, + ___XXXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXXX,XX______, + _____XXX,XX______, + ______XX,XX______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_007C[ 32] = { /* code 007C */ + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_007D[ 64] = { /* code 007D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXX___,________, + _XXXXX__,________, + _XXXXXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXXX,________, + _____XXX,XX______, + ______XX,XX______, + _____XXX,XX______, + ____XXXX,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXX_,________, + _XXXXX__,________, + _XXXX___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32B_ASCII_007E[ 64] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,XX___XX_, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _XX____X,XXXXXXX_, + ________,_XXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32B_ASCII_CharInfo[95] = { + { 8, 8, 1, acFont32B_ASCII_0020 } /* code 0020 */ + ,{ 8, 8, 1, acFont32B_ASCII_0021 } /* code 0021 */ + ,{ 13, 13, 2, acFont32B_ASCII_0022 } /* code 0022 */ + ,{ 15, 15, 2, acFont32B_ASCII_0023 } /* code 0023 */ + ,{ 15, 15, 2, acFont32B_ASCII_0024 } /* code 0024 */ + ,{ 24, 24, 3, acFont32B_ASCII_0025 } /* code 0025 */ + ,{ 20, 20, 3, acFont32B_ASCII_0026 } /* code 0026 */ + ,{ 6, 6, 1, acFont32B_ASCII_0027 } /* code 0027 */ + ,{ 9, 9, 2, acFont32B_ASCII_0028 } /* code 0028 */ + ,{ 9, 9, 2, acFont32B_ASCII_0029 } /* code 0029 */ + ,{ 11, 11, 2, acFont32B_ASCII_002A } /* code 002A */ + ,{ 16, 16, 2, acFont32B_ASCII_002B } /* code 002B */ + ,{ 8, 8, 1, acFont32B_ASCII_002C } /* code 002C */ + ,{ 9, 9, 2, acFont32B_ASCII_002D } /* code 002D */ + ,{ 8, 8, 1, acFont32B_ASCII_002E } /* code 002E */ + ,{ 8, 8, 1, acFont32B_ASCII_002F } /* code 002F */ + ,{ 15, 15, 2, acFont32B_ASCII_0030 } /* code 0030 */ + ,{ 15, 15, 2, acFont32B_ASCII_0031 } /* code 0031 */ + ,{ 15, 15, 2, acFont32B_ASCII_0032 } /* code 0032 */ + ,{ 15, 15, 2, acFont32B_ASCII_0033 } /* code 0033 */ + ,{ 15, 15, 2, acFont32B_ASCII_0034 } /* code 0034 */ + ,{ 15, 15, 2, acFont32B_ASCII_0035 } /* code 0035 */ + ,{ 15, 15, 2, acFont32B_ASCII_0036 } /* code 0036 */ + ,{ 15, 15, 2, acFont32B_ASCII_0037 } /* code 0037 */ + ,{ 15, 15, 2, acFont32B_ASCII_0038 } /* code 0038 */ + ,{ 15, 15, 2, acFont32B_ASCII_0039 } /* code 0039 */ + ,{ 10, 10, 2, acFont32B_ASCII_003A } /* code 003A */ + ,{ 10, 10, 2, acFont32B_ASCII_003B } /* code 003B */ + ,{ 16, 16, 2, acFont32B_ASCII_003C } /* code 003C */ + ,{ 16, 16, 2, acFont32B_ASCII_003D } /* code 003D */ + ,{ 16, 16, 2, acFont32B_ASCII_003E } /* code 003E */ + ,{ 17, 17, 3, acFont32B_ASCII_003F } /* code 003F */ + ,{ 26, 26, 4, acFont32B_ASCII_0040 } /* code 0040 */ + ,{ 19, 19, 3, acFont32B_ASCII_0041 } /* code 0041 */ + ,{ 20, 20, 3, acFont32B_ASCII_0042 } /* code 0042 */ + ,{ 20, 20, 3, acFont32B_ASCII_0043 } /* code 0043 */ + ,{ 20, 20, 3, acFont32B_ASCII_0044 } /* code 0044 */ + ,{ 18, 18, 3, acFont32B_ASCII_0045 } /* code 0045 */ + ,{ 17, 17, 3, acFont32B_ASCII_0046 } /* code 0046 */ + ,{ 21, 21, 3, acFont32B_ASCII_0047 } /* code 0047 */ + ,{ 20, 20, 3, acFont32B_ASCII_0048 } /* code 0048 */ + ,{ 8, 8, 1, acFont32B_ASCII_0049 } /* code 0049 */ + ,{ 15, 15, 2, acFont32B_ASCII_004A } /* code 004A */ + ,{ 20, 20, 3, acFont32B_ASCII_004B } /* code 004B */ + ,{ 17, 17, 3, acFont32B_ASCII_004C } /* code 004C */ + ,{ 21, 21, 3, acFont32B_ASCII_004D } /* code 004D */ + ,{ 20, 20, 3, acFont32B_ASCII_004E } /* code 004E */ + ,{ 21, 21, 3, acFont32B_ASCII_004F } /* code 004F */ + ,{ 18, 18, 3, acFont32B_ASCII_0050 } /* code 0050 */ + ,{ 21, 21, 3, acFont32B_ASCII_0051 } /* code 0051 */ + ,{ 20, 20, 3, acFont32B_ASCII_0052 } /* code 0052 */ + ,{ 18, 18, 3, acFont32B_ASCII_0053 } /* code 0053 */ + ,{ 18, 18, 3, acFont32B_ASCII_0054 } /* code 0054 */ + ,{ 20, 20, 3, acFont32B_ASCII_0055 } /* code 0055 */ + ,{ 18, 18, 3, acFont32B_ASCII_0056 } /* code 0056 */ + ,{ 25, 25, 4, acFont32B_ASCII_0057 } /* code 0057 */ + ,{ 18, 18, 3, acFont32B_ASCII_0058 } /* code 0058 */ + ,{ 18, 18, 3, acFont32B_ASCII_0059 } /* code 0059 */ + ,{ 17, 17, 3, acFont32B_ASCII_005A } /* code 005A */ + ,{ 9, 9, 2, acFont32B_ASCII_005B } /* code 005B */ + ,{ 8, 8, 1, acFont32B_ASCII_005C } /* code 005C */ + ,{ 9, 9, 2, acFont32B_ASCII_005D } /* code 005D */ + ,{ 16, 16, 2, acFont32B_ASCII_005E } /* code 005E */ + ,{ 15, 15, 2, acFont32B_ASCII_005F } /* code 005F */ + ,{ 9, 9, 2, acFont32B_ASCII_0060 } /* code 0060 */ + ,{ 15, 15, 2, acFont32B_ASCII_0061 } /* code 0061 */ + ,{ 17, 17, 3, acFont32B_ASCII_0062 } /* code 0062 */ + ,{ 15, 15, 2, acFont32B_ASCII_0063 } /* code 0063 */ + ,{ 17, 17, 3, acFont32B_ASCII_0064 } /* code 0064 */ + ,{ 15, 15, 2, acFont32B_ASCII_0065 } /* code 0065 */ + ,{ 9, 9, 2, acFont32B_ASCII_0066 } /* code 0066 */ + ,{ 17, 17, 3, acFont32B_ASCII_0067 } /* code 0067 */ + ,{ 17, 17, 3, acFont32B_ASCII_0068 } /* code 0068 */ + ,{ 8, 8, 1, acFont32B_ASCII_0069 } /* code 0069 */ + ,{ 8, 8, 1, acFont32B_ASCII_006A } /* code 006A */ + ,{ 15, 15, 2, acFont32B_ASCII_006B } /* code 006B */ + ,{ 8, 8, 1, acFont32B_ASCII_006C } /* code 006C */ + ,{ 26, 26, 4, acFont32B_ASCII_006D } /* code 006D */ + ,{ 17, 17, 3, acFont32B_ASCII_006E } /* code 006E */ + ,{ 17, 17, 3, acFont32B_ASCII_006F } /* code 006F */ + ,{ 17, 17, 3, acFont32B_ASCII_0070 } /* code 0070 */ + ,{ 17, 17, 3, acFont32B_ASCII_0071 } /* code 0071 */ + ,{ 11, 11, 2, acFont32B_ASCII_0072 } /* code 0072 */ + ,{ 15, 15, 2, acFont32B_ASCII_0073 } /* code 0073 */ + ,{ 9, 9, 2, acFont32B_ASCII_0074 } /* code 0074 */ + ,{ 17, 17, 3, acFont32B_ASCII_0075 } /* code 0075 */ + ,{ 15, 15, 2, acFont32B_ASCII_0076 } /* code 0076 */ + ,{ 21, 21, 3, acFont32B_ASCII_0077 } /* code 0077 */ + ,{ 15, 15, 2, acFont32B_ASCII_0078 } /* code 0078 */ + ,{ 15, 15, 2, acFont32B_ASCII_0079 } /* code 0079 */ + ,{ 14, 14, 2, acFont32B_ASCII_007A } /* code 007A */ + ,{ 11, 11, 2, acFont32B_ASCII_007B } /* code 007B */ + ,{ 7, 7, 1, acFont32B_ASCII_007C } /* code 007C */ + ,{ 11, 11, 2, acFont32B_ASCII_007D } /* code 007D */ + ,{ 16, 16, 2, acFont32B_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font32B_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,GUI_Font32B_ASCII_CharInfo /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font32B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,32 /* height of font */ + ,32 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font32B_ASCII_Prop1} + ,25, 15, 20 +}; + diff --git a/User/system/lib/lcd/gui/Font/F32_1.c b/User/system/lib/lcd/gui/Font/F32_1.c new file mode 100644 index 0000000..736d0b6 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F32_1.c @@ -0,0 +1,3410 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F32_1.C +Purpose : ISO 8859-1, West European Character Set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont32_1_00A0[ 32] = { /* code 00A0 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A1[ 32] = { /* code 00A1 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A2[ 64] = { /* code 00A2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,__X_____, + ________,__X_____, + ________,__X_____, + ________,__X_____, + ________,_X______, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,XXXX____, + __XX____,X_XXX___, + _XXX____,X__X____, + _XX____X,________, + _XX____X,________, + _XX____X,________, + _XX___X_,________, + _XX___X_,___XX___, + _XXX__X_,___XX___, + __XXXX__,__XX____, + __XXXX__,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ____X___,________, + ____X___,________, + ___X____,________, + ___X____,________, + ___X____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A3[ 64] = { /* code 00A3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ____XXXX,XXX_____, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XX____,___XX___, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __X_____,________, + _XXXXXXX,____X___, + XXXXXXXX,XXXXXX__, + _XX_____,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A4[ 64] = { /* code 00A4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,____X___, + _XXX_XXX,XX_XXX__, + __XXXXXX,XXXXX___, + ___XXX__,_XXX____, + __XXX___,__XXX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXX__,_XXX____, + __XXXXXX,XXXXX___, + _XXX_XXX,XX_XXX__, + __X_____,____X___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A5[ 64] = { /* code 00A5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,____XX__, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XX____, + __XX____,__XX____, + ___XX___,_XX_____, + ____XX__,XX______, + ____XX__,XX______, + _____XXX,X_______, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A6[ 32] = { /* code 00A6 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A7[ 64] = { /* code 00A7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,__XX____, + __XX____,__XXX___, + __XX____,___XX___, + __XXX___,________, + ___XXX__,________, + ____XXXX,________, + __XXXXXX,XX______, + _XX____X,XXX_____, + _XX_____,XXXXX___, + _XX_____,__XXXX__, + _XX_____,___XXX__, + __XXX___,____XX__, + __XXXXX_,____XX__, + ____XXXX,X__XX___, + ______XX,XXXX____, + _______X,XXXX____, + ________,_XXX____, + ________,__XXX___, + __XX____,___XX___, + __XXX___,___XX___, + ___XXX__,__XXX___, + ____XXXX,XXXX____, + _____XXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A8[ 64] = { /* code 00A8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX__XX_,________, + _XX__XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00A9[ 96] = { /* code 00A9 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXX___,________, + _____XXX,XXXXXXX_,________, + ___XXXX_,_____XXX,X_______, + __XXX___,_______X,XX______, + __XX____,XXXXX___,XX______, + _XX____X,XXXXXX__,_XX_____, + _XX___XX,X___XXX_,_XX_____, + XX___XXX,________,__XX____, + XX___XX_,________,__XX____, + XX___XX_,________,__XX____, + XX___XX_,________,__XX____, + XX___XX_,________,__XX____, + XX___XXX,_____XX_,__XX____, + _XX___XX,____XX__,_XX_____, + _XX____X,XXXXXX__,_XX_____, + __XX____,XXXX____,XX______, + __XXX___,_______X,XX______, + ___XXXX_,_____XXX,X_______, + _____XXX,XXXXXXX_,________, + _______X,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00AA[ 64] = { /* code 00AA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + __XXXXXX,________, + _XX___XX,________, + ______XX,________, + ___XXXXX,________, + _XXXX_XX,________, + _XX___XX,________, + _XX__XXX,________, + _XXXXXXX,________, + __XXX_XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00AB[ 64] = { /* code 00AB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,___XX___, + _____XX_,__XX____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX___,XX______, + __XX___X,X_______, + __XX___X,X_______, + ___XX___,XX______, + ____XX__,_XX_____, + ____XX__,_XX_____, + _____XX_,__XX____, + ______XX,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00AC[ 64] = { /* code 00AC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00AD[ 64] = { /* code 00AD */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00AE[ 96] = { /* code 00AE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXX___,________, + _____XXX,XXXXXXX_,________, + ___XXXX_,_____XXX,X_______, + __XXX___,_______X,XX______, + __XX__XX,XXXXX___,XX______, + _XX___XX,XXXXX___,_XX_____, + _XX___XX,____XX__,_XX_____, + XX____XX,____XX__,__XX____, + XX____XX,____XX__,__XX____, + XX____XX,XXXXXX__,__XX____, + XX____XX,XXXXX___,__XX____, + XX____XX,__XX____,__XX____, + XX____XX,___XX___,__XX____, + _XX___XX,____XX__,_XX_____, + _XX___XX,____XX__,_XX_____, + __XX__XX,_____XX_,XX______, + __XXX___,_______X,XX______, + ___XXXX_,_____XXX,X_______, + _____XXX,XXXXXXX_,________, + _______X,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00AF[ 64] = { /* code 00AF */ + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B0[ 64] = { /* code 00B0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,________, + ___X___X,________, + __X_____,X_______, + __X_____,X_______, + __X_____,X_______, + ___X___X,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B1[ 64] = { /* code 00B1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B2[ 64] = { /* code 00B2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + XX____XX,________, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B3[ 64] = { /* code 00B3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + XX____XX,________, + ______XX,________, + ____XX__,________, + ______XX,________, + ______XX,________, + XX___XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B4[ 64] = { /* code 00B4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XXX_,________, + ____XX__,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B5[ 64] = { /* code 00B5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XXX___,___XXX__, + __XXXX__,__XXXX__, + __XXXXXX,XXXXXX__, + __XX_XXX,XX__XX__, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B6[ 64] = { /* code 00B6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXXXXXX_, + __XXXXXX,XXXXXXX_, + _XXXXXXX,___XX___, + XXXXXXXX,___XX___, + XXXXXXXX,___XX___, + XXXXXXXX,___XX___, + XXXXXXXX,___XX___, + XXXXXXXX,___XX___, + _XXXXXXX,___XX___, + __XXXXXX,___XX___, + ___XXXXX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,___XX___, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B7[ 32] = { /* code 00B7 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B8[ 64] = { /* code 00B8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + __XXX___,________, + ____XX__,________, + ____XX__,________, + XXXXXX__,________, + XXXXX___,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00B9[ 64] = { /* code 00B9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ___XXXX_,________, + __XXXXX_,________, + __X__XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00BA[ 64] = { /* code 00BA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XXXXXX,________, + _XXX__XX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XXX__XX,X_______, + __XXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00BB[ 64] = { /* code 00BB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX___X,X_______, + ___XX___,XX______, + ____XX__,_XX_____, + ____XX__,_XX_____, + _____XX_,__XX____, + ______XX,___XX___, + ______XX,___XX___, + _____XX_,__XX____, + ____XX__,_XX_____, + ____XX__,_XX_____, + ___XX___,XX______, + __XX___X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00BC[ 96] = { /* code 00BC */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XX_,________,__XX____, + ___XXXX_,________,_XX_____, + __XXXXX_,________,XX______, + __X__XX_,_______X,XX______, + _____XX_,_______X,X_______, + _____XX_,______XX,________, + _____XX_,_____XXX,________, + _____XX_,____XXX_,________, + _____XX_,____XX__,________, + _____XX_,___XX___,________, + ________,__XXX___,___XX___, + ________,__XX____,__XXX___, + ________,_XX_____,_XXXX___, + ________,XX______,_XXXX___, + _______X,XX______,XX_XX___, + _______X,X______X,X__XX___, + ______XX,______XX,___XX___, + _____XX_,______XX,XXXXXX__, + ____XXX_,________,___XX___, + ____XX__,________,___XX___, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00BD[ 96] = { /* code 00BD */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XX_,________,__XX____, + ___XXXX_,________,_XX_____, + __XXXXX_,________,XX______, + __X__XX_,_______X,XX______, + _____XX_,_______X,X_______, + _____XX_,______XX,________, + _____XX_,_____XX_,________, + _____XX_,____XXX_,________, + _____XX_,____XX__,________, + _____XX_,___XX___,________, + ________,__XX____,XXXXX___, + ________,_XXX___X,XXXXXX__, + ________,_XX___XX,____XX__, + ________,XX______,____XX__, + _______X,X_______,___XX___, + ______XX,X_______,__XX____, + ______XX,________,_XX_____, + _____XX_,_______X,X_______, + ____XX__,_______X,XXXXXX__, + ___XXX__,______XX,XXXXXX__, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00BE[ 96] = { /* code 00BE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXX_,________,__XX____, + _XXXXXXX,________,_XX_____, + XX____XX,________,XXX_____, + ______XX,________,XX______, + ____XX__,_______X,X_______, + ______XX,______XX,________, + ______XX,_____XXX,________, + XX___XXX,_____XX_,________, + _XXXXXX_,____XX__,________, + __XXXX__,___XX___,________, + ________,__XXX___,___XX___, + ________,__XX____,__XXX___, + ________,_XX_____,_XXXX___, + ________,XX______,XXXXX___, + _______X,XX______,XX_XX___, + _______X,X______X,X__XX___, + ______XX,______XX,___XX___, + _____XXX,______XX,XXXXXX__, + _____XX_,________,___XX___, + ____XX__,________,___XX___, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00BF[ 96] = { /* code 00BF */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,X_______,________, + _______X,X_______,________, + ________,________,________, + ________,________,________, + _______X,X_______,________, + _______X,X_______,________, + _______X,X_______,________, + ______XX,X_______,________, + _____XXX,________,________, + _____XX_,________,________, + ____XX__,________,________, + ___XX___,________,________, + __XXX___,________,________, + __XX____,________,________, + __XX____,_____XX_,________, + __XX____,_____XX_,________, + __XXX___,____XX__,________, + ___XXX__,___XXX__,________, + ____XXXX,XXXXX___,________, + ______XX,XXX_____,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C0[ 96] = { /* code 00C0 */ + ______XX,X_______,________, + _______X,XX______,________, + ________,XX______,________, + ________,_XX_____,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C1[ 96] = { /* code 00C1 */ + ________,_XXX____,________, + ________,XXX_____,________, + ________,XX______,________, + _______X,X_______,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C2[ 96] = { /* code 00C2 */ + _______X,X_______,________, + ______XX,XX______,________, + _____XX_,_XX_____,________, + _____XX_,_XX_____,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C3[ 96] = { /* code 00C3 */ + ________,________,________, + ______XX,X__XX___,________, + _____XXX,XXXXX___,________, + _____XX_,_XXX____,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C4[ 96] = { /* code 00C4 */ + ________,________,________, + ________,________,________, + ______XX,__XX____,________, + ______XX,__XX____,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C5[ 96] = { /* code 00C5 */ + ________,________,________, + ________,________,________, + _______X,XX______,________, + ______X_,__X_____,________, + ______X_,__X_____,________, + ______X_,__X_____,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C6[128] = { /* code 00C6 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,_XXXXXXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXXXX,XX______, + ________,XX___XX_,________,________, + ________,XX___XX_,________,________, + _______X,X____XX_,________,________, + _______X,X____XX_,________,________, + ______XX,_____XX_,________,________, + ______XX,_____XX_,________,________, + _____XX_,_____XX_,________,________, + _____XX_,_____XXX,XXXXXXXX,X_______, + ____XX__,_____XXX,XXXXXXXX,X_______, + ____XX__,_____XX_,________,________, + ___XXXXX,XXXXXXX_,________,________, + ___XXXXX,XXXXXXX_,________,________, + __XX____,_____XX_,________,________, + __XX____,_____XX_,________,________, + _XX_____,_____XX_,________,________, + _XX_____,_____XX_,________,________, + XX______,_____XXX,XXXXXXXX,XX______, + XX______,_____XXX,XXXXXXXX,XX______, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C7[ 96] = { /* code 00C7 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,______XX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + __XX____,________,_XX_____, + __XX____,________,XXX_____, + __XXX___,________,XX______, + ___XXX__,_______X,XX______, + ____XXX_,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,_XX_____,________, + ________,XXX_____,________, + ________,__XX____,________, + ________,__XX____,________, + ______XX,XXXX____,________, + ______XX,XXX_____,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C8[ 96] = { /* code 00C8 */ + _______X,XX______,________, + ________,XXX_____,________, + ________,_XX_____,________, + ________,__XX____,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00C9[ 96] = { /* code 00C9 */ + ________,__XXX___,________, + ________,_XXX____,________, + ________,_XX_____,________, + ________,XX______,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00CA[ 96] = { /* code 00CA */ + ________,_XX_____,________, + ________,XXXX____,________, + _______X,X__XX___,________, + _______X,X__XX___,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00CB[ 96] = { /* code 00CB */ + ________,________,________, + ________,________,________, + _______X,X__XX___,________, + _______X,X__XX___,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00CC[ 32] = { /* code 00CC */ + _XXX____, + __XXX___, + ___XX___, + ____XX__, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00CD[ 32] = { /* code 00CD */ + ____XXX_, + ___XXX__, + ___XX___, + __XX____, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00CE[ 32] = { /* code 00CE */ + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00CF[ 32] = { /* code 00CF */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D0[ 96] = { /* code 00D0 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XXX,X_______, + __XX____,_______X,X_______, + __XX____,________,XX______, + __XX____,________,XX______, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + XXXXXXXX,XX______,_XX_____, + XXXXXXXX,XX______,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,XX______, + __XX____,________,XX______, + __XX____,_______X,X_______, + __XX____,_____XXX,X_______, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D1[ 96] = { /* code 00D1 */ + ________,________,________, + _______X,XX__XX__,________, + ______XX,XXXXXX__,________, + ______XX,__XXX___,________, + ________,________,________, + ________,________,________, + __XXX___,_______X,X_______, + __XXX___,_______X,X_______, + __XXXX__,_______X,X_______, + __XXXX__,_______X,X_______, + __XX_XX_,_______X,X_______, + __XX__XX,_______X,X_______, + __XX__XX,_______X,X_______, + __XX___X,X______X,X_______, + __XX____,XX_____X,X_______, + __XX____,XX_____X,X_______, + __XX____,_XX____X,X_______, + __XX____,_XX____X,X_______, + __XX____,__XX___X,X_______, + __XX____,___XX__X,X_______, + __XX____,___XX__X,X_______, + __XX____,____XX_X,X_______, + __XX____,_____XXX,X_______, + __XX____,_____XXX,X_______, + __XX____,______XX,X_______, + __XX____,______XX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D2[ 96] = { /* code 00D2 */ + ________,XXX_____,________, + ________,_XXX____,________, + ________,__XX____,________, + ________,___XX___,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,_XXX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XXX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,________,XXX_____, + ___XXX__,_______X,XX______, + ____XXXX,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D3[ 96] = { /* code 00D3 */ + ________,___XXX__,________, + ________,__XXX___,________, + ________,__XX____,________, + ________,_XX_____,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,_XXX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XXX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,________,XXX_____, + ___XXX__,_______X,XX______, + ____XXXX,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D4[ 96] = { /* code 00D4 */ + ________,__XX____,________, + ________,_XXXX___,________, + ________,XX__XX__,________, + ________,XX__XX__,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,_XXX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XXX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,________,XXX_____, + ___XXX__,_______X,XX______, + ____XXXX,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D5[ 96] = { /* code 00D5 */ + ________,________,________, + _______X,XX__XX__,________, + ______XX,XXXXXX__,________, + ______XX,__XXX___,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,_XXX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XXX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,________,XXX_____, + ___XXX__,_______X,XX______, + ____XXXX,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D6[ 96] = { /* code 00D6 */ + ________,________,________, + ________,________,________, + ________,XX__XX__,________, + ________,XX__XX__,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,_XXX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XXX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,________,XXX_____, + ___XXX__,_______X,XX______, + ____XXXX,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D7[ 64] = { /* code 00D7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,____XX__, + ___XXX__,___XXX__, + ____XXX_,__XXX___, + _____XXX,_XXX____, + ______XX,XXX_____, + _______X,XX______, + ______XX,XXX_____, + _____XXX,_XXX____, + ____XXX_,__XXX___, + ___XXX__,___XXX__, + ___XX___,____XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D8[ 96] = { /* code 00D8 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,__XX____, + _____XXX,XXXXXXX_,_XXX____, + ____XXXX,_____XXX,XXX_____, + ___XXX__,_______X,XX______, + __XXX___,_______X,XX______, + __XX____,______XX,_XX_____, + __XX____,_____XX_,_XX_____, + _XX_____,____XXX_,__XX____, + _XX_____,___XXX__,__XX____, + _XX_____,__XXX___,__XX____, + _XX_____,_XXX____,__XX____, + _XX_____,XXX_____,__XX____, + _XX_____,XX______,__XX____, + _XXX___X,X_______,_XXX____, + __XX__XX,________,_XX_____, + __XXXXX_,________,XXX_____, + ___XXX__,_______X,XX______, + ___XXXXX,_____XXX,X_______, + __XXXXXX,XXXXXXXX,________, + _XXX___X,XXXXXX__,________, + __X_____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00D9[ 96] = { /* code 00D9 */ + ______XX,X_______,________, + _______X,XX______,________, + ________,XX______,________, + ________,_XX_____,________, + ________,________,________, + ________,________,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXX___,______XX,X_______, + ___XX___,______XX,________, + ___XXXX_,____XXXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00DA[ 96] = { /* code 00DA */ + ________,__XXX___,________, + ________,_XXX____,________, + ________,_XX_____,________, + ________,XX______,________, + ________,________,________, + ________,________,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXX___,______XX,X_______, + ___XX___,______XX,________, + ___XXXX_,____XXXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00DB[ 96] = { /* code 00DB */ + ________,_XX_____,________, + ________,XXXX____,________, + _______X,X__XX___,________, + _______X,X__XX___,________, + ________,________,________, + ________,________,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXX___,______XX,X_______, + ___XX___,______XX,________, + ___XXXX_,____XXXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00DC[ 96] = { /* code 00DC */ + ________,________,________, + ________,________,________, + _______X,X__XX___,________, + _______X,X__XX___,________, + ________,________,________, + ________,________,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXX___,______XX,X_______, + ___XX___,______XX,________, + ___XXXX_,____XXXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00DD[ 96] = { /* code 00DD */ + ________,_XXX____,________, + ________,XXX_____,________, + ________,XX______,________, + _______X,X_______,________, + ________,________,________, + ________,________,________, + _XX_____,______XX,X_______, + __XX____,_____XXX,________, + ___XX___,_____XX_,________, + ___XX___,____XXX_,________, + ____XX__,____XX__,________, + ____XXX_,___XXX__,________, + _____XXX,__XXX___,________, + ______XX,__XX____,________, + ______XX,__XX____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00DE[ 96] = { /* code 00DE */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXX___,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XXX,________, + __XX____,______XX,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,______XX,________, + __XX____,_____XXX,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXX___,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00DF[ 96] = { /* code 00DF */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXX_____,________, + ____XXXX,XXXX____,________, + ___XXX__,__XXX___,________, + __XXX___,___XX___,________, + __XX____,___XX___,________, + __XX____,___XX___,________, + __XX____,__XX____,________, + __XX____,__XX____,________, + __XX____,_XX_____,________, + __XX____,_XX_____,________, + __XX____,_XXX____,________, + __XX____,__XXX___,________, + __XX____,___XXXX_,________, + __XX____,_____XX_,________, + __XX____,______XX,________, + __XX____,______XX,________, + __XX___X,X_____XX,________, + __XX__XX,XX___XXX,________, + __XX___X,XXXXXXX_,________, + __XX____,_XXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E0[ 64] = { /* code 00E0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ______XX,X_______, + _______X,X_______, + ________,XX______, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E1[ 64] = { /* code 00E1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXX_____, + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E2[ 64] = { /* code 00E2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XXX,X_______, + ____XX__,XX______, + ____XX__,XX______, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E3[ 64] = { /* code 00E3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,_XX_____, + ___XXXXX,XXX_____, + ___XX__X,XX______, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E4[ 64] = { /* code 00E4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E5[ 64] = { /* code 00E5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,X_______, + _____X__,_X______, + _____X__,_X______, + _____X__,_X______, + ______XX,X_______, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E6[ 96] = { /* code 00E6 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXXX,XX____XX,XXX_____, + __XXXXXX,XXXXXXXX,XXXXX___, + __XX____,__XXXXX_,___XXX__, + _XX_____,___XXX__,____XX__, + ________,___XX___,_____XX_, + ________,_XXXX___,_____XX_, + ____XXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,X__XXXXX,XXXXXXX_, + __XX____,___XX___,________, + _XX_____,___XX___,________, + _XX_____,___XX___,_____XX_, + _XX_____,__XXXX__,____XX__, + _XXX____,_XX_XXX_,___XXX__, + __XXXXXX,XX___XXX,XXXXX___, + ___XXXXX,______XX,XXX_____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E7[ 64] = { /* code 00E7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XXX___, + _XX_____,___XX___, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XX____, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + _____XXX,XX______, + ______XX,________, + _____XXX,________, + _______X,X_______, + _______X,X_______, + ___XXXXX,X_______, + ___XXXXX,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E8[ 64] = { /* code 00E8 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ______XX,X_______, + _______X,X_______, + ________,XX______, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XX_____,________, + _XX_____,________, + _XXX____,________, + __XX____,____XX__, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00E9[ 64] = { /* code 00E9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXX_____, + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XX_____,________, + _XX_____,________, + _XXX____,________, + __XX____,____XX__, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00EA[ 64] = { /* code 00EA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XX_____,________, + _XX_____,________, + _XXX____,________, + __XX____,____XX__, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00EB[ 64] = { /* code 00EB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XX_____,________, + _XX_____,________, + _XXX____,________, + __XX____,____XX__, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00EC[ 32] = { /* code 00EC */ + ________, + ________, + ________, + ________, + ________, + ________, + XXX_____, + _XXX____, + __XX____, + ___XX___, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00ED[ 32] = { /* code 00ED */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XXX__, + __XXX___, + __XX____, + _XX_____, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00EE[ 32] = { /* code 00EE */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00EF[ 32] = { /* code 00EF */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F0[ 64] = { /* code 00F0 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,___X____, + ______XX,XXXX____, + ______XX,XX______, + ____XXX_,XXX_____, + ____X___,_XXX____, + _____XXX,X_XX____, + ___XXXXX,XXXXX___, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F1[ 64] = { /* code 00F1 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,__XX____, + ____XXXX,XXXX____, + ____XX__,XXX_____, + ________,________, + __XX__XX,XXX_____, + __XXXXXX,XXXX____, + __XXXX__,__XXX___, + __XXX___,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F2[ 64] = { /* code 00F2 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ______XX,X_______, + _______X,X_______, + ________,XX______, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F3[ 64] = { /* code 00F3 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXX_____, + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F4[ 64] = { /* code 00F4 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F5[ 64] = { /* code 00F5 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,__XX____, + ____XXXX,XXXX____, + ____XX__,XXX_____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F6[ 64] = { /* code 00F6 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F7[ 64] = { /* code 00F7 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F8[ 96] = { /* code 00F8 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,_____X__,________, + _____XXX,XXXXXXX_,________, + ___XXXXX,XXXXXX__,________, + __XXX___,__XXXX__,________, + __XX____,___XXX__,________, + _XXX____,__XXXXX_,________, + _XX_____,_XXX_XX_,________, + _XX_____,XXX__XX_,________, + _XX____X,XX___XX_,________, + _XX___XX,X____XX_,________, + _XX__XXX,_____XX_,________, + _XX_XXX_,____XXX_,________, + _XXXXX__,____XX__,________, + __XXX___,__XXXX__,________, + __XXXXXX,XXXXX___,________, + _XX_XXXX,XXX_____,________, + __X_____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00F9[ 64] = { /* code 00F9 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,________, + _____XXX,________, + ______XX,________, + _______X,X_______, + ________,________, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + ____XXXX,X__XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00FA[ 64] = { /* code 00FA */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XXX_____, + _______X,XX______, + _______X,X_______, + ______XX,________, + ________,________, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + ____XXXX,X__XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00FB[ 64] = { /* code 00FB */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + ______XX,XX______, + _____XX_,_XX_____, + _____XX_,_XX_____, + ________,________, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + ____XXXX,X__XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00FC[ 64] = { /* code 00FC */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,XX______, + ____XX__,XX______, + ________,________, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + ____XXXX,X__XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00FD[ 64] = { /* code 00FD */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,XX______, + ______XX,X_______, + ______XX,________, + _____XX_,________, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XX____, + __XX____,__XX____, + __XXX___,__XX____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ____XX__,_XX_____, + ____XX__,XX______, + ____XX__,XX______, + _____XX_,XX______, + _____XXX,X_______, + _____XXX,X_______, + ______XX,X_______, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + __XXXX__,________, + __XXX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00FE[ 64] = { /* code 00FE */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX__XX,XX______, + __XXXXXX,XXXX____, + __XXXX__,__XXX___, + __XXX___,___XX___, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,___XXX__, + __XXX___,___XX___, + __XXXX__,__XXX___, + __XXXXXX,XXXX____, + __XX__XX,XX______, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_1_00FF[ 64] = { /* code 00FF */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,XX______, + ____XX__,XX______, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XX____, + __XX____,__XX____, + __XXX___,__XX____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ____XX__,_XX_____, + ____XX__,XX______, + ____XX__,XX______, + _____XX_,XX______, + _____XXX,X_______, + _____XXX,X_______, + ______XX,X_______, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + __XXXX__,________, + __XXX___,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32_1_CharInfo[96] = { + { 8, 8, 1, acFont32_1_00A0 } /* code 00A0 */ + ,{ 8, 8, 1, acFont32_1_00A1 } /* code 00A1 */ + ,{ 15, 15, 2, acFont32_1_00A2 } /* code 00A2 */ + ,{ 15, 15, 2, acFont32_1_00A3 } /* code 00A3 */ + ,{ 15, 15, 2, acFont32_1_00A4 } /* code 00A4 */ + ,{ 15, 15, 2, acFont32_1_00A5 } /* code 00A5 */ + ,{ 6, 6, 1, acFont32_1_00A6 } /* code 00A6 */ + ,{ 15, 15, 2, acFont32_1_00A7 } /* code 00A7 */ + ,{ 9, 9, 2, acFont32_1_00A8 } /* code 00A8 */ + ,{ 20, 20, 3, acFont32_1_00A9 } /* code 00A9 */ + ,{ 10, 10, 2, acFont32_1_00AA } /* code 00AA */ + ,{ 15, 15, 2, acFont32_1_00AB } /* code 00AB */ + ,{ 16, 16, 2, acFont32_1_00AC } /* code 00AC */ + ,{ 9, 9, 2, acFont32_1_00AD } /* code 00AD */ + ,{ 20, 20, 3, acFont32_1_00AE } /* code 00AE */ + ,{ 15, 15, 2, acFont32_1_00AF } /* code 00AF */ + ,{ 11, 11, 2, acFont32_1_00B0 } /* code 00B0 */ + ,{ 15, 15, 2, acFont32_1_00B1 } /* code 00B1 */ + ,{ 9, 9, 2, acFont32_1_00B2 } /* code 00B2 */ + ,{ 9, 9, 2, acFont32_1_00B3 } /* code 00B3 */ + ,{ 9, 9, 2, acFont32_1_00B4 } /* code 00B4 */ + ,{ 16, 16, 2, acFont32_1_00B5 } /* code 00B5 */ + ,{ 15, 15, 2, acFont32_1_00B6 } /* code 00B6 */ + ,{ 8, 8, 1, acFont32_1_00B7 } /* code 00B7 */ + ,{ 9, 9, 2, acFont32_1_00B8 } /* code 00B8 */ + ,{ 9, 9, 2, acFont32_1_00B9 } /* code 00B9 */ + ,{ 10, 10, 2, acFont32_1_00BA } /* code 00BA */ + ,{ 15, 15, 2, acFont32_1_00BB } /* code 00BB */ + ,{ 23, 23, 3, acFont32_1_00BC } /* code 00BC */ + ,{ 23, 23, 3, acFont32_1_00BD } /* code 00BD */ + ,{ 23, 23, 3, acFont32_1_00BE } /* code 00BE */ + ,{ 17, 17, 3, acFont32_1_00BF } /* code 00BF */ + ,{ 18, 18, 3, acFont32_1_00C0 } /* code 00C0 */ + ,{ 18, 18, 3, acFont32_1_00C1 } /* code 00C1 */ + ,{ 18, 18, 3, acFont32_1_00C2 } /* code 00C2 */ + ,{ 18, 18, 3, acFont32_1_00C3 } /* code 00C3 */ + ,{ 18, 18, 3, acFont32_1_00C4 } /* code 00C4 */ + ,{ 18, 18, 3, acFont32_1_00C5 } /* code 00C5 */ + ,{ 27, 27, 4, acFont32_1_00C6 } /* code 00C6 */ + ,{ 20, 20, 3, acFont32_1_00C7 } /* code 00C7 */ + ,{ 18, 18, 3, acFont32_1_00C8 } /* code 00C8 */ + ,{ 18, 18, 3, acFont32_1_00C9 } /* code 00C9 */ + ,{ 18, 18, 3, acFont32_1_00CA } /* code 00CA */ + ,{ 18, 18, 3, acFont32_1_00CB } /* code 00CB */ + ,{ 8, 8, 1, acFont32_1_00CC } /* code 00CC */ + ,{ 8, 8, 1, acFont32_1_00CD } /* code 00CD */ + ,{ 8, 8, 1, acFont32_1_00CE } /* code 00CE */ + ,{ 8, 8, 1, acFont32_1_00CF } /* code 00CF */ + ,{ 20, 20, 3, acFont32_1_00D0 } /* code 00D0 */ + ,{ 19, 19, 3, acFont32_1_00D1 } /* code 00D1 */ + ,{ 21, 21, 3, acFont32_1_00D2 } /* code 00D2 */ + ,{ 21, 21, 3, acFont32_1_00D3 } /* code 00D3 */ + ,{ 21, 21, 3, acFont32_1_00D4 } /* code 00D4 */ + ,{ 21, 21, 3, acFont32_1_00D5 } /* code 00D5 */ + ,{ 21, 21, 3, acFont32_1_00D6 } /* code 00D6 */ + ,{ 16, 16, 2, acFont32_1_00D7 } /* code 00D7 */ + ,{ 21, 21, 3, acFont32_1_00D8 } /* code 00D8 */ + ,{ 19, 19, 3, acFont32_1_00D9 } /* code 00D9 */ + ,{ 19, 19, 3, acFont32_1_00DA } /* code 00DA */ + ,{ 19, 19, 3, acFont32_1_00DB } /* code 00DB */ + ,{ 19, 19, 3, acFont32_1_00DC } /* code 00DC */ + ,{ 18, 18, 3, acFont32_1_00DD } /* code 00DD */ + ,{ 18, 18, 3, acFont32_1_00DE } /* code 00DE */ + ,{ 17, 17, 3, acFont32_1_00DF } /* code 00DF */ + ,{ 15, 15, 2, acFont32_1_00E0 } /* code 00E0 */ + ,{ 15, 15, 2, acFont32_1_00E1 } /* code 00E1 */ + ,{ 15, 15, 2, acFont32_1_00E2 } /* code 00E2 */ + ,{ 15, 15, 2, acFont32_1_00E3 } /* code 00E3 */ + ,{ 15, 15, 2, acFont32_1_00E4 } /* code 00E4 */ + ,{ 15, 15, 2, acFont32_1_00E5 } /* code 00E5 */ + ,{ 24, 24, 3, acFont32_1_00E6 } /* code 00E6 */ + ,{ 14, 14, 2, acFont32_1_00E7 } /* code 00E7 */ + ,{ 15, 15, 2, acFont32_1_00E8 } /* code 00E8 */ + ,{ 15, 15, 2, acFont32_1_00E9 } /* code 00E9 */ + ,{ 15, 15, 2, acFont32_1_00EA } /* code 00EA */ + ,{ 15, 15, 2, acFont32_1_00EB } /* code 00EB */ + ,{ 6, 6, 1, acFont32_1_00EC } /* code 00EC */ + ,{ 6, 6, 1, acFont32_1_00ED } /* code 00ED */ + ,{ 6, 6, 1, acFont32_1_00EE } /* code 00EE */ + ,{ 6, 6, 1, acFont32_1_00EF } /* code 00EF */ + ,{ 15, 15, 2, acFont32_1_00F0 } /* code 00F0 */ + ,{ 15, 15, 2, acFont32_1_00F1 } /* code 00F1 */ + ,{ 15, 15, 2, acFont32_1_00F2 } /* code 00F2 */ + ,{ 15, 15, 2, acFont32_1_00F3 } /* code 00F3 */ + ,{ 15, 15, 2, acFont32_1_00F4 } /* code 00F4 */ + ,{ 15, 15, 2, acFont32_1_00F5 } /* code 00F5 */ + ,{ 15, 15, 2, acFont32_1_00F6 } /* code 00F6 */ + ,{ 15, 15, 2, acFont32_1_00F7 } /* code 00F7 */ + ,{ 17, 17, 3, acFont32_1_00F8 } /* code 00F8 */ + ,{ 15, 15, 2, acFont32_1_00F9 } /* code 00F9 */ + ,{ 15, 15, 2, acFont32_1_00FA } /* code 00FA */ + ,{ 15, 15, 2, acFont32_1_00FB } /* code 00FB */ + ,{ 15, 15, 2, acFont32_1_00FC } /* code 00FC */ + ,{ 14, 14, 2, acFont32_1_00FD } /* code 00FD */ + ,{ 15, 15, 2, acFont32_1_00FE } /* code 00FE */ + ,{ 14, 14, 2, acFont32_1_00FF } /* code 00FF */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font32_1_Prop2 = { + 0x00A0 /* first character */ + ,0x00FF /* last character */ + ,&GUI_Font32_1_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font32_1_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font32_ASCII_CharInfo[0] /* address of first character */ + ,&GUI_Font32_1_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font32_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,32 /* height of font */ + ,32 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font32_1_Prop1} + ,26, 15, 20 +}; + diff --git a/User/system/lib/lcd/gui/Font/F32_ASCII.c b/User/system/lib/lcd/gui/Font/F32_ASCII.c new file mode 100644 index 0000000..8a2851e --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F32_ASCII.c @@ -0,0 +1,3368 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F32_ASCII.C +Purpose : ASCII character set, bold, high +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* Start of unicode area */ +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0020[ 32] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0021[ 32] = { /* code 0021 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0022[ 64] = { /* code 0022 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0023[ 64] = { /* code 0023 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,___XX___, + _____XX_,___XX___, + ____XXX_,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + ____XX__,__XX____, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ___XX___,_XX_____, + XXXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXX__, + __XX____,XX______, + __XX____,XX______, + _XXX___X,XX______, + _XX____X,X_______, + _XX____X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0024[ 64] = { /* code 0024 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,________, + ____XXXX,XX______, + ___XXXXX,XXXX____, + __XXX__X,__XXX___, + _XXX___X,___XXX__, + _XX____X,____XX__, + _XX____X,________, + _XX____X,________, + __XX___X,________, + __XXXXXX,________, + ____XXXX,XXX_____, + ______XX,XXXX____, + _______X,__XXX___, + _______X,___XXX__, + _______X,____XX__, + _XX____X,____XX__, + _XX____X,____XX__, + __XX___X,___XXX__, + __XXX__X,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + _______X,________, + _______X,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0025[ 96] = { /* code 0025 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXXX,________,XX______, + ___XXXXX,X______X,XX______, + __XXX__X,XX_____X,X_______, + __XX____,XX____XX,X_______, + __XX____,XX____XX,________, + __XX____,XX___XXX,________, + __XX____,XX___XX_,________, + __XXX__X,XX__XX__,________, + ___XXXXX,X___XX__,________, + ____XXXX,___XX___,________, + ________,___XX___,XXXX____, + ________,__XX___X,XXXXX___, + ________,__XX__XX,X__XXX__, + ________,_XX___XX,____XX__, + ________,_XX___XX,____XX__, + ________,XX____XX,____XX__, + ________,XX____XX,____XX__, + _______X,X_____XX,X__XXX__, + _______X,X______X,XXXXX___, + ______XX,________,XXXX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0026[ 96] = { /* code 0026 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXX_____,________, + ____XXXX,XXXX____,________, + ____XX__,__XXX___,________, + ___XX___,___XX___,________, + ___XX___,___XX___,________, + ___XX___,___XX___,________, + ____XX__,__XX____,________, + ____XXX_,_XXX____,________, + _____XXX,XXX_____,________, + _____XXX,X_______,________, + ___XXXXX,X_______,________, + __XXX___,XX____X_,________, + _XXX____,_XX__XXX,________, + _XX_____,_XXX_XX_,________, + _XX_____,__XXXXX_,________, + _XX_____,___XXX__,________, + _XXX____,___XXXX_,________, + __XXX___,_XXXXXXX,________, + ___XXXXX,XXXX__XX,X_______, + ____XXXX,XX____XX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0027[ 32] = { /* code 0027 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0028[ 64] = { /* code 0028 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + _____XX_,________, + ______XX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0029[ 64] = { /* code 0029 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + __XX____,________, + __XX____,________, + ___XX___,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________, + _XX_____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_002A[ 64] = { /* code 002A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + __X__XX_,_X______, + _XXXXXXX,XXX_____, + ____XXXX,X_______, + ____XXXX,________, + ___XX__X,X_______, + ___XX___,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_002B[ 64] = { /* code 002B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_002C[ 32] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ___X____, + ___X____, + __XX____, + __X_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_002D[ 64] = { /* code 002D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_002E[ 32] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_002F[ 32] = { /* code 002F */ + ________, + ________, + ________, + ________, + ________, + ________, + ______XX, + ______XX, + _____XX_, + _____XX_, + _____XX_, + ____XX__, + ____XX__, + ____XX__, + ___XXX__, + ___XX___, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + XXX_____, + XX______, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0030[ 64] = { /* code 0030 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + __XX____,___XX___, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0031[ 64] = { /* code 0031 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,XX______, + ________,XX______, + _______X,XX______, + ______XX,XX______, + ____XXXX,XX______, + ___XXXX_,XX______, + ___XX___,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0032[ 64] = { /* code 0032 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + _XX_____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,__XX____, + ________,__XX____, + ________,_XX_____, + ________,XX______, + _______X,X_______, + ______XX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0033[ 64] = { /* code 0033 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + _XXX____,___XX___, + _XX_____,___XX___, + ________,___XX___, + ________,___XX___, + ________,_XXX____, + ______XX,XXX_____, + ______XX,XXXX____, + ________,__XXX___, + ________,___XXX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + _XX_____,____XX__, + _XXX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0034[ 64] = { /* code 0034 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,__XX____, + ________,_XXX____, + ________,XXXX____, + ________,XXXX____, + _______X,X_XX____, + ______XX,__XX____, + _____XXX,__XX____, + _____XX_,__XX____, + ____XX__,__XX____, + ___XXX__,__XX____, + ___XX___,__XX____, + __XX____,__XX____, + _XXX____,__XX____, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + ________,__XX____, + ________,__XX____, + ________,__XX____, + ________,__XX____, + ________,__XX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0035[ 64] = { /* code 0035 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,XXXXX___, + ___XXXXX,XXXXX___, + __XXX___,________, + __XX____,________, + __XX____,________, + __XX____,________, + __X__XXX,XX______, + _XXXXXXX,XXXX____, + _XXXX___,__XXX___, + _XX_____,___XX___, + ________,____XX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + ________,____XX__, + _XX_____,____XX__, + _XXX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0036[ 64] = { /* code 0036 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,XXX_____, + ____XXXX,XXXX____, + ___XXX__,__XXX___, + __XXX___,___XXX__, + __XX____,____XX__, + __XX____,________, + _XX_____,________, + _XX__XXX,XX______, + _XX_XXXX,XXXX____, + _XXXX___,__XXX___, + _XXX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + __XX____,____XX__, + __XX____,___XX___, + ___XX___,__XXX___, + ____XXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0037[ 64] = { /* code 0037 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,___X____, + ________,__XX____, + ________,_XX_____, + ________,_X______, + ________,XX______, + _______X,X_______, + _______X,X_______, + ______XX,________, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0038[ 64] = { /* code 0038 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + ___XX___,__XX____, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + ___XX___,__XX____, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0039[ 64] = { /* code 0039 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,__XX____, + __XX____,___XX___, + _XX_____,____X___, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + __XX____,___XXX__, + __XXX___,__XXXX__, + ___XXXXX,XXX_XX__, + _____XXX,X___XX__, + ________,____XX__, + ________,___XX___, + _XX_____,___XX___, + _XXX____,___XX___, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_003A[ 32] = { /* code 003A */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_003B[ 32] = { /* code 003B */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ____X___, + ____X___, + ___XX___, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_003C[ 64] = { /* code 003C */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,_____X__, + ________,___XXX__, + ________,_XXXX___, + _______X,XXX_____, + _____XXX,________, + ___XXX__,________, + __XX____,________, + ___XXX__,________, + _____XXX,________, + _______X,XXX_____, + ________,_XXXX___, + ________,___XXX__, + ________,_____X__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_003D[ 64] = { /* code 003D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_003E[ 64] = { /* code 003E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,________, + __XXX___,________, + ___XXXX_,________, + _____XXX,X_______, + ________,XXX_____, + ________,__XXX___, + ________,____XX__, + ________,__XXX___, + ________,XXX_____, + _____XXX,X_______, + ___XXXX_,________, + __XXX___,________, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_003F[ 64] = { /* code 003F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + ________,____XX__, + ________,___XXX__, + ________,___XX___, + ________,__XX____, + ________,_XX_____, + ________,XX______, + _______X,XX______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0040[128] = { /* code 0040 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,__XXXXXX,XX______,________, + ________,XXXXXXXX,XXXX____,________, + ______XX,XX______,_XXXX___,________, + _____XXX,________,___XXX__,________, + ____XXX_,________,____XXX_,________, + ___XXX__,__XXXX__,_XX__XXX,________, + ___XX___,XXXXXXXX,_XX___XX,________, + __XX___X,XX____XX,XXX___XX,X_______, + __XX___X,X______X,XX_____X,X_______, + __XX__XX,________,XX_____X,X_______, + _XX___XX,________,XX_____X,X_______, + _XX__XX_,________,XX_____X,X_______, + _XX__XX_,________,XX_____X,X_______, + _XX__XX_,________,XX____XX,X_______, + _XX__XX_,_______X,X_____XX,________, + _XX__XX_,_______X,X____XXX,________, + _XX___XX,______XX,X____XX_,________, + _XXX__XX,X___XXXX,X__XXX__,________, + __XX___X,XXXXXX_X,XXXXX___,________, + __XXX___,XXXXX___,XXXX____,________, + ___XX___,________,________,XX______, + ___XXX__,________,_______X,X_______, + ____XXXX,________,_____XXX,________, + _____XXX,XX______,___XXXX_,________, + _______X,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXX_____,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0041[ 96] = { /* code 0041 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + _____XX_,__XX____,________, + _____XX_,__XX____,________, + ____XXX_,__XXX___,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XX_,________, + _XXX____,_____XXX,________, + _XX_____,______XX,________, + _XX_____,______XX,________, + XX______,_______X,X_______, + XX______,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0042[ 96] = { /* code 0042 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXX___,________, + __XXXXXX,XXXXXX__,________, + __XX____,____XXX_,________, + __XX____,_____XXX,________, + __XX____,______XX,________, + __XX____,______XX,________, + __XX____,______XX,________, + __XX____,_____XXX,________, + __XX____,____XXX_,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XXX,________, + __XX____,______XX,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,______XX,X_______, + __XX____,_____XXX,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0043[ 96] = { /* code 0043 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,______XX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + __XX____,________,_XX_____, + __XX____,________,XXX_____, + __XXX___,________,XX______, + ___XXX__,_______X,XX______, + ____XXX_,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0044[ 96] = { /* code 0044 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXX_,________, + __XX____,_____XXX,X_______, + __XX____,_______X,X_______, + __XX____,________,XX______, + __XX____,________,XX______, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + __XX____,________,XX______, + __XX____,________,XX______, + __XX____,_______X,X_______, + __XX____,_____XXX,X_______, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0045[ 96] = { /* code 0045 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0046[ 96] = { /* code 0046 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXXX,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXX__,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0047[ 96] = { /* code 0047 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,______XX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XX______, + __XX____,________,_XX_____, + __XX____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,________,________, + _XX_____,___XXXXX,XXX_____, + _XX_____,___XXXXX,XXX_____, + _XX_____,________,_XX_____, + _XXX____,________,_XX_____, + __XX____,________,_XX_____, + __XXX___,________,_XX_____, + ___XXX__,________,XXX_____, + ____XXXX,______XX,XX______, + _____XXX,XXXXXXXX,X_______, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0048[ 96] = { /* code 0048 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XXXXXX,XXXXXXXX,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0049[ 32] = { /* code 0049 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_004A[ 64] = { /* code 004A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_004B[ 96] = { /* code 004B */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XX____,______XX,X_______, + __XX____,_____XXX,________, + __XX____,____XXX_,________, + __XX____,___XXX__,________, + __XX____,__XXX___,________, + __XX____,_XXX____,________, + __XX____,XXX_____,________, + __XX___X,XX______,________, + __XX__XX,XX______,________, + __XX_XXX,XX______,________, + __XXXXX_,XXX_____,________, + __XXXX__,_XXX____,________, + __XXX___,_XXX____,________, + __XX____,__XXX___,________, + __XX____,___XXX__,________, + __XX____,____XXX_,________, + __XX____,_____XX_,________, + __XX____,_____XXX,________, + __XX____,______XX,X_______, + __XX____,_______X,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_004C[ 64] = { /* code 004C */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XXXXXX,XXXXXX__, + __XXXXXX,XXXXXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_004D[ 96] = { /* code 004D */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ___XXX__,________,_XXX____, + ___XXXX_,________,XXXX____, + ___XXXX_,________,XXXX____, + ___XXXX_,________,XXXX____, + ___XX_XX,_______X,X_XX____, + ___XX_XX,_______X,X_XX____, + ___XX_XX,_______X,X_XX____, + ___XX__X,X_____XX,__XX____, + ___XX__X,X_____XX,__XX____, + ___XX__X,X_____XX,__XX____, + ___XX___,XX___XX_,__XX____, + ___XX___,XX___XX_,__XX____, + ___XX___,XX___XX_,__XX____, + ___XX___,XXX_XXX_,__XX____, + ___XX___,_XX_XX__,__XX____, + ___XX___,_XX_XX__,__XX____, + ___XX___,_XX_XX__,__XX____, + ___XX___,__XXX___,__XX____, + ___XX___,__XXX___,__XX____, + ___XX___,__XXX___,__XX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_004E[ 96] = { /* code 004E */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXX___,_______X,X_______, + __XXX___,_______X,X_______, + __XXXX__,_______X,X_______, + __XXXX__,_______X,X_______, + __XX_XX_,_______X,X_______, + __XX__XX,_______X,X_______, + __XX__XX,_______X,X_______, + __XX___X,X______X,X_______, + __XX____,XX_____X,X_______, + __XX____,XX_____X,X_______, + __XX____,_XX____X,X_______, + __XX____,_XX____X,X_______, + __XX____,__XX___X,X_______, + __XX____,___XX__X,X_______, + __XX____,___XX__X,X_______, + __XX____,____XX_X,X_______, + __XX____,_____XXX,X_______, + __XX____,_____XXX,X_______, + __XX____,______XX,X_______, + __XX____,______XX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_004F[ 96] = { /* code 004F */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + _XXX____,________,_XXX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XXX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,________,XXX_____, + ___XXX__,_______X,XX______, + ____XXXX,_____XXX,X_______, + _____XXX,XXXXXXXX,________, + _______X,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0050[ 96] = { /* code 0050 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXX___,________, + __XXXXXX,XXXXXX__,________, + __XX____,____XXX_,________, + __XX____,_____XXX,________, + __XX____,______XX,________, + __XX____,______XX,________, + __XX____,______XX,________, + __XX____,______XX,________, + __XX____,_____XXX,________, + __XX____,____XXX_,________, + __XXXXXX,XXXXXX__,________, + __XXXXXX,XXXX____,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + __XX____,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0051[ 96] = { /* code 0051 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXXXX__,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,X_______, + ___XXX__,_______X,XX______, + __XXX___,________,XXX_____, + __XX____,________,_XX_____, + __XX____,________,_XX_____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + _XX_____,________,__XX____, + __XX____,________,_XXX____, + __XX____,________,_XX_____, + __XXX___,___XXX__,XXX_____, + ___XXX__,___XXXXX,XX______, + ____XXXX,_____XXX,XX______, + _____XXX,XXXXXXXX,XXX_____, + _______X,XXXXXX__,_XXX____, + ________,________,__XX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0052[ 96] = { /* code 0052 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXXX,________, + __XX____,______XX,X_______, + __XX____,_______X,XX______, + __XX____,________,XX______, + __XX____,________,XX______, + __XX____,________,XX______, + __XX____,_______X,XX______, + __XX____,______XX,X_______, + __XXXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXX__,________, + __XX____,__XXX___,________, + __XX____,___XX___,________, + __XX____,____XX__,________, + __XX____,____XXX_,________, + __XX____,_____XXX,________, + __XX____,______XX,________, + __XX____,_______X,X_______, + __XX____,_______X,XX______, + __XX____,________,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0053[ 96] = { /* code 0053 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXXX___,________, + ____XXXX,XXXXXXX_,________, + ___XXX__,____XXXX,________, + __XXX___,______XX,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXX___,________,________, + ___XXX__,________,________, + ___XXXXX,XXX_____,________, + ____XXXX,XXXXXX__,________, + ________,XXXXXXXX,________, + ________,____XXXX,________, + ________,______XX,X_______, + _XX_____,_______X,X_______, + _XX_____,_______X,X_______, + _XXX____,_______X,X_______, + __XXX___,______XX,________, + ___XXX__,_____XXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0054[ 64] = { /* code 0054 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXXX_, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + _______X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0055[ 96] = { /* code 0055 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XX____,_______X,X_______, + __XXX___,______XX,X_______, + ___XX___,______XX,________, + ___XXXX_,____XXXX,________, + ____XXXX,XXXXXXX_,________, + ______XX,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0056[ 96] = { /* code 0056 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XX______,_______X,X_______, + XXX_____,______XX,X_______, + _XX_____,______XX,________, + _XX_____,______XX,________, + _XXX____,_____XXX,________, + __XX____,_____XX_,________, + __XX____,_____XX_,________, + ___XX___,____XX__,________, + ___XX___,____XX__,________, + ___XXX__,___XXX__,________, + ____XX__,___XX___,________, + ____XX__,___XX___,________, + ____XXX_,__XXX___,________, + _____XX_,__XX____,________, + _____XX_,_XXX____,________, + ______XX,_XX_____,________, + ______XX,_XX_____,________, + ______XX,XXX_____,________, + _______X,XX______,________, + _______X,XX______,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0057[128] = { /* code 0057 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + XX______,____XXX_,________,_XX_____, + XX______,____XXX_,________,_XX_____, + _XX_____,___XX_XX,________,XX______, + _XX_____,___XX_XX,________,XX______, + _XX_____,___XX_XX,________,XX______, + _XX_____,__XX___X,X_______,XX______, + __XX____,__XX___X,X______X,X_______, + __XX____,__XX___X,X______X,X_______, + __XX____,_XX_____,XX_____X,X_______, + __XXX___,_XX_____,XX____XX,X_______, + ___XX___,_XX_____,XX____XX,________, + ___XX___,XXX_____,_XX___XX,________, + ___XX___,XX______,_XX___XX,________, + ___XXX__,XX______,_XX__XX_,________, + ____XX_X,XX______,_XXX_XX_,________, + ____XX_X,X_______,__XX_XX_,________, + ____XX_X,X_______,__XX_XX_,________, + _____XXX,X_______,__XXXX__,________, + _____XXX,________,___XXX__,________, + _____XXX,________,___XXX__,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0058[ 96] = { /* code 0058 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXX____,_____XXX,________, + __XXX___,____XXX_,________, + ___XX___,____XX__,________, + ___XXX__,___XXX__,________, + ____XXX_,__XXX___,________, + _____XXX,_XXX____,________, + _____XXX,_XXX____,________, + ______XX,_XX_____,________, + _______X,XX______,________, + _______X,XX______,________, + _______X,XX______,________, + ______XX,_XX_____,________, + _____XXX,_XXX____,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ___XXX__,___XXX__,________, + __XXX___,____XXX_,________, + __XXX___,_____XX_,________, + _XXX____,_____XXX,________, + XXX_____,______XX,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0059[ 96] = { /* code 0059 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XX_____,______XX,X_______, + __XX____,_____XXX,________, + ___XX___,_____XX_,________, + ___XX___,____XXX_,________, + ____XX__,____XX__,________, + ____XXX_,___XXX__,________, + _____XXX,__XXX___,________, + ______XX,__XX____,________, + ______XX,__XX____,________, + _______X,XXX_____,________, + _______X,XXX_____,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,XX______,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_005A[ 96] = { /* code 005A */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _XXXXXXX,XXXXXXXX,________, + _XXXXXXX,XXXXXXXX,________, + ________,_____XX_,________, + ________,____XX__,________, + ________,___XX___,________, + ________,__XXX___,________, + ________,_XXX____,________, + ________,_XX_____,________, + ________,XX______,________, + _______X,XX______,________, + ______XX,X_______,________, + ______XX,________,________, + _____XX_,________,________, + ____XX__,________,________, + ___XXX__,________,________, + __XXX___,________,________, + __XX____,________,________, + _XX_____,________,________, + XXXXXXXX,XXXXXXXX,________, + XXXXXXXX,XXXXXXXX,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_005B[ 32] = { /* code 005B */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + __XXXXX_, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXXX_, + __XXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_005C[ 32] = { /* code 005C */ + ________, + ________, + ________, + ________, + ________, + ________, + XX______, + XX______, + _XX_____, + _XX_____, + _XX_____, + __XX____, + __XX____, + __XX____, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + _____XX_, + _____XX_, + _____XX_, + _____XXX, + ______XX, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_005D[ 32] = { /* code 005D */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + _XXXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + _XXXXX__, + _XXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_005E[ 64] = { /* code 005E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + ____XXXX,________, + ___XX__X,X_______, + ___XX__X,X_______, + ___XX__X,X_______, + __XX____,XX______, + __XX____,XX______, + __XX____,XX______, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_005F[ 64] = { /* code 005F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0060[ 64] = { /* code 0060 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + __XXX___,________, + ___XX___,________, + ____XX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0061[ 64] = { /* code 0061 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XXX_____, + __XXXXXX,XXXX____, + __XX____,__XXX___, + _XX_____,___XX___, + ________,___XX___, + ________,XXXXX___, + ____XXXX,XXXXX___, + __XXXXXX,X__XX___, + __XX____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,XXXXX___, + __XXXXXX,XX_XX___, + ___XXXXX,X___XX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0062[ 64] = { /* code 0062 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX__XX,XX______, + __XX_XXX,XXXX____, + __XXXX__,__XXX___, + __XXX___,___XX___, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,___XXX__, + __XXX___,___XX___, + __XXXX__,__XXX___, + __XXXXXX,XXXX____, + __XX__XX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0063[ 64] = { /* code 0063 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XXX___, + _XX_____,___XX___, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XX____, + __XXX___,_XXX____, + ___XXXXX,XXX_____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0064[ 64] = { /* code 0064 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + _____XXX,X__XX___, + ___XXXXX,XX_XX___, + __XXX___,_XXXX___, + __XX____,__XXX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XXXXX___, + _____XXX,X__XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0065[ 64] = { /* code 0065 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XX_____,____XX__, + _XX_____,____XX__, + _XXXXXXX,XXXXXX__, + _XXXXXXX,XXXXXX__, + _XX_____,________, + _XX_____,________, + _XXX____,________, + __XX____,____XX__, + __XXXX__,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0066[ 32] = { /* code 0066 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XXXX_, + __XXXXX_, + __XX____, + __XX____, + __XX____, + XXXXXXX_, + XXXXXXX_, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0067[ 64] = { /* code 0067 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X__XX___, + ___XXXXX,XX_XX___, + __XXX___,_XXXX___, + __XX____,__XXX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + _____XXX,X__XX___, + _XX_____,___XX___, + _XX_____,__XXX___, + _XXX____,_XXX____, + __XXXXXX,XXX_____, + ____XXXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0068[ 64] = { /* code 0068 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX__XX,XXX_____, + __XXXXXX,XXXX____, + __XXXX__,__XXX___, + __XXX___,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0069[ 32] = { /* code 0069 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_006A[ 32] = { /* code 006A */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____, + XXX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_006B[ 64] = { /* code 006B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,___XXX__, + __XX____,__XXX___, + __XX____,_XXX____, + __XX____,XXX_____, + __XX___X,XX______, + __XX_XXX,X_______, + __XXXXXX,X_______, + __XXXXXX,X_______, + __XXX__X,XX______, + __XX____,XXX_____, + __XX____,XXX_____, + __XX____,_XXX____, + __XX____,__XX____, + __XX____,__XXX___, + __XX____,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_006C[ 32] = { /* code 006C */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_006D[ 96] = { /* code 006D */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XX__XX,XX____XX,XX______, + __XX_XXX,XXX_XXXX,XXX_____, + __XXXX__,_XXXXX__,_XXX____, + __XXX___,__XXX___,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + __XX____,__XX____,__XX____, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_006E[ 64] = { /* code 006E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX__XX,XXX_____, + __XXXXXX,XXXX____, + __XXXX__,__XXX___, + __XXX___,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_006F[ 64] = { /* code 006F */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + __XXX___,__XXX___, + __XX____,___XX___, + _XXX____,___XXX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XX_____,____XX__, + _XXX____,___XXX__, + __XX____,___XX___, + __XXX___,__XXX___, + ___XXXXX,XXXX____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0070[ 64] = { /* code 0070 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX__XX,XX______, + __XX_XXX,XXXX____, + __XXXX__,__XXX___, + __XXX___,___XX___, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XX____,____XX__, + __XXX___,___XX___, + __XXXX__,__XXX___, + __XX_XXX,XXXX____, + __XX__XX,XX______, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0071[ 64] = { /* code 0071 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,X__XX___, + ___XXXXX,XX_XX___, + __XXX___,_XXXX___, + __XX____,__XXX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XX_____,___XX___, + _XXX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + _____XXX,X__XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,___XX___, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0072[ 64] = { /* code 0072 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX_XXX,X_______, + __XXXXXX,X_______, + __XXX___,________, + __XXX___,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0073[ 64] = { /* code 0073 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XXX_____, + _XXX____,_XXX____, + _XX_____,__XX____, + _XX_____,________, + _XXXX___,________, + __XXXXXX,X_______, + ___XXXXX,XXXX____, + ______XX,XXXX____, + ________,__XXX___, + _XX_____,___XX___, + _XXX____,___XX___, + __XXX___,__XX____, + ___XXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0074[ 32] = { /* code 0074 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___X____, + __XX____, + __XX____, + __XX____, + __XX____, + XXXXXXX_, + XXXXXXX_, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXXX_, + ___XXXX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0075[ 64] = { /* code 0075 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,___XX___, + __XX____,__XXX___, + __XXX___,_XXXX___, + ___XXXXX,XX_XX___, + ____XXXX,X__XX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0076[ 64] = { /* code 0076 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX______,___XX___, + XX______,___XX___, + _XX_____,__XX____, + _XX_____,__XX____, + _XXX____,_XXX____, + __XX____,_XX_____, + __XXX___,_XX_____, + ___XX___,XX______, + ___XX___,XX______, + ___XXX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + _____XXX,________, + _____XXX,________, + ______X_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0077[ 96] = { /* code 0077 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + XX______,_X______,_XX_____, + XX______,XXX_____,_XX_____, + XX______,XXX_____,_XX_____, + _XX_____,X_X_____,XX______, + _XX____X,X_XX____,XX______, + _XX____X,X_XX___X,XX______, + __XX___X,X_XX___X,X_______, + __XX___X,___X___X,X_______, + __XX__XX,___XX_XX,X_______, + ___XX_XX,___XX_XX,________, + ___XX_XX,___XX_XX,________, + ____X_X_,____X_X_,________, + ____XXX_,____XXX_,________, + ____XXX_,____XXX_,________, + _____X__,_____X__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0078[ 64] = { /* code 0078 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,__XX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXX___,XX______, + ___XX__X,X_______, + ____XXXX,X_______, + ____XXXX,________, + _____XX_,________, + ____XXXX,________, + ____XXXX,________, + ___XX__X,X_______, + __XXX__X,XX______, + __XX____,XX______, + _XX_____,_XX_____, + XXX_____,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_0079[ 64] = { /* code 0079 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,___XX___, + _XX_____,___XX___, + __XX____,__XX____, + __XX____,__XX____, + __XXX___,__XX____, + ___XX___,_XX_____, + ___XX___,_XX_____, + ____XX__,_XX_____, + ____XX__,XX______, + ____XX__,XX______, + _____XX_,XX______, + _____XXX,X_______, + _____XXX,X_______, + ______XX,X_______, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + __XXXX__,________, + __XXX___,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_007A[ 64] = { /* code 007A */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + ________,_XXX____, + ________,XXX_____, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + _____XXX,________, + ____XXX_,________, + ___XXX__,________, + __XXX___,________, + _XXX____,________, + XXX_____,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_007B[ 64] = { /* code 007B */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______XX,X_______, + _____XXX,X_______, + ____XXX_,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + _XXX____,________, + _XXX____,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + _____XXX,X_______, + ______XX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_007C[ 32] = { /* code 007C */ + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_007D[ 64] = { /* code 007D */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,________, + XXXX____,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ____XX__,________, + _____XXX,________, + _____XXX,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXX____,________, + XXX_____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFont32_ASCII_007E[ 64] = { /* code 007E */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,XX___XX_, + _XX____X,XXXXXXX_, + _X______,_XXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32_ASCII_CharInfo[95] = { + { 8, 8, 1, acFont32_ASCII_0020 } /* code 0020 */ + ,{ 8, 8, 1, acFont32_ASCII_0021 } /* code 0021 */ + ,{ 10, 10, 2, acFont32_ASCII_0022 } /* code 0022 */ + ,{ 15, 15, 2, acFont32_ASCII_0023 } /* code 0023 */ + ,{ 15, 15, 2, acFont32_ASCII_0024 } /* code 0024 */ + ,{ 24, 24, 3, acFont32_ASCII_0025 } /* code 0025 */ + ,{ 18, 18, 3, acFont32_ASCII_0026 } /* code 0026 */ + ,{ 5, 5, 1, acFont32_ASCII_0027 } /* code 0027 */ + ,{ 9, 9, 2, acFont32_ASCII_0028 } /* code 0028 */ + ,{ 9, 9, 2, acFont32_ASCII_0029 } /* code 0029 */ + ,{ 11, 11, 2, acFont32_ASCII_002A } /* code 002A */ + ,{ 16, 16, 2, acFont32_ASCII_002B } /* code 002B */ + ,{ 8, 8, 1, acFont32_ASCII_002C } /* code 002C */ + ,{ 9, 9, 2, acFont32_ASCII_002D } /* code 002D */ + ,{ 8, 8, 1, acFont32_ASCII_002E } /* code 002E */ + ,{ 8, 8, 1, acFont32_ASCII_002F } /* code 002F */ + ,{ 15, 15, 2, acFont32_ASCII_0030 } /* code 0030 */ + ,{ 15, 15, 2, acFont32_ASCII_0031 } /* code 0031 */ + ,{ 15, 15, 2, acFont32_ASCII_0032 } /* code 0032 */ + ,{ 15, 15, 2, acFont32_ASCII_0033 } /* code 0033 */ + ,{ 15, 15, 2, acFont32_ASCII_0034 } /* code 0034 */ + ,{ 15, 15, 2, acFont32_ASCII_0035 } /* code 0035 */ + ,{ 15, 15, 2, acFont32_ASCII_0036 } /* code 0036 */ + ,{ 15, 15, 2, acFont32_ASCII_0037 } /* code 0037 */ + ,{ 15, 15, 2, acFont32_ASCII_0038 } /* code 0038 */ + ,{ 15, 15, 2, acFont32_ASCII_0039 } /* code 0039 */ + ,{ 8, 8, 1, acFont32_ASCII_003A } /* code 003A */ + ,{ 8, 8, 1, acFont32_ASCII_003B } /* code 003B */ + ,{ 16, 16, 2, acFont32_ASCII_003C } /* code 003C */ + ,{ 16, 16, 2, acFont32_ASCII_003D } /* code 003D */ + ,{ 16, 16, 2, acFont32_ASCII_003E } /* code 003E */ + ,{ 15, 15, 2, acFont32_ASCII_003F } /* code 003F */ + ,{ 27, 27, 4, acFont32_ASCII_0040 } /* code 0040 */ + ,{ 18, 18, 3, acFont32_ASCII_0041 } /* code 0041 */ + ,{ 18, 18, 3, acFont32_ASCII_0042 } /* code 0042 */ + ,{ 20, 20, 3, acFont32_ASCII_0043 } /* code 0043 */ + ,{ 20, 20, 3, acFont32_ASCII_0044 } /* code 0044 */ + ,{ 18, 18, 3, acFont32_ASCII_0045 } /* code 0045 */ + ,{ 17, 17, 3, acFont32_ASCII_0046 } /* code 0046 */ + ,{ 21, 21, 3, acFont32_ASCII_0047 } /* code 0047 */ + ,{ 19, 19, 3, acFont32_ASCII_0048 } /* code 0048 */ + ,{ 8, 8, 1, acFont32_ASCII_0049 } /* code 0049 */ + ,{ 13, 13, 2, acFont32_ASCII_004A } /* code 004A */ + ,{ 18, 18, 3, acFont32_ASCII_004B } /* code 004B */ + ,{ 15, 15, 2, acFont32_ASCII_004C } /* code 004C */ + ,{ 23, 23, 3, acFont32_ASCII_004D } /* code 004D */ + ,{ 19, 19, 3, acFont32_ASCII_004E } /* code 004E */ + ,{ 21, 21, 3, acFont32_ASCII_004F } /* code 004F */ + ,{ 17, 17, 3, acFont32_ASCII_0050 } /* code 0050 */ + ,{ 21, 21, 3, acFont32_ASCII_0051 } /* code 0051 */ + ,{ 20, 20, 3, acFont32_ASCII_0052 } /* code 0052 */ + ,{ 18, 18, 3, acFont32_ASCII_0053 } /* code 0053 */ + ,{ 16, 16, 2, acFont32_ASCII_0054 } /* code 0054 */ + ,{ 19, 19, 3, acFont32_ASCII_0055 } /* code 0055 */ + ,{ 17, 17, 3, acFont32_ASCII_0056 } /* code 0056 */ + ,{ 28, 28, 4, acFont32_ASCII_0057 } /* code 0057 */ + ,{ 17, 17, 3, acFont32_ASCII_0058 } /* code 0058 */ + ,{ 18, 18, 3, acFont32_ASCII_0059 } /* code 0059 */ + ,{ 17, 17, 3, acFont32_ASCII_005A } /* code 005A */ + ,{ 8, 8, 1, acFont32_ASCII_005B } /* code 005B */ + ,{ 8, 8, 1, acFont32_ASCII_005C } /* code 005C */ + ,{ 8, 8, 1, acFont32_ASCII_005D } /* code 005D */ + ,{ 12, 12, 2, acFont32_ASCII_005E } /* code 005E */ + ,{ 15, 15, 2, acFont32_ASCII_005F } /* code 005F */ + ,{ 9, 9, 2, acFont32_ASCII_0060 } /* code 0060 */ + ,{ 15, 15, 2, acFont32_ASCII_0061 } /* code 0061 */ + ,{ 15, 15, 2, acFont32_ASCII_0062 } /* code 0062 */ + ,{ 14, 14, 2, acFont32_ASCII_0063 } /* code 0063 */ + ,{ 15, 15, 2, acFont32_ASCII_0064 } /* code 0064 */ + ,{ 15, 15, 2, acFont32_ASCII_0065 } /* code 0065 */ + ,{ 7, 7, 1, acFont32_ASCII_0066 } /* code 0066 */ + ,{ 15, 15, 2, acFont32_ASCII_0067 } /* code 0067 */ + ,{ 15, 15, 2, acFont32_ASCII_0068 } /* code 0068 */ + ,{ 6, 6, 1, acFont32_ASCII_0069 } /* code 0069 */ + ,{ 6, 6, 1, acFont32_ASCII_006A } /* code 006A */ + ,{ 14, 14, 2, acFont32_ASCII_006B } /* code 006B */ + ,{ 6, 6, 1, acFont32_ASCII_006C } /* code 006C */ + ,{ 22, 22, 3, acFont32_ASCII_006D } /* code 006D */ + ,{ 15, 15, 2, acFont32_ASCII_006E } /* code 006E */ + ,{ 15, 15, 2, acFont32_ASCII_006F } /* code 006F */ + ,{ 15, 15, 2, acFont32_ASCII_0070 } /* code 0070 */ + ,{ 15, 15, 2, acFont32_ASCII_0071 } /* code 0071 */ + ,{ 9, 9, 2, acFont32_ASCII_0072 } /* code 0072 */ + ,{ 14, 14, 2, acFont32_ASCII_0073 } /* code 0073 */ + ,{ 8, 8, 1, acFont32_ASCII_0074 } /* code 0074 */ + ,{ 15, 15, 2, acFont32_ASCII_0075 } /* code 0075 */ + ,{ 13, 13, 2, acFont32_ASCII_0076 } /* code 0076 */ + ,{ 19, 19, 3, acFont32_ASCII_0077 } /* code 0077 */ + ,{ 12, 12, 2, acFont32_ASCII_0078 } /* code 0078 */ + ,{ 14, 14, 2, acFont32_ASCII_0079 } /* code 0079 */ + ,{ 13, 13, 2, acFont32_ASCII_007A } /* code 007A */ + ,{ 9, 9, 2, acFont32_ASCII_007B } /* code 007B */ + ,{ 6, 6, 1, acFont32_ASCII_007C } /* code 007C */ + ,{ 9, 9, 2, acFont32_ASCII_007D } /* code 007D */ + ,{ 16, 16, 2, acFont32_ASCII_007E } /* code 007E */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font32_ASCII_Prop1 = { + 0x0020 /* first character */ + ,0x007E /* last character */ + ,&GUI_Font32_ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font32_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,32 /* height of font */ + ,32 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font32_ASCII_Prop1} + ,26, 15, 20 +}; + diff --git a/User/system/lib/lcd/gui/Font/F4x6.c b/User/system/lib/lcd/gui/Font/F4x6.c new file mode 100644 index 0000000..0c87e9c --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F4x6.c @@ -0,0 +1,815 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F4x6.C +Purpose : Implementation of 4x6 pixel font +Height : 6 +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont4x6[95][6] = { + + { + ________, + ________, + ________, + ________, + ________, + ________} + + ,{ + _X______, + _X______, + _X______, + ________, + _X______, + ________} + + ,{ + X_X_____, + X_X_____, + ________, + ________, + ________, + ________} + + ,{ + X_X_____, + XXX_____, + X_X_____, + XXX_____, + X_X_____, + ________} + + ,{ + _XX_____, + XX______, + _X______, + _XX_____, + XX______, + ________} + + ,{ + X_______, + __X_____, + _X______, + X_______, + __X_____, + ________} + + ,{ + _X______, + X_X_____, + _X______, + X_XX____, + _X_X____, + ________} + + ,{ + _X______, + _X______, + ________, + ________, + ________, + ________} + + ,{ + __X_____, + _X______, + _X______, + _X______, + __X_____, + ________} + + ,{ + _X______, + __X_____, + __X_____, + __X_____, + _X______, + ________} + + ,{ + X_X_____, + _X______, + XXX_____, + _X______, + X_X_____, + ________} + + ,{ + ________, + _X______, + XXX_____, + _X______, + ________, + ________} + + ,{ + ________, + ________, + ________, + _X______, + X_______, + ________} + + ,{ + ________, + ________, + XXX_____, + ________, + ________, + ________} + + ,{ + ________, + ________, + ________, + ________, + _X______, + ________} + + ,{ + ________, + __X_____, + _X______, + X_______, + ________, + ________} + + ,{ + _X______, + X_X_____, + X_X_____, + X_X_____, + _X______, + ________} + + ,{ + _X______, + XX______, + _X______, + _X______, + XXX_____, + ________} + + ,{ + _X______, + X_X_____, + __X_____, + _X______, + XXX_____, + ________} + + ,{ + XX______, + __X_____, + _X______, + __X_____, + XX______, + ________} + + ,{ + __X_____, + _XX_____, + X_X_____, + XXX_____, + __X_____, + ________} + + ,{ + XXX_____, + X_______, + XX______, + __X_____, + XX______, + ________} + + ,{ + _XX_____, + X_______, + XXX_____, + X_X_____, + XXX_____, + ________} + + ,{ + XXX_____, + __X_____, + _X______, + X_______, + X_______, + ________} + + ,{ + _X______, + X_X_____, + _X______, + X_X_____, + _X______, + ________} + + ,{ + XXX_____, + X_X_____, + XXX_____, + __X_____, + XX______, + ________} + + ,{ + ________, + ________, + _X______, + ________, + _X______, + ________} + + ,{ + ________, + ________, + _X______, + ________, + _X______, + X_______} + + ,{ + __X_____, + _X______, + X_______, + _X______, + __X_____, + ________} + + ,{ + ________, + XXX_____, + ________, + XXX_____, + ________, + ________} + + ,{ + X_______, + _X______, + __X_____, + _X______, + X_______, + ________} + + ,{ + XX______, + __X_____, + _X______, + ________, + _X______, + ________} + + ,{ + _X______, + X_X_____, + __X_____, + XXX_____, + XXX_____, + ________} + + ,{ + _X______, + X_X_____, + XXX_____, + X_X_____, + X_X_____, + ________} + + ,{ + XX______, + X_X_____, + XX______, + X_X_____, + XX______, + ________} + + ,{ + _X______, + X_X_____, + X_______, + X_X_____, + _X______, + ________} + + ,{ + XX______, + X_X_____, + X_X_____, + X_X_____, + XX______, + ________} + + ,{ + XXX_____, + X_______, + XX______, + X_______, + XXX_____, + ________} + + ,{ + XXX_____, + X_______, + XX______, + X_______, + X_______, + ________} + + ,{ + _XX_____, + X_______, + XXX_____, + X_X_____, + _XX_____, + ________} + + ,{ + X_X_____, + X_X_____, + XXX_____, + X_X_____, + X_X_____, + ________} + + ,{ + XXX_____, + _X______, + _X______, + _X______, + XXX_____, + ________} + + ,{ + XXX_____, + __X_____, + __X_____, + X_X_____, + _X______, + ________} + + ,{ + X_X_____, + XX______, + X_______, + XX______, + X_X_____, + ________} + + ,{ + X_______, + X_______, + X_______, + X_______, + XXX_____, + ________} + + ,{ + X_X_____, + XXX_____, + X_X_____, + X_X_____, + X_X_____, + ________} + + ,{ + X_X_____, + XXX_____, + XXX_____, + XXX_____, + X_X_____, + ________} + + ,{ + XXX_____, + X_X_____, + X_X_____, + X_X_____, + XXX_____, + ________} + + ,{ + XXX_____, + X_X_____, + XXX_____, + X_______, + X_______, + ________} + + ,{ + XXX_____, + X_X_____, + X_X_____, + X_X_____, + XXX_____, + __X_____} + + ,{ + XX______, + X_X_____, + XX______, + X_X_____, + X_X_____, + ________} + + ,{ + _XX_____, + X_______, + _X______, + __X_____, + XX______, + ________} + + ,{ + XXX_____, + _X______, + _X______, + _X______, + _X______, + ________} + + ,{ + X_X_____, + X_X_____, + X_X_____, + X_X_____, + XXX_____, + ________} + + ,{ + X_X_____, + X_X_____, + X_X_____, + X_X_____, + _X______, + ________} + + ,{ + X_X_____, + X_X_____, + X_X_____, + XXX_____, + X_X_____, + ________} + + ,{ + X_X_____, + X_X_____, + _X______, + X_X_____, + X_X_____, + ________} + + ,{ + X_X_____, + X_X_____, + X_X_____, + _X______, + _X______, + ________} + + ,{ + XXX_____, + __X_____, + _X______, + X_______, + XXX_____, + ________} + + ,{ + XXX_____, + X_______, + X_______, + X_______, + XXX_____, + ________} + + + ,{ + X_______, + X_______, + _X______, + __X_____, + __X_____, + ________} + + + ,{ + XXX_____, + __X_____, + __X_____, + __X_____, + XXX_____, + ________} + + + ,{ + _X______, + X_X_____, + ________, + ________, + ________, + ________} + + + ,{ + ________, + ________, + ________, + ________, + ________, + XXX_____} + + + ,{ + X_______, + _X______, + ________, + ________, + ________, + ________} + + + ,{ + ________, + ________, + _XX_____, + X_X_____, + _XX_____, + ________} + + ,{ + X_______, + X_______, + XX______, + X_X_____, + XX______, + ________} + + ,{ + ________, + ________, + _XX_____, + X_______, + _XX_____, + ________} + + ,{ + __X_____, + __X_____, + _XX_____, + X_X_____, + _XX_____, + ________} + + ,{ + _X______, + X_X_____, + XXX_____, + X_______, + _XX_____, + ________} + + ,{ + _XX_____, + X_______, + XX______, + X_______, + X_______, + ________} + + ,{ + ________, + _XX_____, + X_X_____, + _XX_____, + __X_____, + XX______} + + ,{ + X_______, + X_______, + XX______, + X_X_____, + X_X_____, + ________} + + ,{ + _X______, + ________, + XX______, + _X______, + XXX_____, + ________} + + ,{ + __X_____, + ________, + __X_____, + __X_____, + X_X_____, + _X______} + + ,{ + X_______, + X_______, + X_X_____, + XX______, + X_X_____, + ________} + + ,{ + XX______, + _X______, + _X______, + _X______, + XXX_____, + ________} + + ,{ + ________, + X_X_____, + XXX_____, + X_X_____, + X_X_____, + ________} + + ,{ + ________, + ________, + XXX_____, + X_X_____, + X_X_____, + ________} + + ,{ + ________, + ________, + XXX_____, + X_X_____, + XXX_____, + ________} + + ,{ + ________, + ________, + XX______, + X_X_____, + XX______, + X_______} + + ,{ + ________, + ________, + XXX_____, + X_X_____, + XXX_____, + __X_____} + + ,{ + ________, + ________, + X_X_____, + XX______, + X_______, + ________} + + ,{ + _XX_____, + X_______, + _X______, + __X_____, + XX______, + ________} + + ,{ + _X______, + XXX_____, + _X______, + _X______, + __X_____, + ________} + + ,{ + ________, + ________, + X_X_____, + X_X_____, + XXX_____, + ________} + + ,{ + ________, + ________, + X_X_____, + X_X_____, + _X______, + ________} + + ,{ + ________, + ________, + X_X_____, + XXX_____, + X_X_____, + ________} + + ,{ + ________, + ________, + X_X_____, + _X______, + X_X_____, + ________} + + ,{ + ________, + ________, + X_X_____, + XXX_____, + __X_____, + XX______} + + ,{ + ________, + XXX_____, + _X______, + X_______, + XXX_____, + ________} + + ,{ + X_______, + _X______, + _XX_____, + _X______, + X_______, + ________} + + ,{ + _X______, + _X______, + _X______, + _X______, + _X______, + ________} + + ,{ + __X_____, + _X______, + XX______, + _X______, + __X_____, + ________} + + ,{ + _X_X____, + X_X_____, + ________, + ________, + ________, + ________} + +}; + + + +GUI_CONST_STORAGE GUI_FONT_MONO FontMono4x6 = { + acFont4x6[0], + (const U8 *)0, + (const GUI_FONT_TRANSINFO *)0, /* ASCII only, no translation table */ + 32, 126, 4, 4, 1 +}; + + +GUI_CONST_STORAGE GUI_FONT GUI_Font4x6 = { + GUI_FONTTYPE_MONO, + 6, 6, 1, 1 + ,{&FontMono4x6} + , 5, 3, 5 +}; + GUI_FONT GUI_Font4x6_2 = { + GUI_FONTTYPE_MONO, + 6, 6*2, 2, 2 + ,{&FontMono4x6} + , 5, 3, 5 +}; diff --git a/User/system/lib/lcd/gui/Font/F6x8.c b/User/system/lib/lcd/gui/Font/F6x8.c new file mode 100644 index 0000000..5d05c5f --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F6x8.c @@ -0,0 +1,2212 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F6x8.C +Purpose : Contains standard font +Height : 8 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +#ifndef GUI_NOFCHARS +#define GUI_NOFCHARS (163) +#endif + +/* ********************************* + * * + * Special character codes * + * * + ********************************* + */ + +/* No 95 to 125 for European character set */ + +#define CODE_SACCAGUE 95 /* small accent ague */ +#define CODE_SACCGRAV 96 +#define CODE_SACCCIRC 97 +#define CODE_SUMLAUT 98 +#define CODE_STILDE 99 +#define CODE_I_NOPOINT 100 + +#define CODE_SHARPS 101 +#define CODE_A_RING 102 +#define CODE_SA_RING 103 +#define CODE_AE 104 +#define CODE_ETH 105 +#define CODE_THORN 106 +#define CODE_SMALLAE 107 +#define CODE_SMALLETH 108 +#define CODE_SMALLTHORN 109 +#define CODE_OSLASH 110 +#define CODE_SOSLASH 111 +#define CODE_LITTLE_A 112 +#define CODE_LITTLE_E 113 +#define CODE_LITTLE_I 114 +#define CODE_LITTLE_O 115 +#define CODE_LITTLE_U 116 +#define CODE_LITTLE_N 117 + +#define CODE_INVEXCLAM 118 +#define CODE_INVQUEST 119 + +#define CODE_CACCAGUE 120 /* capital accent ague */ +#define CODE_CACCGRAV 121 +#define CODE_CACCCIRC 122 +#define CODE_CUMLAUT 123 +#define CODE_CTILDE 124 +#define CODE_CEDILLA 125 + +/* No 126 to 156 for complete ISO 8859_1 western latin character set */ +#define CODE_NB_SPACE 126 +#define CODE_CENT 127 +#define CODE_POUND 128 +#define CODE_CURRENCY 129 +#define CODE_YEN 130 +#define CODE_BROKEN_BAR 131 +#define CODE_SECTION 132 +#define CODE_DIERESIS 133 +#define CODE_COPYRIGHT 134 +#define CODE_FEMININE 135 +#define CODE_LEFT_QUOTE 136 +#define CODE_NOT 137 +#define CODE_HYPHEN 138 +#define CODE_TRADEMARK 139 +#define CODE_MACRON 140 +#define CODE_DEGREE 141 +#define CODE_PLUS_MINUS 142 +#define CODE_SUPER_TWO 143 +#define CODE_SUPER_THREE 144 +#define CODE_ACUTE 145 +#define CODE_MICRO 146 +#define CODE_PARAGRAPH 147 +#define CODE_MIDDLE_DOT 148 +#define CODE_SUPER_ONE 149 +#define CODE_MASCULINE 150 +#define CODE_RIGHT_QUOTE 151 +#define CODE_ONE_FOURTH 152 +#define CODE_ONE_HALF 153 +#define CODE_THREE_FOURTH 154 +#define CODE_MULTIPLY 155 +#define CODE_DIVISION 156 +/* The following are extensions to ISO 8859-1 in the area which is not + defined by the standard. +*/ +#define CODE_ARROW_LEFT 157 +#define CODE_ARROW_RIGHT 158 +#define CODE_ARROW_UP 159 +#define CODE_ARROW_DOWN 160 +#define CODE_ENTER 161 +#define CODE_CHECKMARK 162 + +GUI_CONST_STORAGE unsigned char GUI_acFont6x8[GUI_NOFCHARS][8] = { + {________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + + /* ! */ + , + {__X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________, + __X_____, + ________} + + /* " */ + , + {_X__X___, + _X__X___, + _X__X___, + ________, + ________, + ________, + ________, + ________} + + /* # */ + , + {_X_X____, + _X_X____, + XXXXX___, + _X_X____, + XXXXX___, + _X_X____, + _X_X____, + ________} + + /* $ */ + , + {__X_____, + _XXXX___, + X_X_____, + _XXX____, + __X_X___, + XXXX____, + __X_____} + + /* % */ + , + {XX______, + XX__X___, + ___X____, + __X_____, + _X______, + X__XX___, + ___XX___, + ________} + + /* & */ + , + {_XX_____, + X__X____, + X_X_____, + _X______, + X_X_X___, + X__X____, + _XX_X___, + ________} + + /* ' */ + , + {_XX_____, + __X_____, + _X______, + ________, + ________, + ________, + ________, + ________} + + /* ( */ + , + {___X____, + __X_____, + _X______, + _X______, + _X______, + __X_____, + ___X____, + ________} + + /* ) */ + , + {_X______, + __X_____, + ___X____, + ___X____, + ___X____, + __X_____, + _X______, + ________} + + /* * */ + , + {________, + _X_X____, + __X_____, + XXXXX___, + __X_____, + _X_X____, + ________, + ________} + + , + {________, + __X_____, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________, + ________} + + , + {________, + ________, + ________, + ________, + ________, + _XX_____, + __X_____, + _X______} + + , + {________, + ________, + ________, + XXXXX___, + ________, + ________, + ________, + ________} + + , + {________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________} + + , + {________, + ____X___, + ___X____, + __X_____, + _X______, + X_______, + ________, + ________} + + /* 0 */ + , + {_XXX____, + X___X___, + X__XX___, + X_X_X___, + XX__X___, + X___X___, + _XXX____, + ________} + + /* 1 */ + , + {__X_____, + _XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________} + + /* 2 */ + , + {_XXX____, + X___X___, + ____X___, + __XX____, + _X______, + X_______, + XXXXX___, + ________} + + /* 3 */ + , + {_XXX____, + X___X___, + ____X___, + __XX____, + ____X___, + X___X___, + _XXX____, + ________} + + /* 4 */ + , + {___X____, + __XX____, + _X_X____, + X__X____, + XXXXX___, + ___X____, + ___X____, + ________} + + /* 5 */ + , + {XXXXX___, + X_______, + XXXX____, + ____X___, + ____X___, + X___X___, + _XXX____, + ________} + + /* 6 */ + , + {__XX____, + _X______, + X_______, + XXXX____, + X___X___, + X___X___, + _XXX____, + ________} + + /* 7 */ + , + {XXXXX___, + ____X___, + ___X____, + __X_____, + _X______, + _X______, + _X______, + ________} + + /* 8 */ + , + {_XXX____, + X___X___, + X___X___, + _XXX____, + X___X___, + X___X___, + _XXX____, + ________} + + /* 9 */ + , + {_XXX____, + X___X___, + X___X___, + _XXXX___, + ____X___, + ___X____, + _XX_____, + ________} + + /* ':' 3a */ + , + {________, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + ________, + ________} + + /* ';' 3b */ + , + {________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + __X_____, + _X______} + + /* '<' 3c */ + , + {___X____, + __X_____, + _X______, + X_______, + _X______, + __X_____, + ___X____, + ________} + + /* '=' 3d */ + , + {________, + ________, + XXXXX___, + ________, + XXXXX___, + ________, + ________, + ________} + + /* '>' */ + , + {X_______, + _X______, + __X_____, + ___X____, + __X_____, + _X______, + X_______, + ________} + + /* '?' */ + , + {_XXX____, + X___X___, + ____X___, + ___X____, + __X_____, + ________, + __X_____, + ________} + + /* @ */ + , + {_XXX____, + X___X___, + ____X___, + _XX_X___, + X_X_X___, + X_X_X___, + _XXX____, + ________} + + /* A */ + , + {_XXX____, + X___X___, + X___X___, + XXXXX___, + X___X___, + X___X___, + X___X___, + ________} + + /* B */ + , + {XXXX____, + X___X___, + X___X___, + XXXX____, + X___X___, + X___X___, + XXXX____, + ________} + + /* C */ + , + {_XXX____, + X___X___, + X_______, + X_______, + X_______, + X___X___, + _XXX____, + ________} + + /* D */ + , + {XXX_____, + X__X____, + X___X___, + X___X___, + X___X___, + X__X____, + XXX_____, + ________} + + /* E */ + , + {XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + XXXXX___, + ________} + + /* 1 */ + , + {XXXXX___, + X_______, + X_______, + XXXX____, + X_______, + X_______, + X_______, + ________} + + /* 1 */ + , + {_XXX____, + X___X___, + X_______, + X_______, + X__XX___, + X___X___, + _XXXX___, + ________} + + /* 1 */ + , + {X___X___, + X___X___, + X___X___, + XXXXX___, + X___X___, + X___X___, + X___X___, + ________} + + /* I */ + , + {_XXX____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________} + + /* J */ + , + {__XXX___, + ___X____, + ___X____, + ___X____, + ___X____, + X__X____, + _XX_____, + ________} + + /* K */ + , + {X___X___, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + X___X___, + ________} + + /* L */ + , + {X_______, + X_______, + X_______, + X_______, + X_______, + X_______, + XXXXX___, + ________} + + /* M */ + , + {X___X___, + XX_XX___, + X_X_X___, + X_X_X___, + X___X___, + X___X___, + X___X___, + ________} + + /* N */ + , + {X___X___, + X___X___, + XX__X___, + X_X_X___, + X__XX___, + X___X___, + X___X___, + ________} + + /* O */ + , + {_XXX____, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + + /* P */ + , + {XXXX____, + X___X___, + X___X___, + XXXX____, + X_______, + X_______, + X_______, + ________} + + /* Q */ + , + {_XXX____, + X___X___, + X___X___, + X___X___, + X_X_X___, + X__X____, + _XX_X___, + ________} + + /* R */ + , + {XXXX____, + X___X___, + X___X___, + XXXX____, + X_X_____, + X__X____, + X___X___, + ________} + + /* S */ + , + {_XXX____, + X___X___, + X_______, + _XXX____, + ____X___, + X___X___, + _XXX____, + ________} + + /* T */ + , + {XXXXX___, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________} + + /* U */ + , + {X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + + /* V */ + , + {X___X___, + X___X___, + X___X___, + X___X___, + X___X___, + _X_X____, + __X_____, + ________} + + /* W */ + , + {X___X___, + X___X___, + X___X___, + X_X_X___, + X_X_X___, + X_X_X___, + _X_X____, + ________} + + /* X */ + , + {X___X___, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + X___X___, + ________} + + /* Y */ + , + {X___X___, + X___X___, + X___X___, + _X_X____, + __X_____, + __X_____, + __X_____, + ________} + + /* Z */ + , + {XXXXX___, + ____X___, + ___X____, + __X_____, + _X______, + X_______, + XXXXX___, + ________} + + /* 5b */ + , + {_XXX____, + _X______, + _X______, + _X______, + _X______, + _X______, + _XXX____, + ________} + + /* 5c */ + , + {________, + X_______, + _X______, + __X_____, + ___X____, + ____X___, + ________, + ________} + + /* 5d */ + , + {_XXX____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + _XXX____, + ________} + + /* 5e */ + , + {__X_____, + _X_X____, + X___X___, + ________, + ________, + ________, + ________, + ________} + + /* 5f */ + , + {________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXX___} + + /* 60 */ + , + {_X______, + __X_____, + ___X____, + ________, + ________, + ________, + ________, + ________} + + /* a */ + , + {________, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________} + + /* b */ + , + {X_______, + X_______, + X_XX____, + XX__X___, + X___X___, + X___X___, + XXXX____, + ________} + + /* c */ + , + {________, + ________, + _XXX____, + X_______, + X_______, + X___X___, + _XXX____, + ________} + + /* d */ + , + {____X___, + ____X___, + _XX_X___, + X__XX___, + X___X___, + X___X___, + _XXXX___, + ________} + + /* e */ + , + {________, + ________, + _XXX____, + X___X___, + XXXXX___, + X_______, + _XXX____, + ________} + + /* f */ + , + {__XX____, + _X__X___, + _X______, + XXX_____, + _X______, + _X______, + _X______, + ________} + + /* g */ + , + {________, + ________, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ____X___, + _XXX____} + + /* h */ + , + {X_______, + X_______, + X_XX____, + XX__X___, + X___X___, + X___X___, + X___X___, + ________} + + /* i */ + , + {__X_____, + ________, + _XX_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________} + + /* j */ + , + {___X____, + ________, + __XX____, + ___X____, + ___X____, + ___X____, + X__X____, + _XX_____} + + /* k */ + , + {X_______, + X_______, + X__X____, + X_X_____, + XX______, + X_X_____, + X__X____, + ________} + + /* l */ + , + {_XX_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________} + + /* m */ + , + {________, + ________, + XX_X____, + X_X_X___, + X___X___, + X___X___, + X___X___, + ________} + + /* n */ + , + {________, + ________, + X_XX____, + XX__X___, + X___X___, + X___X___, + X___X___, + ________} + + /* o */ + , + {________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + + /* p */ + , + {________, + ________, + XXXX____, + X___X___, + X___X___, + XXXX____, + X_______, + X_______} + + /* q */ + , + {________, + ________, + _XXXX___, + X___X___, + X___X___, + _XXXX___, + ____X___, + ____X___} + + /* r */ + , + {________, + ________, + X_XX____, + XX__X___, + X_______, + X_______, + X_______, + ________} + + /* s */ + , + {________, + ________, + _XXXX___, + X_______, + _XXX____, + ____X___, + XXXX____, + ________} + + /* t */ + , + {_X______, + _X______, + XXX_____, + _X______, + _X______, + _X__X___, + __XX____, + ________} + + /* u */ + , + {________, + ________, + X___X___, + X___X___, + X___X___, + X__XX___, + _XX_X___, + ________} + + /* v */ + , + {________, + ________, + X___X___, + X___X___, + X___X___, + _X_X____, + __X_____, + ________} + + /* w */ + , + {________, + ________, + X___X___, + X___X___, + X_X_X___, + X_X_X___, + _X_X____, + ________} + + /* X */ + , + {________, + ________, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + ________} + + /* y */ + , + {________, + ________, + X___X___, + X___X___, + X___X___, + _XXXX___, + ____X___, + _XXX____} + + /* z */ + , + {________, + ________, + XXXXX___, + ___X____, + __X_____, + _X______, + XXXXX___, + ________} + + /* 0x7b */ + , + {___X____, + __X_____, + __X_____, + _X______, + __X_____, + __X_____, + ___X____, + ________} + + /* 0x7c */ + , + {__X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________} + + /* 0x7d */ + , + {_X______, + __X_____, + __X_____, + ___X____, + __X_____, + __X_____, + _X______, + ________} + + /* 0x7e */ + , + {_XX_X___, + X__X____, + ________, + ________, + ________, + ________, + ________, + ________} + +/* additional characters for European character set */ + +#if (GUI_NOFCHARS > 95) + /* small accent ague, 95*/ + , + {___XX___, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 96) + + /* small accent grave, 96 */ + , + {XX______, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 97) + + /* small accent circonflex, 97 */ + , + {_XXX____, + X___X___, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 98) + + /* small umlaut, 98 */ + , + {_X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 99) + + /* small tilde, 99 */ + , + {_XX_X___, + X__X____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 100) + + /* i without dot, 100 */ + , + {________, + ________, + ________, + _XX_____, + __X_____, + __X_____, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 101) + + /* sharps eg , 101 */ + , + {________, + _XX_____, + X__X____, + XXXX____, + X___X___, + X___X___, + X_XX____, + X_______} + +#endif +#if (GUI_NOFCHARS > 102) + + /* capital A with ring, 102 */ + , + {__X_____, + ________, + _XXX____, + X___X___, + XXXXX___, + X___X___, + X___X___, + ________} + +#endif +#if (GUI_NOFCHARS > 103) + + /* small a with ring, 103 */ + , + {__X_____, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + _XXXX___, + ________} + +#endif +#if (GUI_NOFCHARS > 104) + + /* capital A diphtong, ligature, 104 */ + , + {__XXX___, + _XX_____, + X_X_____, + X_XXX___, + XXX_____, + X_X_____, + X_XXX___, + ________} + +#endif +#if (GUI_NOFCHARS > 105) + + /* Icelandic eth, 105 */ + , + {_XXX____, + _X__X___, + _X__X___, + XXX_X___, + _X__X___, + _X__X___, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 106) + + /* Icelandic Thorn, 106 */ + , + {XXX_____, + _X______, + _XXX____, + _X__X___, + _X__X___, + _XXX____, + _X______, + XXX_____} + +#endif +#if (GUI_NOFCHARS > 107) + + /* small a diphtong, ligature, 107 */ + , + {________, + ________, + XX_X____, + __X_X___, + _XXXX___, + X_X_____, + _X_XX___, + ________} + +#endif +#if (GUI_NOFCHARS > 108) + + /* small Icelanic Eth, 108 */ + , + {X_X_____, + _X______, + X_X_____, + ___X____, + _XXXX___, + X___X___, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 109) + + /* small Icelandic Thorn, 109 */ + , + {_XX_____, + __X_____, + __XX____, + __X_X___, + __XX____, + __X_____, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 110) + + /* Capital O with slash, 110 */ + , + {_XXX____, + X___X___, + X__XX___, + X_X_X___, + XX__X___, + X___X___, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 111) + + /* small o with slash, 111 */ + , + {________, + ________, + _XXX____, + X__XX___, + X_X_X___, + XX__X___, + _XXX____, + ________} + +/* Capital letters */ + +#endif +#if (GUI_NOFCHARS > 112) + + /* Little capital A, 112 */ + , + {________, + ________, + _XXX____, + X___X___, + XXXXX___, + X___X___, + X___X___, + ________} + +#endif +#if (GUI_NOFCHARS > 113) + + /* Little capital E, 113 */ + , + {________, + ________, + XXXXX___, + X_______, + XXX_____, + X_______, + XXXXX___, + ________} + +#endif +#if (GUI_NOFCHARS > 114) + + /* Little capital I, 114 */ + , + {________, + ________, + _XXX____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 115) + + /* Little capital O, 115 */ + , + {________, + ________, + _XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 116) + + /* Little capital U, 116 */ + , + {________, + ________, + X___X___, + X___X___, + X___X___, + X___X___, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 117) + + /* Little capital N, 117 */ + , + {________, + ________, + X___X___, + XX__X___, + X_X_X___, + X__XX___, + X___X___, + ________} + +#endif +#if (GUI_NOFCHARS > 118) + + /* inverted exclamation, 118 */ + , + {__X_____, + ________, + __X_____, + __X_____, + __X_____, + __X_____, + __X_____, + ________} + +#endif +#if (GUI_NOFCHARS > 119) + + /* inverted question mark, 119 */ + , + {__X_____, + ________, + __X_____, + _X______, + X_______, + X___X___, + _XXX____, + ________} + +#endif +#if (GUI_NOFCHARS > 120) + + /* capital accent ague, 120 */ + , + {___XX___, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 121) + + /* capital accent grave, 121 */ + , + {XX______, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 122) + + /* capital accent circonflex, 122 */ + , + {__X_____, + _X_X____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 123) + + /* capital umlaut, 123 */ + , + {_X_X____, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 124) + + /* capital tilde, 124 */ + , + {_XX_X___, + X__X____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 125) + + /* cedilla, 125 */ + , + {________, + ________, + ________, + ________, + ________, + ________, + ________, + __X_____} + +#endif + +/* additional characters for complete ISO 8859-1 character set */ + +#if (GUI_NOFCHARS > 126) + /* Non breaking space, ISO-Code: 160, internal code: 126 */ + , + {________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 127) + /* cent sign, ISO-Code: 162, internal code: 127 */ + , + {________, + __X_____, + _XXX____, + X_X_____, + X_X_____, + X_X_X___, + _XXX____, + __X_____} + +#endif +#if (GUI_NOFCHARS > 128) + /* pound sterling, ISO-Code: 163, internal code: 128 */ + , + {__XX____, + _X______, + _X______, + XXX_____, + _X______, + _X__X___, + X_XX____, + ________} + +#endif +#if (GUI_NOFCHARS > 129) + /* general currency sign, ISO-Code: 164, internal code: 129 */ + , + {________, + ________, + X___X___, + _XXX____, + _X_X____, + _XXX____, + X___X___, + ________} + +#endif +#if (GUI_NOFCHARS > 130) + /* yen sign, ISO-Code: 165, internal code: 130 */ + , + {X___X___, + _X_X____, + XXXXX___, + __X_____, + XXXXX___, + __X_____, + __X_____, + ________} + +#endif +#if (GUI_NOFCHARS > 131) + /* broken vertical bar, ISO-Code: 166, internal code: 131 */ + , + {__X_____, + __X_____, + __X_____, + ________, + __X_____, + __X_____, + __X_____, + ________} + +#endif +#if (GUI_NOFCHARS > 132) + /* section sign, ISO-Code: 167, internal code: 132 */ + , + {__XX____, + _X__X___, + __X_____, + _X_X____, + __X_____, + X__X____, + _XX_____, + ________} + +#endif +#if (GUI_NOFCHARS > 133) + /* umlaut (dieresis), ISO-Code: 168, internal code: 133 */ + , + {X___X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 134) + /* copyright, ISO-Code: 169, internal code: 134 */ + , + {XXXXX___, + X___X___, + X_X_X___, + X_XXX___, + X_X_X___, + X___X___, + XXXXX___, + ________} + +#endif +#if (GUI_NOFCHARS > 135) + /* feminine ordinal, ISO-Code: 170, internal code: 135 */ + , + {_XXX____, + ____X___, + _XXXX___, + X___X___, + _XXX____, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 136) + /* left angle quote, ISO-Code: 171, internal code: 136 */ + , + {________, + __X_X___, + _X_X____, + X_X_____, + _X_X____, + __X_X___, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 137) + /* not sign, ISO-Code: 172, internal code: 137 */ + , + {________, + ________, + ________, + XXXXX___, + ____X___, + ____X___, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 138) + /* soft hyphen, ISO-Code: 173, internal code: 138 */ + , + {________, + ________, + ________, + _XXX____, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 139) + /* rgistered trademark, ISO-Code: 174, internal code: 139 */ + , + {XXXXX___, + X___X___, + X_X_X___, + X___X___, + X__XX___, + X_X_X___, + XXXXX___, + ________} + +#endif +#if (GUI_NOFCHARS > 140) + /* macron accent, ISO-Code: 175, internal code: 140 */ + , + {XXXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 141) + /* degree sign, ISO-Code: 176, internal code: 141 */ + , + {__X_____, + _X_X____, + __X_____, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 142) + /* plus or minus, ISO-Code: 177, internal code: 142 */ + , + {________, + __X_____, + _XXX____, + __X_____, + ________, + _XXX____, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 143) + /* superscript two, ISO-Code: 178, internal code: 143 */ + , + {_XX_____, + X__X____, + __X_____, + _X______, + XXXX____, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 144) + /* superscript three, ISO-Code: 179, internal code: 144 */ + , + {XXX_____, + ___X____, + _XX_____, + ___X____, + XXX_____, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 145) + /* acute accent, ISO-Code: 180, internal code: 145 */ + , + {___XX___, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 146) + /* micro sign, ISO-Code: 181, internal code: 146 */ + , + {________, + ________, + X___X___, + X___X___, + X___X___, + XX__X___, + X_XX____, + X_______} + +#endif +#if (GUI_NOFCHARS > 147) + /* paragraph sign, ISO-Code: 182, internal code: 147 */ + , + {_XXXX___, + X__XX___, + X__XX___, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ________} + +#endif +#if (GUI_NOFCHARS > 148) + /* middle dot, ISO-Code: 183, internal code: 148 */ + , + {________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 149) + /* superscript one, ISO-Code: 185, internal code: 149 */ + , + {_X______, + XX______, + _X______, + _X______, + XXX_____, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 150) + /* masculine ordinal, ISO-Code: 186, internal code: 150 */ + , + {_XXX____, + X___X___, + X___X___, + X___X___, + _XXX____, + ________, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 151) + /* right angle quote, ISO-Code: 187, internal code: 151 */ + , + {________, + X_X_____, + _X_X____, + __X_X___, + _X_X____, + X_X_____, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 152) + /* fraction one-fourth, ISO-Code: 188, internal code: 152 */ + , + {X___X___, + X__X____, + X_X_____, + _X_X____, + X_XX____, + _X_X____, + _XXXX___, + ___X____} + +#endif +#if (GUI_NOFCHARS > 153) + /* fraction one-half, ISO-Code: 189, internal code: 153 */ + , + {X___X___, + X__X____, + X_X_____, + _X______, + X_XXX___, + ____X___, + ___X____, + __XXX___} + +#endif +#if (GUI_NOFCHARS > 154) + /* fraction three-fourth, ISO-Code: 190, internal code: 154 */ + , + {XX______, + _X______, + XX______, + _X__X___, + XX_XX___, + __X_X___, + __XXX___, + ____X___} + +#endif +#if (GUI_NOFCHARS > 155) + /* multiply sign, ISO-Code: 215, internal code: 155 */ + , + {________, + X___X___, + _X_X____, + __X_____, + _X_X____, + X___X___, + ________, + ________} + +#endif +#if (GUI_NOFCHARS > 156) + /* division sign, ISO-Code: 247, internal code: 156 */ + , + {________, + __X_____, + ________, + XXXXX___, + ________, + __X_____, + ________, + ________} + +#endif + +#if (GUI_NOFCHARS > 157) + /* left arrow, ISO-Code: ---, internal code: 157 */ + , + {___X____, + __XX____, + _XXX____, + XXXXXX__, + _XXX____, + __XX____, + ___X____, + ________} +#endif + +#if (GUI_NOFCHARS > 158) + /* right arrow, ISO-Code: ---, internal code: 158 */ + , + {__X_____, + __XX____, + __XXX___, + XXXXXX__, + __XXX___, + __XX____, + __X_____, + ________} +#endif + +#if (GUI_NOFCHARS > 159) + /* up arrow, ISO-Code: ---, internal code: 159 */ + , + {________, + __X_____, + _XXX____, + XXXXX___, + __X_____, + __X_____, + ________, + ________} +#endif + +#if (GUI_NOFCHARS > 160) + /* down arrow, ISO-Code: ---, internal code: 160 */ + , + {________, + __X_____, + __X_____, + XXXXX___, + _XXX____, + __X_____, + ________, + ________} +#endif + +#if (GUI_NOFCHARS > 161) + /* ENTER character, ISO-Code: ---, internal code: 161 */ + , + {________, + ____X___, + __X_X___, + _XX_X___, + XXXXX___, + _XX_____, + __X_____, + ________} +#endif + +#if (GUI_NOFCHARS > 162) + /* ENTER character, ISO-Code: ---, internal code: 162 */ + , + {________, + _____X__, + _____X__, + ____X___, + ____X___, + X__X____, + _X_X____, + __X_____} +#endif + +}; + +GUI_CONST_STORAGE GUI_FONT_TRANSLIST GUI_F6x8_TL8859_1[112] = { + /* + The folowing are extensions to ISO 8859-1. + Since ISO 8859-1 does not define any characters for the codes + 128 - 159, this area can be used by an application. + The most commonly used symbols in embedded applications are + therefor inserted here. + */ + {CODE_ARROW_LEFT, -1}, /* 144, arrow left */ + {CODE_ARROW_RIGHT, -1}, /* 145, arrow right */ + {CODE_ARROW_UP, -1}, /* 146, arrow up */ + {CODE_ARROW_DOWN, -1}, /* 147, arrow down */ + {CODE_ENTER, -1}, /* 148, enter symbol */ + {CODE_CHECKMARK, -1}, /* 149, checkmark symbol */ + {-1, -1}, /* 150, unused symbol */ + {-1, -1}, /* 151, unused symbol */ + {-1, -1}, /* 152, unused symbol */ + {-1, -1}, /* 153, unused symbol */ + {-1, -1}, /* 154, unused symbol */ + {-1, -1}, /* 155, unused symbol */ + {-1, -1}, /* 156, unused symbol */ + {-1, -1}, /* 157, unused symbol */ + {-1, -1}, /* 158, unused symbol */ + {-1, -1}, /* 159, unused symbol */ + /* starting at character code 160 are the characters defined + by ISO 8859-1 + */ + {CODE_NB_SPACE, -1}, /* 160, non-breaking space */ + {CODE_INVEXCLAM, -1}, /* 161, inverted exclamation sign */ + {CODE_CENT, -1}, /* 162, cent sign */ + {CODE_POUND, -1}, /* 163, pound sterling */ + {CODE_CURRENCY, -1}, /* 164, general currency sign */ + {CODE_YEN, -1}, /* 165, yen sign */ + {CODE_BROKEN_BAR, -1}, /* 166, broken vertical bar */ + {CODE_SECTION, -1}, /* 167, section sign */ + {CODE_DIERESIS, -1}, /* 168, umlaut */ + {CODE_COPYRIGHT, -1}, /* 169, copyright */ + {CODE_FEMININE, -1}, /* 170, */ + {CODE_LEFT_QUOTE, -1}, /* 171, */ + {CODE_NOT, -1}, /* 172, */ + {CODE_HYPHEN, -1}, /* 173, */ + {CODE_TRADEMARK, -1}, /* 174, */ + {CODE_MACRON, -1}, /* 175, */ + {CODE_DEGREE, -1}, /* 176, */ + {CODE_PLUS_MINUS, -1}, /* 177, */ + {CODE_SUPER_TWO, -1}, /* 178, */ + {CODE_SUPER_THREE, -1}, /* 179, */ + {CODE_ACUTE, -1}, /* 180, */ + {CODE_MICRO, -1}, /* 181, */ + {CODE_PARAGRAPH, -1}, /* 182, */ + {CODE_MIDDLE_DOT, -1}, /* 183, */ + {CODE_CEDILLA, -1}, /* 184, */ + {CODE_SUPER_ONE, -1}, /* 185, */ + {CODE_MASCULINE, -1}, /* 186, */ + {CODE_RIGHT_QUOTE, -1}, /* 187, */ + {CODE_ONE_FOURTH, -1}, /* 188, */ + {CODE_ONE_HALF, -1}, /* 189, */ + {CODE_THREE_FOURTH, -1}, /* 190, */ + {CODE_INVQUEST, -1}, /* 191, */ + {CODE_LITTLE_A, CODE_CACCGRAV}, /* 192, */ + {CODE_LITTLE_A, CODE_CACCAGUE}, /* 193, */ + {CODE_LITTLE_A, CODE_CACCCIRC}, /* 194, */ + {CODE_LITTLE_A, CODE_CTILDE}, /* 195, */ + {CODE_LITTLE_A, CODE_CUMLAUT}, /* 196, */ + {CODE_A_RING, -1}, /* 197, */ + {CODE_AE, -1}, /* 198, */ + {'C' - 32, CODE_CEDILLA}, /* 199, */ + {CODE_LITTLE_E, CODE_CACCGRAV}, /* 200, */ + {CODE_LITTLE_E, CODE_CACCAGUE}, /* 201, */ + {CODE_LITTLE_E, CODE_CACCCIRC}, /* 202, */ + {CODE_LITTLE_E, CODE_CUMLAUT}, /* 203, */ + {CODE_LITTLE_I, CODE_CACCGRAV}, /* 204, */ + {CODE_LITTLE_I, CODE_CACCAGUE}, /* 205, */ + {CODE_LITTLE_I, CODE_CACCCIRC}, /* 206, */ + {CODE_LITTLE_I, CODE_CUMLAUT}, /* 207, */ + {CODE_ETH, -1}, /* 208, */ + {CODE_LITTLE_N, CODE_CTILDE}, /* 209, */ + {CODE_LITTLE_O, CODE_CACCGRAV}, /* 210, */ + {CODE_LITTLE_O, CODE_CACCAGUE}, /* 211, */ + {CODE_LITTLE_O, CODE_CACCCIRC}, /* 212, */ + {CODE_LITTLE_O, CODE_CTILDE}, /* 213, */ + {CODE_LITTLE_O, CODE_CUMLAUT}, /* 214, */ + {CODE_MULTIPLY, -1}, /* 215, */ + {CODE_OSLASH, -1}, /* 216, */ + {CODE_LITTLE_U, CODE_CACCGRAV}, /* 217, */ + {CODE_LITTLE_U, CODE_CACCAGUE}, /* 218, */ + {CODE_LITTLE_U, CODE_CACCCIRC}, /* 219, */ + {CODE_LITTLE_U, CODE_CUMLAUT}, /* 220, */ + {'Y' - 32, CODE_CACCAGUE}, /* 221, */ + {CODE_THORN, -1}, /* 222, */ + {CODE_SHARPS, -1}, /* 223, */ + {'a' - 32, CODE_SACCGRAV}, /* 224, */ + {'a' - 32, CODE_SACCAGUE}, /* 225, */ + {'a' - 32, CODE_SACCCIRC}, /* 226, */ + {'a' - 32, CODE_STILDE}, /* 227, */ + {'a' - 32, CODE_SUMLAUT}, /* 228, */ + {CODE_SA_RING, -1}, /* 229, */ + {CODE_SMALLAE, -1}, /* 230, */ + {'c' - 32, CODE_CEDILLA}, /* 231, */ + {'e' - 32, CODE_SACCGRAV}, /* 232, */ + {'e' - 32, CODE_SACCAGUE}, /* 233, */ + {'e' - 32, CODE_SACCCIRC}, /* 234, */ + {'e' - 32, CODE_SUMLAUT}, /* 235, */ + {CODE_I_NOPOINT, CODE_SACCGRAV}, /* 236, */ + {CODE_I_NOPOINT, CODE_SACCAGUE}, /* 237, */ + {CODE_I_NOPOINT, CODE_SACCCIRC}, /* 238, */ + {CODE_I_NOPOINT, CODE_SUMLAUT}, /* 239, */ + {CODE_SMALLETH, -1}, /* 240, small eth, Icelandic */ + {'n' - 32, CODE_STILDE}, /* 241, small n, tilde */ + {'o' - 32, CODE_SACCGRAV}, /* 242, small o, grave accent */ + {'o' - 32, CODE_SACCAGUE}, /* 243, small o, acute accent */ + {'o' - 32, CODE_SACCCIRC}, /* 244, small o, circumflex */ + {'o' - 32, CODE_STILDE}, /* 245, small o, tilde */ + {'o' - 32, CODE_SUMLAUT}, /* 246, small o, umlaut */ + {CODE_DIVISION, -1}, /* 247, division sign */ + {CODE_SOSLASH, -1}, /* 248, small o slash */ + {'u' - 32, CODE_SACCAGUE}, /* 249, */ + {'u' - 32, CODE_SACCGRAV}, /* 250, */ + {'u' - 32, CODE_SACCCIRC}, /* 251, */ + {'u' - 32, CODE_SUMLAUT}, /* 252, small u, umlaut */ + {'y' - 32, CODE_SACCAGUE}, /* 253, small y, acute accent */ + {CODE_SMALLTHORN, -1}, /* 254, small thorn, Icelandic */ + {'y' - 32, CODE_SUMLAUT}, /* 255, */ +}; + +GUI_CONST_STORAGE GUI_FONT_TRANSINFO GUI_F6x8_TI8859_1 = { + 144, /* First character for translation */ + 255, /* Last character for translation */ + &GUI_F6x8_TL8859_1[0]}; + +GUI_CONST_STORAGE GUI_FONT_MONO GUI_F6x8_Mono = { + GUI_acFont6x8[0], + GUI_acFont6x8[0], + &GUI_F6x8_TI8859_1, + 32, 126, 6, 6, 1}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font6x8 = {GUI_FONTTYPE_MONO, 8, 8, 1, 1, {&GUI_F6x8_Mono}, 7, 5, 7}; +GUI_CONST_STORAGE GUI_FONT GUI_Font6x9 = {GUI_FONTTYPE_MONO, 8, 9, 1, 1, {&GUI_F6x8_Mono}, 7, 5, 7}; diff --git a/User/system/lib/lcd/gui/Font/F8x10_ASCII.c b/User/system/lib/lcd/gui/Font/F8x10_ASCII.c new file mode 100644 index 0000000..85e21df --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x10_ASCII.c @@ -0,0 +1,1290 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x10_ASCII.C +Purpose : Monospaced Font similar to Terminal +Height : 10 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0020[10] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0021[10] = { /* code 0021 */ + __XX____, + _XXXX___, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0022[10] = { /* code 0022 */ + _XX__XX_, + _XX__XX_, + _XX__XX_, + __X__X__, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0023[10] = { /* code 0023 */ + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0024[10] = { /* code 0024 */ + __XX____, + _XXXXX__, + XX______, + XX______, + _XXXX___, + ____XX__, + ____XX__, + XXXXX___, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0025[10] = { /* code 0025 */ + ________, + ________, + XX___X__, + XX__XX__, + ___XX___, + __XX____, + _XX_____, + XX__XX__, + X___XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0026[10] = { /* code 0026 */ + _XXX____, + XX_XX___, + XX_XX___, + _XXX____, + XXXXX_X_, + XX_XXXX_, + XX__XX__, + XX_XXX__, + _XXX_XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0027[10] = { /* code 0027 */ + __XX____, + __XX____, + __XX____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0028[10] = { /* code 0028 */ + ____XX__, + ___XX___, + __XX____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + ___XX___, + ____XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0029[10] = { /* code 0029 */ + _XX_____, + __XX____, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_002A[10] = { /* code 002A */ + ________, + ________, + _XX__XX_, + __XXXX__, + XXXXXXXX, + __XXXX__, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_002B[10] = { /* code 002B */ + ________, + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_002C[10] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_002D[10] = { /* code 002D */ + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_002E[10] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_002F[10] = { /* code 002F */ + ________, + ______X_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + X_______, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0030[10] = { /* code 0030 */ + _XXXXX__, + XX___XX_, + XX__XXX_, + XX_XXXX_, + XX_X_XX_, + XXXX_XX_, + XXX__XX_, + XX___XX_, + _XXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0031[10] = { /* code 0031 */ + ___X____, + __XX____, + XXXX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + XXXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0032[10] = { /* code 0032 */ + _XXXX___, + XX__XX__, + XX__XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX__XX__, + XXXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0033[10] = { /* code 0033 */ + _XXXX___, + XX__XX__, + ____XX__, + ____XX__, + __XXX___, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0034[10] = { /* code 0034 */ + ____XX__, + ___XXX__, + __XXXX__, + _XX_XX__, + XX__XX__, + XXXXXXX_, + ____XX__, + ____XX__, + ___XXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0035[10] = { /* code 0035 */ + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0036[10] = { /* code 0036 */ + __XXX___, + _XX_____, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0037[10] = { /* code 0037 */ + XXXXXXX_, + XX___XX_, + XX___XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0038[10] = { /* code 0038 */ + _XXXX___, + XX__XX__, + XX__XX__, + XXX_XX__, + _XXXX___, + XX_XXX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0039[10] = { /* code 0039 */ + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ___XX___, + ___XX___, + __XX____, + _XXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_003A[10] = { /* code 003A */ + ________, + ________, + __XXX___, + __XXX___, + ________, + ________, + __XXX___, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_003B[10] = { /* code 003B */ + ________, + ________, + __XXX___, + __XXX___, + ________, + ________, + __XXX___, + __XXX___, + ___XX___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_003C[10] = { /* code 003C */ + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + _XX_____, + __XX____, + ___XX___, + ____XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_003D[10] = { /* code 003D */ + ________, + ________, + ________, + _XXXXXX_, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_003E[10] = { /* code 003E */ + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_003F[10] = { /* code 003F */ + _XXXX___, + XX__XX__, + ____XX__, + ___XX___, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0040[10] = { /* code 0040 */ + _XXXXX__, + XX___XX_, + XX___XX_, + XX_XXXX_, + XX_XXXX_, + XX_XXXX_, + XX______, + XX______, + _XXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0041[10] = { /* code 0041 */ + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0042[10] = { /* code 0042 */ + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0043[10] = { /* code 0043 */ + __XXXX__, + _XX__XX_, + XX___XX_, + XX______, + XX______, + XX______, + XX___XX_, + _XX__XX_, + __XXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0044[10] = { /* code 0044 */ + XXXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + XXXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0045[10] = { /* code 0045 */ + XXXXXXX_, + _XX___X_, + _XX_____, + _XX__X__, + _XXXXX__, + _XX__X__, + _XX_____, + _XX___X_, + XXXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0046[10] = { /* code 0046 */ + XXXXXXX_, + _XX__XX_, + _XX___X_, + _XX__X__, + _XXXXX__, + _XX__X__, + _XX_____, + _XX_____, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0047[10] = { /* code 0047 */ + __XXXX__, + _XX__XX_, + XX___XX_, + XX______, + XX______, + XX__XXX_, + XX___XX_, + _XX__XX_, + __XXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0048[10] = { /* code 0048 */ + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0049[10] = { /* code 0049 */ + _XXXX___, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_004A[10] = { /* code 004A */ + ___XXXX_, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_004B[10] = { /* code 004B */ + XXX__XX_, + _XX__XX_, + _XX_XX__, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_004C[10] = { /* code 004C */ + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX___X_, + _XX__XX_, + _XX__XX_, + XXXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_004D[10] = { /* code 004D */ + XX___XX_, + XXX_XXX_, + XXXXXXX_, + XXXXXXX_, + XX_X_XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_004E[10] = { /* code 004E */ + XX___XX_, + XX___XX_, + XXX__XX_, + XXXX_XX_, + XXXXXXX_, + XX_XXXX_, + XX__XXX_, + XX___XX_, + XX___XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_004F[10] = { /* code 004F */ + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0050[10] = { /* code 0050 */ + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0051[10] = { /* code 0051 */ + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + XX_XXXX_, + _XXXXX__, + ____XX__, + ___XXXX_}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0052[10] = { /* code 0052 */ + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_XX__, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0053[10] = { /* code 0053 */ + _XXXX___, + XX__XX__, + XX__XX__, + XX______, + _XXX____, + ___XX___, + XX__XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0054[10] = { /* code 0054 */ + XXXXXX__, + X_XX_X__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0055[10] = { /* code 0055 */ + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0056[10] = { /* code 0056 */ + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0057[10] = { /* code 0057 */ + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0058[10] = { /* code 0058 */ + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0059[10] = { /* code 0059 */ + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_005A[10] = { /* code 005A */ + XXXXXXX_, + XX__XXX_, + X__XX___, + ___XX___, + __XX____, + _XX_____, + _XX___X_, + XX___XX_, + XXXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_005B[10] = { /* code 005B */ + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_005C[10] = { /* code 005C */ + ________, + X_______, + XX______, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ______X_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_005D[10] = { /* code 005D */ + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + __XXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_005E[10] = { /* code 005E */ + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_005F[10] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0060[10] = { /* code 0060 */ + __XX____, + __XX____, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0061[10] = { /* code 0061 */ + ________, + ________, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0062[10] = { /* code 0062 */ + XXX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XX_XXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0063[10] = { /* code 0063 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX______, + XX______, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0064[10] = { /* code 0064 */ + ___XXX__, + ____XX__, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0065[10] = { /* code 0065 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0066[10] = { /* code 0066 */ + __XXX___, + _XX_XX__, + _XX_____, + _XX_____, + XXXXX___, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0067[10] = { /* code 0067 */ + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + XX__XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0068[10] = { /* code 0068 */ + XXX_____, + _XX_____, + _XX_____, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0069[10] = { /* code 0069 */ + ___XX___, + ___XX___, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_006A[10] = { /* code 006A */ + ____XX__, + ________, + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_006B[10] = { /* code 006B */ + XXX_____, + _XX_____, + _XX_____, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_006C[10] = { /* code 006C */ + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_006D[10] = { /* code 006D */ + ________, + ________, + ________, + XXXXXX__, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XX___XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_006E[10] = { /* code 006E */ + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_006F[10] = { /* code 006F */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0070[10] = { /* code 0070 */ + ________, + ________, + XX_XXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0071[10] = { /* code 0071 */ + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ___XXXX_}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0072[10] = { /* code 0072 */ + ________, + ________, + ________, + XXX_XX__, + _XX_XXX_, + _XXX_XX_, + _XX_____, + _XX_____, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0073[10] = { /* code 0073 */ + ________, + ________, + ________, + _XXXX___, + XX__XX__, + _XX_____, + ___XX___, + XX__XX__, + _XXXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0074[10] = { /* code 0074 */ + ________, + __X_____, + _XX_____, + XXXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XX_XX__, + __XXX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0075[10] = { /* code 0075 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0076[10] = { /* code 0076 */ + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0077[10] = { /* code 0077 */ + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + _XX_XX__, + _XX_XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0078[10] = { /* code 0078 */ + ________, + ________, + ________, + XX___XX_, + _XX_XX__, + __XXX___, + __XXX___, + _XX_XX__, + XX___XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_0079[10] = { /* code 0079 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ____XX__, + ___XX___, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_007A[10] = { /* code 007A */ + ________, + ________, + ________, + XXXXXX__, + X___XX__, + ___XX___, + _XX_____, + XX___X__, + XXXXXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_007B[10] = { /* code 007B */ + ___XXX__, + __XX____, + __XX____, + _XX_____, + XX______, + _XX_____, + __XX____, + __XX____, + ___XXX__, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_007C[10] = { /* code 007C */ + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_007D[10] = { /* code 007D */ + XXX_____, + __XX____, + __XX____, + ___XX___, + ____XX__, + ___XX___, + __XX____, + __XX____, + XXX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_007E[10] = { /* code 007E */ + _XXX__XX, + XX_XX_X_, + XX__XXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x10ASCII_007F[10] = { /* code 007F */ + ________, + ________, + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font8x10ASCII_CharInfo[96] = { + { 8, 8, 1, acFont8x10ASCII_0020 } /* code 0020 */ + ,{ 8, 8, 1, acFont8x10ASCII_0021 } /* code 0021 */ + ,{ 8, 8, 1, acFont8x10ASCII_0022 } /* code 0022 */ + ,{ 8, 8, 1, acFont8x10ASCII_0023 } /* code 0023 */ + ,{ 8, 8, 1, acFont8x10ASCII_0024 } /* code 0024 */ + ,{ 8, 8, 1, acFont8x10ASCII_0025 } /* code 0025 */ + ,{ 8, 8, 1, acFont8x10ASCII_0026 } /* code 0026 */ + ,{ 8, 8, 1, acFont8x10ASCII_0027 } /* code 0027 */ + ,{ 8, 8, 1, acFont8x10ASCII_0028 } /* code 0028 */ + ,{ 8, 8, 1, acFont8x10ASCII_0029 } /* code 0029 */ + ,{ 8, 8, 1, acFont8x10ASCII_002A } /* code 002A */ + ,{ 8, 8, 1, acFont8x10ASCII_002B } /* code 002B */ + ,{ 8, 8, 1, acFont8x10ASCII_002C } /* code 002C */ + ,{ 8, 8, 1, acFont8x10ASCII_002D } /* code 002D */ + ,{ 8, 8, 1, acFont8x10ASCII_002E } /* code 002E */ + ,{ 8, 8, 1, acFont8x10ASCII_002F } /* code 002F */ + ,{ 8, 8, 1, acFont8x10ASCII_0030 } /* code 0030 */ + ,{ 8, 8, 1, acFont8x10ASCII_0031 } /* code 0031 */ + ,{ 8, 8, 1, acFont8x10ASCII_0032 } /* code 0032 */ + ,{ 8, 8, 1, acFont8x10ASCII_0033 } /* code 0033 */ + ,{ 8, 8, 1, acFont8x10ASCII_0034 } /* code 0034 */ + ,{ 8, 8, 1, acFont8x10ASCII_0035 } /* code 0035 */ + ,{ 8, 8, 1, acFont8x10ASCII_0036 } /* code 0036 */ + ,{ 8, 8, 1, acFont8x10ASCII_0037 } /* code 0037 */ + ,{ 8, 8, 1, acFont8x10ASCII_0038 } /* code 0038 */ + ,{ 8, 8, 1, acFont8x10ASCII_0039 } /* code 0039 */ + ,{ 8, 8, 1, acFont8x10ASCII_003A } /* code 003A */ + ,{ 8, 8, 1, acFont8x10ASCII_003B } /* code 003B */ + ,{ 8, 8, 1, acFont8x10ASCII_003C } /* code 003C */ + ,{ 8, 8, 1, acFont8x10ASCII_003D } /* code 003D */ + ,{ 8, 8, 1, acFont8x10ASCII_003E } /* code 003E */ + ,{ 8, 8, 1, acFont8x10ASCII_003F } /* code 003F */ + ,{ 8, 8, 1, acFont8x10ASCII_0040 } /* code 0040 */ + ,{ 8, 8, 1, acFont8x10ASCII_0041 } /* code 0041 */ + ,{ 8, 8, 1, acFont8x10ASCII_0042 } /* code 0042 */ + ,{ 8, 8, 1, acFont8x10ASCII_0043 } /* code 0043 */ + ,{ 8, 8, 1, acFont8x10ASCII_0044 } /* code 0044 */ + ,{ 8, 8, 1, acFont8x10ASCII_0045 } /* code 0045 */ + ,{ 8, 8, 1, acFont8x10ASCII_0046 } /* code 0046 */ + ,{ 8, 8, 1, acFont8x10ASCII_0047 } /* code 0047 */ + ,{ 8, 8, 1, acFont8x10ASCII_0048 } /* code 0048 */ + ,{ 8, 8, 1, acFont8x10ASCII_0049 } /* code 0049 */ + ,{ 8, 8, 1, acFont8x10ASCII_004A } /* code 004A */ + ,{ 8, 8, 1, acFont8x10ASCII_004B } /* code 004B */ + ,{ 8, 8, 1, acFont8x10ASCII_004C } /* code 004C */ + ,{ 8, 8, 1, acFont8x10ASCII_004D } /* code 004D */ + ,{ 8, 8, 1, acFont8x10ASCII_004E } /* code 004E */ + ,{ 8, 8, 1, acFont8x10ASCII_004F } /* code 004F */ + ,{ 8, 8, 1, acFont8x10ASCII_0050 } /* code 0050 */ + ,{ 8, 8, 1, acFont8x10ASCII_0051 } /* code 0051 */ + ,{ 8, 8, 1, acFont8x10ASCII_0052 } /* code 0052 */ + ,{ 8, 8, 1, acFont8x10ASCII_0053 } /* code 0053 */ + ,{ 8, 8, 1, acFont8x10ASCII_0054 } /* code 0054 */ + ,{ 8, 8, 1, acFont8x10ASCII_0055 } /* code 0055 */ + ,{ 8, 8, 1, acFont8x10ASCII_0056 } /* code 0056 */ + ,{ 8, 8, 1, acFont8x10ASCII_0057 } /* code 0057 */ + ,{ 8, 8, 1, acFont8x10ASCII_0058 } /* code 0058 */ + ,{ 8, 8, 1, acFont8x10ASCII_0059 } /* code 0059 */ + ,{ 8, 8, 1, acFont8x10ASCII_005A } /* code 005A */ + ,{ 8, 8, 1, acFont8x10ASCII_005B } /* code 005B */ + ,{ 8, 8, 1, acFont8x10ASCII_005C } /* code 005C */ + ,{ 8, 8, 1, acFont8x10ASCII_005D } /* code 005D */ + ,{ 8, 8, 1, acFont8x10ASCII_005E } /* code 005E */ + ,{ 8, 8, 1, acFont8x10ASCII_005F } /* code 005F */ + ,{ 8, 8, 1, acFont8x10ASCII_0060 } /* code 0060 */ + ,{ 8, 8, 1, acFont8x10ASCII_0061 } /* code 0061 */ + ,{ 8, 8, 1, acFont8x10ASCII_0062 } /* code 0062 */ + ,{ 8, 8, 1, acFont8x10ASCII_0063 } /* code 0063 */ + ,{ 8, 8, 1, acFont8x10ASCII_0064 } /* code 0064 */ + ,{ 8, 8, 1, acFont8x10ASCII_0065 } /* code 0065 */ + ,{ 8, 8, 1, acFont8x10ASCII_0066 } /* code 0066 */ + ,{ 8, 8, 1, acFont8x10ASCII_0067 } /* code 0067 */ + ,{ 8, 8, 1, acFont8x10ASCII_0068 } /* code 0068 */ + ,{ 8, 8, 1, acFont8x10ASCII_0069 } /* code 0069 */ + ,{ 8, 8, 1, acFont8x10ASCII_006A } /* code 006A */ + ,{ 8, 8, 1, acFont8x10ASCII_006B } /* code 006B */ + ,{ 8, 8, 1, acFont8x10ASCII_006C } /* code 006C */ + ,{ 8, 8, 1, acFont8x10ASCII_006D } /* code 006D */ + ,{ 8, 8, 1, acFont8x10ASCII_006E } /* code 006E */ + ,{ 8, 8, 1, acFont8x10ASCII_006F } /* code 006F */ + ,{ 8, 8, 1, acFont8x10ASCII_0070 } /* code 0070 */ + ,{ 8, 8, 1, acFont8x10ASCII_0071 } /* code 0071 */ + ,{ 8, 8, 1, acFont8x10ASCII_0072 } /* code 0072 */ + ,{ 8, 8, 1, acFont8x10ASCII_0073 } /* code 0073 */ + ,{ 8, 8, 1, acFont8x10ASCII_0074 } /* code 0074 */ + ,{ 8, 8, 1, acFont8x10ASCII_0075 } /* code 0075 */ + ,{ 8, 8, 1, acFont8x10ASCII_0076 } /* code 0076 */ + ,{ 8, 8, 1, acFont8x10ASCII_0077 } /* code 0077 */ + ,{ 8, 8, 1, acFont8x10ASCII_0078 } /* code 0078 */ + ,{ 8, 8, 1, acFont8x10ASCII_0079 } /* code 0079 */ + ,{ 8, 8, 1, acFont8x10ASCII_007A } /* code 007A */ + ,{ 8, 8, 1, acFont8x10ASCII_007B } /* code 007B */ + ,{ 8, 8, 1, acFont8x10ASCII_007C } /* code 007C */ + ,{ 8, 8, 1, acFont8x10ASCII_007D } /* code 007D */ + ,{ 8, 8, 1, acFont8x10ASCII_007E } /* code 007E */ + ,{ 8, 8, 1, acFont8x10ASCII_007F } /* code 007F */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font8x10ASCII_Prop1 = { + 32 /* first character */ + ,127 /* last character */ + ,&GUI_Font8x10ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x10_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,10 /* height of font */ + ,10 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font8x10ASCII_Prop1} + ,9, 6, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F8x12_ASCII.c b/User/system/lib/lcd/gui/Font/F8x12_ASCII.c new file mode 100644 index 0000000..15b265f --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x12_ASCII.c @@ -0,0 +1,1482 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x12_ASCII.C +Purpose : Monospaced Font similar to Terminal +Height : 12 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0020[12] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0021[12] = { /* code 0021 */ + ________, + __XX____, + _XXXX___, + _XXXX___, + _XXXX___, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0022[12] = { /* code 0022 */ + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __X__X__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0023[12] = { /* code 0023 */ + ________, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0024[12] = { /* code 0024 */ + __XX____, + __XX____, + _XXXXX__, + XX______, + XX______, + _XXXX___, + ____XX__, + ____XX__, + XXXXX___, + __XX____, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0025[12] = { /* code 0025 */ + ________, + ________, + ________, + XX___X__, + XX__XX__, + ___XX___, + __XX____, + _XX_____, + XX__XX__, + X___XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0026[12] = { /* code 0026 */ + ________, + _XXX____, + XX_XX___, + XX_XX___, + _XXX____, + XXXXX_X_, + XX_XXXX_, + XX__XX__, + XX_XXX__, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0027[12] = { /* code 0027 */ + ________, + __XX____, + __XX____, + __XX____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0028[12] = { /* code 0028 */ + ________, + ____XX__, + ___XX___, + __XX____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + ___XX___, + ____XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0029[12] = { /* code 0029 */ + ________, + _XX_____, + __XX____, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_002A[12] = { /* code 002A */ + ________, + ________, + ________, + _XX__XX_, + __XXXX__, + XXXXXXXX, + __XXXX__, + _XX__XX_, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_002B[12] = { /* code 002B */ + ________, + ________, + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_002C[12] = { /* code 002C */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + _XX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_002D[12] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_002E[12] = { /* code 002E */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_002F[12] = { /* code 002F */ + ________, + ________, + ______X_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0030[12] = { /* code 0030 */ + ________, + _XXXXX__, + XX___XX_, + XX__XXX_, + XX_XXXX_, + XX_X_XX_, + XXXX_XX_, + XXX__XX_, + XX___XX_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0031[12] = { /* code 0031 */ + ________, + ___X____, + __XX____, + XXXX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0032[12] = { /* code 0032 */ + ________, + _XXXX___, + XX__XX__, + XX__XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX__XX__, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0033[12] = { /* code 0033 */ + ________, + _XXXX___, + XX__XX__, + ____XX__, + ____XX__, + __XXX___, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0034[12] = { /* code 0034 */ + ________, + ____XX__, + ___XXX__, + __XXXX__, + _XX_XX__, + XX__XX__, + XXXXXXX_, + ____XX__, + ____XX__, + ___XXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0035[12] = { /* code 0035 */ + ________, + XXXXXX__, + XX______, + XX______, + XX______, + XXXXX___, + ____XX__, + ____XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0036[12] = { /* code 0036 */ + ________, + __XXX___, + _XX_____, + XX______, + XX______, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0037[12] = { /* code 0037 */ + ________, + XXXXXXX_, + XX___XX_, + XX___XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0038[12] = { /* code 0038 */ + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XXX_XX__, + _XXXX___, + XX_XXX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0039[12] = { /* code 0039 */ + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ___XX___, + ___XX___, + __XX____, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_003A[12] = { /* code 003A */ + ________, + ________, + ________, + __XXX___, + __XXX___, + ________, + ________, + __XXX___, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_003B[12] = { /* code 003B */ + ________, + ________, + ________, + __XXX___, + __XXX___, + ________, + ________, + __XXX___, + __XXX___, + ___XX___, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_003C[12] = { /* code 003C */ + ________, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + _XX_____, + __XX____, + ___XX___, + ____XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_003D[12] = { /* code 003D */ + ________, + ________, + ________, + ________, + _XXXXXX_, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_003E[12] = { /* code 003E */ + ________, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_003F[12] = { /* code 003F */ + ________, + _XXXX___, + XX__XX__, + ____XX__, + ___XX___, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0040[12] = { /* code 0040 */ + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX_XXXX_, + XX_XXXX_, + XX_XXXX_, + XX______, + XX______, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0041[12] = { /* code 0041 */ + ________, + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0042[12] = { /* code 0042 */ + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0043[12] = { /* code 0043 */ + ________, + __XXXX__, + _XX__XX_, + XX___XX_, + XX______, + XX______, + XX______, + XX___XX_, + _XX__XX_, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0044[12] = { /* code 0044 */ + ________, + XXXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + XXXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0045[12] = { /* code 0045 */ + ________, + XXXXXXX_, + _XX___X_, + _XX_____, + _XX__X__, + _XXXXX__, + _XX__X__, + _XX_____, + _XX___X_, + XXXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0046[12] = { /* code 0046 */ + ________, + XXXXXXX_, + _XX__XX_, + _XX___X_, + _XX__X__, + _XXXXX__, + _XX__X__, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0047[12] = { /* code 0047 */ + ________, + __XXXX__, + _XX__XX_, + XX___XX_, + XX______, + XX______, + XX__XXX_, + XX___XX_, + _XX__XX_, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0048[12] = { /* code 0048 */ + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XXXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0049[12] = { /* code 0049 */ + ________, + _XXXX___, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_004A[12] = { /* code 004A */ + ________, + ___XXXX_, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_004B[12] = { /* code 004B */ + ________, + XXX__XX_, + _XX__XX_, + _XX_XX__, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_004C[12] = { /* code 004C */ + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX___X_, + _XX__XX_, + _XX__XX_, + XXXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_004D[12] = { /* code 004D */ + ________, + XX___XX_, + XXX_XXX_, + XXXXXXX_, + XXXXXXX_, + XX_X_XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_004E[12] = { /* code 004E */ + ________, + XX___XX_, + XX___XX_, + XXX__XX_, + XXXX_XX_, + XXXXXXX_, + XX_XXXX_, + XX__XXX_, + XX___XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_004F[12] = { /* code 004F */ + ________, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0050[12] = { /* code 0050 */ + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0051[12] = { /* code 0051 */ + ________, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + XX_XXXX_, + _XXXXX__, + ____XX__, + ___XXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0052[12] = { /* code 0052 */ + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_XX__, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0053[12] = { /* code 0053 */ + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX______, + _XXX____, + ___XX___, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0054[12] = { /* code 0054 */ + ________, + XXXXXX__, + X_XX_X__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0055[12] = { /* code 0055 */ + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0056[12] = { /* code 0056 */ + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0057[12] = { /* code 0057 */ + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0058[12] = { /* code 0058 */ + ________, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0059[12] = { /* code 0059 */ + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_005A[12] = { /* code 005A */ + ________, + XXXXXXX_, + XX__XXX_, + X__XX___, + ___XX___, + __XX____, + _XX_____, + _XX___X_, + XX___XX_, + XXXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_005B[12] = { /* code 005B */ + ________, + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_005C[12] = { /* code 005C */ + ________, + ________, + X_______, + XX______, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ______X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_005D[12] = { /* code 005D */ + ________, + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_005E[12] = { /* code 005E */ + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_005F[12] = { /* code 005F */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0060[12] = { /* code 0060 */ + __XX____, + __XX____, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0061[12] = { /* code 0061 */ + ________, + ________, + ________, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0062[12] = { /* code 0062 */ + ________, + XXX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XX_XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0063[12] = { /* code 0063 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX______, + XX______, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0064[12] = { /* code 0064 */ + ________, + ___XXX__, + ____XX__, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0065[12] = { /* code 0065 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XXXXXX__, + XX______, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0066[12] = { /* code 0066 */ + ________, + __XXX___, + _XX_XX__, + _XX_____, + _XX_____, + XXXXX___, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0067[12] = { /* code 0067 */ + ________, + ________, + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + XX__XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0068[12] = { /* code 0068 */ + ________, + XXX_____, + _XX_____, + _XX_____, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0069[12] = { /* code 0069 */ + ________, + ___XX___, + ___XX___, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_006A[12] = { /* code 006A */ + ________, + ____XX__, + ____XX__, + ________, + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_006B[12] = { /* code 006B */ + ________, + XXX_____, + _XX_____, + _XX_____, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_006C[12] = { /* code 006C */ + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_006D[12] = { /* code 006D */ + ________, + ________, + ________, + ________, + XXXXXX__, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_006E[12] = { /* code 006E */ + ________, + ________, + ________, + ________, + XXXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_006F[12] = { /* code 006F */ + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0070[12] = { /* code 0070 */ + ________, + ________, + ________, + ________, + XX_XXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0071[12] = { /* code 0071 */ + ________, + ________, + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ___XXXX_}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0072[12] = { /* code 0072 */ + ________, + ________, + ________, + ________, + XXX_XX__, + _XX_XXX_, + _XXX_XX_, + _XX_____, + _XX_____, + XXXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0073[12] = { /* code 0073 */ + ________, + ________, + ________, + ________, + _XXXX___, + XX__XX__, + _XX_____, + ___XX___, + XX__XX__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0074[12] = { /* code 0074 */ + ________, + ________, + __X_____, + _XX_____, + XXXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XX_XX__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0075[12] = { /* code 0075 */ + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0076[12] = { /* code 0076 */ + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + __XX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0077[12] = { /* code 0077 */ + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + _XX_XX__, + _XX_XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0078[12] = { /* code 0078 */ + ________, + ________, + ________, + ________, + XX___XX_, + _XX_XX__, + __XXX___, + __XXX___, + _XX_XX__, + XX___XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_0079[12] = { /* code 0079 */ + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ____XX__, + ___XX___, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_007A[12] = { /* code 007A */ + ________, + ________, + ________, + ________, + XXXXXX__, + X___XX__, + ___XX___, + _XX_____, + XX___X__, + XXXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_007B[12] = { /* code 007B */ + ________, + ___XXX__, + __XX____, + __XX____, + _XX_____, + XX______, + _XX_____, + __XX____, + __XX____, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_007C[12] = { /* code 007C */ + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_007D[12] = { /* code 007D */ + ________, + XXX_____, + __XX____, + __XX____, + ___XX___, + ____XX__, + ___XX___, + __XX____, + __XX____, + XXX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_007E[12] = { /* code 007E */ + ________, + _XXX__XX, + XX_XX_X_, + XX__XXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFont8x12ASCII_007F[12] = { /* code 007F */ + ________, + ________, + ________, + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_Font8x12ASCII_CharInfo[96] = { + { 8, 8, 1, acFont8x12ASCII_0020 } /* code 0020 */ + ,{ 8, 8, 1, acFont8x12ASCII_0021 } /* code 0021 */ + ,{ 8, 8, 1, acFont8x12ASCII_0022 } /* code 0022 */ + ,{ 8, 8, 1, acFont8x12ASCII_0023 } /* code 0023 */ + ,{ 8, 8, 1, acFont8x12ASCII_0024 } /* code 0024 */ + ,{ 8, 8, 1, acFont8x12ASCII_0025 } /* code 0025 */ + ,{ 8, 8, 1, acFont8x12ASCII_0026 } /* code 0026 */ + ,{ 8, 8, 1, acFont8x12ASCII_0027 } /* code 0027 */ + ,{ 8, 8, 1, acFont8x12ASCII_0028 } /* code 0028 */ + ,{ 8, 8, 1, acFont8x12ASCII_0029 } /* code 0029 */ + ,{ 8, 8, 1, acFont8x12ASCII_002A } /* code 002A */ + ,{ 8, 8, 1, acFont8x12ASCII_002B } /* code 002B */ + ,{ 8, 8, 1, acFont8x12ASCII_002C } /* code 002C */ + ,{ 8, 8, 1, acFont8x12ASCII_002D } /* code 002D */ + ,{ 8, 8, 1, acFont8x12ASCII_002E } /* code 002E */ + ,{ 8, 8, 1, acFont8x12ASCII_002F } /* code 002F */ + ,{ 8, 8, 1, acFont8x12ASCII_0030 } /* code 0030 */ + ,{ 8, 8, 1, acFont8x12ASCII_0031 } /* code 0031 */ + ,{ 8, 8, 1, acFont8x12ASCII_0032 } /* code 0032 */ + ,{ 8, 8, 1, acFont8x12ASCII_0033 } /* code 0033 */ + ,{ 8, 8, 1, acFont8x12ASCII_0034 } /* code 0034 */ + ,{ 8, 8, 1, acFont8x12ASCII_0035 } /* code 0035 */ + ,{ 8, 8, 1, acFont8x12ASCII_0036 } /* code 0036 */ + ,{ 8, 8, 1, acFont8x12ASCII_0037 } /* code 0037 */ + ,{ 8, 8, 1, acFont8x12ASCII_0038 } /* code 0038 */ + ,{ 8, 8, 1, acFont8x12ASCII_0039 } /* code 0039 */ + ,{ 8, 8, 1, acFont8x12ASCII_003A } /* code 003A */ + ,{ 8, 8, 1, acFont8x12ASCII_003B } /* code 003B */ + ,{ 8, 8, 1, acFont8x12ASCII_003C } /* code 003C */ + ,{ 8, 8, 1, acFont8x12ASCII_003D } /* code 003D */ + ,{ 8, 8, 1, acFont8x12ASCII_003E } /* code 003E */ + ,{ 8, 8, 1, acFont8x12ASCII_003F } /* code 003F */ + ,{ 8, 8, 1, acFont8x12ASCII_0040 } /* code 0040 */ + ,{ 8, 8, 1, acFont8x12ASCII_0041 } /* code 0041 */ + ,{ 8, 8, 1, acFont8x12ASCII_0042 } /* code 0042 */ + ,{ 8, 8, 1, acFont8x12ASCII_0043 } /* code 0043 */ + ,{ 8, 8, 1, acFont8x12ASCII_0044 } /* code 0044 */ + ,{ 8, 8, 1, acFont8x12ASCII_0045 } /* code 0045 */ + ,{ 8, 8, 1, acFont8x12ASCII_0046 } /* code 0046 */ + ,{ 8, 8, 1, acFont8x12ASCII_0047 } /* code 0047 */ + ,{ 8, 8, 1, acFont8x12ASCII_0048 } /* code 0048 */ + ,{ 8, 8, 1, acFont8x12ASCII_0049 } /* code 0049 */ + ,{ 8, 8, 1, acFont8x12ASCII_004A } /* code 004A */ + ,{ 8, 8, 1, acFont8x12ASCII_004B } /* code 004B */ + ,{ 8, 8, 1, acFont8x12ASCII_004C } /* code 004C */ + ,{ 8, 8, 1, acFont8x12ASCII_004D } /* code 004D */ + ,{ 8, 8, 1, acFont8x12ASCII_004E } /* code 004E */ + ,{ 8, 8, 1, acFont8x12ASCII_004F } /* code 004F */ + ,{ 8, 8, 1, acFont8x12ASCII_0050 } /* code 0050 */ + ,{ 8, 8, 1, acFont8x12ASCII_0051 } /* code 0051 */ + ,{ 8, 8, 1, acFont8x12ASCII_0052 } /* code 0052 */ + ,{ 8, 8, 1, acFont8x12ASCII_0053 } /* code 0053 */ + ,{ 8, 8, 1, acFont8x12ASCII_0054 } /* code 0054 */ + ,{ 8, 8, 1, acFont8x12ASCII_0055 } /* code 0055 */ + ,{ 8, 8, 1, acFont8x12ASCII_0056 } /* code 0056 */ + ,{ 8, 8, 1, acFont8x12ASCII_0057 } /* code 0057 */ + ,{ 8, 8, 1, acFont8x12ASCII_0058 } /* code 0058 */ + ,{ 8, 8, 1, acFont8x12ASCII_0059 } /* code 0059 */ + ,{ 8, 8, 1, acFont8x12ASCII_005A } /* code 005A */ + ,{ 8, 8, 1, acFont8x12ASCII_005B } /* code 005B */ + ,{ 8, 8, 1, acFont8x12ASCII_005C } /* code 005C */ + ,{ 8, 8, 1, acFont8x12ASCII_005D } /* code 005D */ + ,{ 8, 8, 1, acFont8x12ASCII_005E } /* code 005E */ + ,{ 8, 8, 1, acFont8x12ASCII_005F } /* code 005F */ + ,{ 8, 8, 1, acFont8x12ASCII_0060 } /* code 0060 */ + ,{ 8, 8, 1, acFont8x12ASCII_0061 } /* code 0061 */ + ,{ 8, 8, 1, acFont8x12ASCII_0062 } /* code 0062 */ + ,{ 8, 8, 1, acFont8x12ASCII_0063 } /* code 0063 */ + ,{ 8, 8, 1, acFont8x12ASCII_0064 } /* code 0064 */ + ,{ 8, 8, 1, acFont8x12ASCII_0065 } /* code 0065 */ + ,{ 8, 8, 1, acFont8x12ASCII_0066 } /* code 0066 */ + ,{ 8, 8, 1, acFont8x12ASCII_0067 } /* code 0067 */ + ,{ 8, 8, 1, acFont8x12ASCII_0068 } /* code 0068 */ + ,{ 8, 8, 1, acFont8x12ASCII_0069 } /* code 0069 */ + ,{ 8, 8, 1, acFont8x12ASCII_006A } /* code 006A */ + ,{ 8, 8, 1, acFont8x12ASCII_006B } /* code 006B */ + ,{ 8, 8, 1, acFont8x12ASCII_006C } /* code 006C */ + ,{ 8, 8, 1, acFont8x12ASCII_006D } /* code 006D */ + ,{ 8, 8, 1, acFont8x12ASCII_006E } /* code 006E */ + ,{ 8, 8, 1, acFont8x12ASCII_006F } /* code 006F */ + ,{ 8, 8, 1, acFont8x12ASCII_0070 } /* code 0070 */ + ,{ 8, 8, 1, acFont8x12ASCII_0071 } /* code 0071 */ + ,{ 8, 8, 1, acFont8x12ASCII_0072 } /* code 0072 */ + ,{ 8, 8, 1, acFont8x12ASCII_0073 } /* code 0073 */ + ,{ 8, 8, 1, acFont8x12ASCII_0074 } /* code 0074 */ + ,{ 8, 8, 1, acFont8x12ASCII_0075 } /* code 0075 */ + ,{ 8, 8, 1, acFont8x12ASCII_0076 } /* code 0076 */ + ,{ 8, 8, 1, acFont8x12ASCII_0077 } /* code 0077 */ + ,{ 8, 8, 1, acFont8x12ASCII_0078 } /* code 0078 */ + ,{ 8, 8, 1, acFont8x12ASCII_0079 } /* code 0079 */ + ,{ 8, 8, 1, acFont8x12ASCII_007A } /* code 007A */ + ,{ 8, 8, 1, acFont8x12ASCII_007B } /* code 007B */ + ,{ 8, 8, 1, acFont8x12ASCII_007C } /* code 007C */ + ,{ 8, 8, 1, acFont8x12ASCII_007D } /* code 007D */ + ,{ 8, 8, 1, acFont8x12ASCII_007E } /* code 007E */ + ,{ 8, 8, 1, acFont8x12ASCII_007F } /* code 007F */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font8x12ASCII_Prop1 = { + 32 /* first character */ + ,127 /* last character */ + ,&GUI_Font8x12ASCII_CharInfo[0] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x12_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,12 /* height of font */ + ,12 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_Font8x12ASCII_Prop1} + ,10, 6, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F8x13_1.c b/User/system/lib/lcd/gui/Font/F8x13_1.c new file mode 100644 index 0000000..133ae1d --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x13_1.c @@ -0,0 +1,1587 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x13.C +Purpose : Monospaced Font similar to courier +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acF8x13_1_160[13] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_161[13] = { /* code 161 */ + ________, + ________, + ____X___, + ________, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_162[13] = { /* code 162 */ + ________, + ________, + ________, + ________, + ____X___, + ___XXX__, + __X___X_, + __X_____, + __X___X_, + ___XXX__, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_163[13] = { /* code 163 */ + ________, + ________, + ________, + ___XX___, + __X__X__, + __X_____, + ___X____, + __XXXX__, + ___X____, + ___X____, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_164[13] = { /* code 164 */ + ________, + ________, + _X_____X, + __XXXXX_, + __X___X_, + __X___X_, + __X___X_, + __XXXXX_, + _X_____X, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_165[13] = { /* code 165 */ + ________, + ________, + ________, + _XXX_XXX, + __X___X_, + _XXXXXXX, + ___X_X__, + _XXXXXXX, + ____X___, + ____X___, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_166[13] = { /* code 166 */ + ________, + ________, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ________, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_167[13] = { /* code 167 */ + ________, + ________, + ___XXXX_, + __X___X_, + _X_X____, + _X__X___, + __X__X__, + ___X__X_, + ____X_X_, + _X___X__, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_168[13] = { /* code 168 */ + ________, + ________, + __X___X_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_169[13] = { /* code 169 */ + ________, + ________, + ___XXX__, + __X___X_, + _X__XX_X, + _X_X___X, + _X_X___X, + _X__XX_X, + __X___X_, + ___XXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_170[13] = { /* code 170 */ + ________, + ________, + ___XX___, + _____X__, + ___XXX__, + __X__X__, + ___XXX__, + ________, + __XXXX__, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_171[13] = { /* code 171 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___X___X, + __X___X_, + _X___X__, + __X___X_, + ___X___X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_172[13] = { /* code 172 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + ______X_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_173[13] = { /* code 173 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_174[13] = { /* code 174 */ + ________, + ________, + ___XXX__, + __X___X_, + _X_XX__X, + _X_X_X_X, + _X_XX__X, + _X_X_X_X, + __X___X_, + ___XXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_175[13] = { /* code 175 */ + ________, + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_176[13] = { /* code 176 */ + ________, + ________, + ____X___, + ___X_X__, + ____X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_177[13] = { /* code 177 */ + ________, + ________, + ____X___, + ____X___, + ____X___, + _XXXXXXX, + ____X___, + ____X___, + ____X___, + ________, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_178[13] = { /* code 178 */ + ________, + ________, + ____X___, + ___X_X__, + _____X__, + ____X___, + ___XXX__, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_179[13] = { /* code 179 */ + ________, + ________, + ___XX___, + _____X__, + ____X___, + _____X__, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_180[13] = { /* code 180 */ + ________, + ________, + _____X__, + ____X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_181[13] = { /* code 181 */ + ________, + ________, + ________, + ________, + ________, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __XXXX__, + __X_____, + _X______}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_182[13] = { /* code 182 */ + ________, + ________, + __XXXXXX, + _XXXX_X_, + _XXXX_X_, + _XXXX_X_, + __XXX_X_, + ____X_X_, + ____X_X_, + ____X_X_, + ___XX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_183[13] = { /* code 183 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_184[13] = { /* code 184 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + _____X__, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_185[13] = { /* code 185 */ + ________, + ________, + ___XX___, + ____X___, + ____X___, + ____X___, + ___XXX__, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_186[13] = { /* code 186 */ + ________, + ________, + ___XX___, + __X__X__, + __X__X__, + __X__X__, + ___XX___, + ________, + __XXXX__, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_187[13] = { /* code 187 */ + ________, + ________, + ________, + ________, + ________, + ________, + _X___X__, + __X___X_, + ___X___X, + __X___X_, + _X___X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_188[13] = { /* code 188 */ + ________, + ________, + _XX_____, + __X____X, + __X___X_, + __X__X__, + _XXXX__X, + ___X__XX, + __X__X_X, + _X__XXXX, + _______X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_189[13] = { /* code 189 */ + ________, + ________, + _XX_____, + __X____X, + __X___X_, + __X__X__, + _XXXX_X_, + ___X_X_X, + __X____X, + _X____X_, + _____XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_190[13] = { /* code 190 */ + ________, + ________, + _XX_____, + ___X___X, + __X___X_, + ___X_X__, + _XX_X__X, + ___X__XX, + __X__X_X, + _X__XXXX, + _______X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_191[13] = { /* code 191 */ + ________, + ________, + ____X___, + ________, + ____X___, + ____X___, + ___X____, + __X_____, + __X_____, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_192[13] = { /* code 192 */ + ___X____, + ____X___, + ___XX___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_193[13] = { /* code 193 */ + _____X__, + ____X___, + ___XX___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_194[13] = { /* code 194 */ + ____X___, + ___X_X__, + ___XX___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_195[13] = { /* code 195 */ + __XXX__X, + _X__XXX_, + ___XX___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_196[13] = { /* code 196 */ + __X___X_, + ________, + ___XX___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_197[13] = { /* code 197 */ + ____X___, + ___X_X__, + ____X___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_198[13] = { /* code 198 */ + ________, + ________, + __XXXXXX, + ___XX__X, + ___XX___, + __X_X_X_, + __X_XXX_, + __X_X_X_, + _XXXX___, + _X__X__X, + _X__XXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_199[13] = { /* code 199 */ + ________, + ________, + ________, + ___XXXX_, + __X____X, + _X______, + _X______, + _X______, + _X______, + __X____X, + ___XXXX_, + _____X__, + ____XX__}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_200[13] = { /* code 200 */ + ___X____, + ____X___, + _XXXXXXX, + __X____X, + __X_____, + __X__X__, + __XXXX__, + __X__X__, + __X_____, + __X____X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_201[13] = { /* code 201 */ + _____X__, + ____X___, + _XXXXXXX, + __X____X, + __X_____, + __X__X__, + __XXXX__, + __X__X__, + __X_____, + __X____X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_202[13] = { /* code 202 */ + ____X___, + ___X_X__, + _XXXXXXX, + __X____X, + __X_____, + __X__X__, + __XXXX__, + __X__X__, + __X_____, + __X____X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_203[13] = { /* code 203 */ + __X___X_, + ________, + _XXXXXXX, + __X____X, + __X_____, + __X__X__, + __XXXX__, + __X__X__, + __X_____, + __X____X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_204[13] = { /* code 204 */ + ___X____, + ____X___, + __XXXXX_, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_205[13] = { /* code 205 */ + _____X__, + ____X___, + __XXXXX_, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_206[13] = { /* code 206 */ + ____X___, + ___X_X__, + __XXXXX_, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_207[13] = { /* code 207 */ + __X___X_, + ________, + __XXXXX_, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_208[13] = { /* code 208 */ + ________, + ________, + _XXXXX__, + __X___X_, + __X____X, + __X____X, + _XXXX__X, + __X____X, + __X____X, + __X___X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_209[13] = { /* code 209 */ + __XXX__X, + _X__XXX_, + _XX__XXX, + __X___X_, + __XX__X_, + __XX__X_, + __X_X_X_, + __X__XX_, + __X__XX_, + __X___X_, + _XXX__X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_210[13] = { /* code 210 */ + ___X____, + ____X___, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_211[13] = { /* code 211 */ + _____X__, + ____X___, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_212[13] = { /* code 212 */ + ____X___, + ___X_X__, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_213[13] = { /* code 213 */ + __XXX__X, + _X__XXX_, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_214[13] = { /* code 214 */ + __X___X_, + ________, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_215[13] = { /* code 215 */ + ________, + ________, + ________, + ________, + _X_____X, + __X___X_, + ___X_X__, + ____X___, + ___X_X__, + __X___X_, + _X_____X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_216[13] = { /* code 216 */ + ________, + ________, + ___XXX_X, + __X___X_, + _X___X_X, + _X___X_X, + _X__X__X, + _X_X___X, + _X_X___X, + __X___X_, + _X_XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_217[13] = { /* code 217 */ + ___X____, + ____X___, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_218[13] = { /* code 218 */ + _____X__, + ____X___, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_219[13] = { /* code 219 */ + ____X___, + ___X_X__, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_220[13] = { /* code 220 */ + __X___X_, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_221[13] = { /* code 221 */ + _____X__, + ____X___, + _XXX_XXX, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ____X___, + ____X___, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_222[13] = { /* code 222 */ + ________, + ________, + _XX_____, + __X_____, + __XXXXX_, + __X____X, + __X____X, + __X____X, + __XXXXX_, + __X_____, + _XXX____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_223[13] = { /* code 223 */ + ________, + ________, + ___XXX__, + __X___X_, + __X___X_, + __X___X_, + __X_XXX_, + __X____X, + __X____X, + __X____X, + _XX_XXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_224[13] = { /* code 224 */ + ________, + ________, + ___X____, + ____X___, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_225[13] = { /* code 225 */ + ________, + ________, + _____X__, + ____X___, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_226[13] = { /* code 226 */ + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_227[13] = { /* code 227 */ + ________, + ________, + __XXX__X, + _X__XXX_, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_228[13] = { /* code 228 */ + ________, + ________, + __X___X_, + ________, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_229[13] = { /* code 229 */ + ________, + ____X___, + ___X_X__, + ____X___, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_230[13] = { /* code 230 */ + ________, + ________, + ________, + ________, + ________, + __XX_XX_, + ____X__X, + __XXXXXX, + _X__X___, + _X__X__X, + __XX_XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_231[13] = { /* code 231 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _X_____X, + _X______, + _X______, + _X_____X, + __XXXXX_, + _____X__, + ____XX__}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_232[13] = { /* code 232 */ + ________, + ________, + ___X____, + ____X___, + ________, + __XXXXX_, + _X_____X, + _XXXXXXX, + _X______, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_233[13] = { /* code 233 */ + ________, + ________, + _____X__, + ____X___, + ________, + __XXXXX_, + _X_____X, + _XXXXXXX, + _X______, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_234[13] = { /* code 234 */ + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXXXX_, + _X_____X, + _XXXXXXX, + _X______, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_235[13] = { /* code 235 */ + ________, + ________, + __X___X_, + ________, + ________, + __XXXXX_, + _X_____X, + _XXXXXXX, + _X______, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_236[13] = { /* code 236 */ + ________, + ________, + ___X____, + ____X___, + ________, + __XXX___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_237[13] = { /* code 237 */ + ________, + ________, + ____X___, + ___X____, + ________, + __XXX___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_238[13] = { /* code 238 */ + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXX___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_239[13] = { /* code 239 */ + ________, + ________, + __X__X__, + ________, + ________, + __XXX___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_240[13] = { /* code 240 */ + ________, + ________, + __XX_XX_, + ____X___, + __XX_X__, + ______X_, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_241[13] = { /* code 241 */ + ________, + ________, + __XXX__X, + _X__XXX_, + ________, + _XX_XX__, + __XX__X_, + __X___X_, + __X___X_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_242[13] = { /* code 242 */ + ________, + ________, + ___X____, + ____X___, + ________, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_243[13] = { /* code 243 */ + ________, + ________, + _____X__, + ____X___, + ________, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_244[13] = { /* code 244 */ + ________, + ________, + ____X___, + ___X_X__, + ________, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_245[13] = { /* code 245 */ + ________, + ________, + __XXX__X, + _X__XXX_, + ________, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_246[13] = { /* code 246 */ + ________, + ________, + __X___X_, + ________, + ________, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_247[13] = { /* code 247 */ + ________, + ________, + ________, + ________, + ____X___, + ________, + ________, + _XXXXXXX, + ________, + ________, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_248[13] = { /* code 248 */ + ________, + ________, + ________, + ________, + ________, + __XXXXXX, + _X____XX, + _X__XX_X, + _X_XX__X, + _XX____X, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_249[13] = { /* code 249 */ + ________, + ________, + ___X____, + ____X___, + ________, + _XX__XX_, + __X___X_, + __X___X_, + __X___X_, + __X__XX_, + ___XX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_250[13] = { /* code 250 */ + ________, + ________, + _____X__, + ____X___, + ________, + _XX__XX_, + __X___X_, + __X___X_, + __X___X_, + __X__XX_, + ___XX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_251[13] = { /* code 251 */ + ________, + ________, + ____X___, + ___X_X__, + ________, + _XX__XX_, + __X___X_, + __X___X_, + __X___X_, + __X__XX_, + ___XX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_252[13] = { /* code 252 */ + ________, + ________, + __X___X_, + ________, + ________, + _XX__XX_, + __X___X_, + __X___X_, + __X___X_, + __X__XX_, + ___XX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_253[13] = { /* code 253 */ + ________, + ________, + _____X__, + ____X___, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_254[13] = { /* code 254 */ + ________, + ________, + _XX_____, + __X_____, + __X_____, + __XXXXX_, + __X____X, + __X____X, + __X____X, + __X____X, + __XXXXX_, + __X_____, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acF8x13_1_255[13] = { /* code 255 */ + ________, + ________, + __X___X_, + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ____X___, + __XX____}; + + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x13_1[96] = { + { 8, 8, 1, acF8x13_1_160 } /* code 160 */ + ,{ 8, 8, 1, acF8x13_1_161 } /* code 161 */ + ,{ 8, 8, 1, acF8x13_1_162 } /* code 162 */ + ,{ 8, 8, 1, acF8x13_1_163 } /* code 163 */ + ,{ 8, 8, 1, acF8x13_1_164 } /* code 164 */ + ,{ 8, 8, 1, acF8x13_1_165 } /* code 165 */ + ,{ 8, 8, 1, acF8x13_1_166 } /* code 166 */ + ,{ 8, 8, 1, acF8x13_1_167 } /* code 167 */ + ,{ 8, 8, 1, acF8x13_1_168 } /* code 168 */ + ,{ 8, 8, 1, acF8x13_1_169 } /* code 169 */ + ,{ 8, 8, 1, acF8x13_1_170 } /* code 170 */ + ,{ 8, 8, 1, acF8x13_1_171 } /* code 171 */ + ,{ 8, 8, 1, acF8x13_1_172 } /* code 172 */ + ,{ 8, 8, 1, acF8x13_1_173 } /* code 173 */ + ,{ 8, 8, 1, acF8x13_1_174 } /* code 174 */ + ,{ 8, 8, 1, acF8x13_1_175 } /* code 175 */ + ,{ 8, 8, 1, acF8x13_1_176 } /* code 176 */ + ,{ 8, 8, 1, acF8x13_1_177 } /* code 177 */ + ,{ 8, 8, 1, acF8x13_1_178 } /* code 178 */ + ,{ 8, 8, 1, acF8x13_1_179 } /* code 179 */ + ,{ 8, 8, 1, acF8x13_1_180 } /* code 180 */ + ,{ 8, 8, 1, acF8x13_1_181 } /* code 181 */ + ,{ 8, 8, 1, acF8x13_1_182 } /* code 182 */ + ,{ 8, 8, 1, acF8x13_1_183 } /* code 183 */ + ,{ 8, 8, 1, acF8x13_1_184 } /* code 184 */ + ,{ 8, 8, 1, acF8x13_1_185 } /* code 185 */ + ,{ 8, 8, 1, acF8x13_1_186 } /* code 186 */ + ,{ 8, 8, 1, acF8x13_1_187 } /* code 187 */ + ,{ 8, 8, 1, acF8x13_1_188 } /* code 188 */ + ,{ 8, 8, 1, acF8x13_1_189 } /* code 189 */ + ,{ 8, 8, 1, acF8x13_1_190 } /* code 190 */ + ,{ 8, 8, 1, acF8x13_1_191 } /* code 191 */ + ,{ 8, 8, 1, acF8x13_1_192 } /* code 192 */ + ,{ 8, 8, 1, acF8x13_1_193 } /* code 193 */ + ,{ 8, 8, 1, acF8x13_1_194 } /* code 194 */ + ,{ 8, 8, 1, acF8x13_1_195 } /* code 195 */ + ,{ 8, 8, 1, acF8x13_1_196 } /* code 196 */ + ,{ 8, 8, 1, acF8x13_1_197 } /* code 197 */ + ,{ 8, 8, 1, acF8x13_1_198 } /* code 198 */ + ,{ 8, 8, 1, acF8x13_1_199 } /* code 199 */ + ,{ 8, 8, 1, acF8x13_1_200 } /* code 200 */ + ,{ 8, 8, 1, acF8x13_1_201 } /* code 201 */ + ,{ 8, 8, 1, acF8x13_1_202 } /* code 202 */ + ,{ 8, 8, 1, acF8x13_1_203 } /* code 203 */ + ,{ 8, 8, 1, acF8x13_1_204 } /* code 204 */ + ,{ 8, 8, 1, acF8x13_1_205 } /* code 205 */ + ,{ 8, 8, 1, acF8x13_1_206 } /* code 206 */ + ,{ 8, 8, 1, acF8x13_1_207 } /* code 207 */ + ,{ 8, 8, 1, acF8x13_1_208 } /* code 208 */ + ,{ 8, 8, 1, acF8x13_1_209 } /* code 209 */ + ,{ 8, 8, 1, acF8x13_1_210 } /* code 210 */ + ,{ 8, 8, 1, acF8x13_1_211 } /* code 211 */ + ,{ 8, 8, 1, acF8x13_1_212 } /* code 212 */ + ,{ 8, 8, 1, acF8x13_1_213 } /* code 213 */ + ,{ 8, 8, 1, acF8x13_1_214 } /* code 214 */ + ,{ 8, 8, 1, acF8x13_1_215 } /* code 215 */ + ,{ 8, 8, 1, acF8x13_1_216 } /* code 216 */ + ,{ 8, 8, 1, acF8x13_1_217 } /* code 217 */ + ,{ 8, 8, 1, acF8x13_1_218 } /* code 218 */ + ,{ 8, 8, 1, acF8x13_1_219 } /* code 219 */ + ,{ 8, 8, 1, acF8x13_1_220 } /* code 220 */ + ,{ 8, 8, 1, acF8x13_1_221 } /* code 221 */ + ,{ 8, 8, 1, acF8x13_1_222 } /* code 222 */ + ,{ 8, 8, 1, acF8x13_1_223 } /* code 223 */ + ,{ 8, 8, 1, acF8x13_1_224 } /* code 224 */ + ,{ 8, 8, 1, acF8x13_1_225 } /* code 225 */ + ,{ 8, 8, 1, acF8x13_1_226 } /* code 226 */ + ,{ 8, 8, 1, acF8x13_1_227 } /* code 227 */ + ,{ 8, 8, 1, acF8x13_1_228 } /* code 228 */ + ,{ 8, 8, 1, acF8x13_1_229 } /* code 229 */ + ,{ 8, 8, 1, acF8x13_1_230 } /* code 230 */ + ,{ 8, 8, 1, acF8x13_1_231 } /* code 231 */ + ,{ 8, 8, 1, acF8x13_1_232 } /* code 232 */ + ,{ 8, 8, 1, acF8x13_1_233 } /* code 233 */ + ,{ 8, 8, 1, acF8x13_1_234 } /* code 234 */ + ,{ 8, 8, 1, acF8x13_1_235 } /* code 235 */ + ,{ 8, 8, 1, acF8x13_1_236 } /* code 236 */ + ,{ 8, 8, 1, acF8x13_1_237 } /* code 237 */ + ,{ 8, 8, 1, acF8x13_1_238 } /* code 238 */ + ,{ 8, 8, 1, acF8x13_1_239 } /* code 239 */ + ,{ 8, 8, 1, acF8x13_1_240 } /* code 240 */ + ,{ 8, 8, 1, acF8x13_1_241 } /* code 241 */ + ,{ 8, 8, 1, acF8x13_1_242 } /* code 242 */ + ,{ 8, 8, 1, acF8x13_1_243 } /* code 243 */ + ,{ 8, 8, 1, acF8x13_1_244 } /* code 244 */ + ,{ 8, 8, 1, acF8x13_1_245 } /* code 245 */ + ,{ 8, 8, 1, acF8x13_1_246 } /* code 246 */ + ,{ 8, 8, 1, acF8x13_1_247 } /* code 247 */ + ,{ 8, 8, 1, acF8x13_1_248 } /* code 248 */ + ,{ 8, 8, 1, acF8x13_1_249 } /* code 249 */ + ,{ 8, 8, 1, acF8x13_1_250 } /* code 250 */ + ,{ 8, 8, 1, acF8x13_1_251 } /* code 251 */ + ,{ 8, 8, 1, acF8x13_1_252 } /* code 252 */ + ,{ 8, 8, 1, acF8x13_1_253 } /* code 253 */ + ,{ 8, 8, 1, acF8x13_1_254 } /* code 254 */ + ,{ 8, 8, 1, acF8x13_1_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontPropF8x13_1_2 = { + 160 /* first character */ + ,255 /* last character */ + ,&GUI_CharInfoF8x13_1[0] /* address of first character */ + ,(const GUI_FONT_PROP *)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontPropF8x13_1_1 = { + 32 /* first character */ + ,127 /* last character */ + ,&GUI_CharInfoF8x13_ASCII[0] /* address of first character */ + ,&GUI_FontPropF8x13_1_2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x13_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontPropF8x13_1_1} + , 11, 6, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F8x13_ASCII.c b/User/system/lib/lcd/gui/Font/F8x13_ASCII.c new file mode 100644 index 0000000..7901f71 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x13_ASCII.c @@ -0,0 +1,1579 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x13.C +Purpose : Monospaced Font similar to courier +Height : 13 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_32[13] = { /* code 32 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_33[13] = { /* code 33 */ + ________, + ________, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ________, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_34[13] = { /* code 34 */ + ________, + ________, + ___X_X__, + ___X_X__, + ___X_X__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_35[13] = { /* code 35 */ + ________, + ________, + ____X_X_, + ____X_X_, + __XXXXXX, + ___X_X__, + ___X_X__, + ___X_X__, + _XXXXXX_, + __X_X___, + __X_X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_36[13] = { /* code 36 */ + ________, + ________, + ____X___, + ___XXX__, + __X___X_, + __X_____, + ___XXX__, + ______X_, + __X___X_, + ___XXX__, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_37[13] = { /* code 37 */ + ________, + ________, + __X_____, + _X_X___X, + __X___X_, + _____X__, + ____X___, + ___X____, + __X___X_, + _X___X_X, + ______X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_38[13] = { /* code 38 */ + ________, + ________, + ___XX___, + __X_____, + __X_____, + ___X____, + __XX____, + _X__X__X, + _X__X_X_, + _X___X__, + __XXX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_39[13] = { /* code 39 */ + ________, + ________, + ____X___, + ____X___, + ____X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_40[13] = { /* code 40 */ + ________, + ________, + _____X__, + ____X___, + ____X___, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ____X___, + ____X___, + _____X__}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_41[13] = { /* code 41 */ + ________, + ________, + ___X____, + ____X___, + ____X___, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + ____X___, + ____X___, + ___X____}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_42[13] = { /* code 42 */ + ________, + ________, + ________, + ________, + __XX_XX_, + ___XXX__, + _XXXXXXX, + ___XXX__, + __XX_XX_, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_43[13] = { /* code 43 */ + ________, + ________, + ________, + ________, + ____X___, + ____X___, + ____X___, + _XXXXXXX, + ____X___, + ____X___, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_44[13] = { /* code 44 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_45[13] = { /* code 45 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXXX, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_46[13] = { /* code 46 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_47[13] = { /* code 47 */ + ________, + ________, + ________, + _______X, + ______X_, + _____X__, + ____X___, + ___X____, + __X_____, + _X______, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_48[13] = { /* code 48 */ + ________, + ________, + ___XXX__, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_49[13] = { /* code 49 */ + ________, + ________, + ____X___, + __XXX___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_50[13] = { /* code 50 */ + ________, + ________, + ___XXX__, + __X___X_, + ______X_, + ______X_, + _____X__, + ____X___, + ___X____, + __X_____, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_51[13] = { /* code 51 */ + ________, + ________, + ___XXX__, + __X___X_, + ______X_, + ______X_, + ____XX__, + ______X_, + ______X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_52[13] = { /* code 52 */ + ________, + ________, + _____X__, + ____XX__, + ____XX__, + ___X_X__, + ___X_X__, + __X__X__, + __XXXXX_, + _____X__, + ____XXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_53[13] = { /* code 53 */ + ________, + ________, + __XXXXX_, + __X_____, + __X_____, + __X_____, + __XXXX__, + ______X_, + ______X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_54[13] = { /* code 54 */ + ________, + ________, + ____XX__, + ___X____, + __X_____, + __X_____, + __XXXX__, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_55[13] = { /* code 55 */ + ________, + ________, + __XXXXX_, + __X___X_, + ______X_, + _____X__, + _____X__, + ____X___, + ____X___, + ___X____, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_56[13] = { /* code 56 */ + ________, + ________, + ___XXX__, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_57[13] = { /* code 57 */ + ________, + ________, + ___XXX__, + __X___X_, + __X___X_, + __X___X_, + ___XXXX_, + ______X_, + ______X_, + _____X__, + ___XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_58[13] = { /* code 58 */ + ________, + ________, + ________, + ________, + ________, + ____X___, + ________, + ________, + ________, + ________, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_59[13] = { /* code 59 */ + ________, + ________, + ________, + ________, + ________, + ____X___, + ________, + ________, + ________, + ________, + ____X___, + ___X____, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_60[13] = { /* code 60 */ + ________, + ________, + ________, + ________, + _____X__, + ____X___, + ___X____, + __X_____, + ___X____, + ____X___, + _____X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_61[13] = { /* code 61 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + ________, + __XXXXX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_62[13] = { /* code 62 */ + ________, + ________, + ________, + ________, + ___X____, + ____X___, + _____X__, + ______X_, + _____X__, + ____X___, + ___X____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_63[13] = { /* code 63 */ + ________, + ________, + ___XXX__, + __X___X_, + ______X_, + ______X_, + _____X__, + ____X___, + ____X___, + ________, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_64[13] = { /* code 64 */ + ________, + ________, + ___XXXX_, + __X____X, + _X__XX_X, + _X_X_X_X, + _X_X_X_X, + _X_X_X_X, + _X__XXX_, + __X_____, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_65[13] = { /* code 65 */ + ________, + ________, + ___XX___, + ____X___, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + __XXXXX_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_66[13] = { /* code 66 */ + ________, + ________, + _XXXXXX_, + __X____X, + __X____X, + __X____X, + __XXXXX_, + __X____X, + __X____X, + __X____X, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_67[13] = { /* code 67 */ + ________, + ________, + ___XXXX_, + __X____X, + _X______, + _X______, + _X______, + _X______, + _X______, + __X____X, + ___XXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_68[13] = { /* code 68 */ + ________, + ________, + _XXXXX__, + __X___X_, + __X____X, + __X____X, + __X____X, + __X____X, + __X____X, + __X___X_, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_69[13] = { /* code 69 */ + ________, + ________, + _XXXXXXX, + __X____X, + __X_____, + __X__X__, + __XXXX__, + __X__X__, + __X_____, + __X____X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_70[13] = { /* code 70 */ + ________, + ________, + _XXXXXXX, + __X____X, + __X_____, + __X__X__, + __XXXX__, + __X__X__, + __X_____, + __X_____, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_71[13] = { /* code 71 */ + ________, + ________, + ___XXXX_, + __X____X, + _X______, + _X______, + _X______, + _X___XXX, + _X_____X, + __X____X, + ___XXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_72[13] = { /* code 72 */ + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __XXXXX_, + __X___X_, + __X___X_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_73[13] = { /* code 73 */ + ________, + ________, + __XXXXX_, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_74[13] = { /* code 74 */ + ________, + ________, + ___XXXX_, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + _X___X__, + _X___X__, + __XXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_75[13] = { /* code 75 */ + ________, + ________, + _XXX__XX, + __X___X_, + __X__X__, + __X__X__, + __X_X___, + __XXX___, + __X__X__, + __X___X_, + _XXX__XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_76[13] = { /* code 76 */ + ________, + ________, + _XXXXX__, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X___X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_77[13] = { /* code 77 */ + ________, + ________, + _XX___XX, + __X___X_, + __XX_XX_, + __XX_XX_, + __X_X_X_, + __X_X_X_, + __X___X_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_78[13] = { /* code 78 */ + ________, + ________, + _XX__XXX, + __X___X_, + __XX__X_, + __XX__X_, + __X_X_X_, + __X__XX_, + __X__XX_, + __X___X_, + _XXX__X_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_79[13] = { /* code 79 */ + ________, + ________, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_80[13] = { /* code 80 */ + ________, + ________, + _XXXXXX_, + __X____X, + __X____X, + __X____X, + __XXXXX_, + __X_____, + __X_____, + __X_____, + _XXXX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_81[13] = { /* code 81 */ + ________, + ________, + ___XXX__, + __X___X_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __X___X_, + ___XXX__, + ___XX_XX, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_82[13] = { /* code 82 */ + ________, + ________, + _XXXXXX_, + __X____X, + __X____X, + __X____X, + __XXXXX_, + __X__X__, + __X__X__, + __X___X_, + _XXX__XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_83[13] = { /* code 83 */ + ________, + ________, + __XXXXX_, + _X_____X, + _X______, + _X______, + __XXXXX_, + _______X, + _______X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_84[13] = { /* code 84 */ + ________, + ________, + _XXXXXXX, + _X__X__X, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_85[13] = { /* code 85 */ + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_86[13] = { /* code 86 */ + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ___X_X__, + ____X___, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_87[13] = { /* code 87 */ + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + __X___X_, + __X_X_X_, + __X_X_X_, + __X_X_X_, + ___X_X__, + ___X_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_88[13] = { /* code 88 */ + ________, + ________, + _XXX_XXX, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ___X_X__, + ___X_X__, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_89[13] = { /* code 89 */ + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ____X___, + ____X___, + ___XXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_90[13] = { /* code 90 */ + ________, + ________, + _XXXXXXX, + _X____X_, + _____X__, + _____X__, + ____X___, + ___X____, + ___X____, + __X____X, + _XXXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_91[13] = { /* code 91 */ + ________, + ________, + ___XXX__, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___XXX__}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_92[13] = { /* code 92 */ + ________, + ________, + ________, + _X______, + __X_____, + ___X____, + ____X___, + _____X__, + ______X_, + _______X, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_93[13] = { /* code 93 */ + ________, + ________, + ___XXX__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + ___XXX__}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_94[13] = { /* code 94 */ + ________, + ____X___, + ___X_X__, + __X___X_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_95[13] = { /* code 95 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_96[13] = { /* code 96 */ + ________, + ________, + ___X____, + ____X___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_97[13] = { /* code 97 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + __XXXX_X, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_98[13] = { /* code 98 */ + ________, + ________, + _XX_____, + __X_____, + __X_____, + __XXXXX_, + __X____X, + __X____X, + __X____X, + __X____X, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_99[13] = { /* code 99 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _X_____X, + _X______, + _X______, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_100[13] = { /* code 100 */ + ________, + ________, + _____XX_, + ______X_, + ______X_, + __XXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + __XXXXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_101[13] = { /* code 101 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _X_____X, + _XXXXXXX, + _X______, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_102[13] = { /* code 102 */ + ________, + ________, + ____XX__, + ___X____, + ___X____, + __XXXX__, + ___X____, + ___X____, + ___X____, + ___X____, + __XXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_103[13] = { /* code 103 */ + ________, + ________, + ________, + ________, + ________, + __XXXXXX, + _X____X_, + _X____X_, + _X____X_, + __XXXXX_, + ______X_, + ______X_, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_104[13] = { /* code 104 */ + ________, + ________, + _XX_____, + __X_____, + __X_____, + __X_XX__, + __XX__X_, + __X___X_, + __X___X_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_105[13] = { /* code 105 */ + ________, + ________, + ____X___, + ________, + ________, + __XXX___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_106[13] = { /* code 106 */ + ________, + ________, + _____X__, + ________, + ________, + __XXXX__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + _____X__, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_107[13] = { /* code 107 */ + ________, + ________, + _XX_____, + __X_____, + __X_____, + __X__XX_, + __X__X__, + __X_X___, + __XXX___, + __X__X__, + _XX___XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_108[13] = { /* code 108 */ + ________, + ________, + ___XX___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_109[13] = { /* code 109 */ + ________, + ________, + ________, + ________, + ________, + _XXX_X__, + __X_X_X_, + __X_X_X_, + __X_X_X_, + __X_X_X_, + _XX_X_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_110[13] = { /* code 110 */ + ________, + ________, + ________, + ________, + ________, + _XX_XX__, + __XX__X_, + __X___X_, + __X___X_, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_111[13] = { /* code 111 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _X_____X, + _X_____X, + _X_____X, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_112[13] = { /* code 112 */ + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + __X____X, + __X____X, + __X____X, + __X____X, + __XXXXX_, + __X_____, + _XXX____}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_113[13] = { /* code 113 */ + ________, + ________, + ________, + ________, + ________, + __XXXXXX, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + __XXXXX_, + ______X_, + _____XXX}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_114[13] = { /* code 114 */ + ________, + ________, + ________, + ________, + ________, + _XXX_XX_, + ___XX__X, + ___X____, + ___X____, + ___X____, + _XXXXX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_115[13] = { /* code 115 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _X_____X, + __XXX___, + _____XX_, + _X_____X, + __XXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_116[13] = { /* code 116 */ + ________, + ________, + ________, + ___X____, + ___X____, + __XXXX__, + ___X____, + ___X____, + ___X____, + ___X__X_, + ____XX__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_117[13] = { /* code 117 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + __X___X_, + __X___X_, + __X___X_, + __X__XX_, + ___XX_XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_118[13] = { /* code 118 */ + ________, + ________, + ________, + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_119[13] = { /* code 119 */ + ________, + ________, + ________, + ________, + ________, + _XXX_XXX, + __X___X_, + __X_X_X_, + __X_X_X_, + ___X_X__, + ___X_X__, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_120[13] = { /* code 120 */ + ________, + ________, + ________, + ________, + ________, + _XXX_XXX, + __X___X_, + ___XXX__, + ___XXX__, + __X___X_, + _XXX_XXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_121[13] = { /* code 121 */ + ________, + ________, + ________, + ________, + ________, + _XXX_XXX, + __X___X_, + __X___X_, + ___X_X__, + ___X_X__, + ____X___, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_122[13] = { /* code 122 */ + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _X___X__, + ____X___, + ___X____, + __X___X_, + _XXXXXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_123[13] = { /* code 123 */ + ________, + ________, + _____XX_, + ____X___, + ____X___, + ____X___, + ____X___, + __XX____, + ____X___, + ____X___, + ____X___, + ____X___, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_124[13] = { /* code 124 */ + ________, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___, + ____X___}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_125[13] = { /* code 125 */ + ________, + ________, + __XX____, + ____X___, + ____X___, + ____X___, + ____X___, + _____XX_, + ____X___, + ____X___, + ____X___, + ____X___, + __XX____}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_126[13] = { /* code 126 */ + ________, + ________, + ________, + __XX___X, + _X__X__X, + _X___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x13_ASCII_127[13] = { /* code 127 */ + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ________}; + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x13_ASCII[96] = { + { 8, 8, 1, acF8x13_ASCII_32 } /* code 32 */ + ,{ 8, 8, 1, acF8x13_ASCII_33 } /* code 33 */ + ,{ 8, 8, 1, acF8x13_ASCII_34 } /* code 34 */ + ,{ 8, 8, 1, acF8x13_ASCII_35 } /* code 35 */ + ,{ 8, 8, 1, acF8x13_ASCII_36 } /* code 36 */ + ,{ 8, 8, 1, acF8x13_ASCII_37 } /* code 37 */ + ,{ 8, 8, 1, acF8x13_ASCII_38 } /* code 38 */ + ,{ 8, 8, 1, acF8x13_ASCII_39 } /* code 39 */ + ,{ 8, 8, 1, acF8x13_ASCII_40 } /* code 40 */ + ,{ 8, 8, 1, acF8x13_ASCII_41 } /* code 41 */ + ,{ 8, 8, 1, acF8x13_ASCII_42 } /* code 42 */ + ,{ 8, 8, 1, acF8x13_ASCII_43 } /* code 43 */ + ,{ 8, 8, 1, acF8x13_ASCII_44 } /* code 44 */ + ,{ 8, 8, 1, acF8x13_ASCII_45 } /* code 45 */ + ,{ 8, 8, 1, acF8x13_ASCII_46 } /* code 46 */ + ,{ 8, 8, 1, acF8x13_ASCII_47 } /* code 47 */ + ,{ 8, 8, 1, acF8x13_ASCII_48 } /* code 48 */ + ,{ 8, 8, 1, acF8x13_ASCII_49 } /* code 49 */ + ,{ 8, 8, 1, acF8x13_ASCII_50 } /* code 50 */ + ,{ 8, 8, 1, acF8x13_ASCII_51 } /* code 51 */ + ,{ 8, 8, 1, acF8x13_ASCII_52 } /* code 52 */ + ,{ 8, 8, 1, acF8x13_ASCII_53 } /* code 53 */ + ,{ 8, 8, 1, acF8x13_ASCII_54 } /* code 54 */ + ,{ 8, 8, 1, acF8x13_ASCII_55 } /* code 55 */ + ,{ 8, 8, 1, acF8x13_ASCII_56 } /* code 56 */ + ,{ 8, 8, 1, acF8x13_ASCII_57 } /* code 57 */ + ,{ 8, 8, 1, acF8x13_ASCII_58 } /* code 58 */ + ,{ 8, 8, 1, acF8x13_ASCII_59 } /* code 59 */ + ,{ 8, 8, 1, acF8x13_ASCII_60 } /* code 60 */ + ,{ 8, 8, 1, acF8x13_ASCII_61 } /* code 61 */ + ,{ 8, 8, 1, acF8x13_ASCII_62 } /* code 62 */ + ,{ 8, 8, 1, acF8x13_ASCII_63 } /* code 63 */ + ,{ 8, 8, 1, acF8x13_ASCII_64 } /* code 64 */ + ,{ 8, 8, 1, acF8x13_ASCII_65 } /* code 65 */ + ,{ 8, 8, 1, acF8x13_ASCII_66 } /* code 66 */ + ,{ 8, 8, 1, acF8x13_ASCII_67 } /* code 67 */ + ,{ 8, 8, 1, acF8x13_ASCII_68 } /* code 68 */ + ,{ 8, 8, 1, acF8x13_ASCII_69 } /* code 69 */ + ,{ 8, 8, 1, acF8x13_ASCII_70 } /* code 70 */ + ,{ 8, 8, 1, acF8x13_ASCII_71 } /* code 71 */ + ,{ 8, 8, 1, acF8x13_ASCII_72 } /* code 72 */ + ,{ 8, 8, 1, acF8x13_ASCII_73 } /* code 73 */ + ,{ 8, 8, 1, acF8x13_ASCII_74 } /* code 74 */ + ,{ 8, 8, 1, acF8x13_ASCII_75 } /* code 75 */ + ,{ 8, 8, 1, acF8x13_ASCII_76 } /* code 76 */ + ,{ 8, 8, 1, acF8x13_ASCII_77 } /* code 77 */ + ,{ 8, 8, 1, acF8x13_ASCII_78 } /* code 78 */ + ,{ 8, 8, 1, acF8x13_ASCII_79 } /* code 79 */ + ,{ 8, 8, 1, acF8x13_ASCII_80 } /* code 80 */ + ,{ 8, 8, 1, acF8x13_ASCII_81 } /* code 81 */ + ,{ 8, 8, 1, acF8x13_ASCII_82 } /* code 82 */ + ,{ 8, 8, 1, acF8x13_ASCII_83 } /* code 83 */ + ,{ 8, 8, 1, acF8x13_ASCII_84 } /* code 84 */ + ,{ 8, 8, 1, acF8x13_ASCII_85 } /* code 85 */ + ,{ 8, 8, 1, acF8x13_ASCII_86 } /* code 86 */ + ,{ 8, 8, 1, acF8x13_ASCII_87 } /* code 87 */ + ,{ 8, 8, 1, acF8x13_ASCII_88 } /* code 88 */ + ,{ 8, 8, 1, acF8x13_ASCII_89 } /* code 89 */ + ,{ 8, 8, 1, acF8x13_ASCII_90 } /* code 90 */ + ,{ 8, 8, 1, acF8x13_ASCII_91 } /* code 91 */ + ,{ 8, 8, 1, acF8x13_ASCII_92 } /* code 92 */ + ,{ 8, 8, 1, acF8x13_ASCII_93 } /* code 93 */ + ,{ 8, 8, 1, acF8x13_ASCII_94 } /* code 94 */ + ,{ 8, 8, 1, acF8x13_ASCII_95 } /* code 95 */ + ,{ 8, 8, 1, acF8x13_ASCII_96 } /* code 96 */ + ,{ 8, 8, 1, acF8x13_ASCII_97 } /* code 97 */ + ,{ 8, 8, 1, acF8x13_ASCII_98 } /* code 98 */ + ,{ 8, 8, 1, acF8x13_ASCII_99 } /* code 99 */ + ,{ 8, 8, 1, acF8x13_ASCII_100 } /* code 100 */ + ,{ 8, 8, 1, acF8x13_ASCII_101 } /* code 101 */ + ,{ 8, 8, 1, acF8x13_ASCII_102 } /* code 102 */ + ,{ 8, 8, 1, acF8x13_ASCII_103 } /* code 103 */ + ,{ 8, 8, 1, acF8x13_ASCII_104 } /* code 104 */ + ,{ 8, 8, 1, acF8x13_ASCII_105 } /* code 105 */ + ,{ 8, 8, 1, acF8x13_ASCII_106 } /* code 106 */ + ,{ 8, 8, 1, acF8x13_ASCII_107 } /* code 107 */ + ,{ 8, 8, 1, acF8x13_ASCII_108 } /* code 108 */ + ,{ 8, 8, 1, acF8x13_ASCII_109 } /* code 109 */ + ,{ 8, 8, 1, acF8x13_ASCII_110 } /* code 110 */ + ,{ 8, 8, 1, acF8x13_ASCII_111 } /* code 111 */ + ,{ 8, 8, 1, acF8x13_ASCII_112 } /* code 112 */ + ,{ 8, 8, 1, acF8x13_ASCII_113 } /* code 113 */ + ,{ 8, 8, 1, acF8x13_ASCII_114 } /* code 114 */ + ,{ 8, 8, 1, acF8x13_ASCII_115 } /* code 115 */ + ,{ 8, 8, 1, acF8x13_ASCII_116 } /* code 116 */ + ,{ 8, 8, 1, acF8x13_ASCII_117 } /* code 117 */ + ,{ 8, 8, 1, acF8x13_ASCII_118 } /* code 118 */ + ,{ 8, 8, 1, acF8x13_ASCII_119 } /* code 119 */ + ,{ 8, 8, 1, acF8x13_ASCII_120 } /* code 120 */ + ,{ 8, 8, 1, acF8x13_ASCII_121 } /* code 121 */ + ,{ 8, 8, 1, acF8x13_ASCII_122 } /* code 122 */ + ,{ 8, 8, 1, acF8x13_ASCII_123 } /* code 123 */ + ,{ 8, 8, 1, acF8x13_ASCII_124 } /* code 124 */ + ,{ 8, 8, 1, acF8x13_ASCII_125 } /* code 125 */ + ,{ 8, 8, 1, acF8x13_ASCII_126 } /* code 126 */ + ,{ 8, 8, 1, acF8x13_ASCII_127 } /* code 127 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontPropF8x13_ASCII_1 = { + 32 /* first character */ + ,127 /* last character */ + ,GUI_CharInfoF8x13_ASCII /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x13_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,13 /* height of font */ + ,13 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontPropF8x13_ASCII_1} + , 11, 6, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F8x15B_1.c b/User/system/lib/lcd/gui/Font/F8x15B_1.c new file mode 100644 index 0000000..eef129b --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x15B_1.c @@ -0,0 +1,1777 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x15B.C +Purpose : Monospaced Bold Font similar to the fixed system font +Height : 15 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acF8x15B_1_160[15] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_161[15] = { /* code 161 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + __XXXX__, + __XXXX__, + __XXXX__, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_162[15] = { /* code 162 */ + ________, + ________, + ________, + ___XX___, + ___XX___, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + _XX__XX_, + __XXXX__, + ___XX___, + ___XX___, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_163[15] = { /* code 163 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + XXXXXX__, + _XX_____, + _XX_____, + XX______, + XXXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_164[15] = { /* code 164 */ + ________, + ________, + ________, + ________, + _XX__XX_, + __XXXX__, + _XX__XX_, + _XX__XX_, + __XXXX__, + _XX__XX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_165[15] = { /* code 165 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + _XXXXXX_, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_166[15] = { /* code 166 */ + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_167[15] = { /* code 167 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + __XXX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XXX__, + _____XX_, + _XX__XX_, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_168[15] = { /* code 168 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_169[15] = { /* code 169 */ + ________, + ________, + ________, + _XXXXXX_, + XX____XX, + X__XX__X, + X_X__X_X, + X_X____X, + X_X__X_X, + X__XX__X, + XX____XX, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_170[15] = { /* code 170 */ + ________, + ________, + ________, + __XXXX__, + _____XX_, + __XXXXX_, + _XX__XX_, + __XXXXX_, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_171[15] = { /* code 171 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX__XX, + _XX__XX_, + XX__XX__, + _XX__XX_, + __XX__XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_172[15] = { /* code 172 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _____XX_, + _____XX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_173[15] = { /* code 173 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_174[15] = { /* code 174 */ + ________, + ________, + ________, + _XXXXXX_, + XX____XX, + X_XXX__X, + X_X__X_X, + X_X__X_X, + X_XXX__X, + X_X__X_X, + XX____XX, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_175[15] = { /* code 175 */ + XXXXXXXX, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_176[15] = { /* code 176 */ + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_177[15] = { /* code 177 */ + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_178[15] = { /* code 178 */ + ________, + ________, + ________, + __XXX___, + ____XX__, + ___XX___, + __XX____, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_179[15] = { /* code 179 */ + ________, + ________, + ________, + __XXX___, + ____XX__, + ___XX___, + ____XX__, + __XXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_180[15] = { /* code 180 */ + ________, + ___XXX__, + ___XX___, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_181[15] = { /* code 181 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXX_XX, + _XX_____, + _XX_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_182[15] = { /* code 182 */ + ________, + ________, + ________, + ___XXXXX, + __XXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + __XXXXX_, + ___XXXX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_183[15] = { /* code 183 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_184[15] = { /* code 184 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ____XX__, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_185[15] = { /* code 185 */ + ________, + ________, + ________, + ___XX___, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_186[15] = { /* code 186 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_187[15] = { /* code 187 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX__XX__, + _XX__XX_, + __XX__XX, + _XX__XX_, + XX__XX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_188[15] = { /* code 188 */ + ________, + ________, + _XX_____, + XXX_____, + _XX___XX, + _XX__XX_, + _XX_XX__, + ___XX___, + __XX_XXX, + _XX_XXXX, + XX_XX_XX, + ___XXXXX, + ______XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_189[15] = { /* code 189 */ + ________, + ________, + _XX_____, + XXX_____, + _XX___XX, + _XX__XX_, + _XX_XX__, + ___XX___, + __XXXXX_, + _XX___XX, + XX___XX_, + ____XX__, + ____XXXX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_190[15] = { /* code 190 */ + ________, + ________, + XXX_____, + __XX____, + _XX___XX, + __XX_XX_, + XXX_XX__, + ___XX___, + __XX_XXX, + _XX_XXXX, + XX_XX_XX, + ___XXXXX, + ______XX, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_191[15] = { /* code 191 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + __XX____, + _XX__XX_, + _XX__XX_, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_192[15] = { /* code 192 */ + __XX____, + ___XX___, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_193[15] = { /* code 193 */ + ____XX__, + ___XX___, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_194[15] = { /* code 194 */ + __XXXX__, + _XX__XX_, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_195[15] = { /* code 195 */ + __XXX_XX, + _XX_XXX_, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_196[15] = { /* code 196 */ + _XX__XX_, + _XX__XX_, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_197[15] = { /* code 197 */ + __XXXX__, + _XX__XX_, + __XXXX__, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_198[15] = { /* code 198 */ + ________, + ________, + ________, + ____XXXX, + ___XXX__, + __XXXX__, + _XX_XX__, + _XX_XXXX, + _XXXXX__, + _XX_XX__, + _XX_XX__, + _XX_XXXX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_199[15] = { /* code 199 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ____XX__, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_200[15] = { /* code 200 */ + __XX____, + ___XX___, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_201[15] = { /* code 201 */ + ____XX__, + ___XX___, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_202[15] = { /* code 202 */ + __XXXX__, + _XX__XX_, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_203[15] = { /* code 203 */ + _XX__XX_, + _XX__XX_, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_204[15] = { /* code 204 */ + __XX____, + ___XX___, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_205[15] = { /* code 205 */ + ____XX__, + ___XX___, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_206[15] = { /* code 206 */ + __XXXX__, + _XX__XX_, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_207[15] = { /* code 207 */ + _XX__XX_, + _XX__XX_, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_208[15] = { /* code 208 */ + ________, + ________, + ________, + _XXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + XXXX_XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_209[15] = { /* code 209 */ + __XXX_XX, + _XX_XXX_, + ________, + _XX___XX, + _XX___XX, + _XXX__XX, + _XXXX_XX, + _XX_XXXX, + _XX__XXX, + _XX___XX, + _XX___XX, + _XX___XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_210[15] = { /* code 210 */ + __XX____, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_211[15] = { /* code 211 */ + ____XX__, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_212[15] = { /* code 212 */ + __XXXX__, + _XX__XX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_213[15] = { /* code 213 */ + __XXX_XX, + _XX_XXX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_214[15] = { /* code 214 */ + _XX__XX_, + _XX__XX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_215[15] = { /* code 215 */ + ________, + ________, + ________, + ________, + _X____X_, + _XX__XX_, + __XXXX__, + ___XX___, + __XXXX__, + _XX__XX_, + _X____X_, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_216[15] = { /* code 216 */ + ________, + ________, + ________, + __XXXXX_, + _XX__XX_, + _XX_XXX_, + _XX_XXX_, + _XXXXXX_, + _XXX_XX_, + _XXX_XX_, + _XX__XX_, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_217[15] = { /* code 217 */ + __XX____, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_218[15] = { /* code 218 */ + ____XX__, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_219[15] = { /* code 219 */ + __XXXX__, + _XX__XX_, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_220[15] = { /* code 220 */ + _XX__XX_, + _XX__XX_, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_221[15] = { /* code 221 */ + ____XX__, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_222[15] = { /* code 222 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_223[15] = { /* code 223 */ + ________, + ________, + ________, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_224[15] = { /* code 224 */ + ________, + _XXX____, + __XX____, + ___XX___, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_225[15] = { /* code 225 */ + ________, + ____XXX_, + ____XX__, + ___XX___, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_226[15] = { /* code 226 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_227[15] = { /* code 227 */ + ________, + _XXX___X, + XX_XX_XX, + X___XXX_, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_228[15] = { /* code 228 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_229[15] = { /* code 229 */ + ________, + __XXXX__, + _XX__XX_, + __XXXX__, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_230[15] = { /* code 230 */ + ________, + ________, + ________, + ________, + ________, + _XX_XXX_, + ___XX_XX, + ___XX_XX, + _XXXXXXX, + XX_XX___, + XX_XX___, + _XXX_XXX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_231[15] = { /* code 231 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + __XXXX__, + ___XX___, + ____XX__, + __XXX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_232[15] = { /* code 232 */ + ________, + _XXX____, + __XX____, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX_____, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_233[15] = { /* code 233 */ + ________, + ____XXX_, + ____XX__, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX_____, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_234[15] = { /* code 234 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX_____, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_235[15] = { /* code 235 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX_____, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_236[15] = { /* code 236 */ + ________, + _XXX____, + __XX____, + ___XX___, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_237[15] = { /* code 237 */ + ________, + ____XXX_, + ____XX__, + ___XX___, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_238[15] = { /* code 238 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_239[15] = { /* code 239 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_240[15] = { /* code 240 */ + ________, + ________, + ________, + __XX_XX_, + ___XX___, + _XX_XX__, + ___XXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_241[15] = { /* code 241 */ + ________, + _XXX___X, + XX_XX_XX, + X___XXX_, + ________, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_242[15] = { /* code 242 */ + ________, + _XXX____, + __XX____, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_243[15] = { /* code 243 */ + ________, + ____XXX_, + ____XX__, + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_244[15] = { /* code 244 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_245[15] = { /* code 245 */ + ________, + _XXX___X, + XX_XX_XX, + X___XXX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_246[15] = { /* code 246 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_247[15] = { /* code 247 */ + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + _XXXXXX_, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_248[15] = { /* code 248 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _XX__XX_, + _XX_XXX_, + _XXXXXX_, + _XXX_XX_, + _XX__XX_, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_249[15] = { /* code 249 */ + ________, + _XXX____, + __XX____, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_250[15] = { /* code 250 */ + ________, + ____XXX_, + ____XX__, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_251[15] = { /* code 251 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_252[15] = { /* code 252 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_253[15] = { /* code 253 */ + ________, + ____XXX_, + ____XX__, + ___XX___, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ____XX__, + ___XX___, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_254[15] = { /* code 254 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acF8x15B_1_255[15] = { /* code 255 */ + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ____XX__, + ___XX___, + XXXX____}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x15B_1[96] = { + { 8, 8, 1, acF8x15B_1_160 } /* code 160 */ + ,{ 8, 8, 1, acF8x15B_1_161 } /* code 161 */ + ,{ 8, 8, 1, acF8x15B_1_162 } /* code 162 */ + ,{ 8, 8, 1, acF8x15B_1_163 } /* code 163 */ + ,{ 8, 8, 1, acF8x15B_1_164 } /* code 164 */ + ,{ 8, 8, 1, acF8x15B_1_165 } /* code 165 */ + ,{ 8, 8, 1, acF8x15B_1_166 } /* code 166 */ + ,{ 8, 8, 1, acF8x15B_1_167 } /* code 167 */ + ,{ 8, 8, 1, acF8x15B_1_168 } /* code 168 */ + ,{ 8, 8, 1, acF8x15B_1_169 } /* code 169 */ + ,{ 8, 8, 1, acF8x15B_1_170 } /* code 170 */ + ,{ 8, 8, 1, acF8x15B_1_171 } /* code 171 */ + ,{ 8, 8, 1, acF8x15B_1_172 } /* code 172 */ + ,{ 8, 8, 1, acF8x15B_1_173 } /* code 173 */ + ,{ 8, 8, 1, acF8x15B_1_174 } /* code 174 */ + ,{ 8, 8, 1, acF8x15B_1_175 } /* code 175 */ + ,{ 8, 8, 1, acF8x15B_1_176 } /* code 176 */ + ,{ 8, 8, 1, acF8x15B_1_177 } /* code 177 */ + ,{ 8, 8, 1, acF8x15B_1_178 } /* code 178 */ + ,{ 8, 8, 1, acF8x15B_1_179 } /* code 179 */ + ,{ 8, 8, 1, acF8x15B_1_180 } /* code 180 */ + ,{ 8, 8, 1, acF8x15B_1_181 } /* code 181 */ + ,{ 8, 8, 1, acF8x15B_1_182 } /* code 182 */ + ,{ 8, 8, 1, acF8x15B_1_183 } /* code 183 */ + ,{ 8, 8, 1, acF8x15B_1_184 } /* code 184 */ + ,{ 8, 8, 1, acF8x15B_1_185 } /* code 185 */ + ,{ 8, 8, 1, acF8x15B_1_186 } /* code 186 */ + ,{ 8, 8, 1, acF8x15B_1_187 } /* code 187 */ + ,{ 8, 8, 1, acF8x15B_1_188 } /* code 188 */ + ,{ 8, 8, 1, acF8x15B_1_189 } /* code 189 */ + ,{ 8, 8, 1, acF8x15B_1_190 } /* code 190 */ + ,{ 8, 8, 1, acF8x15B_1_191 } /* code 191 */ + ,{ 8, 8, 1, acF8x15B_1_192 } /* code 192 */ + ,{ 8, 8, 1, acF8x15B_1_193 } /* code 193 */ + ,{ 8, 8, 1, acF8x15B_1_194 } /* code 194 */ + ,{ 8, 8, 1, acF8x15B_1_195 } /* code 195 */ + ,{ 8, 8, 1, acF8x15B_1_196 } /* code 196 */ + ,{ 8, 8, 1, acF8x15B_1_197 } /* code 197 */ + ,{ 8, 8, 1, acF8x15B_1_198 } /* code 198 */ + ,{ 8, 8, 1, acF8x15B_1_199 } /* code 199 */ + ,{ 8, 8, 1, acF8x15B_1_200 } /* code 200 */ + ,{ 8, 8, 1, acF8x15B_1_201 } /* code 201 */ + ,{ 8, 8, 1, acF8x15B_1_202 } /* code 202 */ + ,{ 8, 8, 1, acF8x15B_1_203 } /* code 203 */ + ,{ 8, 8, 1, acF8x15B_1_204 } /* code 204 */ + ,{ 8, 8, 1, acF8x15B_1_205 } /* code 205 */ + ,{ 8, 8, 1, acF8x15B_1_206 } /* code 206 */ + ,{ 8, 8, 1, acF8x15B_1_207 } /* code 207 */ + ,{ 8, 8, 1, acF8x15B_1_208 } /* code 208 */ + ,{ 8, 8, 1, acF8x15B_1_209 } /* code 209 */ + ,{ 8, 8, 1, acF8x15B_1_210 } /* code 210 */ + ,{ 8, 8, 1, acF8x15B_1_211 } /* code 211 */ + ,{ 8, 8, 1, acF8x15B_1_212 } /* code 212 */ + ,{ 8, 8, 1, acF8x15B_1_213 } /* code 213 */ + ,{ 8, 8, 1, acF8x15B_1_214 } /* code 214 */ + ,{ 8, 8, 1, acF8x15B_1_215 } /* code 215 */ + ,{ 8, 8, 1, acF8x15B_1_216 } /* code 216 */ + ,{ 8, 8, 1, acF8x15B_1_217 } /* code 217 */ + ,{ 8, 8, 1, acF8x15B_1_218 } /* code 218 */ + ,{ 8, 8, 1, acF8x15B_1_219 } /* code 219 */ + ,{ 8, 8, 1, acF8x15B_1_220 } /* code 220 */ + ,{ 8, 8, 1, acF8x15B_1_221 } /* code 221 */ + ,{ 8, 8, 1, acF8x15B_1_222 } /* code 222 */ + ,{ 8, 8, 1, acF8x15B_1_223 } /* code 223 */ + ,{ 8, 8, 1, acF8x15B_1_224 } /* code 224 */ + ,{ 8, 8, 1, acF8x15B_1_225 } /* code 225 */ + ,{ 8, 8, 1, acF8x15B_1_226 } /* code 226 */ + ,{ 8, 8, 1, acF8x15B_1_227 } /* code 227 */ + ,{ 8, 8, 1, acF8x15B_1_228 } /* code 228 */ + ,{ 8, 8, 1, acF8x15B_1_229 } /* code 229 */ + ,{ 8, 8, 1, acF8x15B_1_230 } /* code 230 */ + ,{ 8, 8, 1, acF8x15B_1_231 } /* code 231 */ + ,{ 8, 8, 1, acF8x15B_1_232 } /* code 232 */ + ,{ 8, 8, 1, acF8x15B_1_233 } /* code 233 */ + ,{ 8, 8, 1, acF8x15B_1_234 } /* code 234 */ + ,{ 8, 8, 1, acF8x15B_1_235 } /* code 235 */ + ,{ 8, 8, 1, acF8x15B_1_236 } /* code 236 */ + ,{ 8, 8, 1, acF8x15B_1_237 } /* code 237 */ + ,{ 8, 8, 1, acF8x15B_1_238 } /* code 238 */ + ,{ 8, 8, 1, acF8x15B_1_239 } /* code 239 */ + ,{ 8, 8, 1, acF8x15B_1_240 } /* code 240 */ + ,{ 8, 8, 1, acF8x15B_1_241 } /* code 241 */ + ,{ 8, 8, 1, acF8x15B_1_242 } /* code 242 */ + ,{ 8, 8, 1, acF8x15B_1_243 } /* code 243 */ + ,{ 8, 8, 1, acF8x15B_1_244 } /* code 244 */ + ,{ 8, 8, 1, acF8x15B_1_245 } /* code 245 */ + ,{ 8, 8, 1, acF8x15B_1_246 } /* code 246 */ + ,{ 8, 8, 1, acF8x15B_1_247 } /* code 247 */ + ,{ 8, 8, 1, acF8x15B_1_248 } /* code 248 */ + ,{ 8, 8, 1, acF8x15B_1_249 } /* code 249 */ + ,{ 8, 8, 1, acF8x15B_1_250 } /* code 250 */ + ,{ 8, 8, 1, acF8x15B_1_251 } /* code 251 */ + ,{ 8, 8, 1, acF8x15B_1_252 } /* code 252 */ + ,{ 8, 8, 1, acF8x15B_1_253 } /* code 253 */ + ,{ 8, 8, 1, acF8x15B_1_254 } /* code 254 */ + ,{ 8, 8, 1, acF8x15B_1_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontPropF8x15B_1_2 = { + 160 /* first character */ + ,255 /* last character */ + ,GUI_CharInfoF8x15B_1 /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontPropF8x15B_1_1 = { + 32 /* first character */ + ,127 /* last character */ + ,GUI_CharInfoF8x15B_ASCII /* address of first character */ + ,&GUI_FontPropF8x15B_1_2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x15B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,15 /* height of font */ + ,15 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontPropF8x15B_1_1} + , 12, 7, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F8x15B_ASCII.c b/User/system/lib/lcd/gui/Font/F8x15B_ASCII.c new file mode 100644 index 0000000..135ca92 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x15B_ASCII.c @@ -0,0 +1,1770 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x15B.C +Purpose : Monospaced Bold Font similar to the fixed system font +Height : 15 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_32[15] = { /* code 32 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_33[15] = { /* code 33 */ + ________, + ________, + ________, + ___XX___, + __XXXX__, + __XXXX__, + __XXXX__, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_34[15] = { /* code 34 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_35[15] = { /* code 35 */ + ________, + ________, + ________, + __XX_XX_, + __XX_XX_, + _XXXXXXX, + __XX_XX_, + __XX_XX_, + __XX_XX_, + _XXXXXXX, + __XX_XX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_36[15] = { /* code 36 */ + ________, + ___XX___, + ___XX___, + __XXXX__, + _XX__XX_, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ___XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_37[15] = { /* code 37 */ + ________, + ________, + _XXX____, + XX_XX___, + XX_XX_X_, + _XXX_XX_, + ____XX__, + ___XX___, + __XX____, + _XX_XXX_, + _X_XX_XX, + ___XX_XX, + ____XXX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_38[15] = { /* code 38 */ + ________, + ________, + ________, + __XXX___, + _XX_XX__, + _XX_XX__, + __XXX___, + _XX_____, + _XX_XXXX, + _XX__XX_, + _XX__XX_, + __XXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_39[15] = { /* code 39 */ + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_40[15] = { /* code 40 */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XX___, + ___XX___, + ____XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_41[15] = { /* code 41 */ + ________, + ________, + ________, + __XX____, + ___XX___, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_42[15] = { /* code 42 */ + ________, + ________, + ________, + ________, + ________, + __XX_XX_, + ___XXX__, + _XXXXXXX, + ___XXX__, + __XX_XX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_43[15] = { /* code 43 */ + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_44[15] = { /* code 44 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ____XX__, + ___XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_45[15] = { /* code 45 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_46[15] = { /* code 46 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_47[15] = { /* code 47 */ + ________, + ________, + ________, + _____XX_, + _____XX_, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + __XX____, + __XX____, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_48[15] = { /* code 48 */ + ________, + ________, + ________, + ___XXXX_, + __XX__XX, + __XX_XXX, + __XX_XXX, + __XX__XX, + __XXX_XX, + __XXX_XX, + __XX__XX, + ___XXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_49[15] = { /* code 49 */ + ________, + ________, + ________, + ____XX__, + ___XXX__, + _XXXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_50[15] = { /* code 50 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_51[15] = { /* code 51 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _____XX_, + ___XXX__, + _____XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_52[15] = { /* code 52 */ + ________, + ________, + ________, + __XX____, + __XX____, + __XX_XX_, + __XX_XX_, + __XX_XX_, + _XX__XX_, + _XXXXXXX, + _____XX_, + _____XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_53[15] = { /* code 53 */ + ________, + ________, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _____XX_, + _____XX_, + ____XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_54[15] = { /* code 54 */ + ________, + ________, + ________, + ___XXX__, + ___XX___, + __XX____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_55[15] = { /* code 55 */ + ________, + ________, + ________, + _XXXXXX_, + _____XX_, + ____XX__, + ____XX__, + ___XX___, + ___XX___, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_56[15] = { /* code 56 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXX_XX_, + __XXXX__, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_57[15] = { /* code 57 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ____XX__, + ___XX___, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_58[15] = { /* code 58 */ + ________, + ________, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_59[15] = { /* code 59 */ + ________, + ________, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ____XX__, + ___XX___, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_60[15] = { /* code 60 */ + ________, + ________, + ________, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_61[15] = { /* code 61 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_62[15] = { /* code 62 */ + ________, + ________, + ________, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_63[15] = { /* code 63 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + ____XX__, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_64[15] = { /* code 64 */ + ________, + ________, + ________, + _XXXXXX_, + XX____XX, + XX____XX, + XX__XXXX, + XX_XX_XX, + XX_XX_XX, + XX__XXXX, + XX______, + _XXXXXXX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_65[15] = { /* code 65 */ + ________, + ________, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_66[15] = { /* code 66 */ + ________, + ________, + ________, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_67[15] = { /* code 67 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_68[15] = { /* code 68 */ + ________, + ________, + ________, + _XXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_69[15] = { /* code 69 */ + ________, + ________, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_70[15] = { /* code 70 */ + ________, + ________, + ________, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_71[15] = { /* code 71 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX_____, + _XX_____, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_72[15] = { /* code 72 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_73[15] = { /* code 73 */ + ________, + ________, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_74[15] = { /* code 74 */ + ________, + ________, + ________, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_75[15] = { /* code 75 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX_XX__, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX_XX__, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_76[15] = { /* code 76 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_77[15] = { /* code 77 */ + ________, + ________, + ________, + _XX___XX, + _XX___XX, + _XXX_XXX, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + _XX___XX, + _XX___XX, + _XX___XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_78[15] = { /* code 78 */ + ________, + ________, + ________, + _XX___XX, + _XX___XX, + _XXX__XX, + _XXXX_XX, + _XX_XXXX, + _XX__XXX, + _XX___XX, + _XX___XX, + _XX___XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_79[15] = { /* code 79 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_80[15] = { /* code 80 */ + ________, + ________, + ________, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_81[15] = { /* code 81 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ____XX__, + _____XX_, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_82[15] = { /* code 82 */ + ________, + ________, + ________, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_83[15] = { /* code 83 */ + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_84[15] = { /* code 84 */ + ________, + ________, + ________, + _XXXXXX_, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_85[15] = { /* code 85 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_86[15] = { /* code 86 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_87[15] = { /* code 87 */ + ________, + ________, + ________, + _XX___XX, + _XX___XX, + _XX___XX, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + __XX_XX_, + __XX_XX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_88[15] = { /* code 88 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + __XX_X__, + ___XX___, + ___XX___, + __X_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_89[15] = { /* code 89 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_90[15] = { /* code 90 */ + ________, + ________, + ________, + _XXXXXX_, + _____XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_91[15] = { /* code 91 */ + ________, + ________, + ________, + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_92[15] = { /* code 92 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + __XX____, + __XX____, + ___XX___, + ___XX___, + ____XX__, + ____XX__, + _____XX_, + _____XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_93[15] = { /* code 93 */ + ________, + ________, + ________, + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_94[15] = { /* code 94 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_95[15] = { /* code 95 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_96[15] = { /* code 96 */ + ________, + __XXX___, + ___XX___, + ____XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_97[15] = { /* code 97 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_98[15] = { /* code 98 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_99[15] = { /* code 99 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_100[15] = { /* code 100 */ + ________, + ________, + ________, + _____XX_, + _____XX_, + __XXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_101[15] = { /* code 101 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XXXXXX_, + _XX_____, + _XX_____, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_102[15] = { /* code 102 */ + ________, + ________, + ________, + ___XXXX_, + __XX____, + __XX____, + __XX____, + _XXXXXX_, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_103[15] = { /* code 103 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + _____XX_, + _____XX_, + _XXXXX__}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_104[15] = { /* code 104 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_105[15] = { /* code 105 */ + ________, + ________, + ___XX___, + ___XX___, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_106[15] = { /* code 106 */ + ________, + ________, + ____XX__, + ____XX__, + ________, + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_107[15] = { /* code 107 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + _XX__XX_, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_108[15] = { /* code 108 */ + ________, + ________, + ________, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_109[15] = { /* code 109 */ + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + _XX___XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_110[15] = { /* code 110 */ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_111[15] = { /* code 111 */ + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_112[15] = { /* code 112 */ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_113[15] = { /* code 113 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + _____XX_, + _____XX_, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_114[15] = { /* code 114 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX_XXX_, + _XXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_115[15] = { /* code 115 */ + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _XX_____, + _XX_____, + __XXXX__, + _____XX_, + _____XX_, + _XXXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_116[15] = { /* code 116 */ + ________, + ________, + ________, + __XX____, + __XX____, + _XXXXXX_, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_117[15] = { /* code 117 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_118[15] = { /* code 118 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_119[15] = { /* code 119 */ + ________, + ________, + ________, + ________, + ________, + _XX___XX, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + _XX_X_XX, + __XX_XX_, + __XX_XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_120[15] = { /* code 120 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_121[15] = { /* code 121 */ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ____XX__, + ___XX___, + XXXX____}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_122[15] = { /* code 122 */ + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_123[15] = { /* code 123 */ + ________, + ________, + ________, + ____XX__, + ___XX___, + ___XX___, + ___XX___, + __XX____, + _XX_____, + __XX____, + ___XX___, + ___XX___, + ___XX___, + ____XX__, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_124[15] = { /* code 124 */ + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_125[15] = { /* code 125 */ + ________, + ________, + ________, + __XX____, + ___XX___, + ___XX___, + ___XX___, + ____XX__, + _____XX_, + ____XX__, + ___XX___, + ___XX___, + ___XX___, + __XX____, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_126[15] = { /* code 126 */ + ________, + ________, + ________, + _XXX___X, + XX_XX_XX, + X___XXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acF8x15B_ASCII_127[15] = { /* code 127 */ + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x15B_ASCII[96] = { + { 8, 8, 1, acF8x15B_ASCII_32 } /* code 32 */ + ,{ 8, 8, 1, acF8x15B_ASCII_33 } /* code 33 */ + ,{ 8, 8, 1, acF8x15B_ASCII_34 } /* code 34 */ + ,{ 8, 8, 1, acF8x15B_ASCII_35 } /* code 35 */ + ,{ 8, 8, 1, acF8x15B_ASCII_36 } /* code 36 */ + ,{ 8, 8, 1, acF8x15B_ASCII_37 } /* code 37 */ + ,{ 8, 8, 1, acF8x15B_ASCII_38 } /* code 38 */ + ,{ 8, 8, 1, acF8x15B_ASCII_39 } /* code 39 */ + ,{ 8, 8, 1, acF8x15B_ASCII_40 } /* code 40 */ + ,{ 8, 8, 1, acF8x15B_ASCII_41 } /* code 41 */ + ,{ 8, 8, 1, acF8x15B_ASCII_42 } /* code 42 */ + ,{ 8, 8, 1, acF8x15B_ASCII_43 } /* code 43 */ + ,{ 8, 8, 1, acF8x15B_ASCII_44 } /* code 44 */ + ,{ 8, 8, 1, acF8x15B_ASCII_45 } /* code 45 */ + ,{ 8, 8, 1, acF8x15B_ASCII_46 } /* code 46 */ + ,{ 8, 8, 1, acF8x15B_ASCII_47 } /* code 47 */ + ,{ 8, 8, 1, acF8x15B_ASCII_48 } /* code 48 */ + ,{ 8, 8, 1, acF8x15B_ASCII_49 } /* code 49 */ + ,{ 8, 8, 1, acF8x15B_ASCII_50 } /* code 50 */ + ,{ 8, 8, 1, acF8x15B_ASCII_51 } /* code 51 */ + ,{ 8, 8, 1, acF8x15B_ASCII_52 } /* code 52 */ + ,{ 8, 8, 1, acF8x15B_ASCII_53 } /* code 53 */ + ,{ 8, 8, 1, acF8x15B_ASCII_54 } /* code 54 */ + ,{ 8, 8, 1, acF8x15B_ASCII_55 } /* code 55 */ + ,{ 8, 8, 1, acF8x15B_ASCII_56 } /* code 56 */ + ,{ 8, 8, 1, acF8x15B_ASCII_57 } /* code 57 */ + ,{ 8, 8, 1, acF8x15B_ASCII_58 } /* code 58 */ + ,{ 8, 8, 1, acF8x15B_ASCII_59 } /* code 59 */ + ,{ 8, 8, 1, acF8x15B_ASCII_60 } /* code 60 */ + ,{ 8, 8, 1, acF8x15B_ASCII_61 } /* code 61 */ + ,{ 8, 8, 1, acF8x15B_ASCII_62 } /* code 62 */ + ,{ 8, 8, 1, acF8x15B_ASCII_63 } /* code 63 */ + ,{ 8, 8, 1, acF8x15B_ASCII_64 } /* code 64 */ + ,{ 8, 8, 1, acF8x15B_ASCII_65 } /* code 65 */ + ,{ 8, 8, 1, acF8x15B_ASCII_66 } /* code 66 */ + ,{ 8, 8, 1, acF8x15B_ASCII_67 } /* code 67 */ + ,{ 8, 8, 1, acF8x15B_ASCII_68 } /* code 68 */ + ,{ 8, 8, 1, acF8x15B_ASCII_69 } /* code 69 */ + ,{ 8, 8, 1, acF8x15B_ASCII_70 } /* code 70 */ + ,{ 8, 8, 1, acF8x15B_ASCII_71 } /* code 71 */ + ,{ 8, 8, 1, acF8x15B_ASCII_72 } /* code 72 */ + ,{ 8, 8, 1, acF8x15B_ASCII_73 } /* code 73 */ + ,{ 8, 8, 1, acF8x15B_ASCII_74 } /* code 74 */ + ,{ 8, 8, 1, acF8x15B_ASCII_75 } /* code 75 */ + ,{ 8, 8, 1, acF8x15B_ASCII_76 } /* code 76 */ + ,{ 8, 8, 1, acF8x15B_ASCII_77 } /* code 77 */ + ,{ 8, 8, 1, acF8x15B_ASCII_78 } /* code 78 */ + ,{ 8, 8, 1, acF8x15B_ASCII_79 } /* code 79 */ + ,{ 8, 8, 1, acF8x15B_ASCII_80 } /* code 80 */ + ,{ 8, 8, 1, acF8x15B_ASCII_81 } /* code 81 */ + ,{ 8, 8, 1, acF8x15B_ASCII_82 } /* code 82 */ + ,{ 8, 8, 1, acF8x15B_ASCII_83 } /* code 83 */ + ,{ 8, 8, 1, acF8x15B_ASCII_84 } /* code 84 */ + ,{ 8, 8, 1, acF8x15B_ASCII_85 } /* code 85 */ + ,{ 8, 8, 1, acF8x15B_ASCII_86 } /* code 86 */ + ,{ 8, 8, 1, acF8x15B_ASCII_87 } /* code 87 */ + ,{ 8, 8, 1, acF8x15B_ASCII_88 } /* code 88 */ + ,{ 8, 8, 1, acF8x15B_ASCII_89 } /* code 89 */ + ,{ 8, 8, 1, acF8x15B_ASCII_90 } /* code 90 */ + ,{ 8, 8, 1, acF8x15B_ASCII_91 } /* code 91 */ + ,{ 8, 8, 1, acF8x15B_ASCII_92 } /* code 92 */ + ,{ 8, 8, 1, acF8x15B_ASCII_93 } /* code 93 */ + ,{ 8, 8, 1, acF8x15B_ASCII_94 } /* code 94 */ + ,{ 8, 8, 1, acF8x15B_ASCII_95 } /* code 95 */ + ,{ 8, 8, 1, acF8x15B_ASCII_96 } /* code 96 */ + ,{ 8, 8, 1, acF8x15B_ASCII_97 } /* code 97 */ + ,{ 8, 8, 1, acF8x15B_ASCII_98 } /* code 98 */ + ,{ 8, 8, 1, acF8x15B_ASCII_99 } /* code 99 */ + ,{ 8, 8, 1, acF8x15B_ASCII_100 } /* code 100 */ + ,{ 8, 8, 1, acF8x15B_ASCII_101 } /* code 101 */ + ,{ 8, 8, 1, acF8x15B_ASCII_102 } /* code 102 */ + ,{ 8, 8, 1, acF8x15B_ASCII_103 } /* code 103 */ + ,{ 8, 8, 1, acF8x15B_ASCII_104 } /* code 104 */ + ,{ 8, 8, 1, acF8x15B_ASCII_105 } /* code 105 */ + ,{ 8, 8, 1, acF8x15B_ASCII_106 } /* code 106 */ + ,{ 8, 8, 1, acF8x15B_ASCII_107 } /* code 107 */ + ,{ 8, 8, 1, acF8x15B_ASCII_108 } /* code 108 */ + ,{ 8, 8, 1, acF8x15B_ASCII_109 } /* code 109 */ + ,{ 8, 8, 1, acF8x15B_ASCII_110 } /* code 110 */ + ,{ 8, 8, 1, acF8x15B_ASCII_111 } /* code 111 */ + ,{ 8, 8, 1, acF8x15B_ASCII_112 } /* code 112 */ + ,{ 8, 8, 1, acF8x15B_ASCII_113 } /* code 113 */ + ,{ 8, 8, 1, acF8x15B_ASCII_114 } /* code 114 */ + ,{ 8, 8, 1, acF8x15B_ASCII_115 } /* code 115 */ + ,{ 8, 8, 1, acF8x15B_ASCII_116 } /* code 116 */ + ,{ 8, 8, 1, acF8x15B_ASCII_117 } /* code 117 */ + ,{ 8, 8, 1, acF8x15B_ASCII_118 } /* code 118 */ + ,{ 8, 8, 1, acF8x15B_ASCII_119 } /* code 119 */ + ,{ 8, 8, 1, acF8x15B_ASCII_120 } /* code 120 */ + ,{ 8, 8, 1, acF8x15B_ASCII_121 } /* code 121 */ + ,{ 8, 8, 1, acF8x15B_ASCII_122 } /* code 122 */ + ,{ 8, 8, 1, acF8x15B_ASCII_123 } /* code 123 */ + ,{ 8, 8, 1, acF8x15B_ASCII_124 } /* code 124 */ + ,{ 8, 8, 1, acF8x15B_ASCII_125 } /* code 125 */ + ,{ 8, 8, 1, acF8x15B_ASCII_126 } /* code 126 */ + ,{ 8, 8, 1, acF8x15B_ASCII_127 } /* code 127 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontPropF8x15B_ASCII_1 = { + 32 /* first character */ + ,127 /* last character */ + ,GUI_CharInfoF8x15B_ASCII /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x15B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,15 /* height of font */ + ,15 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontPropF8x15B_ASCII_1} + , 12, 7, 9 +}; + diff --git a/User/system/lib/lcd/gui/Font/F8x16.c b/User/system/lib/lcd/gui/Font/F8x16.c new file mode 100644 index 0000000..43d413c --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x16.c @@ -0,0 +1,3321 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x16.C +Purpose : Implementation of 8x16 pixel font +Height : 16 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* ********************************* + * * + * Special character codes * + * * + ********************************* +*/ + +/* No 95 to 125 for European character set */ + +#define CODE_SACCAGUE 95 /* small accent ague */ +#define CODE_SACCGRAV 96 +#define CODE_SACCCIRC 97 +#define CODE_SUMLAUT 98 +#define CODE_STILDE 99 +#define CODE_I_NOPOINT 100 + +#define CODE_SHARPS 101 +#define CODE_A_RING 102 +#define CODE_SA_RING 103 +#define CODE_AE 104 +#define CODE_ETH 105 +#define CODE_THORN 106 +#define CODE_SMALLAE 107 +#define CODE_SMALLETH 108 +#define CODE_SMALLTHORN 109 +#define CODE_OSLASH 110 +#define CODE_SOSLASH 111 +#define CODE_LITTLE_A 112 +#define CODE_LITTLE_E 113 +#define CODE_LITTLE_I 114 +#define CODE_LITTLE_O 115 +#define CODE_LITTLE_U 116 +#define CODE_LITTLE_N 117 + +#define CODE_INVEXCLAM 118 +#define CODE_INVQUEST 119 + +#define CODE_CACCAGUE 120 /* capital accent ague */ +#define CODE_CACCGRAV 121 +#define CODE_CACCCIRC 122 +#define CODE_CUMLAUT 123 +#define CODE_CTILDE 124 +#define CODE_CEDILLA 125 + +/* No 126 to 156 for complete ISO 8859_1 western latin character set */ +#define CODE_NB_SPACE 126 +#define CODE_CENT 127 +#define CODE_POUND 128 +#define CODE_CURRENCY 129 +#define CODE_YEN 130 +#define CODE_BROKEN_BAR 131 +#define CODE_SECTION 132 +#define CODE_DIERESIS 133 +#define CODE_COPYRIGHT 134 +#define CODE_FEMININE 135 +#define CODE_LEFT_QUOTE 136 +#define CODE_NOT 137 +#define CODE_HYPHEN 138 +#define CODE_TRADEMARK 139 +#define CODE_MACRON 140 +#define CODE_DEGREE 141 +#define CODE_PLUS_MINUS 142 +#define CODE_SUPER_TWO 143 +#define CODE_SUPER_THREE 144 +#define CODE_ACUTE 145 +#define CODE_MICRO 146 +#define CODE_PARAGRAPH 147 +#define CODE_MIDDLE_DOT 148 +#define CODE_SUPER_ONE 149 +#define CODE_MASCULINE 150 +#define CODE_RIGHT_QUOTE 151 +#define CODE_ONE_FOURTH 152 +#define CODE_ONE_HALF 153 +#define CODE_THREE_FOURTH 154 +#define CODE_MULTIPLY 155 +#define CODE_DIVISION 156 +/* The following are extensions to ISO 8859-1 in the area which is not + defined by the standard. +*/ +#define CODE_ARROW_LEFT 157 +#define CODE_ARROW_RIGHT 158 +#define CODE_ARROW_UP 159 +#define CODE_ARROW_DOWN 160 +#define CODE_ENTER 161 +#define CODE_CHECKMARK 162 + + + + +GUI_CONST_STORAGE U8 acFont8x16[][16] = { + + + { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char ' ' */ + + ,{ + ________, + ________, + ___XX___, + __XXXX__, + __XXXX__, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________} /* char '!' */ + + ,{ + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __X__X__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char '"' */ + + ,{ + ________, + ________, + ________, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + ________, + ________, + ________, + ________} /* char '#' */ + + ,{ + ___XX___, + ___XX___, + _XXXXX__, + XX___XX_, + XX____X_, + XX______, + _XXXXX__, + _____XX_, + _____XX_, + X____XX_, + XX___XX_, + _XXXXX__, + ___XX___, + ___XX___, + ________, + ________} /* char '$' */ + + ,{ + ________, + ________, + ________, + ________, + XX____X_, + XX___XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX___XX_, + X____XX_, + ________, + ________, + ________, + ________} /* char '%' */ + + ,{ + ________, + ________, + __XXX___, + _XX_XX__, + _XX_XX__, + __XXX___, + _XXX_XX_, + XX_XXX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________, + ________, + ________} /* char '&' */ + + ,{ + ________, + __XX____, + __XX____, + __XX____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char ''' */ + + ,{ + ________, + ________, + ____XX__, + ___XX___, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XX___, + ____XX__, + ________, + ________, + ________, + ________} /* char '(' */ + + ,{ + ________, + ________, + __XX____, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ___XX___, + __XX____, + ________, + ________, + ________, + ________} /* char ')' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + __XXXX__, + XXXXXXXX, + __XXXX__, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________} /* char '*' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________} /* char '+' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + __XX____, + ________, + ________, + ________} /* char ',' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char '-' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________} /* char '.' */ + + ,{ + ________, + ________, + ________, + ________, + ______X_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + X_______, + ________, + ________, + ________, + ________} /* char '/' */ + + ,{ + ________, + ________, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________, + ________, + ________, + ________} /* char '0' */ + + ,{ + ________, + ________, + ___XX___, + __XXX___, + _XXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________, + ________, + ________, + ________} /* char '1' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + XX___XX_, + XXXXXXX_, + ________, + ________, + ________, + ________} /* char '2' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + _____XX_, + _____XX_, + __XXXX__, + _____XX_, + _____XX_, + _____XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char '3' */ + + ,{ + ________, + ________, + ____XX__, + ___XXX__, + __XXXX__, + _XX_XX__, + XX__XX__, + XXXXXXX_, + ____XX__, + ____XX__, + ____XX__, + ___XXXX_, + ________, + ________, + ________, + ________} /* char '4' */ + + ,{ + ________, + ________, + XXXXXXX_, + XX______, + XX______, + XX______, + XXXXXX__, + _____XX_, + _____XX_, + _____XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char '5' */ + + ,{ + ________, + ________, + __XXX___, + _XX_____, + XX______, + XX______, + XXXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char '6' */ + + ,{ + ________, + ________, + XXXXXXX_, + XX___XX_, + _____XX_, + _____XX_, + ____XX__, + ___XX___, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________} /* char '7' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char '8' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + _____XX_, + _____XX_, + _____XX_, + ____XX__, + _XXXX___, + ________, + ________, + ________, + ________} /* char '9' */ + + ,{ + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________} /* char ':' */ + + ,{ + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ___XX___, + ___XX___, + __XX____, + ________, + ________, + ________, + ________} /* char ';' */ + + ,{ + ________, + ________, + ________, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ________, + ________, + ________, + ________} /* char '<' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + ________, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char '=' */ + + ,{ + ________, + ________, + ________, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________, + ________, + ________, + ________} /* char '>' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + ____XX__, + ___XX___, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________} /* char '?' */ + + ,{ + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX_XXXX_, + XX_XXXX_, + XX_XXXX_, + XX_XXX__, + XX______, + _XXXXX__, + ________, + ________, + ________, + ________} /* char '@' */ + + ,{ + ________, + ________, + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'A' */ + + ,{ + ________, + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXXXXX__, + ________, + ________, + ________, + ________} /* char 'B' */ + + ,{ + ________, + ________, + __XXXX__, + _XX__XX_, + XX____X_, + XX______, + XX______, + XX______, + XX______, + XX____X_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________, + ________} /* char 'C' */ + + ,{ + ________, + ________, + XXXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + XXXXX___, + ________, + ________, + ________, + ________} /* char 'D' */ + + ,{ + ________, + ________, + XXXXXXX_, + _XX__XX_, + _XX___X_, + _XX_X___, + _XXXX___, + _XX_X___, + _XX_____, + _XX___X_, + _XX__XX_, + XXXXXXX_, + ________, + ________, + ________, + ________} /* char 'E' */ + + ,{ + ________, + ________, + XXXXXXX_, + _XX__XX_, + _XX___X_, + _XX_X___, + _XXXX___, + _XX_X___, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________, + ________, + ________} /* char 'F' */ + + ,{ + ________, + ________, + __XXXX__, + _XX__XX_, + XX____X_, + XX______, + XX______, + XX_XXXX_, + XX___XX_, + XX___XX_, + _XX__XX_, + __XXX_X_, + ________, + ________, + ________, + ________} /* char 'G' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'H' */ + + ,{ + ________, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} /* char 'I' */ + + ,{ + ________, + ________, + ___XXXX_, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________, + ________, + ________, + ________} /* char 'J' */ + + ,{ + ________, + ________, + XXX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________, + ________, + ________, + ________} /* char 'K' */ + + ,{ + ________, + ________, + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX___X_, + _XX__XX_, + XXXXXXX_, + ________, + ________, + ________, + ________} /* char 'L' */ + + ,{ + ________, + ________, + XX___XX_, + XXX_XXX_, + XXXXXXX_, + XXXXXXX_, + XX_X_XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'M' */ + + ,{ + ________, + ________, + XX___XX_, + XXX__XX_, + XXXX_XX_, + XXXXXXX_, + XX_XXXX_, + XX__XXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'N' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'O' */ + + ,{ + ________, + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________, + ________, + ________} /* char 'P' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_XXXX_, + _XXXXX__, + ____XX__, + ____XXX_, + ________, + ________} /* char 'Q' */ + + ,{ + ________, + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________, + ________, + ________, + ________} /* char 'R' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + _XX_____, + __XXX___, + ____XX__, + _____XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'S' */ + + ,{ + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _X_XX_X_, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} /* char 'T' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'U' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ___X____, + ________, + ________, + ________, + ________} /* char 'V' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XXXXXXX_, + XXX_XXX_, + _XX_XX__, + ________, + ________, + ________, + ________} /* char 'W' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + _XX_XX__, + _XXXXX__, + __XXX___, + __XXX___, + _XXXXX__, + _XX_XX__, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'X' */ + + ,{ + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} /* char 'Y' */ + + ,{ + ________, + ________, + XXXXXXX_, + XX___XX_, + X____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX____X_, + XX___XX_, + XXXXXXX_, + ________, + ________, + ________, + ________} /* char 'Z' */ + + ,{ + ________, + ________, + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__, + ________, + ________, + ________, + ________} /* char '[' */ + + ,{ + ________, + ________, + ________, + X_______, + XX______, + XXX_____, + _XXX____, + __XXX___, + ___XXX__, + ____XXX_, + _____XX_, + ______X_, + ________, + ________, + ________, + ________} /* char '\' */ + + ,{ + ________, + ________, + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + __XXXX__, + ________, + ________, + ________, + ________} /* char ']' */ + + ,{ + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char '^' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX, + ________, + ________} /* char '_' */ + + ,{ + ________, + __XX____, + ___XX___, + ____XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char '`' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________, + ________, + ________} /* char 'a' */ + + ,{ + ________, + ________, + XXX_____, + _XX_____, + _XX_____, + _XXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'b' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX______, + XX______, + XX______, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'c' */ + + ,{ + ________, + ________, + ___XXX__, + ____XX__, + ____XX__, + __XXXX__, + _XX_XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________, + ________, + ________} /* char 'd' */ + + ,{________, + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XXXXXXX_, + XX______, + XX______, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'e' */ + + ,{ + ________, + ________, + ___XXX__, + __XX_XX_, + __XX__X_, + __XX____, + _XXXX___, + __XX____, + __XX____, + __XX____, + __XX____, + _XXXX___, + ________, + ________, + ________, + ________} /* char 'f' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + XX__XX__, + _XXXX___, + ________} /* char 'g' */ + + ,{ + ________, + ________, + XXX_____, + _XX_____, + _XX_____, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________, + ________, + ________, + ________} /* char 'h' */ + + ,{ + ________, + ________, + ___XX___, + ___XX___, + ________, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} /* char 'i' */ + + ,{ + ________, + ________, + _____XX_, + _____XX_, + ________, + ____XXX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________} /* char 'j' */ + + ,{ + ________, + ________, + XXX_____, + _XX_____, + _XX_____, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XXXX___, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________, + ________, + ________, + ________} /* char 'k' */ + + ,{ + ________, + ________, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} /* char 'l' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XXX_XX__, + XXXXXXX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'm' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX_XXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________, + ________} /* char 'n' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 'o' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX_XXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + XXXX____, + ________} /* char 'p' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ____XX__, + ___XXXX_, + ________} /* char 'q' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX_XXX__, + _XXX_XX_, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________, + ________, + ________} /* char 'r' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + _XX_____, + __XXX___, + ____XX__, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char 's' */ + + ,{ + ________, + ________, + ___X____, + __XX____, + __XX____, + XXXXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX_XX_, + ___XXX__, + ________, + ________, + ________, + ________} /* char 't' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________, + ________, + ________} /* char 'u' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________, + ________, + ________, + ________} /* char 'v' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + XXXXXXX_, + _XX_XX__, + ________, + ________, + ________, + ________} /* char 'w' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX___XX_, + _XX_XX__, + __XXX___, + __XXX___, + __XXX___, + _XX_XX__, + XX___XX_, + ________, + ________, + ________, + ________} /* char 'x' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + _____XX_, + ____XX__, + XXXXX___, + ________} /* char 'y' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + XXXXXXX_, + XX__XX__, + ___XX___, + __XX____, + _XX_____, + XX___XX_, + XXXXXXX_, + ________, + ________, + ________, + ________} /* char 'z' */ + + ,{ + ________, + ________, + ____XXX_, + ___XX___, + ___XX___, + ___XX___, + _XXX____, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ____XXX_, + ________, + ________, + ________, + ________} /* char '{' */ + + ,{ + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________} /* char '|' */ + + ,{ + ________, + ________, + _XXX____, + ___XX___, + ___XX___, + ___XX___, + ____XXX_, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXX____, + ________, + ________, + ________, + ________} /* char '}' */ + + ,{ + ________, + _XXX_XX_, + XX_XXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char '~' */ + + +/* additional characters for European character set */ + +/* small accent ague, 95 */ + ,{ + ________, + ________, + ___XXX__, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* small accent grave, 96 */ + ,{ + ________, + ________, + _XXX____, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* small accent circonflex, 97 */ + ,{ + ________, + ___X____, + __XXX___, + _XX_XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* small umlaut, 98 */ + ,{ + ________, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* small tilde, 99 */ + ,{ + ________, + _XXX_XX_, + XX_XXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* i without dot, 100 */ + ,{ + ________, + ________, + ________, + ________, + ________, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} + +/* sharps eg , 101 */ + ,{ + ________, + ________, + __XXX___, + _XX_XX__, + _XX_XX__, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + _XX_____, + XX______, + ________, + ________} + +/* capital A with ring, 102 */ + ,{ + ___X____, + __X_X___, + ___X____, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} + +/* small a with ring, 103 */ + ,{ + ________, + __XX____, + _X__X___, + __XX____, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________, + ________, + ________, + ________} + +/* capital A diphtong, ligature, 104 */ + + ,{ + ________, + ________, + ___XXXX_, + _XXXX_X_, + XX_XX___, + XX_XX___, + XX_XX___, + XXXXXXX_, + XX_XX___, + XX_XX___, + XX_XX_X_, + XX_XXXX_, + ________, + ________, + ________, + ________} + +/* Icelandic eth, 105 */ + ,{ + ________, + ________, + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXXX_XX_, + XXXX_XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XXXXXX__, + ________, + ________, + ________, + ________} + +/* Icelandic Thorn, 106 */ + ,{ + ________, + ________, + XXXX____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + XXXX____, + ________, + ________, + ________, + ________} + +/* small a diphtong, ligature, 107 */ + ,{ + ________, + ________, + ________, + ________, + ________, + XX__XX__, + __XX__X_, + __XXXXX_, + _XXX____, + X_XX____, + X_XX__X_, + _XX_XX__, + ________, + ________, + ________, + ________} + +/* small Icelanic Eth, 108 */ + ,{ + ________, + ________, + XX_X____, + _XX_____, + X_XX____, + ___XX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} + +/* small Icelandic Thorn, 109 */ + ,{ + ________, + ________, + XXX_____, + _XX_____, + _XX_____, + _XXXX___, + _XX_XX__, + _XX_XX__, + _XXXX___, + _XX_____, + _XX_____, + XXXX____, + ________, + ________, + ________, + ________} + +/* capital O with slash, 110 */ + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX__XXX_, + XX__XXX_, + XX_X_XX_, + XX_X_XX_, + XXX__XX_, + XXX__XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} + +/* small o with slash, 111 */ + ,{ + ________, + ________, + ________, + ________, + ________, + __XXX_X_, + _X___X__, + XX__XXX_, + XX_X_XX_, + XXX__XX_, + _X___X__, + X_XXX___, + ________, + ________, + ________, + ________} + +/* Little capital A, 112 */ + ,{ + ________, + ________, + ________, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} + +/* Little capital E, 113 */ + ,{ + ________, + ________, + ________, + XXXXXXX_, + _XX__XX_, + _XX___X_, + _XX_X___, + _XXXX___, + _XX_X___, + _XX___X_, + _XX__XX_, + XXXXXXX_, + ________, + ________, + ________, + ________} + +/* Little capital I, 114 */ + ,{ + ________, + ________, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________, + ________, + ________, + ________} + +/* Little capital O, 115 */ + ,{ + ________, + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} + +/* Little capital U, 116 */ + ,{ + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} + +/* Little capital N, 117 */ + ,{ + ________, + ________, + ________, + XX___XX_, + XXX__XX_, + XXXX_XX_, + XXXXXXX_, + XX_XXXX_, + XX__XXX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________} + +/* inverted exclamation mark, 118 */ + ,{ + ________, + ________, + ___XX___, + ___XX___, + ________, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + __XXXX__, + __XXXX__, + ___XX___, + ________, + ________, + ________, + ________} /* char inv '!' */ + +/* inverted question mark, 119 */ + ,{ + ________, + ________, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + __XX____, + _XX_____, + XX___XX_, + XX___XX_, + _XXXXX__, + ________, + ________, + ________, + ________} /* char '?' */ + +/* capital accent ague, 120 */ + ,{ + ___XXX__, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* capital accent grave, 121 */ + ,{ + _XXX____, + ___XX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* capital accent circonflex, 122 */ + ,{ + __XXX___, + _XX_XX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* capital umlaut, 123 */ + ,{ + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* capital tilde, 124 */ + ,{ + _XXX_XX_, + XX_XXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* cedilla, 125 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + __XX____, + ________, + ________} + + + +/* additional characters for complete ISO 8859-1 character set */ + +/* Non breaking space, ISO-Code: 160, internal code: 126 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* cent sign, ISO-Code: 162, internal code: 127 */ + ,{ + ________, + ________, + ________, + ___X____, + ___X____, + _XXXXX__, + XX_X____, + XX_X____, + XX_X____, + XX_X____, + XX_X_XX_, + _XXXXX__, + ___X____, + ___X____, + ________, + ________} /* char 'c' */ + + +/* pound sterling, ISO-Code: 163, internal code: 128 */ + ,{ + ________, + ________, + ___XXX__, + __XX____, + __XX____, + __XX____, + _XXXX___, + __XX____, + __XX____, + __XX____, + __XX__X_, + _X_XXX__, + ________, + ________, + ________, + ________} + +/* general currency sign, ISO-Code: 164, internal code: 129 */ + ,{ + ________, + ________, + ________, + ________, + _X____X_, + __XXXX__, + __X__X__, + __X__X__, + __XXXX__, + _X____X_, + ________, + ________, + ________, + ________, + ________, + ________} + +/* yen sign, ISO-Code: 165, internal code: 130 */ + ,{ + ________, + ________, + _XX__XX_, + __XXXX__, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________} + +/* broken vertical bar, ISO-Code: 166, internal code: 131 */ + ,{ + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________} + +/* section sign, ISO-Code: 167, internal code: 132 */ + ,{ + ________, + ________, + __XXXX__, + _XX__X__, + _XX_____, + __XXX___, + _X___X__, + _X___X__, + __XXX___, + ____XX__, + _X__XX__, + _XXXX___, + ________, + ________, + ________, + ________} + +/* umlaut (dieresis), ISO-Code: 168, internal code: 133 */ + ,{ + ________, + XX___XX_, + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* copyright, ISO-Code: 169, internal code: 134 */ + ,{ + ________, + ________, + ________, + ________, + _XXXXXX_, + _X____X_, + _X_XX_X_, + _X_XXXX_, + _X_XX_X_, + _X____X_, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________} + +/* feminine ordinal, ISO-Code: 170, internal code: 135 */ + ,{ + ________, + ________, + _XXX____, + ____X___, + _XXXX___, + X___X___, + X___X___, + _XXX_X__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* left angle quote, ISO-Code: 172, internal code: 136 */ + ,{ + ________, + ________, + ________, + ________, + ________, + __XX_XX_, + _XX_XX__, + XX_XX___, + _XX_XX__, + __XX_XX_, + ________, + ________, + ________, + ________, + ________, + ________} + +/* not sign, ISO-Code: 173, internal code: 137 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXX__, + _____X__, + _____X__, + ________, + ________, + ________, + ________, + ________, + ________} + +/* soft hyphen, ISO-Code: 173, internal code: 138 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* rgistered trademark, ISO-Code: 174, internal code: 139 */ + ,{ + ________, + ________, + ________, + ________, + _XXXXX__, + _X___X__, + _X_X_X__, + _X___X__, + _X__XX__, + _X_X_X__, + _XXXXX__, + ________, + ________, + ________, + ________, + ________} + +/* macron accent, ISO-Code: 175, internal code: 140 */ + ,{ + XXXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* degree sign, ISO-Code: 176, internal code: 141 */ + ,{ + ________, + _XXX____, + XX_XX___, + X___X___, + XX_XX___, + _XXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* plus or minus, ISO-Code: 177, internal code: 142 */ + ,{ + ________, + ________, + ________, + ________, + ___X____, + ___X____, + _XXXXX__, + ___X____, + ___X____, + ________, + _XXXXX__, + ________, + ________, + ________, + ________, + ________} + +/* superscript two, ISO-Code: 178, internal code: 143 */ + ,{ + _XXXX___, + X___XX__, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XXXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* superscript three, ISO-Code: 179, internal code: 144 */ + ,{ + _XXXX___, + X___XX__, + ____XX__, + _XXXX___, + ____XX__, + X___XX__, + _XXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* acute accent, ISO-Code: 180, internal code: 145 */ + ,{ + ________, + ____XXX_, + ___XX___, + __X_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* micro sign, ISO-Code: 181, internal code: 146 */ + ,{ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + XX______, + ________} + +/* paragraph sign, ISO-Code: 182, internal code: 147 */ + ,{ + ________, + ________, + _XXXXXX_, + XX_X_X__, + XX_X_X__, + XX_X_X__, + _XXX_X__, + ___X_X__, + ___X_X__, + ___X_X__, + ___X_X__, + __XXXXX_, + ________, + ________, + ________, + ________} + +/* middle dot, ISO-Code: 183, internal code: 148 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* superscript one, ISO-Code: 185, internal code: 149 */ + ,{ + _XX_____, + XXX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + XXXX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* masculine ordinal, ISO-Code: 186, internal code: 150 */ + ,{ + ________, + ________, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + +/* right angle quote, ISO-Code: 187, internal code: 151 */ + ,{ + ________, + ________, + ________, + ________, + ________, + XX_XX___, + _XX_XX__, + __XX_XX_, + _XX_XX__, + XX_XX___, + ________, + ________, + ________, + ________, + ________, + ________} + +/* fraction one-fourth, ISO-Code: 188, internal code: 152 */ + ,{ + ________, + ________, + _X______, + XX______, + _X___X__, + _X__X___, + ___X____, + __X__X__, + _X__XX__, + X__X_X__, + ___XXXX_, + _____X__, + ________, + ________, + ________, + ________} + +/* fraction one-half, ISO-Code: 189, internal code: 153 */ + ,{ + ________, + ________, + _X______, + XX______, + _X___X__, + _X__X___, + ___X____, + __X_XX__, + _X_X__X_, + X____X__, + ____X___, + ___XXXX_, + ________, + ________, + ________, + ________} + +/* fraction three-fourth, ISO-Code: 190, internal code: 154 */ + ,{ + ________, + ________, + XX______, + __X_____, + _X___X__, + __X_X___, + XX_X____, + __X__X__, + _X__XX__, + X__X_X__, + ___XXXX_, + _____X__, + ________, + ________, + ________, + ________} + +/* multiply sign, ISO-Code: 215, internal code: 155 */ + ,{ + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + __XXXX__, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________} + +/* division sign, ISO-Code: 247, internal code: 156 */ + ,{ + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + _XXXXXX_, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________, + ________} + + /* left arrow, ISO-Code: ---, internal code: 157 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ____X___, + ___XX___, + __XXX___, + _XXXXXXX, + XXXXXXXX, + _XXXXXXX, + __XXX___, + ___XX___, + ____X___, + ________, + ________} + + /* right arrow, ISO-Code: ---, internal code: 158 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ___X____, + ___XX___, + ___XXX__, + XXXXXXX_, + XXXXXXXX, + XXXXXXX_, + ___XXX__, + ___XX___, + ___X____, + ________, + ________} + + /* up arrow, ISO-Code: ---, internal code: 159 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ___X____, + __XXX___, + _XXXXX__, + XXXXXXX_, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + ________, + ________} + + /* down arrow, ISO-Code: ---, internal code: 160 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + __XXX___, + __XXX___, + __XXX___, + XXXXXXX_, + _XXXXX__, + __XXX___, + ___X____, + ________, + ________} + + /* down arrow, ISO-Code: ---, internal code: 161 */ + ,{ + ________, + ________, + ________, + _____XX_, + _____XX_, + _____XX_, + _____XX_, + ___X_XX_, + __XX_XX_, + _XXXXXX_, + XXXXXXX_, + _XXXXX__, + __XX____, + ___X____, + ________, + ________} + + /* down arrow, ISO-Code: ---, internal code: 162 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ______XX, + ______XX, + _____XX_, + _____XX_, + ____XX__, + XX__XX__, + _XXXX___, + __XXX___, + ________, + ________} + +}; + + + +/* + ********************************* + * * + * Font selection * + * * + ********************************* +*/ + +GUI_CONST_STORAGE GUI_FONT_TRANSLIST TransList8x16[] = { +/* + The folowing are extensions to ISO 8859-1. + Since ISO 8859-1 does not define any characters for the codes + 128 - 159, this area can be used by an application. + The most commonly used symbols in embedded applications are + therefor inserted here. +*/ + {CODE_ARROW_LEFT,-1}, /* 144, arrow left */ + {CODE_ARROW_RIGHT,-1}, /* 145, arrow right */ + {CODE_ARROW_UP,-1}, /* 146, arrow up */ + {CODE_ARROW_DOWN,-1}, /* 147, arrow down */ + {CODE_ENTER,-1}, /* 148, enter symbol */ + {CODE_CHECKMARK,-1}, /* 149, checkmark symbol */ + {-1,-1}, /* 150, unused symbol */ + {-1,-1}, /* 151, unused symbol */ + {-1,-1}, /* 152, unused symbol */ + {-1,-1}, /* 153, unused symbol */ + {-1,-1}, /* 154, unused symbol */ + {-1,-1}, /* 155, unused symbol */ + {-1,-1}, /* 156, unused symbol */ + {-1,-1}, /* 157, unused symbol */ + {-1,-1}, /* 158, unused symbol */ + {-1,-1}, /* 159, unused symbol */ +/* starting at character code 160 are the characters defined + by ISO 8859-1 +*/ + {CODE_NB_SPACE,-1}, /* 160, non-breaking space */ + {CODE_INVEXCLAM,-1}, /* 161, inverted exclamation sign */ + {CODE_CENT,-1}, /* 162, cent sign */ + {CODE_POUND,-1}, /* 163, pound sterling */ + {CODE_CURRENCY,-1}, /* 164, general currency sign */ + {CODE_YEN,-1}, /* 165, yen sign */ + {CODE_BROKEN_BAR,-1}, /* 166, broken vertical bar */ + {CODE_SECTION,-1}, /* 167, section sign */ + {CODE_DIERESIS,-1}, /* 168, umlaut */ + {CODE_COPYRIGHT,-1}, /* 169, copyright */ + {CODE_FEMININE,-1}, /* 170, */ + {CODE_LEFT_QUOTE,-1}, /* 171, */ + {CODE_NOT,-1}, /* 172, */ + {CODE_HYPHEN,-1}, /* 173, */ + {CODE_TRADEMARK,-1}, /* 174, */ + {CODE_MACRON,-1}, /* 175, */ + {CODE_DEGREE,-1}, /* 176, */ + {CODE_PLUS_MINUS,-1}, /* 177, */ + {CODE_SUPER_TWO,-1}, /* 178, */ + {CODE_SUPER_THREE,-1}, /* 179, */ + {CODE_ACUTE,-1}, /* 180, */ + {CODE_MICRO,-1}, /* 181, */ + {CODE_PARAGRAPH,-1}, /* 182, */ + {CODE_MIDDLE_DOT,-1}, /* 183, */ + {CODE_CEDILLA,-1}, /* 184, */ + {CODE_SUPER_ONE,-1}, /* 185, */ + {CODE_MASCULINE,-1}, /* 186, */ + {CODE_RIGHT_QUOTE,-1}, /* 187, */ + {CODE_ONE_FOURTH,-1}, /* 188, */ + {CODE_ONE_HALF,-1}, /* 189, */ + {CODE_THREE_FOURTH,-1}, /* 190, */ + {CODE_INVQUEST,-1}, /* 191, */ + {CODE_LITTLE_A,CODE_CACCGRAV}, /* 192, */ + {CODE_LITTLE_A,CODE_CACCAGUE}, /* 193, */ + {CODE_LITTLE_A,CODE_CACCCIRC}, /* 194, */ + {CODE_LITTLE_A,CODE_CTILDE}, /* 195, */ + {CODE_LITTLE_A,CODE_CUMLAUT}, /* 196, */ + {CODE_A_RING,-1}, /* 197, */ + {CODE_AE,-1}, /* 198, */ + {'C'-32,CODE_CEDILLA}, /* 199, */ + {CODE_LITTLE_E,CODE_CACCGRAV}, /* 200, */ + {CODE_LITTLE_E,CODE_CACCAGUE}, /* 201, */ + {CODE_LITTLE_E,CODE_CACCCIRC}, /* 202, */ + {CODE_LITTLE_E,CODE_CUMLAUT}, /* 203, */ + {CODE_LITTLE_I,CODE_CACCGRAV}, /* 204, */ + {CODE_LITTLE_I,CODE_CACCAGUE}, /* 205, */ + {CODE_LITTLE_I,CODE_CACCCIRC}, /* 206, */ + {CODE_LITTLE_I,CODE_CUMLAUT}, /* 207, */ + {CODE_ETH,-1}, /* 208, */ + {CODE_LITTLE_N,CODE_CTILDE}, /* 209, */ + {CODE_LITTLE_O,CODE_CACCGRAV}, /* 210, */ + {CODE_LITTLE_O,CODE_CACCAGUE}, /* 211, */ + {CODE_LITTLE_O,CODE_CACCCIRC}, /* 212, */ + {CODE_LITTLE_O,CODE_CTILDE}, /* 213, */ + {CODE_LITTLE_O,CODE_CUMLAUT}, /* 214, */ + {CODE_MULTIPLY,-1}, /* 215, */ + {CODE_OSLASH,-1}, /* 216, */ + {CODE_LITTLE_U,CODE_CACCGRAV}, /* 217, */ + {CODE_LITTLE_U,CODE_CACCAGUE}, /* 218, */ + {CODE_LITTLE_U,CODE_CACCCIRC}, /* 219, */ + {CODE_LITTLE_U,CODE_CUMLAUT}, /* 220, */ + {'Y'-32,CODE_CACCAGUE}, /* 221, */ + {CODE_THORN,-1}, /* 222, */ + {CODE_SHARPS,-1}, /* 223, */ + {'a'-32,CODE_SACCGRAV}, /* 224, */ + {'a'-32,CODE_SACCAGUE}, /* 225, */ + {'a'-32,CODE_SACCCIRC}, /* 226, */ + {'a'-32,CODE_STILDE}, /* 227, */ + {'a'-32,CODE_SUMLAUT}, /* 228, */ + {CODE_SA_RING,-1}, /* 229, */ + {CODE_SMALLAE,-1}, /* 230, */ + {'c'-32,CODE_CEDILLA}, /* 231, */ + {'e'-32,CODE_SACCGRAV}, /* 232, */ + {'e'-32,CODE_SACCAGUE}, /* 233, */ + {'e'-32,CODE_SACCCIRC}, /* 234, */ + {'e'-32,CODE_SUMLAUT}, /* 235, */ + {CODE_I_NOPOINT,CODE_SACCGRAV}, /* 236, */ + {CODE_I_NOPOINT,CODE_SACCAGUE}, /* 237, */ + {CODE_I_NOPOINT,CODE_SACCCIRC}, /* 238, */ + {CODE_I_NOPOINT,CODE_SUMLAUT}, /* 239, */ + {CODE_SMALLETH,-1}, /* 240, small eth, Icelandic */ + {'n'-32,CODE_STILDE}, /* 241, small n, tilde */ + {'o'-32,CODE_SACCGRAV}, /* 242, small o, grave accent */ + {'o'-32,CODE_SACCAGUE}, /* 243, small o, acute accent */ + {'o'-32,CODE_SACCCIRC}, /* 244, small o, circumflex */ + {'o'-32,CODE_STILDE}, /* 245, small o, tilde */ + {'o'-32,CODE_SUMLAUT}, /* 246, small o, umlaut */ + {CODE_DIVISION,-1}, /* 247, division sign */ + {CODE_SOSLASH,-1}, /* 248, small o slash */ + {'u'-32,CODE_SACCAGUE}, /* 249, */ + {'u'-32,CODE_SACCGRAV}, /* 250, */ + {'u'-32,CODE_SACCCIRC}, /* 251, */ + {'u'-32,CODE_SUMLAUT}, /* 252, small u, umlaut */ + {'y'-32,CODE_SACCAGUE}, /* 253, small y, acute accent */ + {CODE_SMALLTHORN,-1}, /* 254, small thorn, Icelandic */ + {'y'-32,CODE_SUMLAUT}, /* 255, */ +}; + + +GUI_CONST_STORAGE GUI_FONT_TRANSINFO TransInfo8x16 = { + 144 /* FirstChar */ + ,255 /* LastChar */ + ,TransList8x16 /* const GUI_FONT_TRANSLIST* pList */ +}; + +GUI_CONST_STORAGE GUI_FONT_MONO FontMono8x16 = { + acFont8x16[0], + acFont8x16[0], + &TransInfo8x16, + 32, /* FirstChar */ + 127, /* LastChar */ + 8, /* XSize */ + 8, /* XDist */ + 1 /* BytesPerLine */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x16 = { GUI_FONTTYPE_MONO, 16, 16, 1, 1 , {&FontMono8x16}, 12, 7, 10}; +GUI_CONST_STORAGE GUI_FONT GUI_Font8x17 = { GUI_FONTTYPE_MONO, 16, 17, 1, 1 , {&FontMono8x16}, 12, 7, 10}; +GUI_CONST_STORAGE GUI_FONT GUI_Font8x18 = { GUI_FONTTYPE_MONO, 16, 18, 1, 1 , {&FontMono8x16}, 12, 7, 10}; + + +/* ********************************* + * * + * Magnified fonts * + * * + ********************************* + + The following are the definitions for magnified fonts. If magnified fonts + are not used, they can be erased. +*/ + +static GUI_CONST_STORAGE GUI_FONT_MONO FontMono8x16x2 = { + acFont8x16[0], + acFont8x16[0], + &TransInfo8x16, + 32, /* FirstChar */ + 127, /* LastChar */ + 8, /* XSize */ + 2*8, /* XDist */ + 1 /* BytesPerLine */ +}; + +static GUI_CONST_STORAGE GUI_FONT_MONO FontMono8x16x3 = { + acFont8x16[0], + acFont8x16[0], + &TransInfo8x16, + 32, /* FirstChar */ + 127, /* LastChar */ + 8, /* XSize */ + 3*8, /* XDist */ + 1 /* BytesPerLine */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x16x1x2 = { GUI_FONTTYPE_MONO, 16, 2*16, 1, 2 , {&FontMono8x16}, 12, 7, 10 }; +GUI_CONST_STORAGE GUI_FONT GUI_Font8x16x2x2 = { GUI_FONTTYPE_MONO, 16, 2*16, 2, 2 , {&FontMono8x16x2}, 12, 7, 10 }; +GUI_CONST_STORAGE GUI_FONT GUI_Font8x16x3x3 = { GUI_FONTTYPE_MONO, 16, 3*16, 3, 3 , {&FontMono8x16x3}, 12, 7, 10 }; + + diff --git a/User/system/lib/lcd/gui/Font/F8x8.c b/User/system/lib/lcd/gui/Font/F8x8.c new file mode 100644 index 0000000..0f61d95 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/F8x8.c @@ -0,0 +1,2057 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F8x8.C +Purpose : Implementation of 8x8 pixel font +Height : 8 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +/* ********************************* + * * + * Special character codes * + * * + ********************************* +*/ + +/* No 95 to 125 for European character set */ + +#define CODE_SACCAGUE 95 /* small accent ague */ +#define CODE_SACCGRAV 96 +#define CODE_SACCCIRC 97 +#define CODE_SUMLAUT 98 +#define CODE_STILDE 99 +#define CODE_I_NOPOINT 100 + +#define CODE_SHARPS 101 +#define CODE_A_RING 102 +#define CODE_SA_RING 103 +#define CODE_AE 104 +#define CODE_ETH 105 +#define CODE_THORN 106 +#define CODE_SMALLAE 107 +#define CODE_SMALLETH 108 +#define CODE_SMALLTHORN 109 +#define CODE_OSLASH 110 +#define CODE_SOSLASH 111 +#define CODE_LITTLE_A 112 +#define CODE_LITTLE_E 113 +#define CODE_LITTLE_I 114 +#define CODE_LITTLE_O 115 +#define CODE_LITTLE_U 116 +#define CODE_LITTLE_N 117 + +#define CODE_INVEXCLAM 118 +#define CODE_INVQUEST 119 + +#define CODE_CACCAGUE 120 /* capital accent ague */ +#define CODE_CACCGRAV 121 +#define CODE_CACCCIRC 122 +#define CODE_CUMLAUT 123 +#define CODE_CTILDE 124 +#define CODE_CEDILLA 125 + +/* No 126 to 156 for complete ISO 8859_1 western latin character set */ +#define CODE_NB_SPACE 126 +#define CODE_CENT 127 +#define CODE_POUND 128 +#define CODE_CURRENCY 129 +#define CODE_YEN 130 +#define CODE_BROKEN_BAR 131 +#define CODE_SECTION 132 +#define CODE_DIERESIS 133 +#define CODE_COPYRIGHT 134 +#define CODE_FEMININE 135 +#define CODE_LEFT_QUOTE 136 +#define CODE_NOT 137 +#define CODE_HYPHEN 138 +#define CODE_TRADEMARK 139 +#define CODE_MACRON 140 +#define CODE_DEGREE 141 +#define CODE_PLUS_MINUS 142 +#define CODE_SUPER_TWO 143 +#define CODE_SUPER_THREE 144 +#define CODE_ACUTE 145 +#define CODE_MICRO 146 +#define CODE_PARAGRAPH 147 +#define CODE_MIDDLE_DOT 148 +#define CODE_SUPER_ONE 149 +#define CODE_MASCULINE 150 +#define CODE_RIGHT_QUOTE 151 +#define CODE_ONE_FOURTH 152 +#define CODE_ONE_HALF 153 +#define CODE_THREE_FOURTH 154 +#define CODE_MULTIPLY 155 +#define CODE_DIVISION 156 +/* The following are extensions to ISO 8859-1 in the area which is not + defined by the standard. +*/ +#define CODE_ARROW_LEFT 157 +#define CODE_ARROW_RIGHT 158 +#define CODE_ARROW_UP 159 +#define CODE_ARROW_DOWN 160 +#define CODE_ENTER 161 +#define CODE_CHECKMARK 162 + + + + + +/* + **************************************************************** + * * + * 8 * 8 font * + * * + **************************************************************** +*/ + + +GUI_CONST_STORAGE unsigned char GUI_F8x8_acFont[][8] = { + + { + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} /* char ' ' */ + + ,{ + ___XX___, + __XXXX__, + __XXXX__, + ___XX___, + ___XX___, + ________, + ___XX___, + ________} /* char '!' */ + + ,{ + _XX__XX_, + _XX__XX_, + __X__X__, + ________, + ________, + ________, + ________, + ________} /* char '"' */ + + ,{ + _XX_XX__, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + XXXXXXX_, + _XX_XX__, + _XX_XX__, + ________} /* char '#' */ + + ,{ + ___XX___, + __XXXXX_, + _XX_____, + __XXXX__, + _____XX_, + _XXXXX__, + ___XX___, + ________} /* char '$' */ + + ,{ + ________, + XX___XX_, + XX__XX__, + ___XX___, + __XX____, + _XX__XX_, + XX___XX_, + ________} /* char '%' */ + + ,{ + __XXX___, + _XX_XX__, + __XXX___, + _XXX_XX_, + XX_XXX__, + XX__XX__, + _XXX_XX_, + ________} /* char '&' */ + + ,{ + ___XX___, + ___XX___, + __XX____, + ________, + ________, + ________, + ________, + ________} /* char ''' */ + + ,{ + ____XX__, + ___XX___, + __XX____, + __XX____, + __XX____, + ___XX___, + ____XX__, + ________} /* char '(' */ + + ,{ + __XX____, + ___XX___, + ____XX__, + ____XX__, + ____XX__, + ___XX___, + __XX____, + ________} /* char ')' */ + + ,{ + ________, + _XX__XX_, + __XXXX__, + XXXXXXXX, + __XXXX__, + _XX__XX_, + ________, + ________} /* char '*' */ + + ,{ + ________, + ___XX___, + ___XX___, + _XXXXXX_, + ___XX___, + ___XX___, + ________, + ________} /* char '+' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + __XX____} /* char ',' */ + + ,{ + ________, + ________, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________} /* char '-' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ________} /* char '.' */ + + ,{ + _____XX_, + ____XX__, + ___XX___, + __XX____, + _XX_____, + XX______, + X_______, + ________} /* char '/' */ + + ,{ + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________} /* char '0' */ + + ,{ + ___XX___, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + ________} /* char '1' */ + + ,{ + _XXXXX__, + XX___XX_, + _____XX_, + ___XXX__, + __XX____, + _XX__XX_, + XXXXXXX_, + ________} /* char '2' */ + + ,{ + _XXXXX__, + XX___XX_, + _____XX_, + __XXXX__, + _____XX_, + XX___XX_, + _XXXXX__, + ________} /* char '3' */ + + ,{ + ___XXX__, + __XXXX__, + _XX_XX__, + XX__XX__, + XXXXXXX_, + ____XX__, + ___XXXX_, + ________} /* char '4' */ + + ,{ + XXXXXXX_, + XX______, + XX______, + XXXXXX__, + _____XX_, + XX___XX_, + _XXXXX__, + ________} /* char '5' */ + + ,{ + __XXX___, + _XX_____, + XX______, + XXXXXX__, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} /* char '6' */ + + ,{ + XXXXXXX_, + XX___XX_, + ____XX__, + ___XX___, + __XX____, + __XX____, + __XX____, + ________} /* char '7' */ + + ,{ + _XXXXX__, + XX___XX_, + XX___XX_, + _XXXXX__, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} /* char '8' */ + + ,{ + _XXXXX__, + XX___XX_, + XX___XX_, + _XXXXXX_, + _____XX_, + ____XX__, + _XXXX___, + ________} /* char '9' */ + + ,{ + ________, + ___XX___, + ___XX___, + ________, + ________, + ___XX___, + ___XX___, + ________} /* char ':' */ + + ,{ + ________, + ___XX___, + ___XX___, + ________, + ________, + ___XX___, + ___XX___, + __XX____} /* char ';' */ + + ,{ + _____XX_, + ____XX__, + ___XX___, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ________} /* char '<' */ + + ,{ + ________, + ________, + _XXXXXX_, + ________, + ________, + _XXXXXX_, + ________, + ________} /* char '=' */ + + ,{ + _XX_____, + __XX____, + ___XX___, + ____XX__, + ___XX___, + __XX____, + _XX_____, + ________} /* char '>' */ + + ,{ + _XXXXX__, + XX___XX_, + ____XX__, + ___XX___, + ___XX___, + ________, + ___XX___, + ________} /* char '?' */ + + ,{ + _XXXXX__, + XX___XX_, + XX_XXXX_, + XX_XXXX_, + XX_XXXX_, + XX______, + _XXXX___, + ________} /* char '@' */ + + ,{ + __XXX___, + _XX_XX__, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________} /* char 'A' */ + + ,{ + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX__XX_, + _XX__XX_, + XXXXXX__, + ________} /* char 'B' */ + + ,{ + __XXXX__, + _XX__XX_, + XX______, + XX______, + XX______, + _XX__XX_, + __XXXX__, + ________} /* char 'C' */ + + ,{ + XXXXX___, + _XX_XX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX_XX__, + XXXXX___, + ________} /* char 'D' */ + + ,{ + XXXXXXX_, + _XX___X_, + _XX_X___, + _XXXX___, + _XX_X___, + _XX___X_, + XXXXXXX_, + ________} /* char 'E' */ + + ,{ + XXXXXXX_, + _XX___X_, + _XX_X___, + _XXXX___, + _XX_X___, + _XX_____, + XXXX____, + ________} /* char 'F' */ + + ,{ + __XXXX__, + _XX__XX_, + XX______, + XX______, + XX__XXX_, + _XX__XX_, + __XXX_X_, + ________} /* char 'G' */ + + ,{ + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________} /* char 'H' */ + + ,{ + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________} /* char 'I' */ + + ,{ + ___XXXX_, + ____XX__, + ____XX__, + ____XX__, + XX__XX__, + XX__XX__, + _XXXX___, + ________} /* char 'J' */ + + ,{ + XXX__XX_, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________} /* char 'K' */ + + ,{ + XXXX____, + _XX_____, + _XX_____, + _XX_____, + _XX___X_, + _XX__XX_, + XXXXXXX_, + ________} /* char 'L' */ + + ,{ + XX___XX_, + XXX_XXX_, + XXXXXXX_, + XXXXXXX_, + XX_X_XX_, + XX___XX_, + XX___XX_, + ________} /* char 'M' */ + + ,{ + XX___XX_, + XXX__XX_, + XXXX_XX_, + XX_XXXX_, + XX__XXX_, + XX___XX_, + XX___XX_, + ________} /* char 'N' */ + + ,{ + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} /* char 'O' */ + + ,{ + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + _XX_____, + XXXX____, + ________} /* char 'P' */ + + ,{ + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + _XXXXX__, + ____XXX_} /* char 'Q' */ + + ,{ + XXXXXX__, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_XX__, + _XX__XX_, + XXX__XX_, + ________} /* char 'R' */ + + ,{ + __XXXX__, + _XX__XX_, + __XX____, + ___XX___, + ____XX__, + _XX__XX_, + __XXXX__, + ________} /* char 'S' */ + + ,{ + _XXXXXX_, + _XXXXXX_, + _X_XX_X_, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________} /* char 'T' */ + + ,{ + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} /* char 'U' */ + + ,{ + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________} /* char 'V' */ + + ,{ + XX___XX_, + XX___XX_, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + XXXXXXX_, + _XX_XX__, + ________} /* char 'W' */ + + ,{ + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + _XX_XX__, + XX___XX_, + XX___XX_, + ________} /* char 'X' */ + + ,{ + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ___XX___, + ___XX___, + __XXXX__, + ________} /* char 'Y' */ + + ,{ + XXXXXXX_, + XX___XX_, + X___XX__, + ___XX___, + __XX__X_, + _XX__XX_, + XXXXXXX_, + ________} /* char 'Z' */ + + ,{ + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__, + ________} /* char '[' */ + + ,{ + XX______, + _XX_____, + __XX____, + ___XX___, + ____XX__, + _____XX_, + ______X_, + ________} /* char '\' */ + + ,{ + __XXXX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + ____XX__, + __XXXX__, + ________} /* char ']' */ + + ,{ + ___X____, + __XXX___, + _XX_XX__, + XX___XX_, + ________, + ________, + ________, + ________} /* char '^' */ + + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XXXXXXXX} /* char '_' */ + + ,{ + __XX____, + ___XX___, + ____XX__, + ________, + ________, + ________, + ________, + ________} /* char '`' */ + + ,{ + ________, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + _XXX_XX_, + ________} /* char 'a' */ + + ,{ + XXX_____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + XX_XXX__, + ________} /* char 'b' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX______, + XX___XX_, + _XXXXX__, + ________} /* char 'c' */ + + ,{ + ___XXX__, + ____XX__, + _XXXXX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________} /* char 'd' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XXXXXXX_, + XX______, + _XXXXX__, + ________} /* char 'e' */ + + ,{ + __XXXX__, + _XX__XX_, + _XX_____, + XXXXX___, + _XX_____, + _XX_____, + XXXX____, + ________} /* char 'f' */ + + ,{ + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + XXXXX___} /* char 'g' */ + + ,{ + XXX_____, + _XX_____, + _XX_XX__, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + XXX__XX_, + ________} /* char 'h' */ + + ,{ + ___XX___, + ________, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________} /* char 'i' */ + + ,{ + _____XX_, + ________, + _____XX_, + _____XX_, + _____XX_, + _XX__XX_, + _XX__XX_, + __XXXX__} /* char 'j' */ + + ,{ + XXX_____, + _XX_____, + _XX__XX_, + _XX_XX__, + _XXXX___, + _XX_XX__, + XXX__XX_, + ________} /* char 'k' */ + + ,{ + __XXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________} /* char 'l' */ + + ,{ + ________, + ________, + XXX_XX__, + XXXXXXX_, + XX_X_XX_, + XX_X_XX_, + XX_X_XX_, + ________} /* char 'm' */ + + ,{ + ________, + ________, + XX_XXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________} /* char 'n' */ + + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} /* char 'o' */ + + ,{ + ________, + ________, + XX_XXX__, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + XXXX____} /* char 'p' */ + + ,{ + ________, + ________, + _XXX_XX_, + XX__XX__, + XX__XX__, + _XXXXX__, + ____XX__, + ___XXXX_} /* char 'q' */ + + ,{ + ________, + ________, + XX_XXX__, + _XXX_XX_, + _XX_____, + _XX_____, + XXXX____, + ________} /* char 'r' */ + + ,{ + ________, + ________, + _XXXXXX_, + XX______, + _XXXXX__, + _____XX_, + XXXXXX__, + ________} /* char 's' */ + + ,{ + __XX____, + __XX____, + XXXXXX__, + __XX____, + __XX____, + __XX_XX_, + ___XXX__, + ________} /* char 't' */ + + ,{ + ________, + ________, + XX__XX__, + XX__XX__, + XX__XX__, + XX__XX__, + _XXX_XX_, + ________} /* char 'u' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + _XX_XX__, + __XXX___, + ________} /* char 'v' */ + + ,{ + ________, + ________, + XX___XX_, + XX_X_XX_, + XX_X_XX_, + XXXXXXX_, + _XX_XX__, + ________} /* char 'w' */ + + ,{ + ________, + ________, + XX___XX_, + _XX_XX__, + __XXX___, + _XX_XX__, + XX___XX_, + ________} /* char 'x' */ + + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + _____XX_, + XXXXXX__} /* char 'y' */ + + ,{ + ________, + ________, + _XXXXXX_, + _X__XX__, + ___XX___, + __XX__X_, + _XXXXXX_, + ________} /* char 'z' */ + + ,{ + ____XXX_, + ___XX___, + ___XX___, + _XXX____, + ___XX___, + ___XX___, + ____XXX_, + ________} /* char '{' */ + + ,{ + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________} /* char '|' */ + + ,{ + _XXX____, + ___XX___, + ___XX___, + ____XXX_, + ___XX___, + ___XX___, + _XXX____, + ________} /* char '}' */ + + ,{ + _XXX_XX_, + XX_XXX__, + ________, + ________, + ________, + ________, + ________, + ________} /* char '~' */ + + + +/* additional characters for European character set */ + +/* small accent ague, 95 */ + ,{ + ____XX__, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________} + + /* small accent grave, 96 */ + ,{ + _XX_____, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________} + + +/* small accent circonflex, 97 */ + ,{ + _XXXXX__, + X_____X_, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* small umlaut, 98 */ + ,{ + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* small tilde, 99 */ + ,{ + _XXX__X_, + X___XX__, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* i without dot, 100 */ + ,{ + ________, + ________, + __XXX___, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________} + + + /* sharps eg , 101 */ + ,{ + __XXX___, + _XX_XX__, + _XX_XX__, + _XXXX___, + _XX__XX_, + _XX__XX_, + _XX_XX__, + XX______} + + + /* capital A with ring, 102 */ + ,{ + ___XX___, + ________, + __XXXX__, + _XX__XX_, + _XXXXXX_, + _XX__XX_, + _XX__XX_, + ________} + + + /* small a with ring, 103 */ + ,{ + __XX____, + ________, + _XXXX___, + ____XX__, + _XXXXX__, + XX__XX__, + _XXX_XX_, + ________} + + + + /* capital A diphtong, ligature, 104 */ + ,{ + ___XXXX_, + _XXXX___, + X__XX___, + X__XXXX_, + XXXXX___, + X__XX___, + X__XXXX_, + ________} + + + /* Icelandic eth, 105 */ + ,{ + _XXXXX__, + _XX__XX_, + _XX__XX_, + XXXX_XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + ________} + + + /* Icelandic Thorn, 106 */ + ,{ + XXXX____, + _XX_____, + _XXXXX__, + _XX__XX_, + _XX__XX_, + _XXXXX__, + _XX_____, + XXXX____} + + + /* small a diphtong, ligature, 107 */ + ,{ + ________, + ________, + XX__XX__, + __XX__X_, + _XXXXXX_, + X_XX____, + XXX_XX__, + ________} + + + /* small Icelanic Eth, 108 */ + ,{ + _XX_X___, + __XX____, + _X_XX___, + ____XX__, + _XXXXXX_, + XX___XX_, + _XXXXX__, + ________} + + + /* small Icelandic Thorn, 109 */ + ,{ + _XXX____, + __XX____, + __XXXX__, + __XX_XX_, + __XXXX__, + __XX____, + _XXXX___, + ________} + + + /* capital O with slash, 110 */ + ,{ + __XXX_X_, + _XX_XX__, + XX__XXX_, + XX_X_XX_, + XXX__XX_, + _XX_XX__, + X_XXX___, + ________} + + + /* small o with slash, 111 */ + ,{ + ________, + ______X_, + _XXXXX__, + XX__XXX_, + XX_X_XX_, + XXX__XX_, + _XXXXX__, + X_______} + + + /* Little capital A, 112 */ + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XXXXXXX_, + XX___XX_, + XX___XX_, + ________} + + + /* Little capital E, 113 */ + ,{ + ________, + ________, + XXXXXXX_, + _XX_____, + _XXXXX__, + _XX_____, + XXXXXXX_, + ________} + + + /* Little capital I, 114 */ + ,{ + ________, + ________, + __XXXX__, + ___XX___, + ___XX___, + ___XX___, + __XXXX__, + ________} + + + /* Little capital O, 115 */ + ,{ + ________, + ________, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} + + + /* Little capital U, 116 */ + ,{ + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + ________} + + + /* Little capital N, 117 */ + ,{ + ________, + ________, + XXX__XX_, + XXXX_XX_, + XX_XXXX_, + XX__XXX_, + XX___XX_, + ________} + + + /* inverted exclamation, 118 */ + + ,{ + ___XX___, + ________, + ___XX___, + ___XX___, + __XXXX__, + __XXXX__, + ___XX___, + ________} + + + /* inverted question mark, 119 */ + ,{ + __XX____, + ________, + __XX____, + __XX____, + _XX_____, + XX___XX_, + _XXXXX__, + ________} + + + /* capital accent ague, 120 */ + + ,{ + ____XX__, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* capital accent grave, 121 */ + ,{ + _XX_____, + ___X____, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* capital accent circonflex, 122 */ + ,{ + __XXX___, + _X___X__, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* capital umlaut, 123 */ + ,{ + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* capital tilde, 124 */ + ,{ + _XXX__X_, + X___XX__, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* cedilla, 125 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___X____} + + + +/* additional characters for complete ISO 8859-1 character set */ + +/* Non breaking space, ISO-Code: 160, internal code: 126 */ + ,{ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* cent sign, ISO-Code: 162, internal code: 127 */ + ,{ + ________, + ___X____, + _XXXXX__, + XX_X____, + XX_X____, + XX_X_XX_, + _XXXXX__, + ___X____} /* char 'c' */ + + + /* pound sterling, ISO-Code: 163, internal code: 128 */ + ,{ + ___XXX__, + __XX____, + __XX____, + _XXXX___, + __XX____, + __XX__X_, + _X_XXX__, + ________} + + + /* general currency sign, ISO-Code: 164, internal code: 129 */ + ,{ + ________, + ________, + _X___X__, + __XXX___, + __X_X___, + __XXX___, + _X___X__, + ________} + + + /* yen sign, ISO-Code: 165, internal code: 130 */ + ,{ + _X___X__, + __X_X___, + _XXXXX__, + ___X____, + _XXXXX__, + ___X____, + ___X____, + ________} + + + + /* broken vertical bar, ISO-Code: 166, internal code: 131 */ + ,{ + __XX____, + __XX____, + __XX____, + ________, + __XX____, + __XX____, + __XX____, + ________} + + + /* section sign, ISO-Code: 167, internal code: 132 */ + ,{ + __XXX___, + _X______, + __XX____, + _X__X___, + __XX____, + ____X___, + _XXX____, + ________} + + + /* umlaut (dieresis), ISO-Code: 168, internal code: 133 */ + ,{ + XX___XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* copyright, ISO-Code: 169, internal code: 134 */ + ,{ + _XXXXXX_, + _X____X_, + _X_XX_X_, + _X_XXXX_, + _X_XX_X_, + _X____X_, + _XXXXXX_, + ________} + + + /* feminine ordinal, ISO-Code: 170, internal code: 135 */ + ,{ + __XXX___, + _____X__, + __XXXX__, + _X___X__, + __XXX___, + ________, + ________, + ________} + + + /* left angle quote, ISO-Code: 172, internal code: 136 */ + ,{ + ________, + __XX_XX_, + _XX_XX__, + XX_XX___, + _XX_XX__, + __XX_XX_, + ________, + ________} + + + /* not sign, ISO-Code: 173, internal code: 137 */ + ,{ + ________, + ________, + ________, + _XXXXX__, + _____X__, + _____X__, + ________, + ________} + + + /* soft hyphen, ISO-Code: 173, internal code: 138 */ + ,{ + ________, + ________, + ________, + _XXXXX__, + ________, + ________, + ________, + ________} + + + /* rgistered trademark, ISO-Code: 174, internal code: 139 */ + ,{ + _XXXXX__, + _X___X__, + _X_X_X__, + _X___X__, + _X__XX__, + _X_X_X__, + _XXXXX__, + ________} + + + /* macron accent, ISO-Code: 175, internal code: 140 */ + ,{ + _XXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________} + + + /* degree sign, ISO-Code: 176, internal code: 141 */ + ,{ + __XX____, + _X__X___, + __XX____, + ________, + ________, + ________, + ________, + ________} + + + /* plus or minus, ISO-Code: 177, internal code: 142 */ + ,{ + ___X____, + ___X____, + _XXXXX__, + ___X____, + ___X____, + ________, + _XXXXX__, + ________} + + + /* superscript two, ISO-Code: 178, internal code: 143 */ + ,{ + _XX_____, + X__X____, + __X_____, + _X______, + XXXX____, + ________, + ________, + ________} + + + /* superscript three, ISO-Code: 179, internal code: 144 */ + ,{ + XXX_____, + ___X____, + _XX_____, + ___X____, + XXX_____, + ________, + ________, + ________} + + + /* acute accent, ISO-Code: 180, internal code: 145 */ + ,{ + ____XXX_, + ___XX___, + __X_____, + ________, + ________, + ________, + ________, + ________} + + + /* micro sign, ISO-Code: 181, internal code: 146 */ + ,{ + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XXXXX__, + XX______} + + + /* paragraph sign, ISO-Code: 182, internal code: 147 */ + ,{ + _XXXXXX_, + XX_X_X__, + XX_X_X__, + _XXX_X__, + ___X_X__, + ___X_X__, + __XXXXX_, + ________} + + + /* middle dot, ISO-Code: 183, internal code: 148 */ + ,{ + ________, + ________, + ________, + ___XX___, + ___XX___, + ________, + ________, + ________} + + + /* superscript one, ISO-Code: 185, internal code: 149 */ + ,{ + _X______, + XX______, + _X______, + _X______, + XXX_____, + ________, + ________, + ________} + + + /* masculine ordinal, ISO-Code: 186, internal code: 150 */ + ,{ + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXX__, + ________, + ________, + ________} + + + /* right angle quote, ISO-Code: 187, internal code: 151 */ + ,{ + ________, + XX_XX___, + _XX_XX__, + __XX_XX_, + _XX_XX__, + XX_XX___, + ________, + ________} + + + /* fraction one-fourth, ISO-Code: 188, internal code: 152 */ + ,{ + X____X__, + X___X___, + X__X____, + X_X__X__, + _X__XX__, + X__X_X__, + ___XXXX_, + _____X__} + + + /* fraction one-half, ISO-Code: 189, internal code: 153 */ + ,{ + X____X__, + X___X___, + X__X____, + X_X_XX__, + _X_X__X_, + X____X__, + ____X___, + ___XXXX_} + + + /* fraction three-fourth, ISO-Code: 190, internal code: 154 */ + ,{ + XX______, + __X_____, + _X______, + __X__X__, + XX__XX__, + ___X_X__, + ___XXXX_, + _____X__} + + + /* multiply sign, ISO-Code: 215, internal code: 155 */ + ,{ + ________, + _XX__XX_, + __XXXX__, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + ________} + + + /* division sign, ISO-Code: 247, internal code: 156 */ + ,{ + ________, + ___XX___, + ________, + _XXXXXX_, + ________, + ___XX___, + ________, + ________} + + + /* left arrow, ISO-Code: ---, internal code: 157 */ + ,{ + ___X____, + __XX____, + _XXX____, + XXXXXX__, + _XXX____, + __XX____, + ___X____, + ________} + + /* right arrow, ISO-Code: ---, internal code: 158 */ + ,{ + __X_____, + __XX____, + __XXX___, + XXXXXX__, + __XXX___, + __XX____, + __X_____, + ________} + + /* up arrow, ISO-Code: ---, internal code: 159 */ + ,{ + ________, + __X_____, + _XXX____, + XXXXX___, + __X_____, + __X_____, + ________, + ________} + + /* down arrow, ISO-Code: ---, internal code: 160 */ + ,{ + ________, + __X_____, + __X_____, + XXXXX___, + _XXX____, + __X_____, + ________, + ________} + + /* ENTER character, ISO-Code: ---, internal code: 162 */ + ,{ + ________, + ____X___, + __X_X___, + _XX_X___, + XXXXX___, + _XX_____, + __X_____, + ________} + + /* ENTER character, ISO-Code: ---, internal code: 162 */ + ,{ + _____XX_, + _____XX_, + _____XX_, + ____XX__, + X___XX__, + XX_XX___, + _XXXX___, + __XX____} + + +}; + + +GUI_CONST_STORAGE GUI_FONT_TRANSLIST GUI_F8x8_TransList[] = { +/* + The folowing are extensions to ISO 8859-1. + Since ISO 8859-1 does not define any characters for the codes + 128 - 159, this area can be used by an application. + The most commonly used symbols in embedded applications are + therefor inserted here. +*/ + {CODE_ARROW_LEFT,-1}, /* 144, arrow left */ + {CODE_ARROW_RIGHT,-1}, /* 145, arrow right */ + {CODE_ARROW_UP,-1}, /* 146, arrow up */ + {CODE_ARROW_DOWN,-1}, /* 147, arrow down */ + {CODE_ENTER,-1}, /* 148, enter symbol */ + {CODE_CHECKMARK,-1}, /* 149, checkmark symbol */ + {-1,-1}, /* 150, unused symbol */ + {-1,-1}, /* 151, unused symbol */ + {-1,-1}, /* 152, unused symbol */ + {-1,-1}, /* 153, unused symbol */ + {-1,-1}, /* 154, unused symbol */ + {-1,-1}, /* 155, unused symbol */ + {-1,-1}, /* 156, unused symbol */ + {-1,-1}, /* 157, unused symbol */ + {-1,-1}, /* 158, unused symbol */ + {-1,-1}, /* 159, unused symbol */ +/* starting at character code 160 are the characters defined + by ISO 8859-1 +*/ + {CODE_NB_SPACE,-1}, /* 160, non-breaking space */ + {CODE_INVEXCLAM,-1}, /* 161, inverted exclamation sign */ + {CODE_CENT,-1}, /* 162, cent sign */ + {CODE_POUND,-1}, /* 163, pound sterling */ + {CODE_CURRENCY,-1}, /* 164, general currency sign */ + {CODE_YEN,-1}, /* 165, yen sign */ + {CODE_BROKEN_BAR,-1}, /* 166, broken vertical bar */ + {CODE_SECTION,-1}, /* 167, section sign */ + {CODE_DIERESIS,-1}, /* 168, umlaut */ + {CODE_COPYRIGHT,-1}, /* 169, copyright */ + {CODE_FEMININE,-1}, /* 170, */ + {CODE_LEFT_QUOTE,-1}, /* 171, */ + {CODE_NOT,-1}, /* 172, */ + {CODE_HYPHEN,-1}, /* 173, */ + {CODE_TRADEMARK,-1}, /* 174, */ + {CODE_MACRON,-1}, /* 175, */ + {CODE_DEGREE,-1}, /* 176, */ + {CODE_PLUS_MINUS,-1}, /* 177, */ + {CODE_SUPER_TWO,-1}, /* 178, */ + {CODE_SUPER_THREE,-1}, /* 179, */ + {CODE_ACUTE,-1}, /* 180, */ + {CODE_MICRO,-1}, /* 181, */ + {CODE_PARAGRAPH,-1}, /* 182, */ + {CODE_MIDDLE_DOT,-1}, /* 183, */ + {CODE_CEDILLA,-1}, /* 184, */ + {CODE_SUPER_ONE,-1}, /* 185, */ + {CODE_MASCULINE,-1}, /* 186, */ + {CODE_RIGHT_QUOTE,-1}, /* 187, */ + {CODE_ONE_FOURTH,-1}, /* 188, */ + {CODE_ONE_HALF,-1}, /* 189, */ + {CODE_THREE_FOURTH,-1}, /* 190, */ + {CODE_INVQUEST,-1}, /* 191, */ + {CODE_LITTLE_A,CODE_CACCGRAV}, /* 192, */ + {CODE_LITTLE_A,CODE_CACCAGUE}, /* 193, */ + {CODE_LITTLE_A,CODE_CACCCIRC}, /* 194, */ + {CODE_LITTLE_A,CODE_CTILDE}, /* 195, */ + {CODE_LITTLE_A,CODE_CUMLAUT}, /* 196, */ + {CODE_A_RING,-1}, /* 197, */ + {CODE_AE,-1}, /* 198, */ + {'C'-32,CODE_CEDILLA}, /* 199, */ + {CODE_LITTLE_E,CODE_CACCGRAV}, /* 200, */ + {CODE_LITTLE_E,CODE_CACCAGUE}, /* 201, */ + {CODE_LITTLE_E,CODE_CACCCIRC}, /* 202, */ + {CODE_LITTLE_E,CODE_CUMLAUT}, /* 203, */ + {CODE_LITTLE_I,CODE_CACCGRAV}, /* 204, */ + {CODE_LITTLE_I,CODE_CACCAGUE}, /* 205, */ + {CODE_LITTLE_I,CODE_CACCCIRC}, /* 206, */ + {CODE_LITTLE_I,CODE_CUMLAUT}, /* 207, */ + {CODE_ETH,-1}, /* 208, */ + {CODE_LITTLE_N,CODE_CTILDE}, /* 209, */ + {CODE_LITTLE_O,CODE_CACCGRAV}, /* 210, */ + {CODE_LITTLE_O,CODE_CACCAGUE}, /* 211, */ + {CODE_LITTLE_O,CODE_CACCCIRC}, /* 212, */ + {CODE_LITTLE_O,CODE_CTILDE}, /* 213, */ + {CODE_LITTLE_O,CODE_CUMLAUT}, /* 214, */ + {CODE_MULTIPLY,-1}, /* 215, */ + {CODE_OSLASH,-1}, /* 216, */ + {CODE_LITTLE_U,CODE_CACCGRAV}, /* 217, */ + {CODE_LITTLE_U,CODE_CACCAGUE}, /* 218, */ + {CODE_LITTLE_U,CODE_CACCCIRC}, /* 219, */ + {CODE_LITTLE_U,CODE_CUMLAUT}, /* 220, */ + {'Y'-32,CODE_CACCAGUE}, /* 221, */ + {CODE_THORN,-1}, /* 222, */ + {CODE_SHARPS,-1}, /* 223, */ + {'a'-32,CODE_SACCGRAV}, /* 224, */ + {'a'-32,CODE_SACCAGUE}, /* 225, */ + {'a'-32,CODE_SACCCIRC}, /* 226, */ + {'a'-32,CODE_STILDE}, /* 227, */ + {'a'-32,CODE_SUMLAUT}, /* 228, */ + {CODE_SA_RING,-1}, /* 229, */ + {CODE_SMALLAE,-1}, /* 230, */ + {'c'-32,CODE_CEDILLA}, /* 231, */ + {'e'-32,CODE_SACCGRAV}, /* 232, */ + {'e'-32,CODE_SACCAGUE}, /* 233, */ + {'e'-32,CODE_SACCCIRC}, /* 234, */ + {'e'-32,CODE_SUMLAUT}, /* 235, */ + {CODE_I_NOPOINT,CODE_SACCGRAV}, /* 236, */ + {CODE_I_NOPOINT,CODE_SACCAGUE}, /* 237, */ + {CODE_I_NOPOINT,CODE_SACCCIRC}, /* 238, */ + {CODE_I_NOPOINT,CODE_SUMLAUT}, /* 239, */ + {CODE_SMALLETH,-1}, /* 240, small eth, Icelandic */ + {'n'-32,CODE_STILDE}, /* 241, small n, tilde */ + {'o'-32,CODE_SACCGRAV}, /* 242, small o, grave accent */ + {'o'-32,CODE_SACCAGUE}, /* 243, small o, acute accent */ + {'o'-32,CODE_SACCCIRC}, /* 244, small o, circumflex */ + {'o'-32,CODE_STILDE}, /* 245, small o, tilde */ + {'o'-32,CODE_SUMLAUT}, /* 246, small o, umlaut */ + {CODE_DIVISION,-1}, /* 247, division sign */ + {CODE_SOSLASH,-1}, /* 248, small o slash */ + {'u'-32,CODE_SACCAGUE}, /* 249, */ + {'u'-32,CODE_SACCGRAV}, /* 250, */ + {'u'-32,CODE_SACCCIRC}, /* 251, */ + {'u'-32,CODE_SUMLAUT}, /* 252, small u, umlaut */ + {'y'-32,CODE_SACCAGUE}, /* 253, small y, acute accent */ + {CODE_SMALLTHORN,-1}, /* 254, small thorn, Icelandic */ + {'y'-32,CODE_SUMLAUT}, /* 255, */ +}; + +GUI_CONST_STORAGE GUI_FONT_TRANSINFO GUI_F8x8_TransInfo = { + 144 /* FirstChar */ + ,255 /* LastChar */ + ,GUI_F8x8_TransList /* const GUI_FONT_TRANSLIST* pList */ +}; + +GUI_CONST_STORAGE GUI_FONT_MONO GUI_F8x8_Mono = { + GUI_F8x8_acFont[0], + GUI_F8x8_acFont[0], + &GUI_F8x8_TransInfo, + 32, /* FirstChar */ + 127, /* LastChar */ + 8, /* XSize */ + 8, /* XDist */ + 1 /* BytesPerLine */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x8 = { + GUI_FONTTYPE_MONO + ,8 + ,8 + ,1 + ,1 + ,{&GUI_F8x8_Mono} + , 7, 5, 7 +}; + +GUI_CONST_STORAGE GUI_FONT GUI_Font8x9 = { + GUI_FONTTYPE_MONO + ,8 + ,9 + ,1 + ,1 + ,{&GUI_F8x8_Mono} + , 7, 5, 7 }; diff --git a/User/system/lib/lcd/gui/Font/FComic18B_1.c b/User/system/lib/lcd/gui/Font/FComic18B_1.c new file mode 100644 index 0000000..9176b8d --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FComic18B_1.c @@ -0,0 +1,2068 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FComic18.C +Purpose : Font, similar to Comic +Height : 18 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_160[18] = { /* code 160 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_161[18] = { /* code 161 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_162[36] = { /* code 162 */ + ________,________, + ____XX__,________, + ____XX__,________, + ___XXXX_,X_______, + __XXXXXX,X_______, + _XX_XX_X,X_______, + XX__XX__,________, + XX__XX__,________, + XX__XX__,________, + XX__XX__,X_______, + XXX_XX_X,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_163[36] = { /* code 163 */ + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + ___XX___,_XX_____, + __XXX___,________, + __XX____,________, + __XX____,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ___X____,________, + ___XX___,________, + ___XX___,________, + ___XX___,___X____, + __XXXXX_,__XX____, + __XXXXXX,XXXX____, + _______X,XXX_____, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_164[36] = { /* code 164 */ + ________,________, + ________,________, + ________,________, + XX______,________, + XXX_____,XX______, + _XXXXXXX,XX______, + _XXXXXXX,X_______, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + XXXXXXXX,________, + XX_____X,X_______, + _______X,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_165[36] = { /* code 165 */ + ________,________, + ________,________, + ________,________, + _XX____X,X_______, + _XX____X,X_______, + __XX__XX,________, + _XXX__XX,X_______, + _XXX__XX,X_______, + ___XXXX_,________, + ____XX__,________, + __XXXXXX,________, + __XXXXXX,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_166[18] = { /* code 166 */ + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_167[36] = { /* code 167 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + _XX___XX,________, + _XX_____,________, + XXXXXX__,________, + XX___XXX,________, + _XXX__XX,________, + ___XXXX_,________, + X_____XX,________, + XX____XX,________, + _XXXXXXX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_168[36] = { /* code 168 */ + ________,________, + ________,________, + ________,________, + ________,________, + _XX__XX_,________, + _XX__XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_169[36] = { /* code 169 */ + ________,________, + ________,________, + _____XXX,X_______, + ___XXXXX,XXX_____, + __XXX___,_XX_____, + __XX__XX,__XX____, + _XX__XXX,__XX____, + _XX_XX__,__XX____, + _XX_XX__,X_XX____, + _XX_XXXX,X_XX____, + _XX__XXX,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_170[18] = { /* code 170 */ + ________, + ________, + ________, + __XXXX__, + _XXXXX__, + _XX_XX__, + _XX_XX__, + _XXX_XX_, + _XXX_XX_, + __X__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_171[36] = { /* code 171 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX__X,X_______, + __XX__XX,________, + _XX__XX_,________, + XX__XX__,________, + _XX__XX_,________, + __XX__XX,________, + ___XX__X,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_172[36] = { /* code 172 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_173[18] = { /* code 173 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + _XXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_174[36] = { /* code 174 */ + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,XX______, + __XXX___,_XX_____, + __XXXXXX,_XXX____, + _XX_X__X,__XX____, + _XX_X__X,__XX____, + _XX_XXX_,__XX____, + _XX_XXX_,__XX____, + _XX_XX_X,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_175[36] = { /* code 175 */ + ________,________, + XXXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_176[18] = { /* code 176 */ + ________, + _XXXX___, + XXXXXX__, + XX__XX__, + XX__XX__, + XXXXXX__, + _XXXX___, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_177[18] = { /* code 177 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + XXXXXXXX, + XXXXXXXX, + ___XX___, + ___XX___, + ___XX___, + ________, + XXXXXXXX, + XXXXXXXX, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_178[36] = { /* code 178 */ + ________,________, + ____XX__,________, + ___XXXX_,________, + _____XX_,________, + _____X__,________, + ____X___,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_179[36] = { /* code 179 */ + ________,________, + __XXXX__,________, + __XXXXX_,________, + _____XX_,________, + ____XX__,________, + _____XX_,________, + __XXXXX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_180[18] = { /* code 180 */ + ________, + ________, + ___XX___, + __XX____, + _XX_____, + _X______, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_181[18] = { /* code 181 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX___XX, + _XX___XX, + XX____X_, + XX___XX_, + XX___XX_, + XX___X__, + XXXXXX__, + XXXXXX__, + X_______, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_182[36] = { /* code 182 */ + ________,________, + ________,________, + ________,________, + ______XX,XX______, + ___XXXXX,XX______, + __XX_XX_,XX______, + _XX__XX_,XX______, + _XX__XX_,XX______, + _XX__XX_,XX______, + _XX_XXX_,XX______, + _XXXXXXX,X_______, + __XXXX_X,X_______, + ____XX_X,X_______, + ____XX_X,X_______, + ___XX_XX,________, + ___XX_XX,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_183[18] = { /* code 183 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_184[36] = { /* code 184 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + ____XX__,________, + ____XX__,________, + __XXXX__,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_185[36] = { /* code 185 */ + ________,________, + _____XX_,________, + ____XXX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ____XXXX,________, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_186[18] = { /* code 186 */ + ________, + ___XX___, + __XXXX__, + _XX__XX_, + _XX__XX_, + _XX__XX_, + __XXXXX_, + __XXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_187[36] = { /* code 187 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + X__XX___,________, + XX__XX__,________, + _XX__XX_,________, + __XX__XX,________, + _XX__XX_,________, + XX__XX__,________, + X__XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_188[36] = { /* code 188 */ + ____XX__,________, + ___XXX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ________,________, + ____XX__,________, + ____XX__,________, + ___XXX__,________, + __X_XX__,________, + _XXXXXX_,________, + ____XX__,________, + ____XX__,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_189[36] = { /* code 189 */ + ____XX__,________, + ___XXX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ___XXXX_,________, + ___XXXX_,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ________,________, + ____XXX_,________, + ___XXXXX,________, + ___X__XX,________, + ______X_,________, + ____XX__,________, + ___XXXXX,________, + ___XXXXX,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_190[36] = { /* code 190 */ + __XXXX__,________, + __XXXXX_,________, + _____XX_,________, + ___XXXX_,________, + _____XX_,________, + __XXXXX_,________, + __XXXX__,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ________,________, + ____XX__,________, + ____XX__,________, + ___XXX__,________, + __X_XX__,________, + _XXXXXX_,________, + ____XX__,________, + ____XX__,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_191[36] = { /* code 191 */ + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + ________,________, + _____X__,________, + ___XXX__,________, + __XX____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXX__XX,________, + __XXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_192[36] = { /* code 192 */ + ______XX,________, + _______X,________, + ________,________, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_193[36] = { /* code 193 */ + ______XX,________, + ______X_,________, + ________,________, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_194[36] = { /* code 194 */ + ______XX,XX______, + _____XX_,_XX_____, + ________,________, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_195[36] = { /* code 195 */ + ____XXXX,XXX_____, + ____X__X,XX______, + ________,________, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_196[36] = { /* code 196 */ + ____XX__,XX______, + ____XX__,XX______, + ________,________, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_197[36] = { /* code 197 */ + ______X_,__X_____, + ______X_,__X_____, + _______X,XX______, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_198[54] = { /* code 198 */ + ________,________,________, + ________,________,________, + ________,__XXXXXX,XX______, + ________,_XXXXXXX,XX______, + ________,XXXX____,________, + _______X,X_XX____,________, + ______XX,__XX____,________, + ______XX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______, + ____XX__,__XX____,________, + ___XX___,__XX____,________, + ___XX___,__XX____,________, + __XX____,__XX____,________, + _XX_____,__XX____,________, + _XX_____,__XXXXXX,X_______, + ________,___XXXXX,X_______, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_199[36] = { /* code 199 */ + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,X_______, + __XXX__X,X_______, + __XX____,________, + _XX_____,________, + _XX_____,________, + XX______,________, + XX______,________, + XX______,________, + XXX____X,X_______, + _XXXXXXX,X_______, + __XXXXX_,________, + ____XX__,________, + _____X__,________, + __XXX___,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_200[36] = { /* code 200 */ + _____XX_,________, + ______X_,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_201[36] = { /* code 201 */ + ____X___,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_202[36] = { /* code 202 */ + ___XXXX_,________, + __XX__XX,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_203[36] = { /* code 203 */ + __XX__XX,________, + __XX__XX,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_204[36] = { /* code 204 */ + ___XX___,________, + ____X___,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_205[36] = { /* code 205 */ + ___XX___,________, + ___X____,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_206[36] = { /* code 206 */ + _XX__XX_,________, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_207[36] = { /* code 207 */ + _XX__XX_,________, + _XX__XX_,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_208[36] = { /* code 208 */ + ________,________, + ________,________, + ________,________, + __XX____,________, + __XXXXX_,________, + __XX_XXX,X_______, + __XX___X,XX______, + __XX____,_XX_____, + XXXXXXX_,_XXX____, + XXXXXXX_,__XX____, + __XX____,__XX____, + __XX____,__XX____, + __XX____,_XXX____, + __XX____,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_209[36] = { /* code 209 */ + ___XXXXX,XX______, + ___X__XX,X_______, + ________,________, + _XX_____,__X_____, + _XX_____,__XX____, + _XXX____,__XX____, + _XXXX___,__XX____, + _XX_XX__,__XX____, + _XX__XX_,__XX____, + _XX___X_,__XX____, + _XX___XX,__XX____, + _XX____X,X_XX____, + _XX_____,XXXX____, + _XX_____,_XXX____, + _XX_____,__XX____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_210[36] = { /* code 210 */ + _______X,X_______, + ________,X_______, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XX____, + _XXX____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,_XXX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_211[36] = { /* code 211 */ + ______XX,________, + ______X_,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XX____, + _XXX____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,_XXX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_212[36] = { /* code 212 */ + ____XX__,XX______, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XX____, + _XXX____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,_XXX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_213[36] = { /* code 213 */ + ____XXXX,XXX_____, + ____X__X,XX______, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XX____, + _XXX____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,_XXX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_214[36] = { /* code 214 */ + ____XX__,XX______, + ____XX__,XX______, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XX____, + _XXX____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,_XXX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_215[18] = { /* code 215 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX__XX_, + __XXXXX_, + ___XX___, + ___XXX__, + __XX_XX_, + __X___X_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_216[36] = { /* code 216 */ + ________,________, + ________,________, + ________,________, + _____XXX,XX__X___, + ____XXXX,XXXX____, + ___XX___,_XX_____, + __XX____,XXXX____, + __XX___X,X_XX____, + _XX____X,__XX____, + _XX___X_,__XX____, + _XX__X__,_XXX____, + _XX_X___,_XX_____, + _XXXX___,XXX_____, + __XXXXXX,XX______, + _XXXXXXX,X_______, + _X______,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_217[36] = { /* code 217 */ + _____XX_,________, + ______X_,________, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_218[36] = { /* code 218 */ + _____XX_,________, + _____X__,________, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_219[36] = { /* code 219 */ + ___XX__X,X_______, + ________,________, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_220[36] = { /* code 220 */ + ___XX__X,X_______, + ___XX__X,X_______, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_221[36] = { /* code 221 */ + ____XX__,________, + ____X___,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,XX______, + __XX___X,X_______, + ___XX_XX,X_______, + ___XX_XX,________, + ____XXXX,________, + ____XXXX,________, + _____XX_,________, + ____XXX_,________, + ____XX__,________, + ___XX___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_222[18] = { /* code 222 */ + ________, + ________, + ________, + _XX_____, + _XXXXXX_, + _XXXXXXX, + _XX___XX, + _XX____X, + _XX____X, + _XX___XX, + _XXXXXXX, + _XXXXXX_, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_223[18] = { /* code 223 */ + ________, + ________, + ___XXX__, + __XXXXX_, + _XXX_XX_, + _XX__XX_, + _XX__XX_, + _XX_XXX_, + _XX_XX__, + _XX_XXX_, + _XX__XX_, + _XX__XX_, + _XXX_XX_, + _XXXXXX_, + _XX_XX__, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_224[18] = { /* code 224 */ + ________, + ________, + __X_____, + __XX____, + ___XX___, + ____X___, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_225[18] = { /* code 225 */ + ________, + ________, + _____XX_, + ____XX__, + ___XX___, + ___X____, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_226[18] = { /* code 226 */ + ________, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_227[18] = { /* code 227 */ + ________, + ________, + ________, + __XXX__X, + _XXXXXXX, + _X__XXX_, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_228[18] = { /* code 228 */ + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_229[18] = { /* code 229 */ + ________, + ___XXX__, + __X___X_, + __X___X_, + ___XXX__, + ________, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_230[36] = { /* code 230 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,_XXX____, + __XXXXXX,XXXXX___, + _XXX___X,X_XXX___, + _XX____X,XXXX____, + _XX____X,XX______, + _XXX___X,X____X__, + __XXXXXX,XXXXXX__, + ___XXXX_,XXXXX___, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_231[18] = { /* code 231 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XXXXXX_, + _XX___X_, + XX______, + XX______, + XX___XX_, + XXXXXXX_, + _XXXXX__, + ___XX___, + ____X___, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_232[18] = { /* code 232 */ + ________, + ________, + __X_____, + __XX____, + ___XX___, + ____X___, + ________, + __XXXX__, + _XXXXXX_, + XXX__XX_, + XX__XX__, + XX_XX___, + XXX___X_, + XXXXXXX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_233[18] = { /* code 233 */ + ________, + ________, + _____XX_, + ____XX__, + ___XX___, + ___X____, + ________, + __XXXX__, + _XXXXXX_, + XXX__XX_, + XX__XX__, + XX_XX___, + XXX___X_, + XXXXXXX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_234[18] = { /* code 234 */ + ________, + ________, + ________, + ___XX___, + __XXXX__, + _XX__XX_, + ________, + __XXXX__, + _XXXXXX_, + XXX__XX_, + XX__XX__, + XX_XX___, + XXX___X_, + XXXXXXX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_235[18] = { /* code 235 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + ________, + __XXXX__, + _XXXXXX_, + XXX__XX_, + XX__XX__, + XX_XX___, + XXX___X_, + XXXXXXX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_236[18] = { /* code 236 */ + ________, + ________, + X_______, + XX______, + _XX_____, + __X_____, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_237[18] = { /* code 237 */ + ________, + ________, + __XX____, + _XX_____, + XX______, + X_______, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_238[18] = { /* code 238 */ + ________, + ________, + ________, + _XX_____, + XXXX____, + X__XX___, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_239[18] = { /* code 239 */ + ________, + ________, + ________, + ________, + X__XX___, + X__XX___, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_240[18] = { /* code 240 */ + ________, + ________, + _XX_____, + _XX_____, + __XXXXX_, + __XXX___, + _XXXXX__, + _XX_XX__, + ____XXX_, + __XXXXX_, + _XX__XX_, + XX___XX_, + XX___XX_, + XXXXXX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_241[18] = { /* code 241 */ + ________, + ________, + ________, + __XXX__X, + _XXXXXXX, + _X__XXX_, + ________, + XX_XXX__, + XXXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_242[18] = { /* code 242 */ + ________, + ________, + ___X____, + ___XX___, + ____XX__, + _____X__, + ________, + __XXX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_243[18] = { /* code 243 */ + ________, + ________, + _____XX_, + ____XX__, + ___XX___, + ___X____, + ________, + __XXX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_244[18] = { /* code 244 */ + ________, + ________, + ________, + __XX____, + _XXXX___, + XX__XX__, + ________, + __XXX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_245[18] = { /* code 245 */ + ________, + ________, + ________, + _XXX__X_, + XXXXXXX_, + X__XXX__, + ________, + __XXX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_246[18] = { /* code 246 */ + ________, + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + __XXX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_247[36] = { /* code 247 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + ________,________, + ____X___,________, + ____X___,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_248[18] = { /* code 248 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX_X_, + _XXXXXX_, + XXX__XX_, + XX_XXXX_, + XXX__XX_, + XX__XXX_, + XXXXXX__, + X_XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_249[18] = { /* code 249 */ + ________, + ________, + __X_____, + __XX____, + ___XX___, + ____X___, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_250[18] = { /* code 250 */ + ________, + ________, + _____XX_, + ____XX__, + ___XX___, + ___X____, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_251[18] = { /* code 251 */ + ________, + ________, + ________, + __XX____, + _XXXX___, + XX__XX__, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_252[18] = { /* code 252 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_253[36] = { /* code 253 */ + ________,________, + ________,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + ___X____,________, + ________,________, + XX____XX,________, + XXX___XX,________, + _XX___XX,________, + _XXX_XX_,________, + __XX_XX_,________, + __XXXX__,________, + ___XXX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_254[36] = { /* code 254 */ + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_XXX_,________, + _XXXXXXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XXXXX__,________, + _XX_____,________, + _XX_____,________, + _XX_____,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_1_255[36] = { /* code 255 */ + ________,________, + ________,________, + ________,________, + ________,________, + XX__XX__,________, + XX__XX__,________, + ________,________, + XX____XX,________, + XXX___XX,________, + _XX___XX,________, + _XXX_XX_,________, + __XX_XX_,________, + __XXXX__,________, + ___XXX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________}; + + + +GUI_CONST_STORAGE GUI_CHARINFO CharInfoComic18B_1_160_255[193] = { + { 5, 5, 1, acFontComic18B_1_160 } /* code 160 */ + ,{ 4, 4, 1, acFontComic18B_1_161 } /* code 161 */ + ,{ 10, 10, 2, acFontComic18B_1_162 } /* code 162 */ + ,{ 13, 13, 2, acFontComic18B_1_163 } /* code 163 */ + ,{ 10, 10, 2, acFontComic18B_1_164 } /* code 164 */ + ,{ 10, 10, 2, acFontComic18B_1_165 } /* code 165 */ + ,{ 6, 6, 1, acFontComic18B_1_166 } /* code 166 */ + ,{ 10, 10, 2, acFontComic18B_1_167 } /* code 167 */ + ,{ 9, 9, 2, acFontComic18B_1_168 } /* code 168 */ + ,{ 13, 13, 2, acFontComic18B_1_169 } /* code 169 */ + ,{ 8, 8, 1, acFontComic18B_1_170 } /* code 170 */ + ,{ 9, 9, 2, acFontComic18B_1_171 } /* code 171 */ + ,{ 9, 9, 2, acFontComic18B_1_172 } /* code 172 */ + ,{ 7, 7, 1, acFontComic18B_1_173 } /* code 173 */ + ,{ 13, 13, 2, acFontComic18B_1_174 } /* code 174 */ + ,{ 10, 10, 2, acFontComic18B_1_175 } /* code 175 */ + ,{ 7, 7, 1, acFontComic18B_1_176 } /* code 176 */ + ,{ 8, 8, 1, acFontComic18B_1_177 } /* code 177 */ + ,{ 10, 10, 2, acFontComic18B_1_178 } /* code 178 */ + ,{ 10, 10, 2, acFontComic18B_1_179 } /* code 179 */ + ,{ 8, 8, 1, acFontComic18B_1_180 } /* code 180 */ + ,{ 8, 8, 1, acFontComic18B_1_181 } /* code 181 */ + ,{ 11, 11, 2, acFontComic18B_1_182 } /* code 182 */ + ,{ 4, 4, 1, acFontComic18B_1_183 } /* code 183 */ + ,{ 9, 9, 2, acFontComic18B_1_184 } /* code 184 */ + ,{ 10, 10, 2, acFontComic18B_1_185 } /* code 185 */ + ,{ 8, 8, 1, acFontComic18B_1_186 } /* code 186 */ + ,{ 9, 9, 2, acFontComic18B_1_187 } /* code 187 */ + ,{ 10, 10, 2, acFontComic18B_1_188 } /* code 188 */ + ,{ 10, 10, 2, acFontComic18B_1_189 } /* code 189 */ + ,{ 10, 10, 2, acFontComic18B_1_190 } /* code 190 */ + ,{ 9, 9, 2, acFontComic18B_1_191 } /* code 191 */ + ,{ 12, 12, 2, acFontComic18B_1_192 } /* code 192 */ + ,{ 12, 12, 2, acFontComic18B_1_193 } /* code 193 */ + ,{ 12, 12, 2, acFontComic18B_1_194 } /* code 194 */ + ,{ 12, 12, 2, acFontComic18B_1_195 } /* code 195 */ + ,{ 12, 12, 2, acFontComic18B_1_196 } /* code 196 */ + ,{ 12, 12, 2, acFontComic18B_1_197 } /* code 197 */ + ,{ 19, 19, 3, acFontComic18B_1_198 } /* code 198 */ + ,{ 10, 10, 2, acFontComic18B_1_199 } /* code 199 */ + ,{ 10, 10, 2, acFontComic18B_1_200 } /* code 200 */ + ,{ 10, 10, 2, acFontComic18B_1_201 } /* code 201 */ + ,{ 10, 10, 2, acFontComic18B_1_202 } /* code 202 */ + ,{ 10, 10, 2, acFontComic18B_1_203 } /* code 203 */ + ,{ 9, 9, 2, acFontComic18B_1_204 } /* code 204 */ + ,{ 9, 9, 2, acFontComic18B_1_205 } /* code 205 */ + ,{ 9, 9, 2, acFontComic18B_1_206 } /* code 206 */ + ,{ 9, 9, 2, acFontComic18B_1_207 } /* code 207 */ + ,{ 12, 12, 2, acFontComic18B_1_208 } /* code 208 */ + ,{ 13, 13, 2, acFontComic18B_1_209 } /* code 209 */ + ,{ 13, 13, 2, acFontComic18B_1_210 } /* code 210 */ + ,{ 13, 13, 2, acFontComic18B_1_211 } /* code 211 */ + ,{ 13, 13, 2, acFontComic18B_1_212 } /* code 212 */ + ,{ 13, 13, 2, acFontComic18B_1_213 } /* code 213 */ + ,{ 13, 13, 2, acFontComic18B_1_214 } /* code 214 */ + ,{ 8, 8, 1, acFontComic18B_1_215 } /* code 215 */ + ,{ 13, 13, 2, acFontComic18B_1_216 } /* code 216 */ + ,{ 12, 12, 2, acFontComic18B_1_217 } /* code 217 */ + ,{ 12, 12, 2, acFontComic18B_1_218 } /* code 218 */ + ,{ 12, 12, 2, acFontComic18B_1_219 } /* code 219 */ + ,{ 12, 12, 2, acFontComic18B_1_220 } /* code 220 */ + ,{ 11, 11, 2, acFontComic18B_1_221 } /* code 221 */ + ,{ 8, 8, 1, acFontComic18B_1_222 } /* code 222 */ + ,{ 8, 8, 1, acFontComic18B_1_223 } /* code 223 */ + ,{ 8, 8, 1, acFontComic18B_1_224 } /* code 224 */ + ,{ 8, 8, 1, acFontComic18B_1_225 } /* code 225 */ + ,{ 8, 8, 1, acFontComic18B_1_226 } /* code 226 */ + ,{ 8, 8, 1, acFontComic18B_1_227 } /* code 227 */ + ,{ 8, 8, 1, acFontComic18B_1_228 } /* code 228 */ + ,{ 8, 8, 1, acFontComic18B_1_229 } /* code 229 */ + ,{ 15, 15, 2, acFontComic18B_1_230 } /* code 230 */ + ,{ 8, 8, 1, acFontComic18B_1_231 } /* code 231 */ + ,{ 8, 8, 1, acFontComic18B_1_232 } /* code 232 */ + ,{ 8, 8, 1, acFontComic18B_1_233 } /* code 233 */ + ,{ 8, 8, 1, acFontComic18B_1_234 } /* code 234 */ + ,{ 8, 8, 1, acFontComic18B_1_235 } /* code 235 */ + ,{ 5, 5, 1, acFontComic18B_1_236 } /* code 236 */ + ,{ 5, 5, 1, acFontComic18B_1_237 } /* code 237 */ + ,{ 5, 5, 1, acFontComic18B_1_238 } /* code 238 */ + ,{ 5, 5, 1, acFontComic18B_1_239 } /* code 239 */ + ,{ 8, 8, 1, acFontComic18B_1_240 } /* code 240 */ + ,{ 8, 8, 1, acFontComic18B_1_241 } /* code 241 */ + ,{ 8, 8, 1, acFontComic18B_1_242 } /* code 242 */ + ,{ 8, 8, 1, acFontComic18B_1_243 } /* code 243 */ + ,{ 8, 8, 1, acFontComic18B_1_244 } /* code 244 */ + ,{ 8, 8, 1, acFontComic18B_1_245 } /* code 245 */ + ,{ 8, 8, 1, acFontComic18B_1_246 } /* code 246 */ + ,{ 9, 9, 2, acFontComic18B_1_247 } /* code 247 */ + ,{ 8, 8, 1, acFontComic18B_1_248 } /* code 248 */ + ,{ 8, 8, 1, acFontComic18B_1_249 } /* code 249 */ + ,{ 8, 8, 1, acFontComic18B_1_250 } /* code 250 */ + ,{ 8, 8, 1, acFontComic18B_1_251 } /* code 251 */ + ,{ 8, 8, 1, acFontComic18B_1_252 } /* code 252 */ + ,{ 9, 9, 2, acFontComic18B_1_253 } /* code 253 */ + ,{ 9, 9, 2, acFontComic18B_1_254 } /* code 254 */ + ,{ 9, 9, 2, acFontComic18B_1_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP FontComic18BProp_1_160 = { + 160 /* first character */ + ,255 /* last character */ + ,CharInfoComic18B_1_160_255 /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP FontComic18BProp_1_32 = { + 32 /* first character */ + ,127 /* last character */ + ,CharInfo18B_ASCII /* address of first character */ + ,&FontComic18BProp_1_160 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontComic18B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,18 /* height of font */ + ,18 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&FontComic18BProp_1_32} + ,15, 8, 12 +}; + diff --git a/User/system/lib/lcd/gui/Font/FComic18B_ASCII.c b/User/system/lib/lcd/gui/Font/FComic18B_ASCII.c new file mode 100644 index 0000000..aee10f2 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FComic18B_ASCII.c @@ -0,0 +1,2079 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FComic18B_ASCII.C +Purpose : Font, similar to Comic, ASCII only +Height : 18 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_32[18] = { /* code 32 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_33[18] = { /* code 33 */ + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_34[18] = { /* code 34 */ + ________, + ________, + ________, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + _XX__XX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_35[36] = { /* code 35 */ + ________,________, + ________,________, + ________,________, + ____XX__,_XX_____, + ____XX__,_XX_____, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ___XX___,XX______, + ___XX__X,XX______, + __XX___X,X_______, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + __XX__XX,X_______, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_36[36] = { /* code 36 */ + ________,________, + ____XX__,________, + ____XX__,________, + ___XXXXX,________, + _XXXXXXX,X_______, + XXX_XX__,________, + XX__XX__,________, + XX__XX__,________, + XXXXXXXX,________, + __XXXXXX,X_______, + ____XX_X,XX______, + ____XX__,XX______, + XX__XX_X,XX______, + XXXXXXXX,X_______, + _XXXXXXX,________, + ____XX__,________, + ____XX__,________, + ____XX__,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_37[36] = { /* code 37 */ + ________,________, + ________,________, + ________,X_______, + _XXX___X,X_______, + XXXXX__X,________, + XX_XX_XX,________, + XXXXX_X_,________, + _XXX_XX_,________, + _____X__,________, + ____XX__,________, + ____X___,XXX_____, + ___XX__X,XXXX____, + ___X___X,X_XX____, + __XX___X,XXXX____, + __X_____,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_38[36] = { /* code 38 */ + ________,________, + ________,________, + ________,________, + ____XXX_,________, + ___XXXXX,________, + ___XX_XX,________, + ___XXXX_,________, + ___XXX__,________, + __XXXX__,_X______, + _XX__XX_,_X______, + XX____XX,XX______, + XX_____X,XX______, + XXX____X,X_______, + _XXXXXXX,XX______, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_39[18] = { /* code 39 */ + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_40[18] = { /* code 40 */ + ________, + ________, + ____XX__, + ___XXX__, + ___XX___, + __XX____, + __XX____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + __XX____, + __XX____, + ___XX___, + ____XX__}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_41[18] = { /* code 41 */ + ________, + ________, + XX______, + XXX_____, + _XX_____, + __XX____, + __XX____, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + __XX____, + __XX____, + _XX_____, + XX______}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_42[36] = { /* code 42 */ + ________,________, + ________,________, + ________,________, + ____X___,________, + _XXXXXXX,________, + __XXXXXX,________, + ___XXX__,________, + __XX_XX_,________, + __X__XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_43[18] = { /* code 43 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + XXXXXXXX, + XXXXXXXX, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_44[18] = { /* code 44 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __X_____, + _XX_____, + _X______, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_45[18] = { /* code 45 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXX__, + _XXXXX__, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_46[18] = { /* code 46 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_47[36] = { /* code 47 */ + ________,________, + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________, + _XX_____,________, + _XX_____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_48[36] = { /* code 48 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,________, + _XX___XX,________, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + XX_____X,X_______, + _XX___XX,________, + _XXXXXXX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_49[18] = { /* code 49 */ + ________, + ________, + ________, + ___XX___, + __XXX___, + _XXXX___, + _X_XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_50[36] = { /* code 50 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XXXXXX,X_______, + _XXX___X,X_______, + _XX____X,X_______, + _______X,X_______, + _____XXX,________, + ____XXX_,________, + __XXX___,________, + _XXX____,________, + _XX_____,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_51[36] = { /* code 51 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,________, + _XX___XX,________, + ______XX,________, + _____XXX,________, + __XXXX__,________, + ___XXXXX,________, + ______XX,________, + ______XX,________, + _X____XX,________, + _XXXXXX_,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_52[36] = { /* code 52 */ + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XXX,________, + ____XXXX,________, + ____X_XX,________, + ___X__XX,________, + __XX__XX,________, + _XX___XX,________, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + ______XX,________, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_53[36] = { /* code 53 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XX_____,________, + _XXXXXX_,________, + _XXXXXXX,________, + _XX___XX,X_______, + _XX____X,X_______, + _______X,X_______, + _______X,X_______, + _XX___XX,X_______, + _XXXXXXX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_54[36] = { /* code 54 */ + ________,________, + ________,________, + ________,________, + _____XX_,________, + ____XXX_,________, + ___XXX__,________, + __XXX___,________, + __XX____,________, + _XXXXXXX,________, + _XXXXXXX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XXX__XX,X_______, + __XXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_55[36] = { /* code 55 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _______X,X_______, + ______XX,________, + ______X_,________, + _____XX_,________, + _____XX_,________, + ____XX__,________, + ____XX__,________, + ___XX___,________, + ___XX___,________, + ___X____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_56[36] = { /* code 56 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + _XXXXXXX,________, + _XX____X,X_______, + _XX____X,X_______, + _XXXXXXX,________, + __XXXXXX,________, + _XXX__XX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_57[36] = { /* code 57 */ + ________,________, + ________,________, + ________,________, + ___XXXX_,________, + __XXXXXX,________, + _XXX__XX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XXX__XX,X_______, + __XXXXXX,X_______, + ___XXXXX,X_______, + ______XX,________, + _____XXX,________, + ____XXX_,________, + __XXXX__,________, + __XX____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_58[18] = { /* code 58 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_59[18] = { /* code 59 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + ________, + ________, + __XX____, + _XX_____, + _XX_____, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_60[18] = { /* code 60 */ + ________, + ________, + ________, + ________, + ________, + ________, + ____XX__, + ___XXX__, + __XXX___, + _XX_____, + __XX____, + ___XX___, + ____XX__, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_61[18] = { /* code 61 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_62[18] = { /* code 62 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_____, + __XX____, + ___XX___, + ____XX__, + __XXX___, + _XXX____, + _X______, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_63[36] = { /* code 63 */ + ________,________, + ________,________, + ________,________, + ________,________, + __XXXX__,________, + _XXXXXX_,________, + _XX__XXX,________, + ______XX,________, + ______XX,________, + ______XX,________, + _____XX_,________, + ___XXX__,________, + ___X____,________, + ________,________, + __XX____,________, + __XX____,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_64[36] = { /* code 64 */ + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXXX____, + ___XX___,__XXX___, + __XX____,___XX___, + __XX__XX,____XX__, + _XX__XX_,____XX__, + _XX_XX__,X___XX__, + _XX_XX_X,X___XX__, + _XX_XXXX,XXXXX___, + _XX__XX_,_XXX____, + _XXX____,________, + __XX____,________, + ___XX___,_XX_____, + ___XXXXX,XXX_____, + _____XXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_65[36] = { /* code 65 */ + ________,________, + ________,________, + ________,________, + _______X,X_______, + _______X,X_______, + ______XX,X_______, + _____XX_,XX______, + _____XX_,XX______, + ____XX__,XX______, + ___XXXXX,XX______, + ___XXXXX,XX______, + __XX____,XXX_____, + __XX____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_66[36] = { /* code 66 */ + ________,________, + ________,________, + ________,________, + _XXXXX__,________, + _XXXXXX_,________, + _XX__XXX,________, + _XX___XX,________, + _XX__XXX,________, + _XXXXXX_,________, + _XXXXXXX,________, + _XX___XX,X_______, + _XX____X,X_______, + _XX___XX,X_______, + _XXXXXXX,________, + _XXXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_67[36] = { /* code 67 */ + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,________, + __XX__XX,________, + _XX_____,________, + _XX_____,________, + XX______,________, + XX______,________, + XX______,________, + XX_____X,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_68[36] = { /* code 68 */ + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XXXXX__,________, + _XXXXXXX,________, + _XX___XX,X_______, + _XX_____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX____X,XX______, + _XXXXXXX,X_______, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_69[36] = { /* code 69 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + _XXXXXXX,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_70[36] = { /* code 70 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,XX______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_71[36] = { /* code 71 */ + ________,________, + ________,________, + ________,________, + ____XXX_,________, + ___XXXXX,X_______, + __XXX__X,X_______, + _XXX____,________, + _XX_____,________, + XX_XXXXX,XX______, + XX_XXXXX,XX______, + XX______,XX______, + XX_____X,X_______, + XX____XX,X_______, + _XXXXXXX,________, + __XXXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_72[36] = { /* code 72 */ + ________,________, + ________,________, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX__XXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXX___,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_73[36] = { /* code 73 */ + ________,________, + ________,________, + ________,________, + XXXXXXXX,________, + XXXXXXXX,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_74[36] = { /* code 74 */ + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XX______, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + XX___XX_,________, + XX___XX_,________, + XXX__XX_,________, + _XXXXXX_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_75[36] = { /* code 75 */ + ________,________, + ________,________, + ________,________, + _XX_____,X_______, + _XX____X,X_______, + _XX___XX,________, + _XX__XX_,________, + _XX_XX__,________, + _XXX____,________, + _XXX____,________, + _XXXX___,________, + _XX_XX__,________, + _XX__XX_,________, + _XX___XX,X_______, + _XX____X,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_76[36] = { /* code 76 */ + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XXXXXXX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_77[36] = { /* code 77 */ + ________,________, + ________,________, + ________,________, + ____XX__,__X_____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___X_X__,_X_X____, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + __XX_XX_,XX_XX___, + __X__XX_,XX_XX___, + _XX__XXX,X__XX___, + _XX___XX,X___XX__, + _XX___XX,X___XX__, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_78[36] = { /* code 78 */ + ________,________, + ________,________, + ________,________, + _XX_____,__X_____, + _XX_____,__XX____, + _XXX____,__XX____, + _XXXX___,__XX____, + _XX_XX__,__XX____, + _XX__XX_,__XX____, + _XX___X_,__XX____, + _XX___XX,__XX____, + _XX____X,X_XX____, + _XX_____,XXXX____, + _XX_____,_XXX____, + _XX_____,__XX____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_79[36] = { /* code 79 */ + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XXX_____, + __XXX___,_XXX____, + __XX____,__XX____, + _XXX____,__XX____, + _XX_____,__XX____, + _XX_____,__XX____, + _XX_____,_XXX____, + _XX_____,_XX_____, + __XX____,XXX_____, + __XXXXXX,XX______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_80[18] = { /* code 80 */ + ________, + ________, + ________, + _XXXXX__, + _XXXXXX_, + _XX__XXX, + _XX___XX, + _XX__XXX, + _XXXXXX_, + _XXXXX__, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_81[36] = { /* code 81 */ + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + __XXXXXX,XXX_____, + _XXXX___,_XXX____, + _XX_____,__XX____, + XX______,___XX___, + XX______,___XX___, + XX______,___XX___, + XX____X_,___XX___, + _XX___XX,___XX___, + _XXX___X,X_XX____, + __XXXXXX,XXXX____, + ____XXXX,_XX_____, + ________,__XX____, + ________,___XX___, + ________,____X___}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_82[36] = { /* code 82 */ + ________,________, + ________,________, + ________,________, + _XXXX___,________, + _XXXXXX_,________, + _XX__XXX,________, + _XX___XX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX___XX,________, + _XXXXXX_,________, + _XXXXXX_,________, + _XX__XXX,________, + _XX____X,XX______, + _XX_____,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_83[36] = { /* code 83 */ + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,X_______, + __XXX___,________, + __XX____,________, + __XXXXXX,________, + ___XXXXX,X_______, + _______X,XX______, + ________,XX______, + _XX_____,XX______, + _XX____X,XX______, + __XXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_84[36] = { /* code 84 */ + ________,________, + ________,________, + ________,________, + XXXXXXXX,XX______, + XXXXXXXX,XX______, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_85[36] = { /* code 85 */ + ________,________, + ________,________, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XX_____,_XX_____, + _XXX____,XX______, + __XX___X,XX______, + __XXXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_86[36] = { /* code 86 */ + ________,________, + ________,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + _XX____X,X_______, + __XX___X,X_______, + __XX___X,X_______, + __XX___X,X_______, + __XX__XX,________, + ___XX_XX,________, + ___XX_XX,________, + ___XX_XX,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_87[54] = { /* code 87 */ + ________,________,________, + ________,________,________, + ________,________,________, + _XX_____,XX____XX,________, + _XX____X,XX____XX,________, + _XX____X,XX____XX,________, + _XX____X,_X____XX,________, + __XX__XX,_XX__XX_,________, + __XX__XX,_XX__XX_,________, + __XX__XX,_XX__XX_,________, + __XX_XX_,_XX_XX__,________, + ___X_XX_,_XX_XX__,________, + ___XXX__,_XX_XX__,________, + ___XXX__,_XXXX___,________, + ___XXX__,__XXX___,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_88[36] = { /* code 88 */ + ________,________, + ________,________, + ________,________, + _XX_____,_XX_____, + _XX_____,_XX_____, + __XX____,XX______, + ___XX__X,X_______, + ____XXXX,________, + _____XX_,________, + _____XXX,________, + ____XXXX,X_______, + ___XX__X,X_______, + __XX____,XX______, + _XX_____,_XX_____, + _XX_____,_XX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_89[36] = { /* code 89 */ + ________,________, + ________,________, + ________,________, + _XX_____,XX______, + _XX_____,XX______, + __XX___X,XX______, + __XX___X,X_______, + ___XX_XX,X_______, + ___XX_XX,________, + ____XXXX,________, + ____XXXX,________, + _____XX_,________, + ____XXX_,________, + ____XX__,________, + ___XX___,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_90[36] = { /* code 90 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + ____XXX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XX_____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_91[18] = { /* code 91 */ + ________, + ________, + __XXXX__, + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXXX__, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_92[18] = { /* code 92 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + __XX____, + __XX____, + ___X____, + ___XX___, + ___XX___, + ____X___, + ____XX__, + ____XX__, + ____XX__, + _____XX_, + _____XX_, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_93[18] = { /* code 93 */ + ________, + ________, + XXXXX___, + XXXXX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + XXXXX___, + XXXXX___}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_94[18] = { /* code 94 */ + ________, + ________, + ___XX___, + __XXXX__, + __XX_XX_, + _XX___X_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_95[36] = { /* code 95 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XX______}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_96[36] = { /* code 96 */ + ________,________, + ________,________, + _X______,________, + _XX_____,________, + __XX____,________, + ___X____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_97[18] = { /* code 97 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXX_XX, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_98[36] = { /* code 98 */ + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_XXX_,________, + _XXXXXXX,________, + _XXX__XX,X_______, + _XX____X,X_______, + _XX____X,X_______, + _XX___XX,X_______, + _XXXXXXX,________, + _XXXXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_99[18] = { /* code 99 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XXXXXX_, + _XX___X_, + XX______, + XX______, + XX____X_, + _XXXXXX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_100[36] = { /* code 100 */ + ________,________, + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ______XX,________, + __XXXXXX,________, + _XXXXXXX,________, + XXX___XX,________, + XX____XX,________, + XX____XX,________, + XXX___XX,________, + _XXXXXXX,________, + __XXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_101[18] = { /* code 101 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XXXXXX_, + XXX__XX_, + XX__XX__, + XX_XX___, + XXX___X_, + XXXXXXX_, + __XXXX__, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_102[18] = { /* code 102 */ + ________, + ________, + _____XXX, + ____XXXX, + ___XXX__, + ___XX___, + ___XX___, + _XXXXXX_, + _XXXXXX_, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_103[18] = { /* code 103 */ + ________, + ________, + ________, + ________, + ________, + ________, + __XXXX__, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX__XXX_, + XXXXXXX_, + _XXX_XX_, + _____XX_, + ____XX__, + XXXXXX__, + _XXXX___}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_104[18] = { /* code 104 */ + ________, + ________, + XX______, + XX______, + XX______, + XX______, + XX______, + XX_XXX__, + XXXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_105[18] = { /* code 105 */ + ________, + ________, + ________, + _XX_____, + _XX_____, + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_106[18] = { /* code 106 */ + ________, + ________, + ________, + __XX____, + __XX____, + ________, + ________, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_107[36] = { /* code 107 */ + ________,________, + ________,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX_____,________, + _XX___X_,________, + _XX__XX_,________, + _XX_XX__,________, + _XXXXX__,________, + _XXXXX__,________, + _XX__XX_,________, + _XX___XX,________, + _XX___XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_108[18] = { /* code 108 */ + ________, + ________, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_109[36] = { /* code 109 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX_XXX_X,X_______, + XXXXXXXX,XX______, + XXX_XXX_,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_110[18] = { /* code 110 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX_XXX__, + XXXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_111[18] = { /* code 111 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXX___, + _XXXXX__, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXX__, + __XXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_112[36] = { /* code 112 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_____,________, + _XX_XXX_,________, + _XXXXXXX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XX___XX,________, + _XXXXXX_,________, + _XXXXX__,________, + _XX_____,________, + _XX_____,________, + _XX_____,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_113[18] = { /* code 113 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + __XXXXX_, + _XXXXXX_, + XXX__XX_, + XX___XX_, + XX___XX_, + XX___XX_, + _XXXXXX_, + __XXXXX_, + _____XX_, + _____XX_, + _____XX_}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_114[18] = { /* code 114 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XX_XXX_, + _XXX_XX_, + _XX__XX_, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + _XX_____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_115[18] = { /* code 115 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ___XXX__, + _XXXXX__, + XXX_____, + XXXXX___, + _XXXXX__, + ____XX__, + XXXXXX__, + _XXXX___, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_116[18] = { /* code 116 */ + ________, + ________, + ________, + ________, + __XX____, + __XX____, + __XX____, + XXXXXX__, + XXXXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_117[18] = { /* code 117 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XX___XX_, + XXXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_118[18] = { /* code 118 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + XX___XX_, + XX___XX_, + _XX_XX__, + _XX_XX__, + _XX_XX__, + __XXX___, + __XXX___, + ___X____, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_119[36] = { /* code 119 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX__XX__,XX______, + XX__XX__,XX______, + XX__XX__,XX______, + XX_XXXX_,XX______, + XX_XX_X_,XX______, + XX_XX_X_,XX______, + _XXX__XX,X_______, + _XXX__XX,X_______, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_120[36] = { /* code 120 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XXX__XXX,________, + _XXXXXX_,________, + __XXXX__,________, + __XXXX__,________, + _XXXXXX_,________, + XXX__XXX,________, + XX____XX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_121[36] = { /* code 121 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XXX___XX,________, + _XX___XX,________, + _XXX_XX_,________, + __XX_XX_,________, + __XXXX__,________, + ___XXX__,________, + ___XX___,________, + ___XX___,________, + __XX____,________, + __XX____,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_122[36] = { /* code 122 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,________, + _XXXXXXX,________, + _____XX_,________, + ____XX__,________, + ___XX___,________, + __XX____,________, + _XXXXXXX,________, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_123[18] = { /* code 123 */ + ________, + ________, + ___XXX__, + __XXXX__, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + _XXX____, + _XX_____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + ___XXX__, + ___XXX__}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_124[18] = { /* code 124 */ + ________, + ________, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___, + ___XX___}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_125[18] = { /* code 125 */ + ________, + ________, + XXX_____, + XXXX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XX____, + __XXX___, + ___XXX__, + __XXX___, + __XX____, + __XX____, + __XX____, + __XX____, + XXX_____, + XXX_____}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_126[36] = { /* code 126 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XX___,________, + __XXXX__,X_______, + _XX_XX__,X_______, + _XX__XXX,X_______, + _X___XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_127[18] = { /* code 127 */ + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + _XXXXXX_, + _XXXXXX_, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic18B_ASCII_128[36] = { /* code 128 */ + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ___XXXXX,XX______, + __XXX___,________, + XXXXXXXX,________, + XXXXXXXX,________, + _XX_____,________, + XXXXXXX_,________, + XXXXXXX_,________, + _XX_____,________, + _XXX___X,X_______, + __XXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO CharInfo18B_ASCII[97] = { + { 5, 5, 1, acFontComic18B_ASCII_32 } /* code 32 */ + ,{ 4, 4, 1, acFontComic18B_ASCII_33 } /* code 33 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_34 } /* code 34 */ + ,{ 13, 13, 2, acFontComic18B_ASCII_35 } /* code 35 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_36 } /* code 36 */ + ,{ 13, 13, 2, acFontComic18B_ASCII_37 } /* code 37 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_38 } /* code 38 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_39 } /* code 39 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_40 } /* code 40 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_41 } /* code 41 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_42 } /* code 42 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_43 } /* code 43 */ + ,{ 4, 4, 1, acFontComic18B_ASCII_44 } /* code 44 */ + ,{ 7, 7, 1, acFontComic18B_ASCII_45 } /* code 45 */ + ,{ 4, 4, 1, acFontComic18B_ASCII_46 } /* code 46 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_47 } /* code 47 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_48 } /* code 48 */ + ,{ 7, 7, 1, acFontComic18B_ASCII_49 } /* code 49 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_50 } /* code 50 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_51 } /* code 51 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_52 } /* code 52 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_53 } /* code 53 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_54 } /* code 54 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_55 } /* code 55 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_56 } /* code 56 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_57 } /* code 57 */ + ,{ 5, 5, 1, acFontComic18B_ASCII_58 } /* code 58 */ + ,{ 5, 5, 1, acFontComic18B_ASCII_59 } /* code 59 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_60 } /* code 60 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_61 } /* code 61 */ + ,{ 7, 7, 1, acFontComic18B_ASCII_62 } /* code 62 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_63 } /* code 63 */ + ,{ 15, 15, 2, acFontComic18B_ASCII_64 } /* code 64 */ + ,{ 12, 12, 2, acFontComic18B_ASCII_65 } /* code 65 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_66 } /* code 66 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_67 } /* code 67 */ + ,{ 12, 12, 2, acFontComic18B_ASCII_68 } /* code 68 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_69 } /* code 69 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_70 } /* code 70 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_71 } /* code 71 */ + ,{ 12, 12, 2, acFontComic18B_ASCII_72 } /* code 72 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_73 } /* code 73 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_74 } /* code 74 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_75 } /* code 75 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_76 } /* code 76 */ + ,{ 15, 15, 2, acFontComic18B_ASCII_77 } /* code 77 */ + ,{ 13, 13, 2, acFontComic18B_ASCII_78 } /* code 78 */ + ,{ 13, 13, 2, acFontComic18B_ASCII_79 } /* code 79 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_80 } /* code 80 */ + ,{ 14, 14, 2, acFontComic18B_ASCII_81 } /* code 81 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_82 } /* code 82 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_83 } /* code 83 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_84 } /* code 84 */ + ,{ 12, 12, 2, acFontComic18B_ASCII_85 } /* code 85 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_86 } /* code 86 */ + ,{ 17, 17, 3, acFontComic18B_ASCII_87 } /* code 87 */ + ,{ 12, 12, 2, acFontComic18B_ASCII_88 } /* code 88 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_89 } /* code 89 */ + ,{ 12, 12, 2, acFontComic18B_ASCII_90 } /* code 90 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_91 } /* code 91 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_92 } /* code 92 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_93 } /* code 93 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_94 } /* code 94 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_95 } /* code 95 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_96 } /* code 96 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_97 } /* code 97 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_98 } /* code 98 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_99 } /* code 99 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_100 } /* code 100 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_101 } /* code 101 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_102 } /* code 102 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_103 } /* code 103 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_104 } /* code 104 */ + ,{ 5, 5, 1, acFontComic18B_ASCII_105 } /* code 105 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_106 } /* code 106 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_107 } /* code 107 */ + ,{ 5, 5, 1, acFontComic18B_ASCII_108 } /* code 108 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_109 } /* code 109 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_110 } /* code 110 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_111 } /* code 111 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_112 } /* code 112 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_113 } /* code 113 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_114 } /* code 114 */ + ,{ 7, 7, 1, acFontComic18B_ASCII_115 } /* code 115 */ + ,{ 7, 7, 1, acFontComic18B_ASCII_116 } /* code 116 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_117 } /* code 117 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_118 } /* code 118 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_119 } /* code 119 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_120 } /* code 120 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_121 } /* code 121 */ + ,{ 9, 9, 2, acFontComic18B_ASCII_122 } /* code 122 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_123 } /* code 123 */ + ,{ 7, 7, 1, acFontComic18B_ASCII_124 } /* code 124 */ + ,{ 6, 6, 1, acFontComic18B_ASCII_125 } /* code 125 */ + ,{ 10, 10, 2, acFontComic18B_ASCII_126 } /* code 126 */ + ,{ 8, 8, 1, acFontComic18B_ASCII_127 } /* code 127 */ + ,{ 11, 11, 2, acFontComic18B_ASCII_128 } /* code 128 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontComic18BProp_ASCII_1 = { + 32 /* first character */ + ,128 /* last character */ + ,CharInfo18B_ASCII /* address of first character */ + ,(const GUI_FONT_PROP *)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontComic18B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,18 /* height of font */ + ,18 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontComic18BProp_ASCII_1} + ,15, 8, 12 +}; + diff --git a/User/system/lib/lcd/gui/Font/FComic24B_1.c b/User/system/lib/lcd/gui/Font/FComic24B_1.c new file mode 100644 index 0000000..3c84684 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FComic24B_1.c @@ -0,0 +1,2643 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : F24B.C +Purpose : Similar to Comic +Height : 24 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontComic24B_160[48] = { /* code 160 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_161[24] = { /* code 161 */ + ________, + ________, + ________, + _XX_____, + _XXX____, + __XX____, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_162[48] = { /* code 162 */ + ________,________, + ______XX,________, + ______XX,________, + ______XX,________, + _____XXX,XXXX____, + ___XXXXX,XXXX____, + __XXXXXX,XXXX____, + __XXX_XX,__X_____, + _XXXX_XX,________, + _XXX__XX,________, + _XXX__XX,__XX____, + _XXX__XX,__XX____, + _XXXX_XX,_XXX____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + _____XXX,X_______, + ______XX,________, + ______XX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_163[72] = { /* code 163 */ + ________,________,________, + ________,________,________, + ________,________,________, + _______X,XXXX____,________, + _____XXX,XXXXXX__,________, + ____XXXX,XXXXXXX_,________, + ___XXXX_,____XXX_,________, + ___XXX__,_____XX_,________, + ___XXX__,________,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + XXXXXXXX,XXXXX___,________, + ___XXX__,________,________, + ____XXX_,________,________, + ____XXX_,______XX,________, + ____XXX_,______XX,________, + ____XXXX,X____XXX,________, + ___XXXXX,XXXXXXXX,________, + __XXXXXX,XXXXXXX_,________, + __XX____,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_164[48] = { /* code 164 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXXX___,___XX___, + _XXXXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + _XXXXXXX,XXX_____, + XXXX_XXX,XXXX____, + XXXX____,_XXXX___, + XXX_____,__XXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_165[48] = { /* code 165 */ + ________,________, + ________,________, + ________,________, + XXX_____,_XXX____, + XXXX____,_XXX____, + _XXX____,XXXX____, + __XXX___,XXX_____, + __XXX__X,XXX_____, + _XXXXX_X,XXXX____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXXX____, + _____XXX,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_166[48] = { /* code 166 */ + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_167[48] = { /* code 167 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX___X,XXX_____, + _XXXX___,_XX_____, + __XXXXXX,________, + _XXXXXXX,XX______, + _XXX___X,XXX_____, + _XXX____,XXX_____, + _XXXXX__,XXX_____, + __XXXXXX,XXX_____, + XX___XXX,XXX_____, + XXX_____,XXX_____, + XXX_____,XXX_____, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_168[48] = { /* code 168 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX_X,XX______, + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_169[72] = { /* code 169 */ + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXX____,________, + ____XXXX,XXXXX___,________, + ___XXX__,___XXX__,________, + __XXX_XX,XX__XXX_,________, + _XXX_XXX,XX___XX_,________, + _XX_XXX_,_____XX_,________, + _XX_XX__,_____XX_,________, + _XX_XX__,_XX__XX_,________, + _XX_XXXX,XXX_XX__,________, + _XXX__XX,XX_XXX__,________, + __XXX___,__XXX___,________, + ___XXXXX,XXXX____,________, + _____XXX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_170[48] = { /* code 170 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + _XXXXXXX,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX__XX,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_171[48] = { /* code 171 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,___XX___, + ___XXXX_,_XXXX___, + __XXXX__,XXXX____, + _XXXX__X,XXX_____, + XXXX__XX,XX______, + _XXXX__X,XXX_____, + __XXXX__,XXXX____, + ___XXXX_,_XXXX___, + ____XXX_,__XXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_172[48] = { /* code 172 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XXX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_173[48] = { /* code 173 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_174[72] = { /* code 174 */ + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXX____,________, + ____XXXX,XXXXXX__,________, + ___XXX__,____XXX_,________, + __XXX_XX,XXX__XX_,________, + __XX_XXX,XXXX__XX,________, + _XX__XXX,__XX__XX,________, + _XX_XXX_,_XXX__XX,________, + _XX_XXXX,XXX___XX,________, + _XX_XXXX,XX____XX,________, + _XX_XXX_,XXX__XX_,________, + __XXXX__,_XX_XXX_,________, + __XXX___,___XXX__,________, + ___XXXXX,XXXXX___,________, + _____XXX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_175[48] = { /* code 175 */ + XXXXXXXX,XXXXX___, + XXXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_176[48] = { /* code 176 */ + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,X_______, + __XX____,XX______, + __XX____,XX______, + __XX___X,XX______, + ___XXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_177[48] = { /* code 177 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_178[48] = { /* code 178 */ + ________,________, + _____XXX,X_______, + ___XXXXX,XX______, + ___XXX__,XX______, + ___XX__X,XX______, + _____XXX,XX______, + ____XXXX,X_______, + ___XXXX_,________, + ___XXXXX,XX______, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_179[48] = { /* code 179 */ + ________,________, + _____XXX,X_______, + _____XXX,XX______, + ________,XX______, + ______XX,XX______, + ______XX,XX______, + _______X,XX______, + ________,XX______, + ____XXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_180[48] = { /* code 180 */ + ________,________, + ________,________, + _____XX_,________, + ____XXX_,________, + ___XXX__,________, + __XXX___,________, + __XX____,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_181[48] = { /* code 181 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,__XXX___, + ____XXX_,__XXX___, + ____XXX_,__XXX___, + ___XXX__,__XX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XXX____, + ___XXX__,_XX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _XXXX___,________, + _XXX____,________, + _XXX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_182[48] = { /* code 182 */ + ________,________, + ________,________, + ________,________, + ________,XXX_XX__, + ____XXXX,XXXXXXX_, + ___XXXXX,XXXXXXX_, + __XXXXXX,XXX_XXX_, + _XXXXX__,XXX_XXX_, + XXXX____,XXX_XXX_, + XXX_____,XXX_XXX_, + XXX_____,XXX_XXX_, + XXXX____,XXX_XXX_, + _XXXXXXX,XXXXXX__, + __XXXXXX,XXXXXX__, + ____XXXX,XX_XXX__, + _______X,XX_XXX__, + _______X,XX_XXX__, + ______XX,XX_XXX__, + ______XX,XXXXX___, + ______XX,X_XXX___, + ______XX,X_XXX___, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_183[48] = { /* code 183 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_184[48] = { /* code 184 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,________, + ____XXXX,X_______, + _______X,X_______, + ___XXXXX,X_______, + ____XXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_185[48] = { /* code 185 */ + ________,________, + _____XX_,________, + ____XXX_,________, + ___XXXX_,________, + ___XXXX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ___XXXXX,X_______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_186[48] = { /* code 186 */ + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ____XXXX,XXX_____, + ___XXXXX,XXX_____, + __XXXX__,_XXX____, + __XXX___,_XXX____, + __XXXX__,XXXX____, + ___XXXXX,XXXX____, + ___XXXXX,XXX_____, + _____XXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_187[48] = { /* code 187 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XX____XX,________, + XXXX__XX,XX______, + _XXXX__X,XXX_____, + __XXXX__,XXXX____, + ___XXXX_,_XXXX___, + __XXXX__,XXXX____, + _XXXX__X,XXX_____, + XXXX__XX,XX______, + XXX___XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_188[48] = { /* code 188 */ + ________,________, + ______XX,________, + _____XXX,________, + ____XXXX,________, + _____XXX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ____XXXX,XX______, + ____XXXX,XX______, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,________, + _______X,X_______, + ______XX,X_______, + _____XXX,X_______, + ____XX_X,X_______, + ___XX__X,X_______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + _______X,X_______, + _______X,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_189[48] = { /* code 189 */ + ________,________, + ______XX,________, + _____XXX,________, + ____XXXX,________, + ____XXXX,________, + ______XX,________, + ______XX,________, + ______XX,________, + ____XXXX,XX______, + ____XXXX,XX______, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + ________,________, + _____XXX,X_______, + ___XXXXX,XX______, + ___XXX_X,XX______, + ___XX_XX,XX______, + _____XXX,XX______, + ____XXXX,X_______, + ___XXXX_,________, + ___XXXXX,XX______, + ___XXXXX,XX______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_190[48] = { /* code 190 */ + ________,________, + ____XXXX,________, + ____XXXX,X_______, + _______X,X_______, + _____XXX,X_______, + _____XXX,X_______, + ______XX,X_______, + _______X,X_______, + ___XXXXX,X_______, + ___XXXXX,________, + ________,________, + XXXXXXXX,XXXX____, + XXXXXXXX,XXXX____, + ________,________, + ______XX,________, + _____XXX,________, + ____XXXX,________, + ___XX_XX,________, + __XX__XX,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ______XX,________, + ______XX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_191[48] = { /* code 191 */ + ________,________, + ________,________, + ________,________, + _______X,XX______, + _______X,XX______, + _______X,XX______, + ________,________, + ________,________, + ______XX,X_______, + _____XXX,X_______, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXX___,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_192[48] = { /* code 192 */ + ________,_XXX____, + ________,__XX____, + ________,________, + ________,_XX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_193[48] = { /* code 193 */ + ________,_XXX____, + ________,_XX_____, + ________,________, + ________,_XX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_194[48] = { /* code 194 */ + _____XXX,X__XXX__, + _____XXX,____XX__, + ________,________, + ________,_XX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_195[48] = { /* code 195 */ + _____XXX,_XXXXX__, + _____XX_,__XXXX__, + ________,________, + ________,_XX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_196[48] = { /* code 196 */ + ______XX,XX_XXXX_, + ______XX,X__XXXX_, + ________,________, + ________,_XX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_197[48] = { /* code 197 */ + ______XX,XXXXX___, + ______XX,___XX___, + ______XX,___XX___, + ______XX,XXXXX___, + _______X,XXXX____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_198[72] = { /* code 198 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,___XXXXX,XXXXX___, + ________,__XXXXXX,XXXXXX__, + ________,_XXXXXXX,XXXXX___, + ________,XXXXXX__,________, + _______X,XXXXXX__,________, + ______XX,XX_XXX__,________, + _____XXX,X__XXX__,________, + _____XXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXX___, + __XXXX__,___XXX__,________, + __XXX___,___XXX__,________, + _XXXX___,___XXX__,________, + _XXX____,___XXX__,________, + XXXX____,___XXXXX,XXXXX___, + XXX_____,____XXXX,XXXXXX__, + ________,_____XXX,XXXXX___, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_199[48] = { /* code 199 */ + ________,________, + ________,________, + ________,________, + _______X,XXXXX___, + ______XX,XXXXX___, + _____XXX,XXXXX___, + ____XXXX,__XXX___, + ___XXXX_,___XX___, + __XXXX__,________, + __XXX___,________, + __XXX___,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,__XX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ____XXXX,________, + _____XXX,________, + _XXXXXXX,________, + _XXXXX__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_200[48] = { /* code 200 */ + _______X,X_______, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + __XXXXXX,XXXX____, + ___XXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_201[48] = { /* code 201 */ + ______XX,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + __XXXXXX,XXXX____, + ___XXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_202[48] = { /* code 202 */ + __XXX___,_XX_____, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + __XXXXXX,XXXX____, + ___XXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_203[48] = { /* code 203 */ + ___XXX__,XXXX____, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + __XXXXXX,XXXX____, + ___XXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_204[48] = { /* code 204 */ + _____XXX,________, + ______XX,________, + ________,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_205[48] = { /* code 205 */ + ____XXX_,________, + ____XX__,________, + ________,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_206[48] = { /* code 206 */ + _XXXX__X,XX______, + _XXX____,XX______, + ________,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_207[48] = { /* code 207 */ + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + ________,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_208[48] = { /* code 208 */ + ________,________, + ________,________, + ________,________, + ___XX___,________, + __XXXXX_,________, + __XXXXXX,XX______, + __XXX_XX,XXX_____, + __XXX___,XXXX____, + __XXX___,__XXX___, + __XXX___,___XXX__, + XXXXXXXX,____XXX_, + XXXXXXXX,X___XXX_, + XXXXXXXX,X___XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,___XXX__, + __XXX___,__XXXX__, + __XXXXXX,XXXXX___, + __XXXXXX,XXXX____, + ____XXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_209[72] = { /* code 209 */ + ___XXX_X,XXXX____,________, + ___XX___,XXXX____,________, + ________,________,________, + _XXX____,_____XX_,________, + _XXX____,_____XXX,________, + _XXXX___,_____XXX,________, + _XXXXX__,_____XXX,________, + _XXXXX__,_____XXX,________, + _XXXXXX_,_____XXX,________, + _XXX_XXX,_____XXX,________, + _XXX_XXX,X____XXX,________, + _XXX__XX,X____XXX,________, + _XXX___X,XX___XXX,________, + _XXX____,XXX__XXX,________, + _XXX____,_XXX_XXX,________, + _XXX____,__XXXXXX,________, + _XXX____,__XXXXXX,________, + _XXX____,___XXXXX,________, + _XXX____,____XXXX,________, + __X_____,______X_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_210[72] = { /* code 210 */ + ________,__XXX___,________, + ________,___XX___,________, + ________,________,________, + _______X,XXXXX___,________, + ______XX,XXXXXXX_,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,________, + ___XXXX_,______XX,X_______, + ___XXX__,______XX,X_______, + ___XXX__,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,_____XXX,________, + __XXX___,_____XXX,________, + __XXXX__,____XXXX,________, + ___XXXX_,___XXXX_,________, + ____XXXX,XXXXXX__,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_211[72] = { /* code 211 */ + ________,_XXX____,________, + ________,_XX_____,________, + ________,________,________, + ______XX,XXXX____,________, + _____XXX,XXXXXX__,________, + ____XXXX,XXXXXXX_,________, + ___XXXX_,____XXX_,________, + __XXXX__,_____XXX,________, + __XXX___,_____XXX,________, + __XXX___,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,____XXX_,________, + _XXX____,____XXX_,________, + _XXXX___,___XXXX_,________, + __XXXX__,__XXXX__,________, + ___XXXXX,XXXXX___,________, + ____XXXX,XXXX____,________, + _____XXX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_212[72] = { /* code 212 */ + ______XX,XX__XXX_,________, + ______XX,X____XX_,________, + ________,________,________, + _______X,XXXXX___,________, + ______XX,XXXXXXX_,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,________, + ___XXXX_,______XX,X_______, + ___XXX__,______XX,X_______, + ___XXX__,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,_____XXX,________, + __XXX___,_____XXX,________, + __XXXX__,____XXXX,________, + ___XXXX_,___XXXX_,________, + ____XXXX,XXXXXX__,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_213[72] = { /* code 213 */ + _____XXX,_XXXXX__,________, + _____XX_,__XXXX__,________, + ________,________,________, + _______X,XXXXX___,________, + ______XX,XXXXXXX_,________, + _____XXX,XXXXXXXX,________, + ____XXXX,_____XXX,________, + ___XXXX_,______XX,X_______, + ___XXX__,______XX,X_______, + ___XXX__,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,______XX,X_______, + __XXX___,_____XXX,________, + __XXX___,_____XXX,________, + __XXXX__,____XXXX,________, + ___XXXX_,___XXXX_,________, + ____XXXX,XXXXXX__,________, + _____XXX,XXXXX___,________, + ______XX,XXXX____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_214[72] = { /* code 214 */ + ______XX,XX_XXXX_,________, + ______XX,X__XXXX_,________, + ________,________,________, + ______XX,XXXX____,________, + _____XXX,XXXXXX__,________, + ____XXXX,XXXXXXX_,________, + ___XXXX_,____XXX_,________, + __XXXX__,_____XXX,________, + __XXX___,_____XXX,________, + __XXX___,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,____XXX_,________, + _XXX____,____XXX_,________, + _XXXX___,___XXXX_,________, + __XXXX__,__XXXX__,________, + ___XXXXX,XXXXX___,________, + ____XXXX,XXXX____,________, + _____XXX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_215[48] = { /* code 215 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXX___,XXX_____, + __XXXX_X,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + ___XXXXX,XX______, + ___XXX_X,XXX_____, + ___XXX__,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_216[72] = { /* code 216 */ + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXX___X,X_______, + ____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,________, + __XXXXX_,___XXXX_,________, + __XXX___,__XXXXXX,________, + _XXX____,_XXXXXXX,________, + _XXX____,XXXX_XXX,________, + XXX____X,XXX__XXX,________, + XXX___XX,XX___XXX,________, + XXX__XXX,X____XXX,________, + XXX_XXXX,____XXXX,________, + XXXXXXX_,____XXX_,________, + XXXXXX__,___XXXX_,________, + _XXXXX__,__XXXX__,________, + _XXXXXXX,XXXXX___,________, + XXX_XXXX,XXXX____,________, + XX___XXX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_217[48] = { /* code 217 */ + _______X,XX______, + ________,XX______, + ________,________, + __X_____,____X___, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,__XXX___, + __XXX___,_XXX____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_218[48] = { /* code 218 */ + ______XX,X_______, + ______XX,________, + ________,________, + __X_____,____X___, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,__XXX___, + __XXX___,_XXX____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_219[48] = { /* code 219 */ + ___XXXX_,_XXX____, + ___XXX__,__XX____, + ________,________, + __X_____,____X___, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,__XXX___, + __XXX___,_XXX____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_220[48] = { /* code 220 */ + ____XXXX,_XXXX___, + ____XXX_,_XXXX___, + ________,________, + __X_____,____X___, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,__XXX___, + __XXX___,_XXX____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_221[48] = { /* code 221 */ + ______XX,________, + ________,________, + ________,________, + XXX_____,__XXX___, + XXX_____,__XXX___, + XXXX____,_XXXX___, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXX___,XXX_____, + ___XXX_X,XXX_____, + ___XXX_X,XX______, + ____XXXX,XX______, + ____XXXX,X_______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ____XXX_,________, + ___XXXX_,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_222[48] = { /* code 222 */ + ________,________, + ________,________, + ________,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _XXX___X,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + _XXXXXXX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_223[48] = { /* code 223 */ + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,X_______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX__XX,XX______, + _XXX__XX,X_______, + _XXX_XXX,________, + _XXX_XXX,X_______, + _XXX__XX,X_______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX_XXX,XX______, + _XXX_XXX,X_______, + _XXX_XXX,X_______, + _XX_____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_224[48] = { /* code 224 */ + ________,________, + ________,________, + ___XX___,________, + ___XXX__,________, + ____XXX_,________, + _____XXX,________, + ______XX,________, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_225[48] = { /* code 225 */ + ________,________, + ________,________, + ________,XX______, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + _____XX_,________, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_226[48] = { /* code 226 */ + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + __XXXXXX,X_______, + _XXXX__X,XX______, + _XXX____,XX______, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_227[48] = { /* code 227 */ + ________,________, + ________,________, + ________,________, + ___XXX__,_XX_____, + __XXXXX_,XXX_____, + _XXX_XXX,XX______, + _XX___XX,XX______, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_228[48] = { /* code 228 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX_X,XX______, + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_229[48] = { /* code 229 */ + ________,________, + ____XXXX,________, + __XXXXXX,X_______, + __XX___X,X_______, + __XX___X,X_______, + __XXXXXX,X_______, + ___XXXXX,________, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_230[72] = { /* code 230 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ____XXXX,X_XXXXX_,________, + __XXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + _XXX___X,XXX___XX,X_______, + XXXX___X,XX_XXXXX,________, + XXX____X,XXXXXXX_,________, + XXX____X,XXXXX___,________, + XXX____X,XXX_____,XX______, + XXXX___X,XXX____X,XX______, + _XXXXXXX,XXXXXXXX,XX______, + __XXXXXX,XXXXXXXX,X_______, + ___XXXX_,XX_XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_231[48] = { /* code 231 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + _XXXXXXX,XX______, + _XXXX___,XX______, + XXXX____,________, + XXX_____,________, + XXX_____,________, + XXXX___X,XX______, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ___XXXXX,X_______, + _____XXX,________, + ______XX,________, + __XXXXXX,________, + __XXXXXX,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_232[48] = { /* code 232 */ + ________,________, + ________,________, + ___XX___,________, + ___XXX__,________, + ____XXX_,________, + _____XXX,________, + ______XX,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX____,XXX_____, + XXXX__XX,XXX_____, + XXX_XXXX,XX______, + XXXXXXXX,________, + XXXXXX__,________, + XXXX____,XXX_____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_233[48] = { /* code 233 */ + ________,________, + ________,________, + _______X,X_______, + ______XX,X_______, + _____XXX,________, + ____XXX_,________, + ____XX__,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX____,XXX_____, + XXXX__XX,XXX_____, + XXX_XXXX,XX______, + XXXXXXXX,________, + XXXXXX__,________, + XXXX____,XXX_____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_234[48] = { /* code 234 */ + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + __XXXXXX,X_______, + _XXXX__X,XX______, + _XXX____,XX______, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX____,XXX_____, + XXXX__XX,XXX_____, + XXX_XXXX,XX______, + XXXXXXXX,________, + XXXXXX__,________, + XXXX____,XXX_____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_235[48] = { /* code 235 */ + ________,________, + ________,________, + ________,________, + ___XXX_X,XX______, + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX____,XXX_____, + XXXX__XX,XXX_____, + XXX_XXXX,XX______, + XXXXXXXX,________, + XXXXXX__,________, + XXXX____,XXX_____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_236[24] = { /* code 236 */ + ________, + ________, + XX______, + XXX_____, + _XXX____, + __XXX___, + ___XX___, + ________, + __X_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __X_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_237[24] = { /* code 237 */ + ________, + ________, + ____XX__, + ___XXX__, + __XXX___, + _XXX____, + _XX_____, + ________, + __X_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __X_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_238[24] = { /* code 238 */ + ________, + ________, + __XX____, + _XXXX___, + XXXXXX__, + XX__XX__, + X____X__, + ________, + __X_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __X_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_239[24] = { /* code 239 */ + ________, + ________, + ________, + ________, + XXX_XX__, + XXX_XX__, + XX__XX__, + ________, + __X_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __X_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_240[48] = { /* code 240 */ + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XXXXX,X_______, + ____XXXX,X_______, + ___XXXXX,________, + __XXXXX_,________, + __XXX_XX,________, + _____XXX,X_______, + ____XXXX,X_______, + ___XXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX__XX,XX______, + __XXXXXX,X_______, + __XXXXXX,X_______, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_241[48] = { /* code 241 */ + ________,________, + ________,________, + ________,________, + ___XXX__,_XX_____, + __XXXXX_,XXX_____, + _XXX_XXX,XX______, + _XX___XX,XX______, + ________,________, + _XXX_XXX,X_______, + _XXXXXXX,X_______, + _XXXXXXX,XX______, + _XXXXX_X,XX______, + _XXXX__X,XX______, + _XXXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __X_____,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_242[48] = { /* code 242 */ + ________,________, + ________,________, + ____XX__,________, + ____XXX_,________, + _____XXX,________, + ______XX,X_______, + _______X,X_______, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + _XXX__XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_243[48] = { /* code 243 */ + ________,________, + ________,________, + _______X,X_______, + ______XX,X_______, + _____XXX,________, + ____XXX_,________, + ____XX__,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + _XXX__XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_244[48] = { /* code 244 */ + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + __XXXXXX,X_______, + _XXXX__X,XX______, + _XXX____,XX______, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + _XXX__XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_245[48] = { /* code 245 */ + ________,________, + ________,________, + ________,________, + ___XXX__,_XX_____, + __XXXXX_,XXX_____, + _XXX_XXX,XX______, + _XX___XX,XX______, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + _XXX__XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_246[48] = { /* code 246 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX_X,XX______, + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + _XXX__XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_247[48] = { /* code 247 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ________,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_248[48] = { /* code 248 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXX_,XX______, + __XXXXXX,XX______, + _XXXXXXX,XX______, + _XXX__XX,XX______, + XXX__XXX,XX______, + XXX_XXXX,XX______, + XXXXXX_X,XX______, + XXXXX__X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + XXXXXXXX,________, + XX_XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_249[48] = { /* code 249 */ + ________,________, + ________,________, + ____XX__,________, + ____XXX_,________, + _____XXX,________, + ______XX,X_______, + _______X,X_______, + ________,________, + ___X____,_X______, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_250[48] = { /* code 250 */ + ________,________, + ________,________, + ________,XX______, + _______X,XX______, + ______XX,X_______, + _____XXX,________, + _____XX_,________, + ________,________, + ___X____,_X______, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_251[48] = { /* code 251 */ + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + __XXXXXX,X_______, + _XXXX__X,XX______, + _XXX____,XX______, + ________,________, + ___X____,_X______, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_252[48] = { /* code 252 */ + ________,________, + ________,________, + ________,________, + ________,________, + ____XXX_,XXX_____, + ___XXXX_,XXX_____, + ___XXX__,XXX_____, + ________,________, + ___X____,_X______, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_253[48] = { /* code 253 */ + ________,________, + ________,________, + ______XX,________, + _____XXX,________, + ____XXX_,________, + ___XXX__,________, + ___XX___,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXX___,XXX_____, + __XXXX_X,XXX_____, + ___XXX_X,XX______, + ___XXXXX,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_254[48] = { /* code 254 */ + ________,________, + ________,________, + ________,________, + __XX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX_XXX,X_______, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _XXXX___,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _XXXXXXX,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_255[48] = { /* code 255 */ + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX_X,XX______, + __XXXX_X,XXX_____, + __XXX__X,XXX_____, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXX___,XXX_____, + __XXXX_X,XXX_____, + ___XXX_X,XX______, + ___XXXXX,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + ________,________}; + + + +GUI_CONST_STORAGE GUI_CHARINFO CharInfo24B_160_255[] = { + { 10, 10, 2, acFontComic24B_160 } /* code 160 */ + ,{ 5, 5, 1, acFontComic24B_161 } /* code 161 */ + ,{ 13, 13, 2, acFontComic24B_162 } /* code 162 */ + ,{ 17, 17, 3, acFontComic24B_163 } /* code 163 */ + ,{ 13, 13, 2, acFontComic24B_164 } /* code 164 */ + ,{ 13, 13, 2, acFontComic24B_165 } /* code 165 */ + ,{ 9, 9, 2, acFontComic24B_166 } /* code 166 */ + ,{ 13, 13, 2, acFontComic24B_167 } /* code 167 */ + ,{ 12, 12, 2, acFontComic24B_168 } /* code 168 */ + ,{ 17, 17, 3, acFontComic24B_169 } /* code 169 */ + ,{ 13, 13, 2, acFontComic24B_170 } /* code 170 */ + ,{ 13, 13, 2, acFontComic24B_171 } /* code 171 */ + ,{ 13, 13, 2, acFontComic24B_172 } /* code 172 */ + ,{ 13, 13, 2, acFontComic24B_173 } /* code 173 */ + ,{ 17, 17, 3, acFontComic24B_174 } /* code 174 */ + ,{ 13, 13, 2, acFontComic24B_175 } /* code 175 */ + ,{ 13, 13, 2, acFontComic24B_176 } /* code 176 */ + ,{ 13, 13, 2, acFontComic24B_177 } /* code 177 */ + ,{ 13, 13, 2, acFontComic24B_178 } /* code 178 */ + ,{ 13, 13, 2, acFontComic24B_179 } /* code 179 */ + ,{ 12, 12, 2, acFontComic24B_180 } /* code 180 */ + ,{ 13, 13, 2, acFontComic24B_181 } /* code 181 */ + ,{ 16, 16, 2, acFontComic24B_182 } /* code 182 */ + ,{ 13, 13, 2, acFontComic24B_183 } /* code 183 */ + ,{ 12, 12, 2, acFontComic24B_184 } /* code 184 */ + ,{ 13, 13, 2, acFontComic24B_185 } /* code 185 */ + ,{ 13, 13, 2, acFontComic24B_186 } /* code 186 */ + ,{ 13, 13, 2, acFontComic24B_187 } /* code 187 */ + ,{ 13, 13, 2, acFontComic24B_188 } /* code 188 */ + ,{ 13, 13, 2, acFontComic24B_189 } /* code 189 */ + ,{ 13, 13, 2, acFontComic24B_190 } /* code 190 */ + ,{ 12, 12, 2, acFontComic24B_191 } /* code 191 */ + ,{ 15, 15, 2, acFontComic24B_192 } /* code 192 */ + ,{ 15, 15, 2, acFontComic24B_193 } /* code 193 */ + ,{ 15, 15, 2, acFontComic24B_194 } /* code 194 */ + ,{ 15, 15, 2, acFontComic24B_195 } /* code 195 */ + ,{ 15, 15, 2, acFontComic24B_196 } /* code 196 */ + ,{ 15, 15, 2, acFontComic24B_197 } /* code 197 */ + ,{ 23, 23, 3, acFontComic24B_198 } /* code 198 */ + ,{ 13, 13, 2, acFontComic24B_199 } /* code 199 */ + ,{ 13, 13, 2, acFontComic24B_200 } /* code 200 */ + ,{ 13, 13, 2, acFontComic24B_201 } /* code 201 */ + ,{ 13, 13, 2, acFontComic24B_202 } /* code 202 */ + ,{ 13, 13, 2, acFontComic24B_203 } /* code 203 */ + ,{ 11, 11, 2, acFontComic24B_204 } /* code 204 */ + ,{ 11, 11, 2, acFontComic24B_205 } /* code 205 */ + ,{ 11, 11, 2, acFontComic24B_206 } /* code 206 */ + ,{ 11, 11, 2, acFontComic24B_207 } /* code 207 */ + ,{ 15, 15, 2, acFontComic24B_208 } /* code 208 */ + ,{ 17, 17, 3, acFontComic24B_209 } /* code 209 */ + ,{ 17, 17, 3, acFontComic24B_210 } /* code 210 */ + ,{ 17, 17, 3, acFontComic24B_211 } /* code 211 */ + ,{ 17, 17, 3, acFontComic24B_212 } /* code 212 */ + ,{ 17, 17, 3, acFontComic24B_213 } /* code 213 */ + ,{ 17, 17, 3, acFontComic24B_214 } /* code 214 */ + ,{ 13, 13, 2, acFontComic24B_215 } /* code 215 */ + ,{ 17, 17, 3, acFontComic24B_216 } /* code 216 */ + ,{ 15, 15, 2, acFontComic24B_217 } /* code 217 */ + ,{ 15, 15, 2, acFontComic24B_218 } /* code 218 */ + ,{ 15, 15, 2, acFontComic24B_219 } /* code 219 */ + ,{ 15, 15, 2, acFontComic24B_220 } /* code 220 */ + ,{ 13, 13, 2, acFontComic24B_221 } /* code 221 */ + ,{ 11, 11, 2, acFontComic24B_222 } /* code 222 */ + ,{ 11, 11, 2, acFontComic24B_223 } /* code 223 */ + ,{ 12, 12, 2, acFontComic24B_224 } /* code 224 */ + ,{ 12, 12, 2, acFontComic24B_225 } /* code 225 */ + ,{ 12, 12, 2, acFontComic24B_226 } /* code 226 */ + ,{ 12, 12, 2, acFontComic24B_227 } /* code 227 */ + ,{ 12, 12, 2, acFontComic24B_228 } /* code 228 */ + ,{ 12, 12, 2, acFontComic24B_229 } /* code 229 */ + ,{ 19, 19, 3, acFontComic24B_230 } /* code 230 */ + ,{ 11, 11, 2, acFontComic24B_231 } /* code 231 */ + ,{ 12, 12, 2, acFontComic24B_232 } /* code 232 */ + ,{ 12, 12, 2, acFontComic24B_233 } /* code 233 */ + ,{ 12, 12, 2, acFontComic24B_234 } /* code 234 */ + ,{ 12, 12, 2, acFontComic24B_235 } /* code 235 */ + ,{ 6, 6, 1, acFontComic24B_236 } /* code 236 */ + ,{ 6, 6, 1, acFontComic24B_237 } /* code 237 */ + ,{ 6, 6, 1, acFontComic24B_238 } /* code 238 */ + ,{ 6, 6, 1, acFontComic24B_239 } /* code 239 */ + ,{ 11, 11, 2, acFontComic24B_240 } /* code 240 */ + ,{ 11, 11, 2, acFontComic24B_241 } /* code 241 */ + ,{ 11, 11, 2, acFontComic24B_242 } /* code 242 */ + ,{ 11, 11, 2, acFontComic24B_243 } /* code 243 */ + ,{ 11, 11, 2, acFontComic24B_244 } /* code 244 */ + ,{ 11, 11, 2, acFontComic24B_245 } /* code 245 */ + ,{ 11, 11, 2, acFontComic24B_246 } /* code 246 */ + ,{ 13, 13, 2, acFontComic24B_247 } /* code 247 */ + ,{ 11, 11, 2, acFontComic24B_248 } /* code 248 */ + ,{ 11, 11, 2, acFontComic24B_249 } /* code 249 */ + ,{ 11, 11, 2, acFontComic24B_250 } /* code 250 */ + ,{ 11, 11, 2, acFontComic24B_251 } /* code 251 */ + ,{ 11, 11, 2, acFontComic24B_252 } /* code 252 */ + ,{ 12, 12, 2, acFontComic24B_253 } /* code 253 */ + ,{ 11, 11, 2, acFontComic24B_254 } /* code 254 */ + ,{ 12, 12, 2, acFontComic24B_255 } /* code 255 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP FontComic24BProp_1_160_255 = { + 160 /* first character */ + ,255 /* last character */ + ,CharInfo24B_160_255 /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP FontComic24BProp_1_ASCII = { + 32 /* first character */ + ,127 /* last character */ + ,CharInfo24B_ASCII /* address of first character */ + ,&FontComic24BProp_1_160_255 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontComic24B_1 = { + GUI_FONTTYPE_PROP /* type of font */ + ,24 /* height of font */ + ,24 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&FontComic24BProp_1_ASCII} + ,20, 12, 17 +}; + diff --git a/User/system/lib/lcd/gui/Font/FComic24B_ASCII.c b/User/system/lib/lcd/gui/Font/FComic24B_ASCII.c new file mode 100644 index 0000000..1f5626a --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FComic24B_ASCII.c @@ -0,0 +1,2638 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FComic24B_ASCII.C +Purpose : Similar to Comic +Height : 24 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + + +GUI_CONST_STORAGE unsigned char acFontComic24B_32[48] = { /* code 32 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_33[24] = { /* code 33 */ + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + ________, + _XX_____, + _XXX____, + __XX____, + ________, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_34[48] = { /* code 34 */ + ________,________, + ________,________, + ________,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + _XX__XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_35[72] = { /* code 35 */ + ________,________,________, + ________,________,________, + ______XX,X___XXX_,________, + ______XX,X___XXX_,________, + ______XX,X__XXXX_,________, + _XXXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + _XXXXXXX,XXXXXXXX,X_______, + ____XXXX,__XXXX__,________, + ____XXX_,__XXX___,________, + ____XXX_,__XXX___,________, + ___XXX__,__XXX___,________, + XXXXXXXX,XXXXXXXX,________, + XXXXXXXX,XXXXXXXX,________, + XXXXXXXX,XXXXXXXX,________, + __XXX___,_XXX____,________, + _XXXX___,XXX_____,________, + _XXX____,XXX_____,________, + _XXX____,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_36[48] = { /* code 36 */ + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + _____XXX,XXX_____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX_XX,X_______, + _XXX__XX,X_______, + _XXX__XX,X_______, + _XXXXXXX,XXX_____, + __XXXXXX,XXXXX___, + ____XXXX,XXXXX___, + ______XX,X_XXXX__, + ______XX,X__XXX__, + ______XX,X__XXX__, + ______XX,X__XXX__, + _XXX__XX,X_XXXX__, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXX____, + __XXXXXX,XX______, + ______XX,X_______, + ______XX,X_______, + ______XX,X_______, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_37[72] = { /* code 37 */ + ________,________,________, + ________,________,________, + ________,________,________, + __XXXX__,___XX___,________, + _XXXXXX_,__XXX___,________, + XXXXXXXX,_XXX____,________, + XXX__XXX,_XXX____,________, + XXX__XXX,XXX_____,________, + XXXXXXXX,XXX_____,________, + _XXXXXXX,XX______,________, + __XXXX_X,XX______,________, + ______XX,X__XXXX_,________, + ______XX,X_XXXXXX,________, + _____XXX,_XXXXXXX,X_______, + _____XXX,_XXX__XX,X_______, + ____XXX_,_XXX__XX,X_______, + ____XX__,_XXXXXXX,X_______, + ___XXX__,__XXXXXX,________, + ___XX___,___XXXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_38[48] = { /* code 38 */ + ________,________, + ________,________, + ________,________, + ______XX,XX______, + _____XXX,XXX_____, + ____XXXX,XXX_____, + ____XXX_,XXX_____, + ____XXX_,XXX_____, + ____XXXX,XX______, + _____XXX,X_______, + ___XXXXX,X_XXX___, + __XXXXXX,X_XXX___, + _XXXX_XX,XXXXX___, + XXXX___X,XXXXX___, + XXX_____,XXXXX___, + XXX_____,XXXX____, + XXXX___X,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXXX__, + ___XXXXX,___XXX__, + ________,___XXX__, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_39[48] = { /* code 39 */ + ________,________, + ________,________, + ________,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ___XX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_40[24] = { /* code 40 */ + ________, + ________, + ________, + _____XXX, + ____XXXX, + ___XXXX_, + ___XXX__, + __XXX___, + __XXX___, + __XXX___, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __XXX___, + __XXX___, + __XXXX__, + ___XXXX_, + ____XXXX, + _____XXX, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_41[24] = { /* code 41 */ + ________, + ________, + ________, + XXX_____, + XXXX____, + _XXXX___, + __XXX___, + ___XXX__, + ___XXX__, + ___XXX__, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ___XXX__, + ___XXX__, + __XXXX__, + _XXXX___, + XXXX____, + XXX_____, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_42[48] = { /* code 42 */ + ________,________, + ________,________, + ________,________, + ____XXX_,________, + ____XXX_,________, + XXX_XXXX,XXX_____, + XXXXXXXX,XXX_____, + __XXXXXX,X_______, + __XXXXXX,X_______, + _XXXX_XX,XX______, + _XXX___X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_43[48] = { /* code 43 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _____XX_,________, + _____XX_,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_44[48] = { /* code 44 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + ___XXX__,________, + ___XX___,________, + __XXX___,________, + __XX____,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_45[48] = { /* code 45 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XX______, + __XXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_46[48] = { /* code 46 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_47[48] = { /* code 47 */ + ________,________, + ________,________, + ________,________, + ________,XX______, + _______X,XX______, + _______X,XX______, + ______XX,X_______, + ______XX,X_______, + _____XXX,________, + _____XXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXX__,________, + ___XXX__,________, + __XXX___,________, + _XXX____,________, + _XXX____,________, + XXX_____,________, + XXX_____,________, + XX______,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_48[48] = { /* code 48 */ + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ___XXXXX,XX______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + __XXX___,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_49[48] = { /* code 49 */ + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XXXX,________, + ___XXXXX,________, + __XXXXXX,________, + __XXXXXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_50[48] = { /* code 50 */ + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXX__,_XXX____, + __XX____,_XXX____, + ________,_XXX____, + ________,XXX_____, + ______XX,XXX_____, + _____XXX,XX______, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + __XXX___,________, + __XXXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_51[48] = { /* code 51 */ + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,XXX_____, + __XXXXXX,XXXX____, + __XXX___,_XXX____, + ________,_XXX____, + ________,XXXX____, + ____XXXX,XXX_____, + ____XXXX,XX______, + ____XXXX,XXX_____, + _______X,XXXX____, + ________,_XXX____, + ________,_XXX____, + __XX____,_XXX____, + __XXX___,XXXX____, + __XXXXXX,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_52[48] = { /* code 52 */ + ________,________, + ________,________, + ________,________, + _______X,XX______, + _______X,XX______, + ______XX,XX______, + _____XXX,XX______, + ____XXXX,XX______, + ____XX_X,XX______, + ___XX__X,XX______, + __XX___X,XX______, + _XX____X,XX______, + XXXXXXXX,XXX_____, + XXXXXXXX,XXXX____, + XXXXXXXX,XXX_____, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + ________,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_53[48] = { /* code 53 */ + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XX______, + __XX____,________, + __XXXXXX,X_______, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + ________,_XXX____, + ________,_XXX____, + ________,_XXX____, + _XX_____,XXXX____, + _XXX___X,XXX_____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_54[48] = { /* code 54 */ + ________,________, + ________,________, + ________,________, + ______XX,________, + _____XXX,X_______, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + __XXX___,________, + __XXXXXX,X_______, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXX_____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_55[48] = { /* code 55 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXXX___, + _XXXXXXX,XXXX____, + ________,XXXX____, + _______X,XXX_____, + ______XX,XX______, + ______XX,XX______, + ______XX,X_______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_56[48] = { /* code 56 */ + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ___XXXXX,XX______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + __XXXXXX,XXX_____, + __XXX___,XXX_____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + _XXXXXXX,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_57[48] = { /* code 57 */ + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + ___XXXXX,XX______, + __XXXXXX,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + __XXXXXX,XXX_____, + ____XXXX,XXX_____, + _______X,XX______, + _____XXX,XX______, + __XXXXXX,X_______, + __XXXXX_,________, + __XXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_58[48] = { /* code 58 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_59[48] = { /* code 59 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XX__,________, + ___XXX__,________, + __XXX___,________, + __XXX___,________, + __XX____,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_60[48] = { /* code 60 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _______X,X_______, + ______XX,X_______, + ____XXXX,________, + ___XXXX_,________, + __XXXX__,________, + __XXXXX_,________, + ____XXXX,________, + _____XXX,X_______, + ______XX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_61[48] = { /* code 61 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ________,________, + ________,________, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_62[48] = { /* code 62 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,________, + ___XXXX_,________, + ____XXXX,________, + _____XXX,X_______, + ______XX,XXX_____, + _______X,XXX_____, + ______XX,XX______, + ____XXXX,X_______, + ___XXXX_,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_63[48] = { /* code 63 */ + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,XX______, + _XXX___X,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ______XX,XX______, + _____XXX,X_______, + ____XXXX,________, + ___XXXX_,________, + ___XXX__,________, + ________,________, + ___XX___,________, + __XXX___,________, + __XXX___,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_64[72] = { /* code 64 */ + ________,________,________, + ________,________,________, + _______X,XXXXX___,________, + _____XXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______, + ___XXXX_,_____XXX,XX______, + __XXXX__,XXXX___X,XX______, + __XXX__X,XXX_____,XXX_____, + _XXX__XX,X_______,XXX_____, + _XXX_XXX,___XX___,XXX_____, + _XXX_XXX,__XXX___,XXX_____, + _XXX_XXX,XXXXXXXX,XXX_____, + _XXX__XX,XXXXXXXX,XX______, + _XXX___X,XX__XXXX,X_______, + __XXX___,________,________, + __XXXX__,________,________, + ___XXXX_,_____XX_,________, + ____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXX_,________, + _______X,XXXXX___,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_65[48] = { /* code 65 */ + ________,________, + ________,________, + ________,________, + ________,_XX_____, + ________,XXX_____, + ________,XXX_____, + _______X,XXX_____, + ______XX,XXXX____, + ______XX,XXXX____, + _____XXX,_XXX____, + _____XXX,_XXX____, + ____XXX_,_XXX____, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXX___,__XXX___, + __XXX___,__XXX___, + _XXXX___,___XXX__, + _XXX____,___XXX__, + _XXX____,____XX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_66[48] = { /* code 66 */ + ________,________, + ________,________, + ________,________, + __XXXXXX,________, + _XXXXXXX,X_______, + _XXXXXXX,XX______, + _XXX___X,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX____,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX___X,XXXX____, + _XXXXXXX,XXX_____, + _XXXXXXX,XX______, + __XXXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_67[48] = { /* code 67 */ + ________,________, + ________,________, + ________,________, + _______X,XXXXX___, + ______XX,XXXXX___, + _____XXX,XXXXX___, + ____XXXX,__XXX___, + ___XXXX_,___XX___, + ___XXX__,________, + __XXX___,________, + __XXX___,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,__XX____, + _XXXX___,XXXX____, + __XXXXXX,XXXX____, + ___XXXXX,XX______, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_68[48] = { /* code 68 */ + ________,________, + ________,________, + ________,________, + __XX____,________, + _XXXXX__,________, + _XXXXXXX,X_______, + _XXX_XXX,XX______, + _XXX___X,XXX_____, + _XXX____,_XXX____, + _XXX____,__XXX___, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,__XXX___, + _XXX____,_XXXX___, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_69[48] = { /* code 69 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XXX_____, + __XXXXXX,XXXX____, + ___XXXXX,XXX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_70[48] = { /* code 70 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXXXXXX,XX______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_71[48] = { /* code 71 */ + ________,________, + ________,________, + ________,________, + _____XXX,XX______, + ____XXXX,XXX_____, + ___XXXXX,XXXX____, + __XXXX__,_XXX____, + __XXXX__,________, + _XXXX___,________, + _XXX____,________, + _XXX__XX,XXXXXX__, + XXX_XXXX,XXXXXX__, + XXX_XXXX,XXXXX___, + XXX_____,__XXX___, + XXX_____,_XXX____, + XXX_____,_XXX____, + XXXX___X,XXXX____, + _XXXXXXX,XXX_____, + _XXXXXXX,XX______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_72[48] = { /* code 72 */ + ________,________, + ________,________, + ________,________, + ___X____,_____X__, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,XXXXXXX_, + __XXXXXX,XXXXXXX_, + __XXXXXX,XXXXXXX_, + __XXXXXX,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + __XXX___,____XXX_, + ___X____,_____X__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_73[48] = { /* code 73 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + ____XXX_,________, + _XXXXXXX,XX______, + XXXXXXXX,XXX_____, + _XXXXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_74[48] = { /* code 74 */ + ________,________, + ________,________, + ________,________, + ____XXXX,XXXX____, + ___XXXXX,XXXXX___, + ____XXXX,XXXX____, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _X____XX,XX______, + XXX___XX,XX______, + XXX___XX,X_______, + XXXX__XX,X_______, + _XXXXXXX,X_______, + __XXXXXX,X_______, + ____XXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_75[48] = { /* code 75 */ + ________,________, + ________,________, + ________,________, + __X_____,_XX_____, + _XXX____,XXX_____, + _XXX___X,XX______, + _XXX__XX,XX______, + _XXX__XX,X_______, + _XXX_XXX,________, + _XXXXXX_,________, + _XXXXX__,________, + _XXXX___,________, + _XXXXX__,________, + _XXXXXX_,________, + _XXXXXXX,________, + _XXX_XXX,X_______, + _XXX__XX,XXX_____, + _XXX____,XXXX____, + _XXX____,_XXX____, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_76[48] = { /* code 76 */ + ________,________, + ________,________, + ________,________, + __X_____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,XXX_____, + _XXXXXXX,XXXX____, + _XXXXXXX,XXX_____, + __XXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_77[72] = { /* code 77 */ + ________,________,________, + ________,________,________, + ________,________,________, + ____XX__,____X___,________, + ___XXX__,___XXX__,________, + ___XXXX_,___XXX__,________, + ___XXXX_,___XXX__,________, + __XXXXX_,__XXXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXX_,__XXXXX_,________, + __XXXXXX,__XXXXX_,________, + __XX_XXX,_XXXXXX_,________, + _XXX_XXX,_XXX_XX_,________, + _XXX_XXX,XXXX_XXX,________, + _XXX__XX,XXX__XXX,________, + XXXX__XX,XXX__XXX,________, + XXX___XX,XXX___XX,________, + XXX____X,XXX___XX,X_______, + XXX____X,XX____XX,X_______, + XXX____X,XX_____X,X_______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_78[72] = { /* code 78 */ + ________,________,________, + ________,________,________, + ________,________,________, + _XXX____,_____XX_,________, + _XXX____,_____XXX,________, + _XXXX___,_____XXX,________, + _XXXXX__,_____XXX,________, + _XXXXX__,_____XXX,________, + _XXXXXX_,_____XXX,________, + _XXX_XXX,_____XXX,________, + _XXX_XXX,X____XXX,________, + _XXX__XX,X____XXX,________, + _XXX___X,XX___XXX,________, + _XXX____,XXX__XXX,________, + _XXX____,_XXX_XXX,________, + _XXX____,__XXXXXX,________, + _XXX____,__XXXXXX,________, + _XXX____,___XXXXX,________, + _XXX____,____XXXX,________, + __X_____,______X_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_79[72] = { /* code 79 */ + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXX____,________, + _____XXX,XXXXXX__,________, + ____XXXX,XXXXXXX_,________, + ___XXXX_,____XXX_,________, + __XXXX__,_____XXX,________, + __XXX___,_____XXX,________, + __XXX___,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,_____XXX,________, + _XXX____,____XXX_,________, + _XXX____,____XXX_,________, + _XXXX___,___XXXX_,________, + __XXXX__,__XXXX__,________, + ___XXXXX,XXXXX___,________, + ____XXXX,XXXX____,________, + _____XXX,XXX_____,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_80[48] = { /* code 80 */ + ________,________, + ________,________, + ________,________, + _XXXXXX_,________, + XXXXXXXX,________, + XXXXXXXX,X_______, + XXX___XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX___XX,XX______, + XXXXXXXX,X_______, + XXXXXXXX,________, + XXXXXXX_,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + _X______,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_81[72] = { /* code 81 */ + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXX____,________, + ____XXXX,XXXXXX__,________, + ___XXXXX,XXXXXXX_,________, + __XXXXX_,___XXXXX,________, + _XXXX___,_____XXX,________, + _XXX____,_____XXX,X_______, + XXX_____,______XX,X_______, + XXX_____,______XX,X_______, + XXX_____,______XX,X_______, + XXX_____,______XX,X_______, + XXX____X,XX____XX,X_______, + XXXX___X,XX___XXX,X_______, + _XXXX__X,XXX_XXXX,________, + __XXXX__,XXXXXXX_,________, + __XXXXXX,XXXXXX__,________, + ____XXXX,XXXXXXX_,________, + _____XXX,XXX_XXXX,________, + ________,_____XXX,X_______, + ________,______XX,XX______, + ________,_______X,XX______, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_82[48] = { /* code 82 */ + ________,________, + ________,________, + ________,________, + __XXXXX_,________, + _XXXXXXX,X_______, + _XXXXXXX,XX______, + _XXX__XX,XXX_____, + _XXX____,XXXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXX___X,XXXX____, + _XXXXXXX,XXX_____, + _XXXXXXX,XX______, + _XXXXXXX,X_______, + _XXX_XXX,XXX_____, + _XXX____,XXXX____, + _XXX____,_XXXX___, + _XXX____,__XXX___, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_83[48] = { /* code 83 */ + ________,________, + ________,________, + ________,________, + ______XX,XXX_____, + ____XXXX,XXXXX___, + ___XXXXX,XXXXX___, + ___XXX__,________, + __XXX___,________, + __XXX___,________, + __XXXXXX,XXX_____, + ___XXXXX,XXXXX___, + ____XXXX,XXXXX___, + ________,__XXXX__, + ________,___XXX__, + ________,___XXX__, + _XXX____,__XXXX__, + _XXXX___,_XXXXX__, + _XXXXXXX,XXXXX___, + __XXXXXX,XXXX____, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_84[48] = { /* code 84 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXXX__, + XXXXXXXX,XXXXXXX_, + _XXXXXXX,XXXXXX__, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + _____XXX,________, + ______X_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_85[48] = { /* code 85 */ + ________,________, + ________,________, + ________,________, + __X_____,____X___, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XXX__, + _XXX____,___XX___, + _XXX____,__XXX___, + _XXX____,__XXX___, + _XXXX___,__XXX___, + __XXX___,_XXX____, + __XXXXXX,XXX_____, + ___XXXXX,XXX_____, + ____XXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_86[48] = { /* code 86 */ + ________,________, + ________,________, + ________,________, + _XXX____,__XXX___, + _XXX____,_XXXX___, + _XXX____,_XXXX___, + _XXX____,_XXX____, + __XXX___,XXXX____, + __XXX___,XXX_____, + __XXX___,XXX_____, + __XXX__X,XX______, + ___XX__X,XX______, + ___XXX_X,XX______, + ___XXXXX,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + ____XXXX,________, + ____XXXX,________, + _____XX_,________, + _____XX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_87[72] = { /* code 87 */ + ________,________,________, + ________,________,________, + ________,________,________, + _XXX____,__XX____,__XXX___, + _XXX____,_XXX____,__XXX___, + _XXXX___,_XXX____,_XXXX___, + __XXX___,_XXX____,_XXX____, + __XXX___,XXXXX___,_XXX____, + __XXX___,XXXXX___,XXXX____, + ___XXX__,XXXXX___,XXX_____, + ___XXX_X,XXXXX___,XXX_____, + ___XXX_X,XX_XX__X,XX______, + ____XX_X,XX_XX__X,XX______, + ____XX_X,X__XXX_X,X_______, + ____XXXX,X__XXXXX,X_______, + ____XXXX,X__XXXXX,X_______, + _____XXX,___XXXXX,________, + _____XXX,____XXXX,________, + _____XXX,____XXX_,________, + _____XXX,____XXX_,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_88[48] = { /* code 88 */ + ________,________, + ________,________, + ________,________, + _XXX____,___XXX__, + _XXXX___,__XXXX__, + _XXXX___,__XXXX__, + __XXXX__,_XXXX___, + ___XXXX_,XXXX____, + ____XXX_,XXX_____, + ____XXXX,XXX_____, + _____XXX,XX______, + ______XX,X_______, + _____XXX,XX______, + ____XXXX,XXX_____, + ___XXXX_,XXX_____, + __XXXX__,XXXX____, + _XXXX___,_XXXX___, + XXXXX___,__XXXX__, + XXXX____,__XXXX__, + XXX_____,___XXX__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_89[48] = { /* code 89 */ + ________,________, + ________,________, + ________,________, + XXX_____,__XXX___, + XXX_____,__XXX___, + XXXX____,_XXXX___, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXX___,XXX_____, + ___XXX_X,XXX_____, + ___XXX_X,XX______, + ____XXXX,XX______, + ____XXXX,X_______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ____XXX_,________, + ___XXXX_,________, + ___XXX__,________, + ___XXX__,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_90[48] = { /* code 90 */ + ________,________, + ________,________, + ________,________, + _XXXXXXX,XXXXX___, + XXXXXXXX,XXXXXX__, + _XXXXXXX,XXXXX___, + _______X,XXXX____, + ______XX,XXX_____, + ______XX,XX______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ___XXXX_,________, + ___XXX__,________, + __XXXX__,________, + __XXX___,________, + _XXX____,________, + _XXXXXXX,XXXXX___, + XXXXXXXX,XXXXXX__, + _XXXXXXX,XXXXX___, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_91[24] = { /* code 91 */ + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_92[48] = { /* code 92 */ + ________,________, + ________,________, + ________,________, + __XX____,________, + __XXX___,________, + __XXXX__,________, + ___XXX__,________, + ____XX__,________, + ____XXX_,________, + ____XXX_,________, + _____XXX,________, + _____XXX,________, + ______XX,________, + ______XX,X_______, + ______XX,X_______, + _______X,XX______, + _______X,XX______, + ________,XXX_____, + ________,XXX_____, + ________,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_93[24] = { /* code 93 */ + ________, + ________, + ________, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + _XXXXXX_, + _XXXXXX_, + _XXXXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_94[48] = { /* code 94 */ + ________,________, + ________,________, + _____XX_,________, + ____XXXX,________, + __XXXXXX,X_______, + _XXXX__X,XX______, + _XXX____,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_95[48] = { /* code 95 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXXXXXXX,XXXXX___, + XXXXXXXX,XXXXX___, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_96[48] = { /* code 96 */ + ________,________, + ________,________, + _XX_____,________, + _XXX____,________, + __XXX___,________, + ___XXX__,________, + ____XX__,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_97[48] = { /* code 97 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + ___XXXXX,XX______, + __XXXXXX,XX______, + __XXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ___XXXX_,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_98[48] = { /* code 98 */ + ________,________, + ________,________, + ________,________, + __XX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX_XXX,________, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _XXXX__X,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX___X,XXX_____, + _XXXXXXX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_99[48] = { /* code 99 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + __XXXXXX,XX______, + _XXXX___,XX______, + XXXX____,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXXX___X,XX______, + _XXXXXXX,XX______, + _XXXXXXX,X_______, + ___XXXXX,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_100[48] = { /* code 100 */ + ________,________, + ________,________, + ________,________, + ________,_X______, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ________,XXX_____, + ____XXXX,XXX_____, + ___XXXXX,XXX_____, + __XXXXXX,XXX_____, + _XXXX___,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXXX__X,XXX_____, + __XXXXXX,XXX_____, + __XXXXXX,XXX_____, + ____XXXX,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_101[48] = { /* code 101 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,X_______, + __XXXXXX,XX______, + _XXXXXXX,XXX_____, + _XXX____,XXX_____, + XXXX__XX,XXX_____, + XXX_XXXX,XX______, + XXXXXXXX,________, + XXXXXX__,________, + XXXX____,XXX_____, + _XXXXXXX,XXX_____, + __XXXXXX,XX______, + ___XXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_102[48] = { /* code 102 */ + ________,________, + ________,________, + ________,________, + _____XXX,X_______, + ____XXXX,XX______, + ____XXXX,X_______, + ___XXXX_,________, + ___XXX__,________, + _XXXXXXX,X_______, + XXXXXXXX,XX______, + _XXXXXXX,X_______, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ____X___,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_103[48] = { /* code 103 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,________, + __XXXXXX,XX______, + _XXXXXXX,XX______, + _XXX___X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,X_______, + XXX___XX,X_______, + XXX___XX,X_______, + XXXXXXXX,X_______, + _XXXXXXX,X_______, + __XXX_XX,X_______, + ______XX,X_______, + _____XXX,X_______, + XXXXXXXX,________, + _XXXXXX_,________, + ___XXX__,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_104[48] = { /* code 104 */ + ________,________, + ________,________, + ________,________, + __X_____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX_XXX,XX______, + _XXXXXXX,XXX_____, + _XXXXXXX,XXX_____, + _XXXXX__,XXX_____, + _XXXX___,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + _XXX____,XXX_____, + __X_____,_X______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_105[24] = { /* code 105 */ + ________, + ________, + ________, + _XXX____, + _XXX____, + _XXX____, + ________, + ________, + __X_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __X_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_106[24] = { /* code 106 */ + ________, + ________, + ________, + ________, + ___XXX__, + ___XXX__, + ___XXX__, + ________, + ____X___, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ____XXX_, + ____XXX_, + ____XXX_, + ____XXX_, + X___XXX_, + XX__XXX_, + XXX_XXX_, + XXXXXXX_, + __XXXX__}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_107[48] = { /* code 107 */ + ________,________, + ________,________, + ________,________, + _X______,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXX____X,XX______, + XXX___XX,XX______, + XXX__XXX,X_______, + XXX_XXXX,________, + XXXXXXX_,________, + XXXXXXX_,________, + XXXXXXXX,________, + XXX__XXX,X_______, + XXX___XX,X_______, + XXX___XX,XX______, + XXX____X,XX______, + _X______,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_108[24] = { /* code 108 */ + ________, + ________, + ________, + __X_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __X_____, + ________, + ________, + ________, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_109[48] = { /* code 109 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX__XXX,__XXXX__, + XXXXXXXX,XXXXXXX_, + XXXXXXXX,XXXXXXX_, + XXXXX_XX,XX__XXX_, + XXXX__XX,X___XXX_, + XXX___XX,X___XXX_, + XXX___XX,X___XXX_, + XXX___XX,X___XXX_, + XXX___XX,X___XXX_, + XXX___XX,X___XXX_, + XXX___XX,X___XXX_, + _X_____X,_____X__, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_110[48] = { /* code 110 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX_XXX,X_______, + _XXXXXXX,X_______, + _XXXXXXX,XX______, + _XXXXX_X,XX______, + _XXXX__X,XX______, + _XXXX__X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __X_____,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_111[48] = { /* code 111 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXXXX,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + _XXX__XX,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX__XX,XX______, + _XXXXXXX,X_______, + _XXXXXXX,________, + ___XXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_112[48] = { /* code 112 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XX_XXXX,________, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XXXX___X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX___XX,XX______, + XXXXXXXX,X_______, + XXXXXXXX,X_______, + XXXXXXX_,________, + XXX_____,________, + XXX_____,________, + XXX_____,________, + XXX_____,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_113[48] = { /* code 113 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____XXXX,XX______, + __XXXXXX,XX______, + _XXXXXXX,XX______, + _XXXX__X,XX______, + XXXX___X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXX____X,XX______, + XXXX___X,XX______, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + ___XXXXX,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______, + _______X,XX______}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_114[48] = { /* code 114 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX_XXX,X_______, + _XXXXXXX,XX______, + _XXXXXXX,XX______, + _XXXXX_X,XX______, + _XXX___X,XX______, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + _XXX____,________, + __X_____,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_115[48] = { /* code 115 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __XXXXXX,X_______, + _XXXXXXX,X_______, + XXXXXXXX,X_______, + XXX____X,X_______, + XXXX____,________, + _XXXXX__,________, + ___XXXXX,________, + _____XXX,X_______, + XXX___XX,X_______, + XXXXXXXX,X_______, + XXXXXXXX,________, + __XXXXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_116[48] = { /* code 116 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ____X___,________, + ___XXX__,________, + ___XXX__,________, + _XXXXXXX,________, + XXXXXXXX,X_______, + _XXXXXXX,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ____X___,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_117[48] = { /* code 117 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,X_______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + _XXXXXXX,XX______, + __XXXXXX,XX______, + ___XXXXX,XX______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_118[48] = { /* code 118 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + XXX_____,XX______, + XXX_____,XX______, + XXXX___X,XX______, + _XXX___X,XX______, + _XXX___X,XX______, + __XXX_XX,X_______, + __XXX_XX,X_______, + ___XXXXX,________, + ___XXXXX,________, + ___XXXXX,________, + ____XXX_,________, + ____XXX_,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_119[48] = { /* code 119 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX__XX,X__XXX__, + _XXX__XX,X__XXX__, + _XXX__XX,X__XXX__, + _XXX_XXX,X__XXX__, + _XXX_XXX,X_XXX___, + __XX_XXX,XXXXX___, + __XXXXXX,XXXXX___, + __XXXXX_,XXXXX___, + __XXXX__,XXXX____, + __XXXX__,XXXX____, + ___XX___,XXXX____, + ___XX___,_XX_____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_120[48] = { /* code 120 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,_XXX____, + __XXXX__,_XXX____, + __XXXX__,XXXX____, + ___XXXXX,XXX_____, + ____XXXX,XX______, + _____XXX,X_______, + ____XXXX,X_______, + ___XXXXX,XX______, + __XXXX_X,XXX_____, + _XXXXX__,XXX_____, + _XXXX___,XXXX____, + _XXX____,_XXX____, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_121[48] = { /* code 121 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXX____,_XXX____, + _XXX____,_XXX____, + _XXXX___,XXXX____, + __XXX___,XXX_____, + __XXXX_X,XXX_____, + ___XXX_X,XX______, + ___XXXXX,XX______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,X_______, + _____XXX,________, + ____XXXX,________, + ____XXX_,________, + ____XXX_,________, + ___XXXX_,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_122[48] = { /* code 122 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _XXXXXXX,XX______, + XXXXXXXX,XX______, + _XXXXXXX,XX______, + ______XX,X_______, + _____XXX,________, + ____XXX_,________, + ___XXXX_,________, + ___XXX__,________, + __XXX___,________, + _XXXXXXX,X_______, + XXXXXXXX,XX______, + XXXXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_123[24] = { /* code 123 */ + ________, + ________, + ________, + ___XXX__, + __XXXXX_, + _XXXXXX_, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + XXX_____, + XX______, + XXX_____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + _XXX____, + __XXXXX_, + __XXXXX_, + ___XXXX_, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_124[48] = { /* code 124 */ + ________,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ___XXX__,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_125[24] = { /* code 125 */ + ________, + ________, + ________, + _XXX____, + XXXXX___, + XXXXXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ____XXXX, + _____XXX, + ____XXX_, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + ___XXX__, + XXXXX___, + XXXXX___, + XXXX____, + ________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_126[48] = { /* code 126 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ___XXX__,__XX____, + _XXXXXX_,_XXX____, + _XXX_XXX,_XXX____, + XXX___XX,XXX_____, + XX_____X,XX______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +GUI_CONST_STORAGE unsigned char acFontComic24B_127[48] = { /* code 127 */ + ________,________, + ________,________, + _XXXXXXX,X_______, + _XXXXXXX,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XX_____,X_______, + _XXXXXXX,X_______, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + + + + +GUI_CONST_STORAGE GUI_CHARINFO CharInfo24B_ASCII[96] = { + { 9, 9, 2, acFontComic24B_32 } /* code 32 */ + ,{ 5, 5, 1, acFontComic24B_33 } /* code 33 */ + ,{ 9, 9, 2, acFontComic24B_34 } /* code 34 */ + ,{ 18, 18, 3, acFontComic24B_35 } /* code 35 */ + ,{ 15, 15, 2, acFontComic24B_36 } /* code 36 */ + ,{ 17, 17, 3, acFontComic24B_37 } /* code 37 */ + ,{ 14, 14, 2, acFontComic24B_38 } /* code 38 */ + ,{ 9, 9, 2, acFontComic24B_39 } /* code 39 */ + ,{ 8, 8, 1, acFontComic24B_40 } /* code 40 */ + ,{ 8, 8, 1, acFontComic24B_41 } /* code 41 */ + ,{ 11, 11, 2, acFontComic24B_42 } /* code 42 */ + ,{ 13, 13, 2, acFontComic24B_43 } /* code 43 */ + ,{ 9, 9, 2, acFontComic24B_44 } /* code 44 */ + ,{ 13, 13, 2, acFontComic24B_45 } /* code 45 */ + ,{ 9, 9, 2, acFontComic24B_46 } /* code 46 */ + ,{ 11, 11, 2, acFontComic24B_47 } /* code 47 */ + ,{ 13, 13, 2, acFontComic24B_48 } /* code 48 */ + ,{ 13, 13, 2, acFontComic24B_49 } /* code 49 */ + ,{ 13, 13, 2, acFontComic24B_50 } /* code 50 */ + ,{ 13, 13, 2, acFontComic24B_51 } /* code 51 */ + ,{ 13, 13, 2, acFontComic24B_52 } /* code 52 */ + ,{ 13, 13, 2, acFontComic24B_53 } /* code 53 */ + ,{ 13, 13, 2, acFontComic24B_54 } /* code 54 */ + ,{ 13, 13, 2, acFontComic24B_55 } /* code 55 */ + ,{ 13, 13, 2, acFontComic24B_56 } /* code 56 */ + ,{ 13, 13, 2, acFontComic24B_57 } /* code 57 */ + ,{ 9, 9, 2, acFontComic24B_58 } /* code 58 */ + ,{ 9, 9, 2, acFontComic24B_59 } /* code 59 */ + ,{ 13, 13, 2, acFontComic24B_60 } /* code 60 */ + ,{ 13, 13, 2, acFontComic24B_61 } /* code 61 */ + ,{ 13, 13, 2, acFontComic24B_62 } /* code 62 */ + ,{ 12, 12, 2, acFontComic24B_63 } /* code 63 */ + ,{ 20, 20, 3, acFontComic24B_64 } /* code 64 */ + ,{ 15, 15, 2, acFontComic24B_65 } /* code 65 */ + ,{ 13, 13, 2, acFontComic24B_66 } /* code 66 */ + ,{ 14, 14, 2, acFontComic24B_67 } /* code 67 */ + ,{ 15, 15, 2, acFontComic24B_68 } /* code 68 */ + ,{ 13, 13, 2, acFontComic24B_69 } /* code 69 */ + ,{ 13, 13, 2, acFontComic24B_70 } /* code 70 */ + ,{ 14, 14, 2, acFontComic24B_71 } /* code 71 */ + ,{ 16, 16, 2, acFontComic24B_72 } /* code 72 */ + ,{ 11, 11, 2, acFontComic24B_73 } /* code 73 */ + ,{ 14, 14, 2, acFontComic24B_74 } /* code 74 */ + ,{ 13, 13, 2, acFontComic24B_75 } /* code 75 */ + ,{ 12, 12, 2, acFontComic24B_76 } /* code 76 */ + ,{ 19, 19, 3, acFontComic24B_77 } /* code 77 */ + ,{ 17, 17, 3, acFontComic24B_78 } /* code 78 */ + ,{ 17, 17, 3, acFontComic24B_79 } /* code 79 */ + ,{ 11, 11, 2, acFontComic24B_80 } /* code 80 */ + ,{ 18, 18, 3, acFontComic24B_81 } /* code 81 */ + ,{ 13, 13, 2, acFontComic24B_82 } /* code 82 */ + ,{ 15, 15, 2, acFontComic24B_83 } /* code 83 */ + ,{ 15, 15, 2, acFontComic24B_84 } /* code 84 */ + ,{ 15, 15, 2, acFontComic24B_85 } /* code 85 */ + ,{ 14, 14, 2, acFontComic24B_86 } /* code 86 */ + ,{ 22, 22, 3, acFontComic24B_87 } /* code 87 */ + ,{ 15, 15, 2, acFontComic24B_88 } /* code 88 */ + ,{ 13, 13, 2, acFontComic24B_89 } /* code 89 */ + ,{ 15, 15, 2, acFontComic24B_90 } /* code 90 */ + ,{ 8, 8, 1, acFontComic24B_91 } /* code 91 */ + ,{ 12, 12, 2, acFontComic24B_92 } /* code 92 */ + ,{ 8, 8, 1, acFontComic24B_93 } /* code 93 */ + ,{ 13, 13, 2, acFontComic24B_94 } /* code 94 */ + ,{ 13, 13, 2, acFontComic24B_95 } /* code 95 */ + ,{ 12, 12, 2, acFontComic24B_96 } /* code 96 */ + ,{ 12, 12, 2, acFontComic24B_97 } /* code 97 */ + ,{ 12, 12, 2, acFontComic24B_98 } /* code 98 */ + ,{ 11, 11, 2, acFontComic24B_99 } /* code 99 */ + ,{ 12, 12, 2, acFontComic24B_100 } /* code 100 */ + ,{ 12, 12, 2, acFontComic24B_101 } /* code 101 */ + ,{ 11, 11, 2, acFontComic24B_102 } /* code 102 */ + ,{ 11, 11, 2, acFontComic24B_103 } /* code 103 */ + ,{ 12, 12, 2, acFontComic24B_104 } /* code 104 */ + ,{ 6, 6, 1, acFontComic24B_105 } /* code 105 */ + ,{ 8, 8, 1, acFontComic24B_106 } /* code 106 */ + ,{ 11, 11, 2, acFontComic24B_107 } /* code 107 */ + ,{ 6, 6, 1, acFontComic24B_108 } /* code 108 */ + ,{ 16, 16, 2, acFontComic24B_109 } /* code 109 */ + ,{ 11, 11, 2, acFontComic24B_110 } /* code 110 */ + ,{ 11, 11, 2, acFontComic24B_111 } /* code 111 */ + ,{ 11, 11, 2, acFontComic24B_112 } /* code 112 */ + ,{ 11, 11, 2, acFontComic24B_113 } /* code 113 */ + ,{ 10, 10, 2, acFontComic24B_114 } /* code 114 */ + ,{ 10, 10, 2, acFontComic24B_115 } /* code 115 */ + ,{ 10, 10, 2, acFontComic24B_116 } /* code 116 */ + ,{ 11, 11, 2, acFontComic24B_117 } /* code 117 */ + ,{ 10, 10, 2, acFontComic24B_118 } /* code 118 */ + ,{ 14, 14, 2, acFontComic24B_119 } /* code 119 */ + ,{ 12, 12, 2, acFontComic24B_120 } /* code 120 */ + ,{ 12, 12, 2, acFontComic24B_121 } /* code 121 */ + ,{ 11, 11, 2, acFontComic24B_122 } /* code 122 */ + ,{ 8, 8, 1, acFontComic24B_123 } /* code 123 */ + ,{ 9, 9, 2, acFontComic24B_124 } /* code 124 */ + ,{ 8, 8, 1, acFontComic24B_125 } /* code 125 */ + ,{ 13, 13, 2, acFontComic24B_126 } /* code 126 */ + ,{ 11, 11, 2, acFontComic24B_127 } /* code 127 */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP FontComic24BProp_ASCII = { + 32 /* first character */ + ,127 /* last character */ + ,CharInfo24B_ASCII /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontComic24B_ASCII = { + GUI_FONTTYPE_PROP /* type of font */ + ,24 /* height of font */ + ,24 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&FontComic24BProp_ASCII} + ,20, 12, 17 +}; + diff --git a/User/system/lib/lcd/gui/Font/FD24x32.c b/User/system/lib/lcd/gui/Font/FD24x32.c new file mode 100644 index 0000000..0f39056 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD24x32.c @@ -0,0 +1,590 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD24x32.C +Purpose : Implementation of the non-proportional 24 by 32 digit +Height : 32 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE U8 acFont24x32[15][96] = { + {________, _XXXXXXX, ________, + _______X, XXXXXXXX, XX______, + ______XX, XXXXXXXX, XXX_____, + _____XXX, XXXXXXXX, XXXX____, + ____XXXX, XXX___XX, XXXXX___, + ____XXXX, X_______, XXXXX___, + ___XXXXX, ________, _XXXXX__, + ___XXXXX, ________, _XXXXX__, + ___XXXXX, ________, _XXXXX__, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + ___XXXXX, ________, _XXXXX__, + ___XXXXX, ________, _XXXXX__, + ___XXXXX, ________, _XXXXX__, + ____XXXX, X_______, XXXXX___, + ____XXXX, XXX___XX, XXXXX___, + _____XXX, XXXXXXXX, XXXX____, + ______XX, XXXXXXXX, XXX_____, + _______X, XXXXXXXX, XX______, + ________, _XXXXXXX, ________} + + , + {________, ______XX, XX______, + ________, ______XX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, ____XXXX, XX______, + ________, __XXXXXX, XX______, + ______XX, XXXXXXXX, XX______, + ______XX, XXXXXXXX, XX______, + ______XX, XXXXXXXX, XX______, + ______XX, XXXXXXXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______, + ________, _____XXX, XX______} + + , + {________, _XXXXXXX, X_______, + _______X, XXXXXXXX, XXX_____, + ______XX, XXXXXXXX, XXXX____, + _____XXX, XXXXXXXX, XXXXX___, + ____XXXX, XXX____X, XXXXXX__, + ___XXXXX, X_______, XXXXXX__, + ___XXXXX, ________, _XXXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + __XXXXX_, ________, __XXXXX_, + ________, ________, __XXXXX_, + ________, ________, __XXXXX_, + ________, ________, __XXXXX_, + ________, ________, _XXXXXX_, + ________, ________, XXXXXX__, + ________, _______X, XXXXXX__, + ________, _____XXX, XXXXX___, + ________, ____XXXX, XXX_____, + ________, __XXXXXX, XX______, + ________, _XXXXXXX, X_______, + _______X, XXXXXXX_, ________, + ______XX, XXXXXX__, ________, + _____XXX, XXXX____, ________, + ____XXXX, XXX_____, ________, + ____XXXX, XX______, ________, + ___XXXXX, X_______, ________, + ___XXXXX, ________, ________, + __XXXXXX, XXXXXXXX, XXXXXXX_, + __XXXXXX, XXXXXXXX, XXXXXXX_, + __XXXXXX, XXXXXXXX, XXXXXXX_, + __XXXXXX, XXXXXXXX, XXXXXXX_, + __XXXXXX, XXXXXXXX, XXXXXXX_} + + , + {________, _XXXXXX_, ________, + ______XX, XXXXXXXX, XX______, + _____XXX, XXXXXXXX, XXX_____, + ____XXXX, XXXXXXXX, XXXX____, + ___XXXXX, X______X, XXXXX___, + ___XXXXX, ________, XXXXX___, + __XXXXX_, ________, XXXXXX__, + __XXXXX_, ________, _XXXXX__, + __XXXXX_, ________, _XXXXX__, + __XXXXX_, ________, _XXXXX__, + ________, ________, XXXXX___, + ________, ________, XXXXX___, + ________, _______X, XXXX____, + ________, __XXXXXX, XXX_____, + ________, __XXXXXX, XX______, + ________, __XXXXXX, XXX_____, + ________, __XXXXXX, XXXXX___, + ________, _______X, XXXXXX__, + ________, ________, _XXXXX__, + ________, ________, _XXXXXX_, + ________, ________, __XXXXX_, + ________, ________, __XXXXX_, + _XXXXX__, ________, __XXXXX_, + _XXXXX__, ________, __XXXXX_, + _XXXXX__, ________, _XXXXXX_, + __XXXXX_, ________, _XXXXX__, + __XXXXXX, ________, XXXXXX__, + ___XXXXX, X______X, XXXXX___, + ____XXXX, XXXXXXXX, XXXX____, + _____XXX, XXXXXXXX, XXX_____, + ______XX, XXXXXXXX, XX______, + ________, _XXXXXX_, ________} + + , + {________, _______X, XXXX____, + ________, ______XX, XXXX____, + ________, _____XXX, XXXX____, + ________, _____XXX, XXXX____, + ________, ____XXXX, XXXX____, + ________, ___XXXXX, XXXX____, + ________, ___XXXX_, XXXX____, + ________, __XXXXX_, XXXX____, + ________, _XXXXX__, XXXX____, + ________, _XXXX___, XXXX____, + ________, XXXXX___, XXXX____, + _______X, XXXX____, XXXX____, + _______X, XXX_____, XXXX____, + ______XX, XXX_____, XXXX____, + _____XXX, XX______, XXXX____, + _____XXX, X_______, XXXX____, + ____XXXX, X_______, XXXX____, + ___XXXXX, ________, XXXX____, + ___XXXX_, ________, XXXX____, + __XXXXX_, ________, XXXX____, + __XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + ________, ________, XXXX____, + ________, ________, XXXX____, + ________, ________, XXXX____, + ________, ________, XXXX____, + ________, ________, XXXX____, + ________, ________, XXXX____, + ________, ________, XXXX____, + ________, ________, XXXX____} + + , + {_____XXX, XXXXXXXX, XXXXXX__, + _____XXX, XXXXXXXX, XXXXXX__, + _____XXX, XXXXXXXX, XXXXXX__, + _____XXX, XXXXXXXX, XXXXXX__, + ____XXXX, X_______, ________, + ____XXXX, X_______, ________, + ____XXXX, X_______, ________, + ____XXXX, X_______, ________, + ____XXXX, ________, ________, + ____XXXX, ________, ________, + ____XXXX, ___XXXXX, ________, + ____XXXX, _XXXXXXX, XXX_____, + ____XXXX, XXXXXXXX, XXXX____, + ___XXXXX, XXXXXXXX, XXXXX___, + ___XXXXX, XXX____X, XXXXXX__, + ___XXXXX, X_______, _XXXXXX_, + ___XXXXX, ________, __XXXXX_, + ________, ________, __XXXXXX, + ________, ________, ___XXXXX, + ________, ________, ___XXXXX, + ________, ________, ___XXXXX, + ________, ________, ___XXXXX, + ________, ________, ___XXXXX, + __XXXXX_, ________, __XXXXXX, + __XXXXX_, ________, __XXXXX_, + ___XXXXX, ________, _XXXXXX_, + ___XXXXX, X_______, XXXXXX__, + ____XXXX, XX____XX, XXXXXX__, + _____XXX, XXXXXXXX, XXXXX___, + ______XX, XXXXXXXX, XXXX____, + _______X, XXXXXXXX, XX______, + ________, __XXXXX_, ________} + + , + {________, __XXXXXX, XX______, + ________, XXXXXXXX, XXXX____, + _______X, XXXXXXXX, XXXXX___, + ______XX, XXXXXXXX, XXXXXX__, + _____XXX, XXX_____, _XXXXX__, + ____XXXX, XX______, __XXXXX_, + ____XXXX, X_______, ___XXXX_, + ___XXXXX, ________, ___XXXX_, + ___XXXXX, ________, ________, + ___XXXXX, ________, ________, + __XXXXX_, ________, ________, + __XXXXX_, ___XXXXX, ________, + __XXXXX_, _XXXXXXX, XXX_____, + __XXXXX_, XXXXXXXX, XXXX____, + __XXXXXX, XXXXXXXX, XXXXX___, + __XXXXXX, XX______, XXXXXX__, + __XXXXXX, X_______, _XXXXXX_, + __XXXXXX, ________, __XXXXX_, + __XXXXXX, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + ___XXXX_, ________, ___XXXXX, + ___XXXXX, ________, ___XXXXX, + ___XXXXX, ________, ___XXXXX, + ____XXXX, X_______, __XXXXX_, + ____XXXX, X_______, _XXXXXX_, + _____XXX, XXX_____, XXXXXX__, + ______XX, XXXXXXXX, XXXXX___, + _______X, XXXXXXXX, XXXX____, + ________, XXXXXXXX, XXX_____, + ________, ___XXXXX, ________} + + , + {__XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + __XXXXXX, XXXXXXXX, XXXXXXXX, + ________, ________, ___XXXXX, + ________, ________, __XXXXX_, + ________, ________, _XXXXX__, + ________, ________, XXXXX___, + ________, _______X, XXXX____, + ________, ______XX, XXX_____, + ________, _____XXX, XXX_____, + ________, _____XXX, XX______, + ________, ____XXXX, XX______, + ________, ___XXXXX, X_______, + ________, ___XXXXX, X_______, + ________, __XXXXXX, ________, + ________, __XXXXXX, ________, + ________, _XXXXXX_, ________, + ________, _XXXXXX_, ________, + ________, _XXXXXX_, ________, + ________, XXXXXX__, ________, + ________, XXXXXX__, ________, + ________, XXXXXX__, ________, + _______X, XXXXX___, ________, + _______X, XXXXX___, ________, + _______X, XXXXX___, ________, + _______X, XXXXX___, ________, + ______XX, XXXX____, ________, + ______XX, XXXX____, ________, + ______XX, XXXX____, ________, + ______XX, XXXX____, ________} + + , + {________, _XXXXXXX, X_______, + _______X, XXXXXXXX, XXX_____, + _____XXX, XXXXXXXX, XXXXX___, + ____XXXX, XXXXXXXX, XXXXXX__, + ____XXXX, XX______, XXXXXX__, + ___XXXXX, X_______, _XXXXXX_, + ___XXXXX, ________, __XXXXX_, + ___XXXXX, ________, __XXXXX_, + ___XXXXX, ________, __XXXXX_, + ___XXXXX, ________, __XXXXX_, + ___XXXXX, X_______, _XXXXXX_, + ____XXXX, X_______, _XXXXX__, + ____XXXX, XXX____X, XXXXXX__, + _____XXX, XXXXXXXX, XXXXX___, + _______X, XXXXXXXX, XXX_____, + ______XX, XXXXXXXX, XXXX____, + ____XXXX, XXXXXXXX, XXXXXX__, + ___XXXXX, XXX____X, XXXXXXX_, + ___XXXXX, ________, __XXXXX_, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXXX, ________, __XXXXXX, + ___XXXXX, ________, __XXXXX_, + ___XXXXX, XX______, XXXXXXX_, + ____XXXX, XXXXXXXX, XXXXXX__, + _____XXX, XXXXXXXX, XXXXX___, + ______XX, XXXXXXXX, XXXX____, + ________, XXXXXXXX, XX______} + + , + {________, _XXXXXXX, X_______, + _______X, XXXXXXXX, XXX_____, + ______XX, XXXXXXXX, XXXX____, + _____XXX, XXXXXXXX, XXXXX___, + ____XXXX, XX______, XXXXXX__, + ___XXXXX, X_______, _XXXXX__, + ___XXXXX, ________, __XXXXX_, + ___XXXX_, ________, __XXXXX_, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + __XXXXX_, ________, ___XXXXX, + ___XXXX_, ________, __XXXXXX, + ___XXXXX, ________, __XXXXXX, + ___XXXXX, X_______, _XXXXXXX, + ____XXXX, XX_____X, XXXXXXXX, + _____XXX, XXXXXXXX, XXXXXXXX, + ______XX, XXXXXXXX, XX_XXXXX, + ________, XXXXXXXX, ___XXXXX, + ________, __XXXX__, ___XXXXX, + ________, ________, __XXXXXX, + ________, ________, __XXXXX_, + ________, ________, __XXXXX_, + __XXXXX_, ________, _XXXXXX_, + __XXXXX_, ________, _XXXXX__, + ___XXXXX, ________, XXXXX___, + ___XXXXX, X______X, XXXXX___, + ____XXXX, XXXXXXXX, XXXX____, + _____XXX, XXXXXXXX, XXX_____, + ______XX, XXXXXXXX, XX______, + ________, XXXXXXXX, ________} + + , + {________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ___XXX__, ________, + ________, __XXXXX_, ________, + ________, __XXXXX_, ________, + ________, __XXXXX_, ________, + ________, ___XXX__, ________} + + , + {________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + __XXXXXX, XXXXXXXX, XXXXXX__, + __XXXXXX, XXXXXXXX, XXXXXX__, + __XXXXXX, XXXXXXXX, XXXXXX__, + __XXXXXX, XXXXXXXX, XXXXXX__, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, __XXXX__, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________} + + , + {________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + __XXXXXX, XXXXXXXX, XXXXXX__, + __XXXXXX, XXXXXXXX, XXXXXX__, + __XXXXXX, XXXXXXXX, XXXXXX__, + __XXXXXX, XXXXXXXX, XXXXXX__, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________} + + , + {________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ___XXX__, ________, + ________, __XXXXX_, ________, + ________, __XXXXX_, ________, + ________, __XXXXX_, ________, + ________, ___XXX__, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ___XXX__, ________, + ________, __XXXXX_, ________, + ________, __XXXXX_, ________, + ________, __XXXXX_, ________, + ________, ___XXX__, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}, + {________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________, + ________, ________, ________}}; + +/* + ************************************** + * * + * Digit translation table * + * * + ************************************** + + This table is needed for translation of the big-digit font, + which is defined for the following characters only : 0123456789+-.: + Needs to be included only if if the digit-font is listed + in the font table. + +*/ + +GUI_CONST_STORAGE GUI_FONT_TRANSLIST TLDigits24x32[] = { + {14, -1}, /* char 32 : ' ' */ + {-1, -1}, /* char 33 : n/a */ + {-1, -1}, /* char 34 : n/a */ + {-1, -1}, /* char 35 : n/a */ + {-1, -1}, /* char 36 : n/a */ + {-1, -1}, /* char 37 : n/a */ + {-1, -1}, /* char 38 : n/a */ + {-1, -1}, /* char 39 : n/a */ + {-1, -1}, /* char 40 : n/a */ + {-1, -1}, /* char 41 : n/a */ + {-1, -1}, /* char 42 : n/a */ + {11, -1}, /* char 43 : '+' */ + {-1, -1}, /* char 44 : n/a */ + {12, -1}, /* char 45 : '-' */ + {10, -1}, /* char 46 : '.' */ + {-1, -1}, /* char 47 : n/a */ + {0, -1}, /* char 48 : '0' */ + {1, -1}, /* char 49 : '1' */ + {2, -1}, /* char 50 : '2' */ + {3, -1}, /* char 51 : '3' */ + {4, -1}, /* char 52 : '4' */ + {5, -1}, /* char 53 : '5' */ + {6, -1}, /* char 54 : '6' */ + {7, -1}, /* char 55 : '7' */ + {8, -1}, /* char 56 : '8' */ + {9, -1}, /* char 57 : '9' */ + {13, -1}, /* char 58 : ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_TRANSINFO TransInfo24x32 = { + 32, /* First character for translation, plus sign */ + 58, /* Last character for translation, digit 9 */ + TLDigits24x32}; + +GUI_CONST_STORAGE GUI_FONT_MONO FontMono24x32 = { + acFont24x32[0], + acFont24x32[0], + &TransInfo24x32, + 0, 0, /* All character are in translation table */ + 24, 24, /* width, spacing */ + 3 /* Bytes per line */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD24x32 = { + GUI_FONTTYPE_MONO, 32, 32, 1, 2, {&FontMono24x32}, 32, 0, 32}; diff --git a/User/system/lib/lcd/gui/Font/FD32.c b/User/system/lib/lcd/gui/Font/FD32.c new file mode 100644 index 0000000..049c22a --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD32.c @@ -0,0 +1,612 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD32.C +Purpose : Implementation of the the proportional 32 pixel digit +Height : 32 +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE U8 acFont32[12][96] = { +{ + ________,_XXXXXXX,________, + _______X,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XXXX____, + ____XXXX,XXX___XX,XXXXX___, + ____XXXX,X_______,XXXXX___, + ___XXXXX,________,_XXXXX__, + ___XXXXX,________,_XXXXX__, + ___XXXXX,________,_XXXXX__, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + ___XXXXX,________,_XXXXX__, + ___XXXXX,________,_XXXXX__, + ___XXXXX,________,_XXXXX__, + ____XXXX,X_______,XXXXX___, + ____XXXX,XXX___XX,XXXXX___, + _____XXX,XXXXXXXX,XXXX____, + ______XX,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XX______, + ________,_XXXXXXX,________} + + + ,{ + ________,______XX,XX______, + ________,______XX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,____XXXX,XX______, + ________,__XXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______, + ________,_____XXX,XX______} + + + + ,{ + ________,_XXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,XXXXX___, + ____XXXX,XXX____X,XXXXXX__, + ___XXXXX,X_______,XXXXXX__, + ___XXXXX,________,_XXXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + __XXXXX_,________,__XXXXX_, + ________,________,__XXXXX_, + ________,________,__XXXXX_, + ________,________,__XXXXX_, + ________,________,_XXXXXX_, + ________,________,XXXXXX__, + ________,_______X,XXXXXX__, + ________,_____XXX,XXXXX___, + ________,____XXXX,XXX_____, + ________,__XXXXXX,XX______, + ________,_XXXXXXX,X_______, + _______X,XXXXXXX_,________, + ______XX,XXXXXX__,________, + _____XXX,XXXX____,________, + ____XXXX,XXX_____,________, + ____XXXX,XX______,________, + ___XXXXX,X_______,________, + ___XXXXX,________,________, + __XXXXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,XXXXXXXX,XXXXXXX_, + __XXXXXX,XXXXXXXX,XXXXXXX_} + + + ,{ + ________,_XXXXXX_,________, + ______XX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXX_____, + ____XXXX,XXXXXXXX,XXXX____, + ___XXXXX,X______X,XXXXX___, + ___XXXXX,________,XXXXX___, + __XXXXX_,________,XXXXXX__, + __XXXXX_,________,_XXXXX__, + __XXXXX_,________,_XXXXX__, + __XXXXX_,________,_XXXXX__, + ________,________,XXXXX___, + ________,________,XXXXX___, + ________,_______X,XXXX____, + ________,__XXXXXX,XXX_____, + ________,__XXXXXX,XX______, + ________,__XXXXXX,XXX_____, + ________,__XXXXXX,XXXXX___, + ________,_______X,XXXXXX__, + ________,________,_XXXXX__, + ________,________,_XXXXXX_, + ________,________,__XXXXX_, + ________,________,__XXXXX_, + _XXXXX__,________,__XXXXX_, + _XXXXX__,________,__XXXXX_, + _XXXXX__,________,_XXXXXX_, + __XXXXX_,________,_XXXXX__, + __XXXXXX,________,XXXXXX__, + ___XXXXX,X______X,XXXXX___, + ____XXXX,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XX______, + ________,_XXXXXX_,________} + + + ,{ + ________,_______X,XXXX____, + ________,______XX,XXXX____, + ________,_____XXX,XXXX____, + ________,_____XXX,XXXX____, + ________,____XXXX,XXXX____, + ________,___XXXXX,XXXX____, + ________,___XXXX_,XXXX____, + ________,__XXXXX_,XXXX____, + ________,_XXXXX__,XXXX____, + ________,_XXXX___,XXXX____, + ________,XXXXX___,XXXX____, + _______X,XXXX____,XXXX____, + _______X,XXX_____,XXXX____, + ______XX,XXX_____,XXXX____, + _____XXX,XX______,XXXX____, + _____XXX,X_______,XXXX____, + ____XXXX,X_______,XXXX____, + ___XXXXX,________,XXXX____, + ___XXXX_,________,XXXX____, + __XXXXX_,________,XXXX____, + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + ________,________,XXXX____, + ________,________,XXXX____, + ________,________,XXXX____, + ________,________,XXXX____, + ________,________,XXXX____, + ________,________,XXXX____, + ________,________,XXXX____, + ________,________,XXXX____} + + + ,{ + _____XXX,XXXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,XXXXXX__, + ____XXXX,X_______,________, + ____XXXX,X_______,________, + ____XXXX,X_______,________, + ____XXXX,X_______,________, + ____XXXX,________,________, + ____XXXX,________,________, + ____XXXX,___XXXXX,________, + ____XXXX,_XXXXXXX,XXX_____, + ____XXXX,XXXXXXXX,XXXX____, + ___XXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXX____X,XXXXXX__, + ___XXXXX,X_______,_XXXXXX_, + ___XXXXX,________,__XXXXX_, + ________,________,__XXXXXX, + ________,________,___XXXXX, + ________,________,___XXXXX, + ________,________,___XXXXX, + ________,________,___XXXXX, + ________,________,___XXXXX, + __XXXXX_,________,__XXXXXX, + __XXXXX_,________,__XXXXX_, + ___XXXXX,________,_XXXXXX_, + ___XXXXX,X_______,XXXXXX__, + ____XXXX,XX____XX,XXXXXX__, + _____XXX,XXXXXXXX,XXXXX___, + ______XX,XXXXXXXX,XXXX____, + _______X,XXXXXXXX,XX______, + ________,__XXXXX_,________} + + + ,{ + ________,__XXXXXX,XX______, + ________,XXXXXXXX,XXXX____, + _______X,XXXXXXXX,XXXXX___, + ______XX,XXXXXXXX,XXXXXX__, + _____XXX,XXX_____,_XXXXX__, + ____XXXX,XX______,__XXXXX_, + ____XXXX,X_______,___XXXX_, + ___XXXXX,________,___XXXX_, + ___XXXXX,________,________, + ___XXXXX,________,________, + __XXXXX_,________,________, + __XXXXX_,___XXXXX,________, + __XXXXX_,_XXXXXXX,XXX_____, + __XXXXX_,XXXXXXXX,XXXX____, + __XXXXXX,XXXXXXXX,XXXXX___, + __XXXXXX,XX______,XXXXXX__, + __XXXXXX,X_______,_XXXXXX_, + __XXXXXX,________,__XXXXX_, + __XXXXXX,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + ___XXXX_,________,___XXXXX, + ___XXXXX,________,___XXXXX, + ___XXXXX,________,___XXXXX, + ____XXXX,X_______,__XXXXX_, + ____XXXX,X_______,_XXXXXX_, + _____XXX,XXX_____,XXXXXX__, + ______XX,XXXXXXXX,XXXXX___, + _______X,XXXXXXXX,XXXX____, + ________,XXXXXXXX,XXX_____, + ________,___XXXXX,________} + + + + ,{ + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + __XXXXXX,XXXXXXXX,XXXXXXXX, + ________,________,___XXXXX, + ________,________,__XXXXX_, + ________,________,_XXXXX__, + ________,________,XXXXX___, + ________,_______X,XXXX____, + ________,______XX,XXX_____, + ________,_____XXX,XXX_____, + ________,_____XXX,XX______, + ________,____XXXX,XX______, + ________,___XXXXX,X_______, + ________,___XXXXX,X_______, + ________,__XXXXXX,________, + ________,__XXXXXX,________, + ________,_XXXXXX_,________, + ________,_XXXXXX_,________, + ________,_XXXXXX_,________, + ________,XXXXXX__,________, + ________,XXXXXX__,________, + ________,XXXXXX__,________, + _______X,XXXXX___,________, + _______X,XXXXX___,________, + _______X,XXXXX___,________, + _______X,XXXXX___,________, + ______XX,XXXX____,________, + ______XX,XXXX____,________, + ______XX,XXXX____,________, + ______XX,XXXX____,________} + + + ,{ + ________,_XXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXX__, + ____XXXX,XX______,XXXXXX__, + ___XXXXX,X_______,_XXXXXX_, + ___XXXXX,________,__XXXXX_, + ___XXXXX,________,__XXXXX_, + ___XXXXX,________,__XXXXX_, + ___XXXXX,________,__XXXXX_, + ___XXXXX,X_______,_XXXXXX_, + ____XXXX,X_______,_XXXXX__, + ____XXXX,XXX____X,XXXXXX__, + _____XXX,XXXXXXXX,XXXXX___, + _______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXX____, + ____XXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXX____X,XXXXXXX_, + ___XXXXX,________,__XXXXX_, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXXX,________,__XXXXXX, + ___XXXXX,________,__XXXXX_, + ___XXXXX,XX______,XXXXXXX_, + ____XXXX,XXXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,XXXXX___, + ______XX,XXXXXXXX,XXXX____, + ________,XXXXXXXX,XX______} + + + + ,{ + ________,_XXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,XXXXX___, + ____XXXX,XX______,XXXXXX__, + ___XXXXX,X_______,_XXXXX__, + ___XXXXX,________,__XXXXX_, + ___XXXX_,________,__XXXXX_, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + __XXXXX_,________,___XXXXX, + ___XXXX_,________,__XXXXXX, + ___XXXXX,________,__XXXXXX, + ___XXXXX,X_______,_XXXXXXX, + ____XXXX,XX_____X,XXXXXXXX, + _____XXX,XXXXXXXX,XXXXXXXX, + ______XX,XXXXXXXX,XX_XXXXX, + ________,XXXXXXXX,___XXXXX, + ________,__XXXX__,___XXXXX, + ________,________,__XXXXXX, + ________,________,__XXXXX_, + ________,________,__XXXXX_, + __XXXXX_,________,_XXXXXX_, + __XXXXX_,________,_XXXXX__, + ___XXXXX,________,XXXXX___, + ___XXXXX,X______X,XXXXX___, + ____XXXX,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XX______, + ________,XXXXXXXX,________} + + + ,{ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + __XXXXXX,XXXXXXXX,XXXXXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,__XXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________} + ,{ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + __XXXXXX,XXXXXXXX,XXXXXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + __XXXXXX,XXXXXXXX,XXXXXX__, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________} +}; + + +GUI_CONST_STORAGE U8 acFont32_DP[2*32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XXXX,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________}; + +GUI_CONST_STORAGE U8 acFont32_Colon[2*32] = { + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XXXX,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + ________,________, + ________,________, + ________,________, + _____XXX,________, + ____XXXX,X_______, + ____XXXX,X_______, + ____XXXX,X_______, + _____XXX,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + + +GUI_CONST_STORAGE U8 acFont32_Space[3*32] = { + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + + +GUI_CONST_STORAGE GUI_CHARINFO CharInfo32[] = { + { 24,24,3, acFont32[0]} /* '0' */ + ,{ 24,24,3, acFont32[1]} /* '1' */ + ,{ 24,24,3, acFont32[2]} /* '2' */ + ,{ 24,24,3, acFont32[3]} /* '3' */ + ,{ 24,24,3, acFont32[4]} /* '4' */ + ,{ 24,24,3, acFont32[5]} /* '5' */ + ,{ 24,24,3, acFont32[6]} /* '6' */ + ,{ 24,24,3, acFont32[7]} /* '7' */ + ,{ 24,24,3, acFont32[8]} /* '8' */ + ,{ 24,24,3, acFont32[9]} /* '9' */ + ,{ 16,16,2, acFont32_Colon} /* ':' */ + ,{ 24,24,3, acFont32[11]} /* '-' */ + ,{ 12,12,2, acFont32_DP} /* '.' */ + ,{ 24,24,3, acFont32[10]} /* '+' */ + ,{ 24,24,3, acFont32_Space} /* ' ' */ +}; + + +/* Digits (48-57), 58: ':' */ +GUI_CONST_STORAGE GUI_FONT_PROP FontProp32_3 = { + 48 /* first character */ + ,58 /* last character */ + ,&CharInfo32[0] /* address of first character */ + ,(const GUI_FONT_PROP *)0 /* pointer to next GUI_FONTRANGE */ +}; + +/* 45: '-', 46: '.' */ +GUI_CONST_STORAGE GUI_FONT_PROP FontProp32_2 = { + 45 /* first character */ + ,46 /* last character */ + ,&CharInfo32[11] /* address of first character */ + ,&FontProp32_3 /* pointer to next GUI_FONTRANGE */ +}; + +/* Plus sign */ +GUI_CONST_STORAGE GUI_FONT_PROP FontProp32_1 = { + 43 /* first character */ + ,43 /* last character */ + ,&CharInfo32[13] /* address of first character */ + ,&FontProp32_2 /* pointer to next GUI_FONTRANGE */ +}; + +/* Space */ +GUI_CONST_STORAGE GUI_FONT_PROP FontProp32 = { + 32 /* first character */ + ,32 /* last character */ + ,&CharInfo32[14] /* address of first character */ + ,&FontProp32_1 /* pointer to next GUI_FONTRANGE */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD32 = { + GUI_FONTTYPE_PROP /* type of font */ + ,32 /* height of font */ + ,32 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&FontProp32} + ,32, 0, 32 +}; + + diff --git a/User/system/lib/lcd/gui/Font/FD36x48.c b/User/system/lib/lcd/gui/Font/FD36x48.c new file mode 100644 index 0000000..474df7f --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD36x48.c @@ -0,0 +1,832 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD48.C +Purpose : Implementation of the non-proportional 37 by 48 pixel digit font +Height : 48 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontD36x48[15][240] = { +{ + ________,_______X,XXXXXX__,________,________, + ________,____XXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,_____XXX,XXXXXX__,________, + ______XX,XXXXXX__,_______X,XXXXXXX_,________, + ______XX,XXXXX___,________,XXXXXXX_,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XX______,________,___XXXXX,X_______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ____XXXX,XX______,________,___XXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + ______XX,XXXXX___,________,XXXXXXX_,________, + ______XX,XXXXXX__,_______X,XXXXXXX_,________, + _______X,XXXXXXXX,_____XXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,X_______,________, + ________,_______X,XXXXXX__,________,________}, + +{ + ________,________,_XXXXXX_,________,________, + ________,________,_XXXXXX_,________,________, + ________,________,XXXXXXX_,________,________, + ________,________,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,______XX,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXX_,________,________, + ________,___XXXXX,XXXXXXX_,________,________, + ________,_XXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________}, + +{ + ________,________,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,______XX,XXXXXXXX,________, + ______XX,XXXXXX__,________,XXXXXXXX,X_______, + ______XX,XXXXX___,________,_XXXXXXX,X_______, + _____XXX,XXXXX___,________,__XXXXXX,X_______, + _____XXX,XXXX____,________,__XXXXXX,XX______, + _____XXX,XXXX____,________,___XXXXX,XX______, + _____XXX,XXXX____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,_XXXXXXX,X_______, + ________,________,________,XXXXXXXX,________, + ________,________,________,XXXXXXXX,________, + ________,________,_______X,XXXXXXX_,________, + ________,________,_____XXX,XXXXXXX_,________, + ________,________,____XXXX,XXXXXX__,________, + ________,________,__XXXXXX,XXXXX___,________, + ________,________,_XXXXXXX,XXXX____,________, + ________,________,XXXXXXXX,XXX_____,________, + ________,______XX,XXXXXXXX,X_______,________, + ________,_____XXX,XXXXXXXX,________,________, + ________,___XXXXX,XXXXXXX_,________,________, + ________,__XXXXXX,XXXXX___,________,________, + ________,_XXXXXXX,XXXX____,________,________, + ________,XXXXXXXX,XX______,________,________, + ________,XXXXXXXX,X_______,________,________, + _______X,XXXXXXX_,________,________,________, + ______XX,XXXXXX__,________,________,________, + ______XX,XXXXX___,________,________,________, + _____XXX,XXXX____,________,________,________, + _____XXX,XXXX____,________,________,________, + ____XXXX,XXX_____,________,________,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______}, + +{ + ________,______XX,XXXXXX__,________,________, + ________,___XXXXX,XXXXXXXX,X_______,________, + ________,_XXXXXXX,XXXXXXXX,XXX_____,________, + ________,XXXXXXXX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXX_,_____XXX,XXXXXXX_,________, + _____XXX,XXXXX___,_______X,XXXXXXX_,________, + _____XXX,XXXX____,________,XXXXXXX_,________, + ____XXXX,XXXX____,________,XXXXXXXX,________, + ____XXXX,XXX_____,________,_XXXXXXX,________, + ____XXXX,XXX_____,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ________,________,________,XXXXXXX_,________, + ________,________,________,XXXXXXX_,________, + ________,________,_______X,XXXXXXX_,________, + ________,________,______XX,XXXXXX__,________, + ________,________,___XXXXX,XXXXX___,________, + ________,_______X,XXXXXXXX,XXXXX___,________, + ________,_______X,XXXXXXXX,XXX_____,________, + ________,_______X,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXX___,________, + ________,_______X,XXXXXXXX,XXXXXX__,________, + ________,_______X,XXXXXXXX,XXXXXXX_,________, + ________,________,_____XXX,XXXXXXXX,________, + ________,________,________,XXXXXXXX,________, + ________,________,________,_XXXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,__XXXXXX,XX______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ____XXXX,XXXX____,_______X,XXXXXXXX,________, + ____XXXX,XXXXXXX_,______XX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXX__,________,________}, + +{ + ________,________,_____XXX,XXXX____,________, + ________,________,____XXXX,XXXX____,________, + ________,________,___XXXXX,XXXX____,________, + ________,________,___XXXXX,XXXX____,________, + ________,________,__XXXXXX,XXXX____,________, + ________,________,_XXXXXXX,XXXX____,________, + ________,________,_XXXXXXX,XXXX____,________, + ________,________,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXX____,________, + ________,______XX,XXXX_XXX,XXXX____,________, + ________,_____XXX,XXX__XXX,XXXX____,________, + ________,____XXXX,XXX__XXX,XXXX____,________, + ________,____XXXX,XX___XXX,XXXX____,________, + ________,___XXXXX,X____XXX,XXXX____,________, + ________,__XXXXXX,X____XXX,XXXX____,________, + ________,__XXXXXX,_____XXX,XXXX____,________, + ________,_XXXXXX_,_____XXX,XXXX____,________, + ________,XXXXXXX_,_____XXX,XXXX____,________, + ________,XXXXXX__,_____XXX,XXXX____,________, + _______X,XXXXX___,_____XXX,XXXX____,________, + ______XX,XXXXX___,_____XXX,XXXX____,________, + ______XX,XXXX____,_____XXX,XXXX____,________, + _____XXX,XXX_____,_____XXX,XXXX____,________, + ____XXXX,XXX_____,_____XXX,XXXX____,________, + ___XXXXX,XX______,_____XXX,XXXX____,________, + ___XXXXX,XX______,_____XXX,XXXX____,________, + __XXXXXX,X_______,_____XXX,XXXX____,________, + _XXXXXXX,________,_____XXX,XXXX____,________, + _XXXXXXX,________,_____XXX,XXXX____,________, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________}, + +{ + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXX__,________,________,________, + _______X,XXXXXX__,________,________,________, + _______X,XXXXX___,________,________,________, + _______X,XXXXX___,________,________,________, + ______XX,XXXXX___,________,________,________, + ______XX,XXXXX___,________,________,________, + ______XX,XXXXX___,________,________,________, + ______XX,XXXX____,________,________,________, + ______XX,XXXX____,________,________,________, + ______XX,XXXX____,_XXXXXXX,________,________, + _____XXX,XXXX__XX,XXXXXXXX,XXX_____,________, + _____XXX,XXXX_XXX,XXXXXXXX,XXXX____,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXXX_,_____XXX,XXXXXXXX,________, + ____XXXX,XXXXX___,_______X,XXXXXXXX,________, + ____XXXX,XXXX____,________,_XXXXXXX,X_______, + ____XXXX,XXX_____,________,_XXXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XXX_____,________,__XXXXXX,X_______, + ___XXXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,_XXXXXXX,X_______, + ____XXXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + _____XXX,XXXXXXX_,______XX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXXX_,________,________}, + +{ + ________,________,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXXX,XX______,________, + ________,___XXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,______XX,XXXXXXX_,________, + ______XX,XXXXXX__,________,XXXXXXXX,________, + _____XXX,XXXXX___,________,_XXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + ____XXXX,XXXX____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,________,________, + ___XXXXX,XXX_____,________,________,________, + ___XXXXX,XX______,________,________,________, + ___XXXXX,XX______,________,________,________, + ___XXXXX,XX______,________,________,________, + ___XXXXX,XX______,XXXXXXX_,________,________, + __XXXXXX,XX____XX,XXXXXXXX,XX______,________, + __XXXXXX,XX__XXXX,XXXXXXXX,XXXX____,________, + __XXXXXX,X__XXXXX,XXXXXXXX,XXXXX___,________, + __XXXXXX,X_XXXXXX,XXXXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,______XX,XXXXXXXX,________, + __XXXXXX,XXXXXX__,________,XXXXXXXX,________, + __XXXXXX,XXXX____,________,_XXXXXXX,X_______, + __XXXXXX,XXXX____,________,_XXXXXXX,X_______, + __XXXXXX,XXX_____,________,__XXXXXX,X_______, + __XXXXXX,XXX_____,________,__XXXXXX,XX______, + __XXXXXX,XX______,________,___XXXXX,XX______, + __XXXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXXX____,________,_XXXXXXX,X_______, + _____XXX,XXXXX___,________,_XXXXXXX,X_______, + _____XXX,XXXXXX__,_______X,XXXXXXXX,________, + ______XX,XXXXXXXX,______XX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXXX_,________,________}, + +{ + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,_XXXXXXX,________, + ________,________,________,XXXXXXX_,________, + ________,________,________,XXXXXX__,________, + ________,________,_______X,XXXXXX__,________, + ________,________,______XX,XXXXX___,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXX_____,________, + ________,________,____XXXX,XXX_____,________, + ________,________,___XXXXX,XX______,________, + ________,________,___XXXXX,XX______,________, + ________,________,__XXXXXX,X_______,________, + ________,________,__XXXXXX,________,________, + ________,________,_XXXXXXX,________,________, + ________,________,XXXXXXX_,________,________, + ________,________,XXXXXXX_,________,________, + ________,________,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,______XX,XXXXX___,________,________, + ________,______XX,XXXXX___,________,________, + ________,_____XXX,XXXXX___,________,________, + ________,_____XXX,XXXX____,________,________, + ________,_____XXX,XXXX____,________,________, + ________,____XXXX,XXXX____,________,________, + ________,____XXXX,XXX_____,________,________, + ________,____XXXX,XXX_____,________,________, + ________,___XXXXX,XXX_____,________,________, + ________,___XXXXX,XXX_____,________,________, + ________,___XXXXX,XX______,________,________, + ________,___XXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________}, + +{ + ________,______XX,XXXXXXX_,________,________, + ________,___XXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXX_,______XX,XXXXXXXX,________, + _____XXX,XXXXXX__,_______X,XXXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + ____XXXX,XXXX____,________,_XXXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + ______XX,XXXXXX__,_______X,XXXXXXX_,________, + _______X,XXXXXXX_,______XX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXXX,XXX_____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXX__,______XX,XXXXXXXX,________, + ____XXXX,XXXX____,_______X,XXXXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ___XXXXX,XX______,________,__XXXXXX,X_______, + __XXXXXX,XX______,________,__XXXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,__XXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ____XXXX,XXXXX___,_______X,XXXXXXXX,________, + ____XXXX,XXXXXXX_,______XX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXX__,________,________}, + +{ + ________,______XX,XXXXXX__,________,________, + ________,__XXXXXX,XXXXXXXX,X_______,________, + ________,XXXXXXXX,XXXXXXXX,XXX_____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXX____,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ____XXXX,XXXXXX__,____XXXX,XXXXXX__,________, + ____XXXX,XXXX____,______XX,XXXXXXX_,________, + ___XXXXX,XXX_____,________,XXXXXXX_,________, + ___XXXXX,XXX_____,________,XXXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + __XXXXXX,XX______,________,_XXXXXXX,________, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,XX______, + __XXXXXX,X_______,________,__XXXXXX,XX______, + __XXXXXX,XX______,________,_XXXXXXX,XX______, + ___XXXXX,XX______,________,_XXXXXXX,XX______, + ___XXXXX,XXX_____,________,XXXXXXXX,XX______, + ___XXXXX,XXX_____,________,XXXXXXXX,XX______, + ____XXXX,XXXX____,______XX,XXXXXXXX,XX______, + ____XXXX,XXXXXX__,____XXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXXXXX,XX_XXXXX,XX______, + _______X,XXXXXXXX,XXXXXXXX,X__XXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,__XXXXXX,XX______, + ________,__XXXXXX,XXXXXX__,__XXXXXX,XX______, + ________,_____XXX,XXXX____,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,_XXXXXXX,X_______, + ________,________,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ___XXXXX,XX______,________,XXXXXXX_,________, + ___XXXXX,XXX_____,________,XXXXXXX_,________, + ____XXXX,XXX_____,_______X,XXXXXXX_,________, + ____XXXX,XXXX____,______XX,XXXXXX__,________, + _____XXX,XXXXXX__,____XXXX,XXXXX___,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,________, + ________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXX_,________,________, + ________,_____XXX,XXXX____,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,________,________,________,________, + ________,________,________,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,________,________,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,________,________, + ________,________,________,________,________} +}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_FontD36x48_CharInfo[15] = { + { 36, 36, 5, acFontD36x48[12] } /* code 0020 ' ' */ + ,{ 36, 36, 5, acFontD36x48[10] } /* code 002B '+' */ + ,{ 36, 36, 5, acFontD36x48[11] } /* code 002D '-' */ + ,{ 36, 36, 5, acFontD36x48[13] } /* code 002E '.' */ + ,{ 36, 36, 5, acFontD36x48[0] } /* code 0030 '0' */ + ,{ 36, 36, 5, acFontD36x48[1] } /* code 0031 '1' */ + ,{ 36, 36, 5, acFontD36x48[2] } /* code 0032 '2' */ + ,{ 36, 36, 5, acFontD36x48[3] } /* code 0033 '3' */ + ,{ 36, 36, 5, acFontD36x48[4] } /* code 0034 '4' */ + ,{ 36, 36, 5, acFontD36x48[5] } /* code 0035 '5' */ + ,{ 36, 36, 5, acFontD36x48[6] } /* code 0036 '6' */ + ,{ 36, 36, 5, acFontD36x48[7] } /* code 0037 '7' */ + ,{ 36, 36, 5, acFontD36x48[8] } /* code 0038 '8' */ + ,{ 36, 36, 5, acFontD36x48[9] } /* code 0039 '9' */ + ,{ 36, 36, 5, acFontD36x48[14] } /* code 003A ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD36x48_Prop4 = { + 0x0030 /* first character */ + ,0x003A /* last character */ + ,&GUI_FontD36x48_CharInfo[ 4] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD36x48_Prop3 = { + 0x002D /* first character */ + ,0x002E /* last character */ + ,&GUI_FontD36x48_CharInfo[ 2] /* address of first character */ + ,&GUI_FontD36x48_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD36x48_Prop2 = { + 0x002B /* first character */ + ,0x002B /* last character */ + ,&GUI_FontD36x48_CharInfo[ 1] /* address of first character */ + ,&GUI_FontD36x48_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD36x48_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&GUI_FontD36x48_CharInfo[ 0] /* address of first character */ + ,&GUI_FontD36x48_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD36x48 = { + GUI_FONTTYPE_PROP /* type of font */ + ,48 /* height of font */ + ,48 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontD36x48_Prop1} + ,48 /* Baseline */ + ,0 /* LHeight */ + ,48 /* CHeight */ +}; + diff --git a/User/system/lib/lcd/gui/Font/FD48.c b/User/system/lib/lcd/gui/Font/FD48.c new file mode 100644 index 0000000..9a234fe --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD48.c @@ -0,0 +1,832 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD48.C +Purpose : Implementation of the proportional 48 pixel digit +Height : 48 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontD48[12][240] = { +{ + ________,_______X,XXXXXX__,________,________, + ________,____XXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,_____XXX,XXXXXX__,________, + ______XX,XXXXXX__,_______X,XXXXXXX_,________, + ______XX,XXXXX___,________,XXXXXXX_,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XX______,________,___XXXXX,X_______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ____XXXX,XX______,________,___XXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + ______XX,XXXXX___,________,XXXXXXX_,________, + ______XX,XXXXXX__,_______X,XXXXXXX_,________, + _______X,XXXXXXXX,_____XXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,X_______,________, + ________,_______X,XXXXXX__,________,________}, + +{ + ________,________,_XXXXXX_,________,________, + ________,________,_XXXXXX_,________,________, + ________,________,XXXXXXX_,________,________, + ________,________,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,______XX,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXX_,________,________, + ________,___XXXXX,XXXXXXX_,________,________, + ________,_XXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________, + ________,_______X,XXXXXXX_,________,________}, + +{ + ________,________,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,______XX,XXXXXXXX,________, + ______XX,XXXXXX__,________,XXXXXXXX,X_______, + ______XX,XXXXX___,________,_XXXXXXX,X_______, + _____XXX,XXXXX___,________,__XXXXXX,X_______, + _____XXX,XXXX____,________,__XXXXXX,XX______, + _____XXX,XXXX____,________,___XXXXX,XX______, + _____XXX,XXXX____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,_XXXXXXX,X_______, + ________,________,________,XXXXXXXX,________, + ________,________,________,XXXXXXXX,________, + ________,________,_______X,XXXXXXX_,________, + ________,________,_____XXX,XXXXXXX_,________, + ________,________,____XXXX,XXXXXX__,________, + ________,________,__XXXXXX,XXXXX___,________, + ________,________,_XXXXXXX,XXXX____,________, + ________,________,XXXXXXXX,XXX_____,________, + ________,______XX,XXXXXXXX,X_______,________, + ________,_____XXX,XXXXXXXX,________,________, + ________,___XXXXX,XXXXXXX_,________,________, + ________,__XXXXXX,XXXXX___,________,________, + ________,_XXXXXXX,XXXX____,________,________, + ________,XXXXXXXX,XX______,________,________, + ________,XXXXXXXX,X_______,________,________, + _______X,XXXXXXX_,________,________,________, + ______XX,XXXXXX__,________,________,________, + ______XX,XXXXX___,________,________,________, + _____XXX,XXXX____,________,________,________, + _____XXX,XXXX____,________,________,________, + ____XXXX,XXX_____,________,________,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______}, + +{ + ________,______XX,XXXXXX__,________,________, + ________,___XXXXX,XXXXXXXX,X_______,________, + ________,_XXXXXXX,XXXXXXXX,XXX_____,________, + ________,XXXXXXXX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXX_,_____XXX,XXXXXXX_,________, + _____XXX,XXXXX___,_______X,XXXXXXX_,________, + _____XXX,XXXX____,________,XXXXXXX_,________, + ____XXXX,XXXX____,________,XXXXXXXX,________, + ____XXXX,XXX_____,________,_XXXXXXX,________, + ____XXXX,XXX_____,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ________,________,________,XXXXXXX_,________, + ________,________,________,XXXXXXX_,________, + ________,________,_______X,XXXXXXX_,________, + ________,________,______XX,XXXXXX__,________, + ________,________,___XXXXX,XXXXX___,________, + ________,_______X,XXXXXXXX,XXXXX___,________, + ________,_______X,XXXXXXXX,XXX_____,________, + ________,_______X,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXX___,________, + ________,_______X,XXXXXXXX,XXXXXX__,________, + ________,_______X,XXXXXXXX,XXXXXXX_,________, + ________,________,_____XXX,XXXXXXXX,________, + ________,________,________,XXXXXXXX,________, + ________,________,________,_XXXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,__XXXXXX,XX______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ____XXXX,XXXX____,_______X,XXXXXXXX,________, + ____XXXX,XXXXXXX_,______XX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXX__,________,________}, + +{ + ________,________,_____XXX,XXXX____,________, + ________,________,____XXXX,XXXX____,________, + ________,________,___XXXXX,XXXX____,________, + ________,________,___XXXXX,XXXX____,________, + ________,________,__XXXXXX,XXXX____,________, + ________,________,_XXXXXXX,XXXX____,________, + ________,________,_XXXXXXX,XXXX____,________, + ________,________,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXX____,________, + ________,______XX,XXXX_XXX,XXXX____,________, + ________,_____XXX,XXX__XXX,XXXX____,________, + ________,____XXXX,XXX__XXX,XXXX____,________, + ________,____XXXX,XX___XXX,XXXX____,________, + ________,___XXXXX,X____XXX,XXXX____,________, + ________,__XXXXXX,X____XXX,XXXX____,________, + ________,__XXXXXX,_____XXX,XXXX____,________, + ________,_XXXXXX_,_____XXX,XXXX____,________, + ________,XXXXXXX_,_____XXX,XXXX____,________, + ________,XXXXXX__,_____XXX,XXXX____,________, + _______X,XXXXX___,_____XXX,XXXX____,________, + ______XX,XXXXX___,_____XXX,XXXX____,________, + ______XX,XXXX____,_____XXX,XXXX____,________, + _____XXX,XXX_____,_____XXX,XXXX____,________, + ____XXXX,XXX_____,_____XXX,XXXX____,________, + ___XXXXX,XX______,_____XXX,XXXX____,________, + ___XXXXX,XX______,_____XXX,XXXX____,________, + __XXXXXX,X_______,_____XXX,XXXX____,________, + _XXXXXXX,________,_____XXX,XXXX____,________, + _XXXXXXX,________,_____XXX,XXXX____,________, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXXX____,________}, + +{ + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXX__,________,________,________, + _______X,XXXXXX__,________,________,________, + _______X,XXXXX___,________,________,________, + _______X,XXXXX___,________,________,________, + ______XX,XXXXX___,________,________,________, + ______XX,XXXXX___,________,________,________, + ______XX,XXXXX___,________,________,________, + ______XX,XXXX____,________,________,________, + ______XX,XXXX____,________,________,________, + ______XX,XXXX____,_XXXXXXX,________,________, + _____XXX,XXXX__XX,XXXXXXXX,XXX_____,________, + _____XXX,XXXX_XXX,XXXXXXXX,XXXX____,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXXX_,_____XXX,XXXXXXXX,________, + ____XXXX,XXXXX___,_______X,XXXXXXXX,________, + ____XXXX,XXXX____,________,_XXXXXXX,X_______, + ____XXXX,XXX_____,________,_XXXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ________,________,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XXX_____,________,__XXXXXX,X_______, + ___XXXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,_XXXXXXX,X_______, + ____XXXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + _____XXX,XXXXXXX_,______XX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXXX_,________,________}, + +{ + ________,________,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXXX,XX______,________, + ________,___XXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,______XX,XXXXXXX_,________, + ______XX,XXXXXX__,________,XXXXXXXX,________, + _____XXX,XXXXX___,________,_XXXXXXX,________, + _____XXX,XXXX____,________,_XXXXXXX,________, + ____XXXX,XXXX____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,________,________, + ___XXXXX,XXX_____,________,________,________, + ___XXXXX,XX______,________,________,________, + ___XXXXX,XX______,________,________,________, + ___XXXXX,XX______,________,________,________, + ___XXXXX,XX______,XXXXXXX_,________,________, + __XXXXXX,XX____XX,XXXXXXXX,XX______,________, + __XXXXXX,XX__XXXX,XXXXXXXX,XXXX____,________, + __XXXXXX,X__XXXXX,XXXXXXXX,XXXXX___,________, + __XXXXXX,X_XXXXXX,XXXXXXXX,XXXXXX__,________, + __XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + __XXXXXX,XXXXXXX_,______XX,XXXXXXXX,________, + __XXXXXX,XXXXXX__,________,XXXXXXXX,________, + __XXXXXX,XXXX____,________,_XXXXXXX,X_______, + __XXXXXX,XXXX____,________,_XXXXXXX,X_______, + __XXXXXX,XXX_____,________,__XXXXXX,X_______, + __XXXXXX,XXX_____,________,__XXXXXX,XX______, + __XXXXXX,XX______,________,___XXXXX,XX______, + __XXXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,___XXXXX,XX______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXXX____,________,_XXXXXXX,X_______, + _____XXX,XXXXX___,________,_XXXXXXX,X_______, + _____XXX,XXXXXX__,_______X,XXXXXXXX,________, + ______XX,XXXXXXXX,______XX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXXX_,________,________}, + +{ + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,_XXXXXXX,________, + ________,________,________,XXXXXXX_,________, + ________,________,________,XXXXXX__,________, + ________,________,_______X,XXXXXX__,________, + ________,________,______XX,XXXXX___,________, + ________,________,_____XXX,XXXX____,________, + ________,________,_____XXX,XXX_____,________, + ________,________,____XXXX,XXX_____,________, + ________,________,___XXXXX,XX______,________, + ________,________,___XXXXX,XX______,________, + ________,________,__XXXXXX,X_______,________, + ________,________,__XXXXXX,________,________, + ________,________,_XXXXXXX,________,________, + ________,________,XXXXXXX_,________,________, + ________,________,XXXXXXX_,________,________, + ________,________,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,______XX,XXXXX___,________,________, + ________,______XX,XXXXX___,________,________, + ________,_____XXX,XXXXX___,________,________, + ________,_____XXX,XXXX____,________,________, + ________,_____XXX,XXXX____,________,________, + ________,____XXXX,XXXX____,________,________, + ________,____XXXX,XXX_____,________,________, + ________,____XXXX,XXX_____,________,________, + ________,___XXXXX,XXX_____,________,________, + ________,___XXXXX,XXX_____,________,________, + ________,___XXXXX,XX______,________,________, + ________,___XXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,XX______,________,________, + ________,__XXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________, + ________,_XXXXXXX,X_______,________,________}, + +{ + ________,______XX,XXXXXXX_,________,________, + ________,___XXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXX_,______XX,XXXXXXXX,________, + _____XXX,XXXXXX__,_______X,XXXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + ____XXXX,XXXX____,________,_XXXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + ____XXXX,XXX_____,________,__XXXXXX,X_______, + _____XXX,XXXX____,________,_XXXXXXX,________, + _____XXX,XXXXX___,________,XXXXXXXX,________, + ______XX,XXXXXX__,_______X,XXXXXXX_,________, + _______X,XXXXXXX_,______XX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXXX,XXX_____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXX__,______XX,XXXXXXXX,________, + ____XXXX,XXXX____,_______X,XXXXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ___XXXXX,XX______,________,__XXXXXX,X_______, + __XXXXXX,XX______,________,__XXXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + __XXXXXX,X_______,________,___XXXXX,XX______, + ___XXXXX,XX______,________,__XXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ___XXXXX,XXX_____,________,_XXXXXXX,X_______, + ____XXXX,XXXXX___,_______X,XXXXXXXX,________, + ____XXXX,XXXXXXX_,______XX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXX__,________,________}, + +{ + ________,______XX,XXXXXX__,________,________, + ________,__XXXXXX,XXXXXXXX,X_______,________, + ________,XXXXXXXX,XXXXXXXX,XXX_____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXX____,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ____XXXX,XXXXXX__,____XXXX,XXXXXX__,________, + ____XXXX,XXXX____,______XX,XXXXXXX_,________, + ___XXXXX,XXX_____,________,XXXXXXX_,________, + ___XXXXX,XXX_____,________,XXXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + __XXXXXX,XX______,________,_XXXXXXX,________, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,X_______, + __XXXXXX,X_______,________,__XXXXXX,XX______, + __XXXXXX,X_______,________,__XXXXXX,XX______, + __XXXXXX,XX______,________,_XXXXXXX,XX______, + ___XXXXX,XX______,________,_XXXXXXX,XX______, + ___XXXXX,XXX_____,________,XXXXXXXX,XX______, + ___XXXXX,XXX_____,________,XXXXXXXX,XX______, + ____XXXX,XXXX____,______XX,XXXXXXXX,XX______, + ____XXXX,XXXXXX__,____XXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXXXXX,XX_XXXXX,XX______, + _______X,XXXXXXXX,XXXXXXXX,X__XXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,__XXXXXX,XX______, + ________,__XXXXXX,XXXXXX__,__XXXXXX,XX______, + ________,_____XXX,XXXX____,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,__XXXXXX,X_______, + ________,________,________,_XXXXXXX,X_______, + ________,________,________,_XXXXXXX,________, + ___XXXXX,XX______,________,_XXXXXXX,________, + ___XXXXX,XX______,________,XXXXXXX_,________, + ___XXXXX,XXX_____,________,XXXXXXX_,________, + ____XXXX,XXX_____,_______X,XXXXXXX_,________, + ____XXXX,XXXX____,______XX,XXXXXX__,________, + _____XXX,XXXXXX__,____XXXX,XXXXX___,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,________, + ________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXX_,________,________, + ________,_____XXX,XXXX____,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,_______X,XXXXXX__,________,________, + ________,________,________,________,________, + ________,________,________,________,________}, + +{ + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________, + ________,________,________,________,________} +}; + +GUI_CONST_STORAGE unsigned char acFontD48_0020[144] = { /* code 0020 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontD48_002E[144] = { /* code 002E */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontD48_003A[144] = { /* code 003A */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________, + ________,________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_FontD48_CharInfo[15] = { + { 18, 18, 3, acFontD48_0020 } /* code 0020 ' ' */ + ,{ 37, 37, 5, acFontD48[10] } /* code 002B '+' */ + ,{ 37, 37, 5, acFontD48[11] } /* code 002D '-' */ + ,{ 18, 18, 3, acFontD48_002E } /* code 002E '.' */ + ,{ 37, 37, 5, acFontD48[0] } /* code 0030 '0' */ + ,{ 37, 37, 5, acFontD48[1] } /* code 0031 '1' */ + ,{ 37, 37, 5, acFontD48[2] } /* code 0032 '2' */ + ,{ 37, 37, 5, acFontD48[3] } /* code 0033 '3' */ + ,{ 37, 37, 5, acFontD48[4] } /* code 0034 '4' */ + ,{ 37, 37, 5, acFontD48[5] } /* code 0035 '5' */ + ,{ 37, 37, 5, acFontD48[6] } /* code 0036 '6' */ + ,{ 37, 37, 5, acFontD48[7] } /* code 0037 '7' */ + ,{ 37, 37, 5, acFontD48[8] } /* code 0038 '8' */ + ,{ 37, 37, 5, acFontD48[9] } /* code 0039 '9' */ + ,{ 18, 18, 3, acFontD48_003A } /* code 003A ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48_Prop4 = { + 0x0030 /* first character */ + ,0x003A /* last character */ + ,&GUI_FontD48_CharInfo[ 4] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48_Prop3 = { + 0x002D /* first character */ + ,0x002E /* last character */ + ,&GUI_FontD48_CharInfo[ 2] /* address of first character */ + ,&GUI_FontD48_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48_Prop2 = { + 0x002B /* first character */ + ,0x002B /* last character */ + ,&GUI_FontD48_CharInfo[ 1] /* address of first character */ + ,&GUI_FontD48_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&GUI_FontD48_CharInfo[ 0] /* address of first character */ + ,&GUI_FontD48_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD48 = { + GUI_FONTTYPE_PROP /* type of font */ + ,48 /* height of font */ + ,48 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontD48_Prop1} + ,48 /* Baseline */ + ,0 /* LHeight */ + ,48 /* CHeight */ +}; + diff --git a/User/system/lib/lcd/gui/Font/FD48x64.c b/User/system/lib/lcd/gui/Font/FD48x64.c new file mode 100644 index 0000000..223739a --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD48x64.c @@ -0,0 +1,1072 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD64.C +Purpose : Implementation of the non-proportional 48 by 64 pixel digit font +Height : 64 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontD48x64[15][384] = { +{ + ________,________,____XXXX,XXXXX___,________,________, + ________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXX___,____XXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXX____,_____XXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + _______X,XXXXXXXX,X_______,________,XXXXXXXX,XX______, + ______XX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXX___,________,________,____XXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXX___,________,________,____XXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,X_______,________,XXXXXXXX,XX______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXX____,_____XXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XX______,________, + ________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,________,____XXXX,XXXXX___,________,________}, + +{ + ________,________,_______X,XXXXXXX_,________,________, + ________,________,_______X,XXXXXXX_,________,________, + ________,________,_______X,XXXXXXX_,________,________, + ________,________,______XX,XXXXXXX_,________,________, + ________,________,______XX,XXXXXXX_,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,___XXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXXX,XXXXXXX_,________,________, + ________,___XXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________}, + +{ + ________,________,_____XXX,XXXXXX__,________,________, + ________,________,__XXXXXX,XXXXXXXX,XX______,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXX____,_______X,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XXX_____,________,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XX______,________,_XXXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,XXXXXXXX,XXX_____, + ________,________,________,_______X,XXXXXXXX,XX______, + ________,________,________,______XX,XXXXXXXX,XX______, + ________,________,________,_____XXX,XXXXXXXX,X_______, + ________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,___XXXXX,XXXXXXX_,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________, + ________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,_______X,XXXXXXXX,XXXXX___,________, + ________,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,________,____XXXX,XXXXXXXX,XX______,________, + ________,________,___XXXXX,XXXXXXXX,X_______,________, + ________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXXXXX__,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________, + ________,____XXXX,XXXXXXXX,XX______,________,________, + ________,___XXXXX,XXXXXXXX,X_______,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________, + ________,__XXXXXX,XXXXXX__,________,________,________, + ________,_XXXXXXX,XXXXX___,________,________,________, + ________,XXXXXXXX,XXXX____,________,________,________, + ________,XXXXXXXX,XXX_____,________,________,________, + _______X,XXXXXXXX,XX______,________,________,________, + _______X,XXXXXXXX,X_______,________,________,________, + ______XX,XXXXXXXX,________,________,________,________, + ______XX,XXXXXXXX,________,________,________,________, + _____XXX,XXXXXXXX,________,________,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___}, + +{ + ________,________,____XXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXX_____,______XX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXX_____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,XXXXXXXX,XX______, + ________,________,________,________,XXXXXXXX,XX______, + ________,________,________,______XX,XXXXXXXX,X_______, + ________,________,________,_____XXX,XXXXXXXX,X_______, + ________,________,________,__XXXXXX,XXXXXXX_,________, + ________,________,____XXXX,XXXXXXXX,XXXXXX__,________, + ________,________,____XXXX,XXXXXXXX,XXXX____,________, + ________,________,____XXXX,XXXXXXXX,XXXX____,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXX_,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,____XXXX,XXXXXXXX,XXX_____, + ________,________,________,_______X,XXXXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXXX___, + ________,________,________,________,__XXXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + _____XXX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXXX____, + ______XX,XXXXXXXX,XX______,_______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,X_______,________, + ________,________,___XXXXX,XXXXX___,________,________}, + +{ + ________,________,________,______XX,XXXXXX__,________, + ________,________,________,______XX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,____XXXX,XXXXXX__,________, + ________,________,________,___XXXXX,XXXXXX__,________, + ________,________,________,___XXXXX,XXXXXX__,________, + ________,________,________,__XXXXXX,XXXXXX__,________, + ________,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,________,______XX,XXXXXXXX,XXXXXX__,________, + ________,________,_____XXX,XXXXXXXX,XXXXXX__,________, + ________,________,_____XXX,XXXXXXXX,XXXXXX__,________, + ________,________,____XXXX,XXXX_XXX,XXXXXX__,________, + ________,________,___XXXXX,XXXX_XXX,XXXXXX__,________, + ________,________,___XXXXX,XXX__XXX,XXXXXX__,________, + ________,________,__XXXXXX,XX___XXX,XXXXXX__,________, + ________,________,_XXXXXXX,XX___XXX,XXXXXX__,________, + ________,________,XXXXXXXX,X____XXX,XXXXXX__,________, + ________,________,XXXXXXXX,_____XXX,XXXXXX__,________, + ________,_______X,XXXXXXX_,_____XXX,XXXXXX__,________, + ________,______XX,XXXXXXX_,_____XXX,XXXXXX__,________, + ________,_____XXX,XXXXXX__,_____XXX,XXXXXX__,________, + ________,_____XXX,XXXXX___,_____XXX,XXXXXX__,________, + ________,____XXXX,XXXXX___,_____XXX,XXXXXX__,________, + ________,___XXXXX,XXXX____,_____XXX,XXXXXX__,________, + ________,__XXXXXX,XXX_____,_____XXX,XXXXXX__,________, + ________,__XXXXXX,XXX_____,_____XXX,XXXXXX__,________, + ________,_XXXXXXX,XX______,_____XXX,XXXXXX__,________, + ________,XXXXXXXX,X_______,_____XXX,XXXXXX__,________, + ________,XXXXXXXX,________,_____XXX,XXXXXX__,________, + _______X,XXXXXXXX,________,_____XXX,XXXXXX__,________, + ______XX,XXXXXXX_,________,_____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________,_____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________,_____XXX,XXXXXX__,________, + ____XXXX,XXXXX___,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXXX____,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXXX____,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXX_____,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________}, + +{ + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,_XXXXXXX,XX______,________,________,________, + ________,_XXXXXXX,XX______,________,________,________, + ________,_XXXXXXX,XX______,________,________,________, + ________,_XXXXXXX,XX______,________,________,________, + ________,XXXXXXXX,XX______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + _______X,XXXXXXXX,X_______,________,________,________, + _______X,XXXXXXXX,________,________,________,________, + _______X,XXXXXXXX,________,________,________,________, + _______X,XXXXXXXX,_______X,XXXXXXX_,________,________, + _______X,XXXXXXXX,____XXXX,XXXXXXXX,XX______,________, + ______XX,XXXXXXX_,__XXXXXX,XXXXXXXX,XXXX____,________, + ______XX,XXXXXXX_,_XXXXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXXX____,____XXXX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XX______,______XX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,________,________,XXXXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,_XXXXXXX,XXXX____, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,X_______,________, + ________,________,____XXXX,XXXXX___,________,________}, + +{ + ________,________,______XX,XXXXXXX_,________,________, + ________,________,__XXXXXX,XXXXXXXX,XX______,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,__XXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXX___,_______X,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XXX_____,________,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XX______,________,_XXXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,________,___XX___, + _____XXX,XXXXXXX_,________,________,________,________, + _____XXX,XXXXXXX_,________,________,________,________, + _____XXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,_______X,XXXXXXX_,________,________, + ____XXXX,XXXXXX__,____XXXX,XXXXXXXX,XX______,________, + ___XXXXX,XXXXX___,__XXXXXX,XXXXXXXX,XXXX____,________, + ___XXXXX,XXXXX___,_XXXXXXX,XXXXXXXX,XXXXXX__,________, + ___XXXXX,XXXXX__X,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXX__X,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ___XXXXX,XXXXX_XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XXX_____, + ___XXXXX,XXXXXXXX,XXX_____,_______X,XXXXXXXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______,________,XXXXXXXX,XXXX____, + ___XXXXX,XXXXXXXX,X_______,________,_XXXXXXX,XXXX____, + ___XXXXX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ___XXXXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + _____XXX,XXXXXXX_,________,________,____XXXX,XXXXXX__, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ______XX,XXXXXXXX,X_______,________,_XXXXXXX,XXXX____, + _______X,XXXXXXXX,XX______,________,XXXXXXXX,XXXX____, + _______X,XXXXXXXX,XXX_____,_______X,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,________,_XXXXXXX,XXXXXXXX,XX______,________, + ________,________,_____XXX,XXXXXX__,________,________}, + +{ + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,_XXXXXXX,XX______, + ________,________,________,________,XXXXXXXX,X_______, + ________,________,________,_______X,XXXXXXXX,________, + ________,________,________,______XX,XXXXXXXX,________, + ________,________,________,_____XXX,XXXXXXX_,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,____XXXX,XXXXX___,________, + ________,________,________,___XXXXX,XXXXX___,________, + ________,________,________,__XXXXXX,XXXX____,________, + ________,________,________,__XXXXXX,XXX_____,________, + ________,________,________,_XXXXXXX,XXX_____,________, + ________,________,________,XXXXXXXX,XX______,________, + ________,________,________,XXXXXXXX,X_______,________, + ________,________,_______X,XXXXXXXX,X_______,________, + ________,________,_______X,XXXXXXXX,________,________, + ________,________,______XX,XXXXXXXX,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXX__,________,________, + ________,________,____XXXX,XXXXXX__,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXX____,________,________, + ________,________,__XXXXXX,XXXX____,________,________, + ________,________,__XXXXXX,XXXX____,________,________, + ________,________,_XXXXXXX,XXX_____,________,________, + ________,________,_XXXXXXX,XXX_____,________,________, + ________,________,XXXXXXXX,XX______,________,________, + ________,________,XXXXXXXX,XX______,________,________, + ________,________,XXXXXXXX,XX______,________,________, + ________,_______X,XXXXXXXX,XX______,________,________, + ________,_______X,XXXXXXXX,X_______,________,________, + ________,_______X,XXXXXXXX,X_______,________,________, + ________,______XX,XXXXXXXX,X_______,________,________, + ________,______XX,XXXXXXXX,________,________,________, + ________,______XX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________}, + +{ + ________,________,____XXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____,______XX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + _______X,XXXXXXXX,X_______,________,XXXXXXXX,XX______, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + _______X,XXXXXXX_,________,________,__XXXXXX,XX______, + _______X,XXXXXXXX,________,________,_XXXXXXX,XX______, + _______X,XXXXXXXX,________,________,_XXXXXXX,XX______, + ________,XXXXXXXX,X_______,________,XXXXXXXX,X_______, + ________,XXXXXXXX,XX______,_______X,XXXXXXXX,X_______, + ________,_XXXXXXX,XXX_____,______XX,XXXXXXXX,________, + ________,__XXXXXX,XXXXX___,____XXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XX______,_______X,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXXX____, + ____XXXX,XXXXXXXX,________,________,_XXXXXXX,XXXXX___, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXXX__,________,________,___XXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + _____XXX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXXX____, + ______XX,XXXXXXXX,XX______,_______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,________,____XXXX,XXXXX___,________,________}, + +{ + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,X_______,_______X,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,________,________,XXXXXXXX,XXX_____, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXX_____, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXX_____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ___XXXXX,XXXXX___,________,________,__XXXXXX,XXXX____, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXXX__, + ___XXXXX,XXXXXX__,________,________,__XXXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXXXX__, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXX__, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,________,________,XXXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,X_______,_______X,XXXXXXXX,XXXXXX__, + ______XX,XXXXXXXX,XX______,_____XXX,XXXXXXXX,XXXXXX__, + ______XX,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,XXXXXX__, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_XXXX,XXXXXX__, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XX__XXXX,XXXXXX__, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XX__XXXX,XXXXXX__, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,____XXXX,XXXXXX__, + ________,_____XXX,XXXXXXXX,XXXXXXX_,____XXXX,XXXXX___, + ________,_______X,XXXXXXXX,XXXXX___,___XXXXX,XXXXX___, + ________,________,__XXXXXX,XX______,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ____XX__,________,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,_XXXXXXX,XXX_____, + ____XXXX,XXXXXX__,________,________,_XXXXXXX,XXX_____, + _____XXX,XXXXXXX_,________,________,XXXXXXXX,XX______, + _____XXX,XXXXXXX_,________,________,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,________,_______X,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,______XX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,_____XXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_______X,XXXXXXXX,XXXXXXX_,________,________, + ________,________,__XXXXXX,XXX_____,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,________,________,________,________} +}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_FontD48x64_CharInfo[15] = { + { 48, 48, 6, acFontD48x64[12] } /* code 0020 ' ' */ + ,{ 48, 48, 6, acFontD48x64[10] } /* code 002B '+' */ + ,{ 48, 48, 6, acFontD48x64[11] } /* code 002D '-' */ + ,{ 48, 48, 6, acFontD48x64[13] } /* code 002E '.' */ + ,{ 48, 48, 6, acFontD48x64[0] } /* code 0030 '0' */ + ,{ 48, 48, 6, acFontD48x64[1] } /* code 0031 '1' */ + ,{ 48, 48, 6, acFontD48x64[2] } /* code 0032 '2' */ + ,{ 48, 48, 6, acFontD48x64[3] } /* code 0033 '3' */ + ,{ 48, 48, 6, acFontD48x64[4] } /* code 0034 '4' */ + ,{ 48, 48, 6, acFontD48x64[5] } /* code 0035 '5' */ + ,{ 48, 48, 6, acFontD48x64[6] } /* code 0036 '6' */ + ,{ 48, 48, 6, acFontD48x64[7] } /* code 0037 '7' */ + ,{ 48, 48, 6, acFontD48x64[8] } /* code 0038 '8' */ + ,{ 48, 48, 6, acFontD48x64[9] } /* code 0039 '9' */ + ,{ 48, 48, 6, acFontD48x64[14] } /* code 003A ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48x64_Prop4 = { + 0x0030 /* first character */ + ,0x003A /* last character */ + ,&GUI_FontD48x64_CharInfo[ 4] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48x64_Prop3 = { + 0x002D /* first character */ + ,0x002E /* last character */ + ,&GUI_FontD48x64_CharInfo[ 2] /* address of first character */ + ,&GUI_FontD48x64_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48x64_Prop2 = { + 0x002B /* first character */ + ,0x002B /* last character */ + ,&GUI_FontD48x64_CharInfo[ 1] /* address of first character */ + ,&GUI_FontD48x64_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD48x64_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&GUI_FontD48x64_CharInfo[ 0] /* address of first character */ + ,&GUI_FontD48x64_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD48x64 = { + GUI_FONTTYPE_PROP /* type of font */ + ,64 /* height of font */ + ,64 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontD48x64_Prop1} + ,64 /* Baseline */ + ,0 /* LHeight */ + ,64 /* CHeight */ +}; + diff --git a/User/system/lib/lcd/gui/Font/FD60x80.c b/User/system/lib/lcd/gui/Font/FD60x80.c new file mode 100644 index 0000000..61ef002 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD60x80.c @@ -0,0 +1,1313 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD80.C +Purpose : Implementation of the non-proportional 61 by 80 pixel digit font +Height : 80 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontD60x80[15][640] = { +{ + ________,________,________,__XXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,___XXXXX,XXXXXXXX,XXX_____,__XXXXXX,XXXXXXXX,XX______,________, + ________,__XXXXXX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXX_____,__XXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,XX______,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXX_____,________,________,________}, + +{ + ________,________,________,_____XXX,XXXXXXX_,________,________,________, + ________,________,________,_____XXX,XXXXXXX_,________,________,________, + ________,________,________,_____XXX,XXXXXXX_,________,________,________, + ________,________,________,____XXXX,XXXXXXX_,________,________,________, + ________,________,________,____XXXX,XXXXXXX_,________,________,________, + ________,________,________,___XXXXX,XXXXXXX_,________,________,________, + ________,________,________,___XXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,_______X,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________}, + +{ + ________,________,________,___XXXXX,XXXXX___,________,________,________, + ________,________,_______X,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,X_______,______XX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXX__,________,________,_XXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXX__,________,________,_XXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXX_,________, + ________,________,________,________,________,_XXXXXXX,XXXXXXX_,________, + ________,________,________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,______XX,XXXXXXXX,XXXXX___,________, + ________,________,________,________,_____XXX,XXXXXXXX,XXXX____,________, + ________,________,________,________,____XXXX,XXXXXXXX,XXXX____,________, + ________,________,________,________,___XXXXX,XXXXXXXX,XXX_____,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,XX______,________, + ________,________,________,________,_XXXXXXX,XXXXXXXX,X_______,________, + ________,________,________,_______X,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,______XX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,________,____XXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,________,___XXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,________,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,_______X,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXX___,________,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXX____,________,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XX______,________,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,X_______,________,________,________, + ________,______XX,XXXXXXXX,XXXXXXX_,________,________,________,________, + ________,_____XXX,XXXXXXXX,XXXXXX__,________,________,________,________, + ________,____XXXX,XXXXXXXX,XXXX____,________,________,________,________, + ________,___XXXXX,XXXXXXXX,XXX_____,________,________,________,________, + ________,__XXXXXX,XXXXXXXX,XX______,________,________,________,________, + ________,__XXXXXX,XXXXXXXX,X_______,________,________,________,________, + ________,_XXXXXXX,XXXXXXXX,________,________,________,________,________, + ________,XXXXXXXX,XXXXXXX_,________,________,________,________,________, + ________,XXXXXXXX,XXXXXX__,________,________,________,________,________, + _______X,XXXXXXXX,XXXXX___,________,________,________,________,________, + _______X,XXXXXXXX,XXXX____,________,________,________,________,________, + ______XX,XXXXXXXX,XXXX____,________,________,________,________,________, + ______XX,XXXXXXXX,XXX_____,________,________,________,________,________, + ______XX,XXXXXXXX,XXX_____,________,________,________,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______}, + +{ + ________,________,________,__XXXXXX,XXXX____,________,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,XX______,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,__XXXXXX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXXX,X_______,_____XXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXX__,________, + _____XXX,XXXXXXXX,XX______,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,________,________,XXXXXXXX,XXXXX___,________, + ________,________,________,________,_______X,XXXXXXXX,XXXXX___,________, + ________,________,________,________,______XX,XXXXXXXX,XXXX____,________, + ________,________,________,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,________,________,________,___XXXXX,XXXXXXXX,XXX_____,________, + ________,________,________,________,XXXXXXXX,XXXXXXXX,XX______,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,______XX,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,________,XXXXXXXX,XXXXXXX_,________, + ________,________,________,________,________,_XXXXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXXX,________, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,_____XXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______,________,________,_____XXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,________,XXXXXXXX,XXXX____,________,________,________}, + +{ + ________,________,________,________,_____XXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,___XXXXX,XXXXXXXX,________,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,________,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,________,________, + ________,________,________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,________,________,________,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_______X,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_______X,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,______XX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,____XXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,___XXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,___XXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,XXXXXXXX,XXX_XXXX,XXXXXXXX,________,________, + ________,________,________,XXXXXXXX,XX__XXXX,XXXXXXXX,________,________, + ________,________,_______X,XXXXXXXX,XX__XXXX,XXXXXXXX,________,________, + ________,________,______XX,XXXXXXXX,X___XXXX,XXXXXXXX,________,________, + ________,________,______XX,XXXXXXXX,____XXXX,XXXXXXXX,________,________, + ________,________,_____XXX,XXXXXXX_,____XXXX,XXXXXXXX,________,________, + ________,________,____XXXX,XXXXXXX_,____XXXX,XXXXXXXX,________,________, + ________,________,___XXXXX,XXXXXX__,____XXXX,XXXXXXXX,________,________, + ________,________,___XXXXX,XXXXX___,____XXXX,XXXXXXXX,________,________, + ________,________,__XXXXXX,XXXXX___,____XXXX,XXXXXXXX,________,________, + ________,________,_XXXXXXX,XXXX____,____XXXX,XXXXXXXX,________,________, + ________,________,_XXXXXXX,XXX_____,____XXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXX_____,____XXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XX______,____XXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,________,________, + ________,_____XXX,XXXXXXXX,________,____XXXX,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXX_,________,____XXXX,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXX_,________,____XXXX,XXXXXXXX,________,________, + ________,___XXXXX,XXXXXX__,________,____XXXX,XXXXXXXX,________,________, + ________,__XXXXXX,XXXXX___,________,____XXXX,XXXXXXXX,________,________, + ________,_XXXXXXX,XXXXX___,________,____XXXX,XXXXXXXX,________,________, + ________,_XXXXXXX,XXXX____,________,____XXXX,XXXXXXXX,________,________, + ________,XXXXXXXX,XXX_____,________,____XXXX,XXXXXXXX,________,________, + _______X,XXXXXXXX,XXX_____,________,____XXXX,XXXXXXXX,________,________, + _______X,XXXXXXXX,XX______,________,____XXXX,XXXXXXXX,________,________, + ______XX,XXXXXXXX,X_______,________,____XXXX,XXXXXXXX,________,________, + _____XXX,XXXXXXXX,X_______,________,____XXXX,XXXXXXXX,________,________, + _____XXX,XXXXXXXX,________,________,____XXXX,XXXXXXXX,________,________, + ____XXXX,XXXXXXX_,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXXX__,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXXX__,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________}, + +{ + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,________,________,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________,________,________, + ________,__XXXXXX,XXXXXX__,________,________,________,________,________, + ________,__XXXXXX,XXXXXX__,________,________,________,________,________, + ________,__XXXXXX,XXXXX___,________,________,________,________,________, + ________,__XXXXXX,XXXXX___,________,________,________,________,________, + ________,__XXXXXX,XXXXX___,________,________,________,________,________, + ________,_XXXXXXX,XXXXX___,________,________,________,________,________, + ________,_XXXXXXX,XXXXX___,________,________,________,________,________, + ________,_XXXXXXX,XXXX____,______XX,XXXXXX__,________,________,________, + ________,_XXXXXXX,XXXX____,__XXXXXX,XXXXXXXX,XX______,________,________, + ________,_XXXXXXX,XXXX____,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,XXXXXXXX,XXXX__XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,XXXXXXXX,XXXX_XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,XXXXXXXX,XXX_XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXX_,________,_____XXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,_____XXX,XXXXXXXX,X_______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______,________,________,_____XXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,_____XXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,________,______XX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________}, + +{ + ________,________,________,____XXXX,XXXXX___,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XX______,______XX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,X_______,_______X,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,________,________,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXX__,________,________,__XXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXX___,________,________,___XXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,____XXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXX_____,________,________,________,________,________, + _______X,XXXXXXXX,XXX_____,________,________,________,________,________, + ______XX,XXXXXXXX,XXX_____,________,________,________,________,________, + ______XX,XXXXXXXX,XX______,________,________,________,________,________, + ______XX,XXXXXXXX,XX______,________,________,________,________,________, + _____XXX,XXXXXXXX,XX______,________,________,________,________,________, + _____XXX,XXXXXXXX,XX______,________,________,________,________,________, + _____XXX,XXXXXXXX,XX______,______XX,XXXXXX__,________,________,________, + _____XXX,XXXXXXXX,X_______,__XXXXXX,XXXXXXXX,XX______,________,________, + _____XXX,XXXXXXXX,X_______,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + _____XXX,XXXXXXXX,X_____XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + _____XXX,XXXXXXXX,X____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ____XXXX,XXXXXXXX,X___XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ____XXXX,XXXXXXXX,X__XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ____XXXX,XXXXXXXX,X_XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,XXXXXX__,________, + ____XXXX,XXXXXXXX,XXXXXXXX,X_______,______XX,XXXXXXXX,XXXXXX__,________, + ____XXXX,XXXXXXXX,XXXXXXXX,________,_______X,XXXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXXXX,XXXXXX__,________,________,__XXXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXX__,________,________,_XXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXX_,________,________,XXXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXXX,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,X_______,______XX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,________,__XXXXXX,XXXXX___,________,________,________}, + +{ + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXX_,________, + ________,________,________,________,________,___XXXXX,XXXXXX__,________, + ________,________,________,________,________,__XXXXXX,XXXXXX__,________, + ________,________,________,________,________,_XXXXXXX,XXXXX___,________, + ________,________,________,________,________,XXXXXXXX,XXXX____,________, + ________,________,________,________,_______X,XXXXXXXX,XXX_____,________, + ________,________,________,________,______XX,XXXXXXXX,XX______,________, + ________,________,________,________,______XX,XXXXXXXX,XX______,________, + ________,________,________,________,_____XXX,XXXXXXXX,X_______,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,___XXXXX,XXXXXXX_,________,________, + ________,________,________,________,___XXXXX,XXXXXXX_,________,________, + ________,________,________,________,__XXXXXX,XXXXXX__,________,________, + ________,________,________,________,_XXXXXXX,XXXXX___,________,________, + ________,________,________,________,_XXXXXXX,XXXXX___,________,________, + ________,________,________,________,XXXXXXXX,XXXX____,________,________, + ________,________,________,_______X,XXXXXXXX,XXX_____,________,________, + ________,________,________,_______X,XXXXXXXX,XXX_____,________,________, + ________,________,________,______XX,XXXXXXXX,XX______,________,________, + ________,________,________,______XX,XXXXXXXX,XX______,________,________, + ________,________,________,_____XXX,XXXXXXXX,X_______,________,________, + ________,________,________,____XXXX,XXXXXXXX,X_______,________,________, + ________,________,________,____XXXX,XXXXXXXX,________,________,________, + ________,________,________,___XXXXX,XXXXXXXX,________,________,________, + ________,________,________,___XXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXXXXX__,________,________,________, + ________,________,________,_XXXXXXX,XXXXXX__,________,________,________, + ________,________,________,_XXXXXXX,XXXXX___,________,________,________, + ________,________,________,XXXXXXXX,XXXXX___,________,________,________, + ________,________,________,XXXXXXXX,XXXX____,________,________,________, + ________,________,_______X,XXXXXXXX,XXXX____,________,________,________, + ________,________,_______X,XXXXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XX______,________,________,________, + ________,________,_____XXX,XXXXXXXX,XX______,________,________,________, + ________,________,_____XXX,XXXXXXXX,X_______,________,________,________, + ________,________,____XXXX,XXXXXXXX,X_______,________,________,________, + ________,________,____XXXX,XXXXXXXX,X_______,________,________,________, + ________,________,____XXXX,XXXXXXXX,X_______,________,________,________, + ________,________,___XXXXX,XXXXXXXX,________,________,________,________, + ________,________,___XXXXX,XXXXXXXX,________,________,________,________, + ________,________,___XXXXX,XXXXXXXX,________,________,________,________, + ________,________,__XXXXXX,XXXXXXX_,________,________,________,________, + ________,________,__XXXXXX,XXXXXXX_,________,________,________,________, + ________,________,__XXXXXX,XXXXXXX_,________,________,________,________, + ________,________,_XXXXXXX,XXXXXXX_,________,________,________,________, + ________,________,_XXXXXXX,XXXXXX__,________,________,________,________, + ________,________,_XXXXXXX,XXXXXX__,________,________,________,________, + ________,________,_XXXXXXX,XXXXXX__,________,________,________,________, + ________,________,XXXXXXXX,XXXXXX__,________,________,________,________, + ________,________,XXXXXXXX,XXXXXX__,________,________,________,________, + ________,________,XXXXXXXX,XXXXX___,________,________,________,________, + ________,________,XXXXXXXX,XXXXX___,________,________,________,________, + ________,________,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXX____,________,________,________,________, + ________,_______X,XXXXXXXX,XXXX____,________,________,________,________, + ________,_______X,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________}, + +{ + ________,________,________,_XXXXXXX,XXXXX___,________,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXXX,X_______,_____XXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXX_,________,_______X,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXX__,________,________,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXX___,________,________,_XXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXX__,________,________,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXX_,________,_______X,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,X_______,_____XXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________}, + +{ + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXXX,XX______,__XXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXX__,________,______XX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXX___,________,_______X,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXX____,________,________,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXX___,________,_______X,XXXXXXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,XX______,__XXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX_XXX,XXXXXXXX,XX______, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX__XXX,XXXXXXXX,XX______, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX___XXX,XXXXXXXX,X_______, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X____XXX,XXXXXXXX,X_______, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,_____XXX,XXXXXXXX,X_______, + ________,________,__XXXXXX,XXXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,X_______, + ________,________,____XXXX,XXXXXXXX,XXXX____,_____XXX,XXXXXXXX,X_______, + ________,________,________,XXXXXXXX,X_______,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXX_,________, + ________,________,________,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,X_______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XX______,________,________,_XXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXX_____,________,________,_XXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXX_____,________,________,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXX____,________,_______X,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXX___,________,______XX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXX__,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,XXXXXXXX,XXXXXXX_,________,____XXXX,XXXXXXXX,XX______,________, + ________,XXXXXXXX,XXXXXXXX,XX______,_XXXXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXX__,________,________,________, + ________,________,________,XXXXXXXX,XX______,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,________,________,________,________,________} +}; + + +GUI_CONST_STORAGE GUI_CHARINFO GUI_FontD60x80_CharInfo[15] = { + { 60, 60, 8, acFontD60x80[12] } /* code 0020 ' ' */ + ,{ 60, 60, 8, acFontD60x80[10] } /* code 002B '+' */ + ,{ 60, 60, 8, acFontD60x80[11] } /* code 002D '-' */ + ,{ 60, 60, 8, acFontD60x80[13] } /* code 002E '.' */ + ,{ 60, 60, 8, acFontD60x80[0] } /* code 0030 '0' */ + ,{ 60, 60, 8, acFontD60x80[1] } /* code 0031 '1' */ + ,{ 60, 60, 8, acFontD60x80[2] } /* code 0032 '2' */ + ,{ 60, 60, 8, acFontD60x80[3] } /* code 0033 '3' */ + ,{ 60, 60, 8, acFontD60x80[4] } /* code 0034 '4' */ + ,{ 60, 60, 8, acFontD60x80[5] } /* code 0035 '5' */ + ,{ 60, 60, 8, acFontD60x80[6] } /* code 0036 '6' */ + ,{ 60, 60, 8, acFontD60x80[7] } /* code 0037 '7' */ + ,{ 60, 60, 8, acFontD60x80[8] } /* code 0038 '8' */ + ,{ 60, 60, 8, acFontD60x80[9] } /* code 0039 '9' */ + ,{ 60, 60, 8, acFontD60x80[14] } /* code 003A ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD60x80_Prop4 = { + 0x0030 /* first character */ + ,0x003A /* last character */ + ,&GUI_FontD60x80_CharInfo[ 4] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD60x80_Prop3 = { + 0x002D /* first character */ + ,0x002E /* last character */ + ,&GUI_FontD60x80_CharInfo[ 2] /* address of first character */ + ,&GUI_FontD60x80_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD60x80_Prop2 = { + 0x002B /* first character */ + ,0x002B /* last character */ + ,&GUI_FontD60x80_CharInfo[ 1] /* address of first character */ + ,&GUI_FontD60x80_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD60x80_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&GUI_FontD60x80_CharInfo[ 0] /* address of first character */ + ,&GUI_FontD60x80_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD60x80 = { + GUI_FONTTYPE_PROP /* type of font */ + ,80 /* height of font */ + ,80 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontD60x80_Prop1} + ,80 /* Baseline */ + ,0 /* LHeight */ + ,80 /* CHeight */ +}; + diff --git a/User/system/lib/lcd/gui/Font/FD64.c b/User/system/lib/lcd/gui/Font/FD64.c new file mode 100644 index 0000000..93587c1 --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD64.c @@ -0,0 +1,1073 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD64.C +Purpose : Implementation of the proportional 64 pixel digit +Height : 64 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontD64[12][384] = { +{ + ________,________,____XXXX,XXXXX___,________,________, + ________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXX___,____XXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXX____,_____XXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + _______X,XXXXXXXX,X_______,________,XXXXXXXX,XX______, + ______XX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXX___,________,________,____XXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXX___,________,________,____XXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,X_______,________,XXXXXXXX,XX______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXX____,_____XXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XX______,________, + ________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,________,____XXXX,XXXXX___,________,________}, + +{ + ________,________,_______X,XXXXXXX_,________,________, + ________,________,_______X,XXXXXXX_,________,________, + ________,________,_______X,XXXXXXX_,________,________, + ________,________,______XX,XXXXXXX_,________,________, + ________,________,______XX,XXXXXXX_,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,___XXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXXX,XXXXXXX_,________,________, + ________,___XXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXXX_,________,________}, + +{ + ________,________,_____XXX,XXXXXX__,________,________, + ________,________,__XXXXXX,XXXXXXXX,XX______,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXX____,_______X,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XXX_____,________,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XX______,________,_XXXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,XXXXXXXX,XXX_____, + ________,________,________,_______X,XXXXXXXX,XX______, + ________,________,________,______XX,XXXXXXXX,XX______, + ________,________,________,_____XXX,XXXXXXXX,X_______, + ________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,___XXXXX,XXXXXXX_,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________, + ________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,_______X,XXXXXXXX,XXXXX___,________, + ________,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,________,____XXXX,XXXXXXXX,XX______,________, + ________,________,___XXXXX,XXXXXXXX,X_______,________, + ________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXXXXX__,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________, + ________,____XXXX,XXXXXXXX,XX______,________,________, + ________,___XXXXX,XXXXXXXX,X_______,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________, + ________,__XXXXXX,XXXXXX__,________,________,________, + ________,_XXXXXXX,XXXXX___,________,________,________, + ________,XXXXXXXX,XXXX____,________,________,________, + ________,XXXXXXXX,XXX_____,________,________,________, + _______X,XXXXXXXX,XX______,________,________,________, + _______X,XXXXXXXX,X_______,________,________,________, + ______XX,XXXXXXXX,________,________,________,________, + ______XX,XXXXXXXX,________,________,________,________, + _____XXX,XXXXXXXX,________,________,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___}, + +{ + ________,________,____XXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXX_____,______XX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXX_____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,XXXXXXXX,XX______, + ________,________,________,________,XXXXXXXX,XX______, + ________,________,________,______XX,XXXXXXXX,X_______, + ________,________,________,_____XXX,XXXXXXXX,X_______, + ________,________,________,__XXXXXX,XXXXXXX_,________, + ________,________,____XXXX,XXXXXXXX,XXXXXX__,________, + ________,________,____XXXX,XXXXXXXX,XXXX____,________, + ________,________,____XXXX,XXXXXXXX,XXXX____,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXX_,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,____XXXX,XXXXXXXX,XXX_____, + ________,________,________,_______X,XXXXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXXX___, + ________,________,________,________,__XXXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + _____XXX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXXX____, + ______XX,XXXXXXXX,XX______,_______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,X_______,________, + ________,________,___XXXXX,XXXXX___,________,________}, + +{ + ________,________,________,______XX,XXXXXX__,________, + ________,________,________,______XX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,____XXXX,XXXXXX__,________, + ________,________,________,___XXXXX,XXXXXX__,________, + ________,________,________,___XXXXX,XXXXXX__,________, + ________,________,________,__XXXXXX,XXXXXX__,________, + ________,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,________,______XX,XXXXXXXX,XXXXXX__,________, + ________,________,_____XXX,XXXXXXXX,XXXXXX__,________, + ________,________,_____XXX,XXXXXXXX,XXXXXX__,________, + ________,________,____XXXX,XXXX_XXX,XXXXXX__,________, + ________,________,___XXXXX,XXXX_XXX,XXXXXX__,________, + ________,________,___XXXXX,XXX__XXX,XXXXXX__,________, + ________,________,__XXXXXX,XX___XXX,XXXXXX__,________, + ________,________,_XXXXXXX,XX___XXX,XXXXXX__,________, + ________,________,XXXXXXXX,X____XXX,XXXXXX__,________, + ________,________,XXXXXXXX,_____XXX,XXXXXX__,________, + ________,_______X,XXXXXXX_,_____XXX,XXXXXX__,________, + ________,______XX,XXXXXXX_,_____XXX,XXXXXX__,________, + ________,_____XXX,XXXXXX__,_____XXX,XXXXXX__,________, + ________,_____XXX,XXXXX___,_____XXX,XXXXXX__,________, + ________,____XXXX,XXXXX___,_____XXX,XXXXXX__,________, + ________,___XXXXX,XXXX____,_____XXX,XXXXXX__,________, + ________,__XXXXXX,XXX_____,_____XXX,XXXXXX__,________, + ________,__XXXXXX,XXX_____,_____XXX,XXXXXX__,________, + ________,_XXXXXXX,XX______,_____XXX,XXXXXX__,________, + ________,XXXXXXXX,X_______,_____XXX,XXXXXX__,________, + ________,XXXXXXXX,________,_____XXX,XXXXXX__,________, + _______X,XXXXXXXX,________,_____XXX,XXXXXX__,________, + ______XX,XXXXXXX_,________,_____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________,_____XXX,XXXXXX__,________, + _____XXX,XXXXXX__,________,_____XXX,XXXXXX__,________, + ____XXXX,XXXXX___,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXXX____,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXXX____,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXX_____,________,_____XXX,XXXXXX__,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,_____XXX,XXXXXX__,________}, + +{ + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____, + ________,_XXXXXXX,XX______,________,________,________, + ________,_XXXXXXX,XX______,________,________,________, + ________,_XXXXXXX,XX______,________,________,________, + ________,_XXXXXXX,XX______,________,________,________, + ________,XXXXXXXX,XX______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + ________,XXXXXXXX,X_______,________,________,________, + _______X,XXXXXXXX,X_______,________,________,________, + _______X,XXXXXXXX,________,________,________,________, + _______X,XXXXXXXX,________,________,________,________, + _______X,XXXXXXXX,_______X,XXXXXXX_,________,________, + _______X,XXXXXXXX,____XXXX,XXXXXXXX,XX______,________, + ______XX,XXXXXXX_,__XXXXXX,XXXXXXXX,XXXX____,________, + ______XX,XXXXXXX_,_XXXXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXXX____,____XXXX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XX______,______XX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,________,________,XXXXXXXX,XXXX____, + _____XXX,XXXXXXX_,________,________,_XXXXXXX,XXXX____, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ________,________,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXX____, + _____XXX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,X_______,________, + ________,________,____XXXX,XXXXX___,________,________}, + +{ + ________,________,______XX,XXXXXXX_,________,________, + ________,________,__XXXXXX,XXXXXXXX,XX______,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,__XXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXX___,_______X,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XXX_____,________,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XX______,________,_XXXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + _______X,XXXXXXXX,X_______,________,__XXXXXX,XXXX____, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,________,___XX___, + _____XXX,XXXXXXX_,________,________,________,________, + _____XXX,XXXXXXX_,________,________,________,________, + _____XXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,________,________,________,________, + ____XXXX,XXXXXX__,_______X,XXXXXXX_,________,________, + ____XXXX,XXXXXX__,____XXXX,XXXXXXXX,XX______,________, + ___XXXXX,XXXXX___,__XXXXXX,XXXXXXXX,XXXX____,________, + ___XXXXX,XXXXX___,_XXXXXXX,XXXXXXXX,XXXXXX__,________, + ___XXXXX,XXXXX__X,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ___XXXXX,XXXXX__X,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ___XXXXX,XXXXX_XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XXX_____, + ___XXXXX,XXXXXXXX,XXX_____,_______X,XXXXXXXX,XXX_____, + ___XXXXX,XXXXXXXX,XX______,________,XXXXXXXX,XXXX____, + ___XXXXX,XXXXXXXX,X_______,________,_XXXXXXX,XXXX____, + ___XXXXX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ___XXXXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,____XXXX,XXXXXX__, + _____XXX,XXXXXXX_,________,________,____XXXX,XXXXXX__, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + _____XXX,XXXXXXX_,________,________,___XXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ______XX,XXXXXXXX,________,________,__XXXXXX,XXXXX___, + ______XX,XXXXXXXX,X_______,________,_XXXXXXX,XXXX____, + _______X,XXXXXXXX,XX______,________,XXXXXXXX,XXXX____, + _______X,XXXXXXXX,XXX_____,_______X,XXXXXXXX,XXX_____, + ________,XXXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,________,_XXXXXXX,XXXXXXXX,XX______,________, + ________,________,_____XXX,XXXXXX__,________,________}, + +{ + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,_XXXXXXX,XXX_____, + ________,________,________,________,_XXXXXXX,XX______, + ________,________,________,________,XXXXXXXX,X_______, + ________,________,________,_______X,XXXXXXXX,________, + ________,________,________,______XX,XXXXXXXX,________, + ________,________,________,_____XXX,XXXXXXX_,________, + ________,________,________,_____XXX,XXXXXX__,________, + ________,________,________,____XXXX,XXXXX___,________, + ________,________,________,___XXXXX,XXXXX___,________, + ________,________,________,__XXXXXX,XXXX____,________, + ________,________,________,__XXXXXX,XXX_____,________, + ________,________,________,_XXXXXXX,XXX_____,________, + ________,________,________,XXXXXXXX,XX______,________, + ________,________,________,XXXXXXXX,X_______,________, + ________,________,_______X,XXXXXXXX,X_______,________, + ________,________,_______X,XXXXXXXX,________,________, + ________,________,______XX,XXXXXXXX,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,_____XXX,XXXXXXX_,________,________, + ________,________,____XXXX,XXXXXX__,________,________, + ________,________,____XXXX,XXXXXX__,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXX____,________,________, + ________,________,__XXXXXX,XXXX____,________,________, + ________,________,__XXXXXX,XXXX____,________,________, + ________,________,_XXXXXXX,XXX_____,________,________, + ________,________,_XXXXXXX,XXX_____,________,________, + ________,________,XXXXXXXX,XX______,________,________, + ________,________,XXXXXXXX,XX______,________,________, + ________,________,XXXXXXXX,XX______,________,________, + ________,_______X,XXXXXXXX,XX______,________,________, + ________,_______X,XXXXXXXX,X_______,________,________, + ________,_______X,XXXXXXXX,X_______,________,________, + ________,______XX,XXXXXXXX,X_______,________,________, + ________,______XX,XXXXXXXX,________,________,________, + ________,______XX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXXX,________,________,________, + ________,_____XXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________, + ________,____XXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________}, + +{ + ________,________,____XXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____,______XX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XX______,_______X,XXXXXXXX,XX______, + _______X,XXXXXXXX,X_______,________,XXXXXXXX,XX______, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXXX,________,________,_XXXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + ______XX,XXXXXXX_,________,________,__XXXXXX,XXX_____, + _______X,XXXXXXX_,________,________,__XXXXXX,XX______, + _______X,XXXXXXXX,________,________,_XXXXXXX,XX______, + _______X,XXXXXXXX,________,________,_XXXXXXX,XX______, + ________,XXXXXXXX,X_______,________,XXXXXXXX,X_______, + ________,XXXXXXXX,XX______,_______X,XXXXXXXX,X_______, + ________,_XXXXXXX,XXX_____,______XX,XXXXXXXX,________, + ________,__XXXXXX,XXXXX___,____XXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXX_____, + _____XXX,XXXXXXXX,XX______,_______X,XXXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXXX____, + ____XXXX,XXXXXXXX,________,________,_XXXXXXX,XXXXX___, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXX__, + ___XXXXX,XXXXXX__,________,________,___XXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXX__,________,________,___XXXXX,XXXXX___, + ____XXXX,XXXXXXX_,________,________,__XXXXXX,XXXXX___, + _____XXX,XXXXXXXX,________,________,_XXXXXXX,XXXX____, + _____XXX,XXXXXXXX,X_______,________,XXXXXXXX,XXXX____, + ______XX,XXXXXXXX,XX______,_______X,XXXXXXXX,XXX_____, + ______XX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXX_____, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,________,XXXXXXXX,XXXXXXXX,X_______,________, + ________,________,____XXXX,XXXXX___,________,________}, + +{ + ________,________,___XXXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,X_______,_______X,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,________,________,XXXXXXXX,XXX_____, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXX_____, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXX_____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXX____, + ___XXXXX,XXXXX___,________,________,__XXXXXX,XXXX____, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXX___, + ___XXXXX,XXXXX___,________,________,___XXXXX,XXXXXX__, + ___XXXXX,XXXXXX__,________,________,__XXXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXXXX__, + ____XXXX,XXXXXX__,________,________,__XXXXXX,XXXXXX__, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXX__, + ____XXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,________,________,XXXXXXXX,XXXXXX__, + _____XXX,XXXXXXXX,X_______,_______X,XXXXXXXX,XXXXXX__, + ______XX,XXXXXXXX,XX______,_____XXX,XXXXXXXX,XXXXXX__, + ______XX,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,XXXXXX__, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_XXXX,XXXXXX__, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XX__XXXX,XXXXXX__, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XX__XXXX,XXXXXX__, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,____XXXX,XXXXXX__, + ________,_____XXX,XXXXXXXX,XXXXXXX_,____XXXX,XXXXX___, + ________,_______X,XXXXXXXX,XXXXX___,___XXXXX,XXXXX___, + ________,________,__XXXXXX,XX______,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXXX___, + ________,________,________,________,___XXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ________,________,________,________,__XXXXXX,XXXX____, + ____XX__,________,________,________,__XXXXXX,XXXX____, + ____XXXX,XXXXXX__,________,________,_XXXXXXX,XXX_____, + ____XXXX,XXXXXX__,________,________,_XXXXXXX,XXX_____, + _____XXX,XXXXXXX_,________,________,XXXXXXXX,XX______, + _____XXX,XXXXXXX_,________,________,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,________,_______X,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,______XX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,_____XXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_______X,XXXXXXXX,XXXXXXX_,________,________, + ________,________,__XXXXXX,XXX_____,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,____XXXX,XXXXX___,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________, + ________,________,________,________,________,________} +}; + + +GUI_CONST_STORAGE unsigned char acFontD64_0020[192] = { /* code 0020 */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontD64_002E[192] = { /* code 002E */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontD64_003A[192] = { /* code 003A */ + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ________,________,________, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______, + ________,________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_FontD64_CharInfo[15] = { + { 24, 24, 3, acFontD64_0020 } /* code 0020 ' ' */ + ,{ 48, 48, 6, acFontD64[10] } /* code 002B '+' */ + ,{ 48, 48, 6, acFontD64[11] } /* code 002D '-' */ + ,{ 24, 24, 3, acFontD64_002E } /* code 002E '.' */ + ,{ 48, 48, 6, acFontD64[0] } /* code 0030 '0' */ + ,{ 48, 48, 6, acFontD64[1] } /* code 0031 '1' */ + ,{ 48, 48, 6, acFontD64[2] } /* code 0032 '2' */ + ,{ 48, 48, 6, acFontD64[3] } /* code 0033 '3' */ + ,{ 48, 48, 6, acFontD64[4] } /* code 0034 '4' */ + ,{ 48, 48, 6, acFontD64[5] } /* code 0035 '5' */ + ,{ 48, 48, 6, acFontD64[6] } /* code 0036 '6' */ + ,{ 48, 48, 6, acFontD64[7] } /* code 0037 '7' */ + ,{ 48, 48, 6, acFontD64[8] } /* code 0038 '8' */ + ,{ 48, 48, 6, acFontD64[9] } /* code 0039 '9' */ + ,{ 24, 24, 3, acFontD64_003A } /* code 003A ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD64_Prop4 = { + 0x0030 /* first character */ + ,0x003A /* last character */ + ,&GUI_FontD64_CharInfo[ 4] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD64_Prop3 = { + 0x002D /* first character */ + ,0x002E /* last character */ + ,&GUI_FontD64_CharInfo[ 2] /* address of first character */ + ,&GUI_FontD64_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD64_Prop2 = { + 0x002B /* first character */ + ,0x002B /* last character */ + ,&GUI_FontD64_CharInfo[ 1] /* address of first character */ + ,&GUI_FontD64_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD64_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&GUI_FontD64_CharInfo[ 0] /* address of first character */ + ,&GUI_FontD64_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD64 = { + GUI_FONTTYPE_PROP /* type of font */ + ,64 /* height of font */ + ,64 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontD64_Prop1} + ,64 /* Baseline */ + ,0 /* LHeight */ + ,64 /* CHeight */ +}; + diff --git a/User/system/lib/lcd/gui/Font/FD80.c b/User/system/lib/lcd/gui/Font/FD80.c new file mode 100644 index 0000000..b5a631d --- /dev/null +++ b/User/system/lib/lcd/gui/Font/FD80.c @@ -0,0 +1,1313 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FD80.C +Purpose : Implementation of the proportional 80 pixel digit +Height : 80 +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_FontIntern.h" + +GUI_CONST_STORAGE unsigned char acFontD80[12][640] = { +{ + ________,________,________,__XXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,___XXXXX,XXXXXXXX,XXX_____,__XXXXXX,XXXXXXXX,XX______,________, + ________,__XXXXXX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXX_____,__XXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,XX______,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXX_____,________,________,________}, + +{ + ________,________,________,_____XXX,XXXXXXX_,________,________,________, + ________,________,________,_____XXX,XXXXXXX_,________,________,________, + ________,________,________,_____XXX,XXXXXXX_,________,________,________, + ________,________,________,____XXXX,XXXXXXX_,________,________,________, + ________,________,________,____XXXX,XXXXXXX_,________,________,________, + ________,________,________,___XXXXX,XXXXXXX_,________,________,________, + ________,________,________,___XXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,_______X,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________, + ________,________,________,_XXXXXXX,XXXXXXX_,________,________,________}, + +{ + ________,________,________,___XXXXX,XXXXX___,________,________,________, + ________,________,_______X,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXXXXX,X_______,______XX,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXXXX,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,_XXXXXXX,XXXXXX__,________,________,_XXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXX__,________,________,_XXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXX_,________, + ________,________,________,________,________,_XXXXXXX,XXXXXXX_,________, + ________,________,________,________,________,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,______XX,XXXXXXXX,XXXXX___,________, + ________,________,________,________,_____XXX,XXXXXXXX,XXXX____,________, + ________,________,________,________,____XXXX,XXXXXXXX,XXXX____,________, + ________,________,________,________,___XXXXX,XXXXXXXX,XXX_____,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,XX______,________, + ________,________,________,________,_XXXXXXX,XXXXXXXX,X_______,________, + ________,________,________,_______X,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,______XX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,________,____XXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,________,___XXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,________,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,_______X,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXX_,________,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXX___,________,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXX____,________,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XX______,________,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,X_______,________,________,________, + ________,______XX,XXXXXXXX,XXXXXXX_,________,________,________,________, + ________,_____XXX,XXXXXXXX,XXXXXX__,________,________,________,________, + ________,____XXXX,XXXXXXXX,XXXX____,________,________,________,________, + ________,___XXXXX,XXXXXXXX,XXX_____,________,________,________,________, + ________,__XXXXXX,XXXXXXXX,XX______,________,________,________,________, + ________,__XXXXXX,XXXXXXXX,X_______,________,________,________,________, + ________,_XXXXXXX,XXXXXXXX,________,________,________,________,________, + ________,XXXXXXXX,XXXXXXX_,________,________,________,________,________, + ________,XXXXXXXX,XXXXXX__,________,________,________,________,________, + _______X,XXXXXXXX,XXXXX___,________,________,________,________,________, + _______X,XXXXXXXX,XXXX____,________,________,________,________,________, + ______XX,XXXXXXXX,XXXX____,________,________,________,________,________, + ______XX,XXXXXXXX,XXX_____,________,________,________,________,________, + ______XX,XXXXXXXX,XXX_____,________,________,________,________,________, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______}, + +{ + ________,________,________,__XXXXXX,XXXX____,________,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,XX______,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,__XXXXXX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXXX,X_______,_____XXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXX__,________, + _____XXX,XXXXXXXX,XX______,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,________,________,_XXXXXXX,XXXXXX__,________, + ________,________,________,________,________,XXXXXXXX,XXXXX___,________, + ________,________,________,________,_______X,XXXXXXXX,XXXXX___,________, + ________,________,________,________,______XX,XXXXXXXX,XXXX____,________, + ________,________,________,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,________,________,________,___XXXXX,XXXXXXXX,XXX_____,________, + ________,________,________,________,XXXXXXXX,XXXXXXXX,XX______,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,______XX,XXXXXXXX,XXXXXX__,________, + ________,________,________,________,________,XXXXXXXX,XXXXXXX_,________, + ________,________,________,________,________,_XXXXXXX,XXXXXXXX,________, + ________,________,________,________,________,__XXXXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXXX,________, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,_____XXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______,________,________,_____XXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,________,XXXXXXXX,XXXX____,________,________,________}, + +{ + ________,________,________,________,_____XXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,___XXXXX,XXXXXXXX,________,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,________,________, + ________,________,________,________,__XXXXXX,XXXXXXXX,________,________, + ________,________,________,________,_XXXXXXX,XXXXXXXX,________,________, + ________,________,________,________,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_______X,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_______X,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,______XX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,____XXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,___XXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,___XXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,________,XXXXXXXX,XXX_XXXX,XXXXXXXX,________,________, + ________,________,________,XXXXXXXX,XX__XXXX,XXXXXXXX,________,________, + ________,________,_______X,XXXXXXXX,XX__XXXX,XXXXXXXX,________,________, + ________,________,______XX,XXXXXXXX,X___XXXX,XXXXXXXX,________,________, + ________,________,______XX,XXXXXXXX,____XXXX,XXXXXXXX,________,________, + ________,________,_____XXX,XXXXXXX_,____XXXX,XXXXXXXX,________,________, + ________,________,____XXXX,XXXXXXX_,____XXXX,XXXXXXXX,________,________, + ________,________,___XXXXX,XXXXXX__,____XXXX,XXXXXXXX,________,________, + ________,________,___XXXXX,XXXXX___,____XXXX,XXXXXXXX,________,________, + ________,________,__XXXXXX,XXXXX___,____XXXX,XXXXXXXX,________,________, + ________,________,_XXXXXXX,XXXX____,____XXXX,XXXXXXXX,________,________, + ________,________,_XXXXXXX,XXX_____,____XXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXX_____,____XXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XX______,____XXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,X_______,____XXXX,XXXXXXXX,________,________, + ________,_____XXX,XXXXXXXX,________,____XXXX,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXX_,________,____XXXX,XXXXXXXX,________,________, + ________,____XXXX,XXXXXXX_,________,____XXXX,XXXXXXXX,________,________, + ________,___XXXXX,XXXXXX__,________,____XXXX,XXXXXXXX,________,________, + ________,__XXXXXX,XXXXX___,________,____XXXX,XXXXXXXX,________,________, + ________,_XXXXXXX,XXXXX___,________,____XXXX,XXXXXXXX,________,________, + ________,_XXXXXXX,XXXX____,________,____XXXX,XXXXXXXX,________,________, + ________,XXXXXXXX,XXX_____,________,____XXXX,XXXXXXXX,________,________, + _______X,XXXXXXXX,XXX_____,________,____XXXX,XXXXXXXX,________,________, + _______X,XXXXXXXX,XX______,________,____XXXX,XXXXXXXX,________,________, + ______XX,XXXXXXXX,X_______,________,____XXXX,XXXXXXXX,________,________, + _____XXX,XXXXXXXX,X_______,________,____XXXX,XXXXXXXX,________,________, + _____XXX,XXXXXXXX,________,________,____XXXX,XXXXXXXX,________,________, + ____XXXX,XXXXXXX_,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXXX__,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXXX__,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXX___,________,________,____XXXX,XXXXXXXX,________,________, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________}, + +{ + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + ________,____XXXX,XXXXXXXX,________,________,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________,________,________, + ________,____XXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXXX_,________,________,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________,________,________, + ________,___XXXXX,XXXXXX__,________,________,________,________,________, + ________,__XXXXXX,XXXXXX__,________,________,________,________,________, + ________,__XXXXXX,XXXXXX__,________,________,________,________,________, + ________,__XXXXXX,XXXXX___,________,________,________,________,________, + ________,__XXXXXX,XXXXX___,________,________,________,________,________, + ________,__XXXXXX,XXXXX___,________,________,________,________,________, + ________,_XXXXXXX,XXXXX___,________,________,________,________,________, + ________,_XXXXXXX,XXXXX___,________,________,________,________,________, + ________,_XXXXXXX,XXXX____,______XX,XXXXXX__,________,________,________, + ________,_XXXXXXX,XXXX____,__XXXXXX,XXXXXXXX,XX______,________,________, + ________,_XXXXXXX,XXXX____,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,XXXXXXXX,XXXX__XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,XXXXXXXX,XXXX_XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,XXXXXXXX,XXX_XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXX_,________,_____XXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,_____XXX,XXXXXXXX,X_______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ________,________,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,X_______,________,________,_____XXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,_____XXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,____XXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,________,______XX,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________}, + +{ + ________,________,________,____XXXX,XXXXX___,________,________,________, + ________,________,________,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XXXXX___,____XXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XX______,______XX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,X_______,_______X,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,________,________,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXX__,________,________,__XXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXX___,________,________,___XXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXXX____,________,________,____XXXX,XXXXXXXX,________, + _______X,XXXXXXXX,XXX_____,________,________,________,________,________, + _______X,XXXXXXXX,XXX_____,________,________,________,________,________, + ______XX,XXXXXXXX,XXX_____,________,________,________,________,________, + ______XX,XXXXXXXX,XX______,________,________,________,________,________, + ______XX,XXXXXXXX,XX______,________,________,________,________,________, + _____XXX,XXXXXXXX,XX______,________,________,________,________,________, + _____XXX,XXXXXXXX,XX______,________,________,________,________,________, + _____XXX,XXXXXXXX,XX______,______XX,XXXXXX__,________,________,________, + _____XXX,XXXXXXXX,X_______,__XXXXXX,XXXXXXXX,XX______,________,________, + _____XXX,XXXXXXXX,X_______,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + _____XXX,XXXXXXXX,X_____XX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + _____XXX,XXXXXXXX,X____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ____XXXX,XXXXXXXX,X___XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ____XXXX,XXXXXXXX,X__XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ____XXXX,XXXXXXXX,X_XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,XXXXXX__,________, + ____XXXX,XXXXXXXX,XXXXXXXX,X_______,______XX,XXXXXXXX,XXXXXX__,________, + ____XXXX,XXXXXXXX,XXXXXXXX,________,_______X,XXXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXXXX,XXXXXXX_,________,________,_XXXXXXX,XXXXXXX_,________, + ____XXXX,XXXXXXXX,XXXXXX__,________,________,__XXXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XX______,________,________,_____XXX,XXXXXXXX,X_______, + ______XX,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXX_____,________,________,____XXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,X_______, + _______X,XXXXXXXX,XXXX____,________,________,___XXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXX___,________,________,__XXXXXX,XXXXXXXX,________, + ________,XXXXXXXX,XXXXXX__,________,________,_XXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXX_,________,________,XXXXXXXX,XXXXXXX_,________, + ________,_XXXXXXX,XXXXXXXX,________,_______X,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,X_______,______XX,XXXXXXXX,XXXXXX__,________, + ________,__XXXXXX,XXXXXXXX,XXXX____,___XXXXX,XXXXXXXX,XXXXX___,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,______XX,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,________,__XXXXXX,XXXXX___,________,________,________}, + +{ + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXX_,________, + ________,________,________,________,________,___XXXXX,XXXXXX__,________, + ________,________,________,________,________,__XXXXXX,XXXXXX__,________, + ________,________,________,________,________,_XXXXXXX,XXXXX___,________, + ________,________,________,________,________,XXXXXXXX,XXXX____,________, + ________,________,________,________,_______X,XXXXXXXX,XXX_____,________, + ________,________,________,________,______XX,XXXXXXXX,XX______,________, + ________,________,________,________,______XX,XXXXXXXX,XX______,________, + ________,________,________,________,_____XXX,XXXXXXXX,X_______,________, + ________,________,________,________,____XXXX,XXXXXXXX,________,________, + ________,________,________,________,___XXXXX,XXXXXXX_,________,________, + ________,________,________,________,___XXXXX,XXXXXXX_,________,________, + ________,________,________,________,__XXXXXX,XXXXXX__,________,________, + ________,________,________,________,_XXXXXXX,XXXXX___,________,________, + ________,________,________,________,_XXXXXXX,XXXXX___,________,________, + ________,________,________,________,XXXXXXXX,XXXX____,________,________, + ________,________,________,_______X,XXXXXXXX,XXX_____,________,________, + ________,________,________,_______X,XXXXXXXX,XXX_____,________,________, + ________,________,________,______XX,XXXXXXXX,XX______,________,________, + ________,________,________,______XX,XXXXXXXX,XX______,________,________, + ________,________,________,_____XXX,XXXXXXXX,X_______,________,________, + ________,________,________,____XXXX,XXXXXXXX,X_______,________,________, + ________,________,________,____XXXX,XXXXXXXX,________,________,________, + ________,________,________,___XXXXX,XXXXXXXX,________,________,________, + ________,________,________,___XXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXXXXXX_,________,________,________, + ________,________,________,__XXXXXX,XXXXXX__,________,________,________, + ________,________,________,_XXXXXXX,XXXXXX__,________,________,________, + ________,________,________,_XXXXXXX,XXXXX___,________,________,________, + ________,________,________,XXXXXXXX,XXXXX___,________,________,________, + ________,________,________,XXXXXXXX,XXXX____,________,________,________, + ________,________,_______X,XXXXXXXX,XXXX____,________,________,________, + ________,________,_______X,XXXXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XXX_____,________,________,________, + ________,________,______XX,XXXXXXXX,XX______,________,________,________, + ________,________,_____XXX,XXXXXXXX,XX______,________,________,________, + ________,________,_____XXX,XXXXXXXX,X_______,________,________,________, + ________,________,____XXXX,XXXXXXXX,X_______,________,________,________, + ________,________,____XXXX,XXXXXXXX,X_______,________,________,________, + ________,________,____XXXX,XXXXXXXX,X_______,________,________,________, + ________,________,___XXXXX,XXXXXXXX,________,________,________,________, + ________,________,___XXXXX,XXXXXXXX,________,________,________,________, + ________,________,___XXXXX,XXXXXXXX,________,________,________,________, + ________,________,__XXXXXX,XXXXXXX_,________,________,________,________, + ________,________,__XXXXXX,XXXXXXX_,________,________,________,________, + ________,________,__XXXXXX,XXXXXXX_,________,________,________,________, + ________,________,_XXXXXXX,XXXXXXX_,________,________,________,________, + ________,________,_XXXXXXX,XXXXXX__,________,________,________,________, + ________,________,_XXXXXXX,XXXXXX__,________,________,________,________, + ________,________,_XXXXXXX,XXXXXX__,________,________,________,________, + ________,________,XXXXXXXX,XXXXXX__,________,________,________,________, + ________,________,XXXXXXXX,XXXXXX__,________,________,________,________, + ________,________,XXXXXXXX,XXXXX___,________,________,________,________, + ________,________,XXXXXXXX,XXXXX___,________,________,________,________, + ________,________,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXXX___,________,________,________,________, + ________,_______X,XXXXXXXX,XXXX____,________,________,________,________, + ________,_______X,XXXXXXXX,XXXX____,________,________,________,________, + ________,_______X,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________, + ________,______XX,XXXXXXXX,XXXX____,________,________,________,________}, + +{ + ________,________,________,_XXXXXXX,XXXXX___,________,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,X_______,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,XXXX____,________, + ________,_XXXXXXX,XXXXXXXX,X_______,_____XXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXX_,________,_______X,XXXXXXXX,XXXXX___,________, + ________,XXXXXXXX,XXXXXX__,________,________,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXX___,________,________,_XXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXX____,________,________,__XXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXX___,________, + ________,__XXXXXX,XXXXX___,________,________,_XXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXX__,________,________,XXXXXXXX,XXXX____,________, + ________,___XXXXX,XXXXXXX_,________,_______X,XXXXXXXX,XXX_____,________, + ________,____XXXX,XXXXXXXX,X_______,_____XXX,XXXXXXXX,XX______,________, + ________,_____XXX,XXXXXXXX,XXX_____,___XXXXX,XXXXXXXX,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,___XXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ___XXXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ___XXXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,XX______, + ____XXXX,XXXXXXXX,________,________,________,_____XXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,________, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXX_,________, + ______XX,XXXXXXXX,XXXXXX__,________,_______X,XXXXXXXX,XXXXXXX_,________, + _______X,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXX__,________, + _______X,XXXXXXXX,XXXXXXXX,XX______,___XXXXX,XXXXXXXX,XXXXXX__,________, + ________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________}, + +{ + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,_____XXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,_______X,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX_____,________, + ________,_XXXXXXX,XXXXXXXX,XX______,__XXXXXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXXX____,________, + ________,XXXXXXXX,XXXXXX__,________,______XX,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXXX___,________,_______X,XXXXXXXX,XXXXX___,________, + _______X,XXXXXXXX,XXXX____,________,________,XXXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,________, + _____XXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,________, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,X_______,________,________,____XXXX,XXXXXXXX,X_______, + _____XXX,XXXXXXXX,X_______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XX______,________,________,___XXXXX,XXXXXXXX,XX______, + _____XXX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXX_____,________,________,__XXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXX____,________,________,_XXXXXXX,XXXXXXXX,XX______, + ______XX,XXXXXXXX,XXXXX___,________,________,XXXXXXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXX___,________,_______X,XXXXXXXX,XXXXXXXX,XX______, + _______X,XXXXXXXX,XXXXXXX_,________,______XX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,________,_____XXX,XXXXXXXX,XXXXXXXX,XX______, + ________,XXXXXXXX,XXXXXXXX,XX______,__XXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX_XXX,XXXXXXXX,XX______, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXX__XXX,XXXXXXXX,XX______, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX___XXX,XXXXXXXX,X_______, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X____XXX,XXXXXXXX,X_______, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,_____XXX,XXXXXXXX,X_______, + ________,________,__XXXXXX,XXXXXXXX,XXXXXX__,_____XXX,XXXXXXXX,X_______, + ________,________,____XXXX,XXXXXXXX,XXXX____,_____XXX,XXXXXXXX,X_______, + ________,________,________,XXXXXXXX,X_______,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,X_______, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,____XXXX,XXXXXXXX,________, + ________,________,________,________,________,___XXXXX,XXXXXXX_,________, + ________,________,________,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,X_______,________,________,___XXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXXX_,________, + _____XXX,XXXXXXXX,XX______,________,________,__XXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XX______,________,________,_XXXXXXX,XXXXXX__,________, + ______XX,XXXXXXXX,XXX_____,________,________,_XXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXX_____,________,________,XXXXXXXX,XXXXX___,________, + ______XX,XXXXXXXX,XXXX____,________,_______X,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXX___,________,______XX,XXXXXXXX,XXXX____,________, + _______X,XXXXXXXX,XXXXXX__,________,_____XXX,XXXXXXXX,XXX_____,________, + ________,XXXXXXXX,XXXXXXX_,________,____XXXX,XXXXXXXX,XX______,________, + ________,XXXXXXXX,XXXXXXXX,XX______,_XXXXXXX,XXXXXXXX,XX______,________, + ________,_XXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______,________, + ________,__XXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,________,________, + ________,___XXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXX_,________,________, + ________,____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXX__,________,________, + ________,_____XXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXX___,________,________, + ________,______XX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXX____,________,________, + ________,________,XXXXXXXX,XXXXXXXX,XXXXXXXX,XX______,________,________, + ________,________,__XXXXXX,XXXXXXXX,XXXXXXXX,________,________,________, + ________,________,____XXXX,XXXXXXXX,XXXXXX__,________,________,________, + ________,________,________,XXXXXXXX,XX______,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,_XXXXXXX,XXXX____,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________}, + +{ + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ____XXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,XXXXXXXX,X_______, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________, + ________,________,________,________,________,________,________,________} +}; + +GUI_CONST_STORAGE unsigned char acFontD80_0020[320] = { /* code 0020 */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________}; + +GUI_CONST_STORAGE unsigned char acFontD80_002E[320] = { /* code 002E */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,________,________,________}; + + +GUI_CONST_STORAGE unsigned char acFontD80_003A[320] = { /* code 003A */ + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,________,________,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,XXXXXXXX,XXXXXXX_,________, + ________,________,________,________}; + +GUI_CONST_STORAGE GUI_CHARINFO GUI_FontD80_CharInfo[15] = { + { 31, 31, 4, acFontD80_0020 } /* code 0020 ' ' */ + ,{ 61, 61, 8, acFontD80[10] } /* code 002B '+' */ + ,{ 61, 61, 8, acFontD80[11] } /* code 002D '-' */ + ,{ 31, 31, 4, acFontD80_002E } /* code 002E '.' */ + ,{ 61, 61, 8, acFontD80[0] } /* code 0030 '0' */ + ,{ 61, 61, 8, acFontD80[1] } /* code 0031 '1' */ + ,{ 61, 61, 8, acFontD80[2] } /* code 0032 '2' */ + ,{ 61, 61, 8, acFontD80[3] } /* code 0033 '3' */ + ,{ 61, 61, 8, acFontD80[4] } /* code 0034 '4' */ + ,{ 61, 61, 8, acFontD80[5] } /* code 0035 '5' */ + ,{ 61, 61, 8, acFontD80[6] } /* code 0036 '6' */ + ,{ 61, 61, 8, acFontD80[7] } /* code 0037 '7' */ + ,{ 61, 61, 8, acFontD80[8] } /* code 0038 '8' */ + ,{ 61, 61, 8, acFontD80[9] } /* code 0039 '9' */ + ,{ 31, 31, 4, acFontD80_003A } /* code 003A ':' */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD80_Prop4 = { + 0x0030 /* first character */ + ,0x003A /* last character */ + ,&GUI_FontD80_CharInfo[ 4] /* address of first character */ + ,(GUI_CONST_STORAGE GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD80_Prop3 = { + 0x002D /* first character */ + ,0x002E /* last character */ + ,&GUI_FontD80_CharInfo[ 2] /* address of first character */ + ,&GUI_FontD80_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD80_Prop2 = { + 0x002B /* first character */ + ,0x002B /* last character */ + ,&GUI_FontD80_CharInfo[ 1] /* address of first character */ + ,&GUI_FontD80_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontD80_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&GUI_FontD80_CharInfo[ 0] /* address of first character */ + ,&GUI_FontD80_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +GUI_CONST_STORAGE GUI_FONT GUI_FontD80 = { + GUI_FONTTYPE_PROP /* type of font */ + ,80 /* height of font */ + ,80 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&GUI_FontD80_Prop1} + ,80 /* Baseline */ + ,0 /* LHeight */ + ,80 /* CHeight */ +}; + diff --git a/User/system/lib/lcd/gui/Font/vssver.scc b/User/system/lib/lcd/gui/Font/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..a6e79e90767925f265870c70439ca49ca5ec6b95 GIT binary patch literal 848 zcmX}nNi5u99LDhxG)|~S#Kk^ZW0`48O!dBDR<&mDFj1SVL7pLTXJU zbFjqHOAm%{5Uo^;5{w89tu(Ycj7S`K+T{7amp7l^H*bD<VYF@1 zGXBD}pc$KYvljh7?zkO{{?DdoHax8`@qpF!gYs(2bk{$7!a>HmR@w{Jdc5nQz2ON< zXDRIi|J~IV(PDV4J~xK;g)2Y(($aTfM?>))`W|f9Qw-C7@bmS|URnZADe|3Zf4K2> z!4EnBZm80y(SdNd`67Z2f>-WhpDszZrKsH(GhTew?_ESL-;yp zu!;Q<{8lMjrX%4Uoiv$N!m6XWLOKf8i{^E7G<@PW8Iq%+lVD5b uZwZ|Y-%{Id&?#`=fUc2Fh0pD0UFbB}*uF39PluyVOo8kfu(;D9kG=uA@)AJ+ literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/GUIDemo/CCGUIDemo.bat b/User/system/lib/lcd/gui/GUIDemo/CCGUIDemo.bat new file mode 100644 index 0000000..911bed9 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/CCGUIDemo.bat @@ -0,0 +1,26 @@ +REM **************************************** +REM Compile GUIDemo modules +REM **************************************** + +CALL CC GUIDEMO +CALL CC GUIDEMO_Automotive +CALL CC GUIDEMO_Bitmap +CALL CC GUIDEMO_Bitmap4bpp +CALL CC GUIDEMO_Circle +CALL CC GUIDEMO_ColorBar +CALL CC GUIDEMO_ColorList +CALL CC GUIDEMO_Cursor +CALL CC GUIDEMO_Dialog +CALL CC GUIDEMO_Font +CALL CC GUIDEMO_FrameWin +CALL CC GUIDEMO_Graph +CALL CC GUIDEMO_HardwareInfo +CALL CC GUIDEMO_Intro +CALL CC GUIDEMO_LUT +CALL CC GUIDEMO_MemDevB +CALL CC GUIDEMO_Navi +CALL CC GUIDEMO_Polygon +CALL CC GUIDEMO_ProgBar +CALL CC GUIDEMO_Speed +CALL CC GUIDEMO_Touch +CALL CC SeggerLogoBlue diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO.c new file mode 100644 index 0000000..a381829 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO.c @@ -0,0 +1,444 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO.c +Purpose : Several GUIDEMO routines +---------------------------------------------------------------------- +*/ + +#include +#include "GUI.h" +#if GUI_WINSUPPORT + #include "PROGBAR.h" + #include "LISTBOX.h" + #include "FRAMEWIN.h" + #include "BUTTON.h" +#endif +#include "GUIDEMO.h" + +/********************************************************************* +* +* Static variables +* +********************************************************************** +*/ + +#if GUI_WINSUPPORT + static BUTTON_Handle _ahButton[2]; + static FRAMEWIN_Handle _ahFrameWin[3]; + static int _ButtonSizeX, _ButtonSizeY; + #if GUIDEMO_LARGE + static FRAMEWIN_Handle _ahInfoWin[2]; + static const char* _sInfo; + #endif +#endif + +static int _iTest, _iTestMinor; +static char _CmdNext; +static const char* _sExplain; + +#define countof(Obj) (sizeof(Obj)/sizeof(Obj[0])) + +/********************************************************************* +* +* Routine table +* +********************************************************************** + + The routines to be called are listed here. The advantage to calling + directly is that we can execute some code before and after. +*/ + +typedef void fVoidVoid(void); + +static fVoidVoid * _apfTest[] = { + GUIDEMO_HardwareInfo, + GUIDEMO_Speed, + #if GUI_SUPPORT_MEMDEV + GUIDEMO_Graph, + #endif + GUIDEMO_Bitmap, + GUIDEMO_Cursor, + GUIDEMO_ShowInternationalFonts, + GUIDEMO_ShowColorBar, + GUIDEMO_ShowColorList, + //GUIDEMO_DemoLUT, + GUIDEMO_DemoPolygon, + GUIDEMO_Circle, + GUIDEMO_Automotive, + GUIDEMO_Navigation, + #if GUI_WINSUPPORT + GUIDEMO_Dialog, + GUIDEMO_DemoProgBar, + GUIDEMO_DemoFrameWin, + #if GUI_SUPPORT_TOUCH + GUIDEMO_Touch, + #endif + #endif + 0 +}; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ + +static void _UpdateCmdWin(void) { + #if GUI_WINSUPPORT && GUIDEMO_LARGE + WM_InvalidateWindow(_ahInfoWin[1]); + #endif +} + +#if (GUI_WINSUPPORT && GUIDEMO_LARGE) +static void _cbCmdWin(WM_MESSAGE* pMsg) { + switch (pMsg->MsgId) { + case WM_PAINT: + /* Update info in command window */ + GUI_SetBkColor(GUI_GRAY); + GUI_Clear(); + GUI_DispStringAt("Demo ", 0, 0); + GUI_DispDecMin(_iTest + 1); + GUI_DispString("."); + GUI_DispDecMin(_iTestMinor); + GUI_DispString("/"); + GUI_DispDecMin(countof(_apfTest)); + default: + WM_DefaultProc(pMsg); + } +} +#endif + +static void _UpdateInfoWin(void) { + #if GUI_WINSUPPORT && GUIDEMO_LARGE + GUI_RECT rClient; + WM_HWIN hWin; + GUI_CONTEXT ContextOld; + GUI_SaveContext(&ContextOld); + /* Update info window */ + WM_ShowWindow(_ahInfoWin[0]); + WM_ShowWindow(_ahFrameWin[0]); + hWin = WM_SelectWindow(_ahInfoWin[0]); + GUI_GetClientRect(&rClient); + GUI_SetBkColor(GUI_WHITE); + GUI_Clear(); + GUI_SetColor(GUI_BLACK); + GUI_SetFont(&GUI_Font13_1); + GUI_SetTextAlign(GUI_TA_HCENTER); + GUI_DispStringHCenterAt(_sInfo, (rClient.x1 - rClient.x0) / 2, 0); + GUI_SetTextAlign(GUI_TA_LEFT); + GUI_SetFont(&GUI_Font8_ASCII); + GUI_DispStringAt(_sExplain, 0, 20); + WM_SelectWindow(hWin); + GUI_RestoreContext(&ContextOld); + #endif +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ + +GUI_COLOR GUIDEMO_SetBkColor(GUI_COLOR Color) { + GUI_COLOR r; + if (GUI_ColorIsAvailable(GUI_RED)) { + r = Color; + } else { + r = GUI_BLACK; + } + GUI_SetBkColor(r); + return r; +} + +GUI_COLOR GUIDEMO_SetColor(GUI_COLOR Color) { + GUI_COLOR r; + if (GUI_ColorIsAvailable(GUI_RED)) { + r = Color; + } else { + r = GUI_WHITE; + } + GUI_SetColor(r); + return r; +} + +int GUIDEMO_Delay(int t) { + int r = 0; + #if GUI_WINSUPPORT + U32 value, tm; + #if GUIDEMO_LARGE + PROGBAR_Handle hProg; + #endif + WM_SetForegroundWindow(_ahButton[0]); + #if GUIDEMO_LARGE + hProg = (t > 100) ? PROGBAR_CreateAsChild(10, 10, 60, 7, _ahInfoWin[1], 0, + WM_CF_SHOW | WM_CF_STAYONTOP| WM_CF_MEMDEV) : 0; + PROGBAR_SetMinMax(hProg, 0, t); + #endif + tm = GUI_GetTime(); + do { + value = GUI_GetTime() - tm; + #if GUIDEMO_LARGE + PROGBAR_SetValue(hProg, value); + WM_ExecIdle(); + #endif + GUI_Delay(10); + } while ((value < (U32)t) && !GUIDEMO_CheckCancel()); + #if GUIDEMO_LARGE + PROGBAR_Delete(hProg); + #endif + _UpdateCmdWin(); + WM_ExecIdle(); + #else + GUI_Delay(t); + #endif + return r; +} + +void GUIDEMO_Wait(void) { + GUIDEMO_Delay(4000); + GUIDEMO_NotifyStartNext(); +} + +int GUIDEMO_CheckCancel(void) { + int c = GUI_GetKey(); + #if GUI_WINSUPPORT + WM_ExecIdle(); + #endif + if ((c == 'n') || (c=='N')) + _CmdNext =1; + if ((c == 'h') || (c=='H')) { + GUI_Delay(500); + do { + GUI_Delay(10); + #if GUI_WINSUPPORT + WM_ExecIdle(); + #endif + c = GUI_GetKey(); + } while (!c); + } + return _CmdNext; +} + +void GUIDEMO_ShowInfo(const char* s) { + _sExplain = s; + _UpdateInfoWin(); +} + +void GUIDEMO_HideInfoWin(void) { + #if GUI_WINSUPPORT + WM_HideWindow(_ahFrameWin[0]); + #endif +} + + +void GUIDEMO_NotifyStartNext(void) { + _CmdNext = 0; + _UpdateCmdWin(); + _iTestMinor++; +} + +int GUIDEMO_WaitKey(void) { + int r = 0; + U32 tMax = GUI_GetTime() + 4000; + U32 tDiff; + #if GUI_WINSUPPORT + PROGBAR_Handle hProg = PROGBAR_Create(LCD_GetXSize() - 70, + LCD_GetYSize() - 40, + 80, 5, WM_CF_SHOW); + #endif + while (tDiff = tMax - GUI_GetTime(), (tDiff > 0) && !GUIDEMO_CheckCancel()) { + if ((r = GUI_GetKey()) != 0) + break; + } + #if GUI_WINSUPPORT + PROGBAR_Delete(hProg); + WM_ExecIdle(); + #endif + return r; +} + +void GUIDEMO_ShowIntro(const char * s, const char * sExp) { + GUI_CONTEXT ContextOld; + GUI_SaveContext(&ContextOld); +#if GUI_WINSUPPORT && GUIDEMO_LARGE + _sInfo = s; +#endif + _sExplain = sExp; + GUI_SetDefault(); + GUIDEMO_HideInfoWin(); + GUIDEMO_SetBkColor(GUI_BLUE); + GUI_SetColor(GUI_WHITE); + GUI_Clear(); + #if !(GUIDEMO_TINY) + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringHCenterAt(s, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 3 - 10); + #else + GUI_SetFont(&GUI_Font13B_ASCII); + GUI_DispStringHCenterAt(s, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 3 - 18); + #endif + if (_sExplain) { + GUI_SetFont(&GUI_Font8_ASCII); + #if !(GUIDEMO_TINY) + GUI_DispStringHCenterAt(_sExplain, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 2 - 10); + #else + GUI_DispStringHCenterAt(_sExplain, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 2 - 14); + #endif + } + GUIDEMO_Delay(_sExplain ? 2000 : 4000); +#if GUI_WINSUPPORT + _UpdateInfoWin(); + _UpdateCmdWin(); +#endif + GUI_RestoreContext(&ContextOld); + #if GUI_WINSUPPORT + WM_ExecIdle(); + #endif + GUIDEMO_NotifyStartNext(); + GUIDEMO_SetBkColor(GUI_RED); + GUI_Clear(); +} + +/********************************************************************* +* +* GUIDEMO_main(): Large version of the demo +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +void GUIDEMO_main(void) { + #if GUI_WINSUPPORT + int i; + int xSize, ySize, xPos, yPos; + #endif + #if (GUI_SUPPORT_CURSOR|GUI_SUPPORT_TOUCH) + GUI_CURSOR_Show(); + #endif + GUI_Clear(); + #if GUI_WINSUPPORT + #if GUI_NUM_LAYERS > 1 + _ahFrameWin[2] = FRAMEWIN_CreateAsChild(10, 10, 100, 100, WM_GetDesktopWindowEx(1), "Display 1", NULL, WM_CF_SHOW); + WM_SetDesktopColorEx(GUI_RED, 1); + GUI_Delay(1000); + #endif + WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */ + /* Calculate position and size of FrameWin[1] */ + _ButtonSizeX = 30; + _ButtonSizeY = 20; + /* Create the control window incl. buttons */ + _ahFrameWin[1] = FRAMEWIN_Create("Control", &_cbCmdWin, WM_CF_SHOW | WM_CF_STAYONTOP, + LCD_GetXSize() - 80, LCD_GetYSize() - 60, 80, 60); + _ahInfoWin[1] = WM_GetClientWindow(_ahFrameWin[1]); + _ahButton[0] = BUTTON_CreateAsChild(4, 20, _ButtonSizeX, _ButtonSizeY, _ahInfoWin[1], + 'H' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); + _ahButton[1] = BUTTON_CreateAsChild(40, 20, _ButtonSizeX, _ButtonSizeY, _ahInfoWin[1], + 'N' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); + BUTTON_SetText(_ahButton[0], "Halt"); + BUTTON_SetText(_ahButton[1], "Next"); + _UpdateCmdWin(); + WM_ExecIdle(); + #endif + /* Show Intro */ + GUIDEMO_Intro(); + #if GUI_WINSUPPORT + /* Calculate position and size of FrameWin[0] */ + xSize = LCD_GetXSize() / 2; + ySize = 65; + xPos = LCD_GetXSize() - xSize; + yPos = 0; + /* Create info window and run the individual demos */ + _ahFrameWin[0] = FRAMEWIN_Create("emWin Demo", NULL, WM_CF_STAYONTOP, + xPos, yPos, xSize, ySize); +// _ahInfoWin[0] = WM_GetFirstChild(_ahFrameWin[0]); + _ahInfoWin[0] = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetFirstChild(_ahFrameWin[0]), WM_CF_SHOW | WM_CF_STAYONTOP, 0, 0); + WM_ExecIdle(); + #endif + /* Run the individual demos ! */ + for (_iTest = 0; _apfTest[_iTest]; _iTest++) { + GUI_CONTEXT ContextOld; + GUI_SaveContext(&ContextOld); + _iTestMinor = 0; + _UpdateCmdWin(); + (*_apfTest[_iTest])(); + _CmdNext = 0; + GUI_RestoreContext(&ContextOld); + } + /* Cleanup */ + #if GUI_WINSUPPORT + for (i = 0; i < countof(_ahFrameWin); i++) { + WM_DeleteWindow(_ahFrameWin[i]); + } + #endif +} + +#else /* GUIDEMO_LARGE */ + +/********************************************************************* +* +* GUIDEMO_main(): Small version of the demo +* +********************************************************************** +*/ +void GUIDEMO_main(void) { + #if GUI_WINSUPPORT + int i; + #endif + #if GUI_WINSUPPORT + #if GUI_NUM_LAYERS > 1 + FRAMEWIN_CreateAsChild(10, 10, 100, 100, WM_GetDesktopWindowEx(1), "Display 1", NULL, WM_CF_SHOW); + GUI_Delay(1000); + #endif + WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */ + _ButtonSizeX = 27; + _ButtonSizeY = 14; + _ahButton[0] = BUTTON_Create(LCD_GetXSize() - _ButtonSizeX * 2 - 4, + LCD_GetYSize() - _ButtonSizeY - 2, + _ButtonSizeX, _ButtonSizeY, + 'H' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); + _ahButton[1] = BUTTON_Create(LCD_GetXSize() - _ButtonSizeX - 2, + LCD_GetYSize() - _ButtonSizeY - 2, + _ButtonSizeX, _ButtonSizeY, + 'N' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); + BUTTON_SetFont(_ahButton[0], &GUI_Font8_ASCII); + BUTTON_SetFont(_ahButton[1], &GUI_Font8_ASCII); + BUTTON_SetText(_ahButton[0], "Halt"); + BUTTON_SetText(_ahButton[1], "Next"); + _UpdateCmdWin(); + WM_ExecIdle(); + #endif + /* Show Intro */ + GUIDEMO_Intro(); + /* Run the individual demos ! */ + for (_iTest = 0; _apfTest[_iTest]; _iTest++) { + GUI_CONTEXT ContextOld; + GUI_SaveContext(&ContextOld); + _iTestMinor = 0; + _UpdateCmdWin(); + (*_apfTest[_iTest])(); + _CmdNext = 0; + GUI_RestoreContext(&ContextOld); + } + /* Cleanup */ + #if GUI_WINSUPPORT + for (i = 0; i < countof(_ahButton); i++) { + BUTTON_Delete(_ahButton[i]); + } + #endif +} + +#endif /* GUIDEMO_LARGE */ diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO.h b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO.h new file mode 100644 index 0000000..9450322 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO.h @@ -0,0 +1,126 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO.h +Purpose : Multiple choice for emWin +---------------------------------------------------------------------- +*/ + + +#ifndef GUIDEMO_H +#define GUIDEMO_H + +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ + + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* GUIDEMO publics +* +********************************************************************* + + The following are the routines which are available to the + demo modules. +*/ + +void GUIDEMO_main(void); + +/********************************************************************* +* +* GUIDEMO main routines +* +********************************************************************* + + The following are the routines which are available to the + demo modules. +*/ + +GUI_COLOR GUIDEMO_SetBkColor (GUI_COLOR Color); +GUI_COLOR GUIDEMO_SetColor (GUI_COLOR Color); +void GUIDEMO_Wait (void); +int GUIDEMO_Delay (int t); +void GUIDEMO_ShowIntro (const char*s, const char* sExplain); +void GUIDEMO_ShowInfo (const char* sExplain); +int GUIDEMO_CheckCancel (void); +void GUIDEMO_NotifyStartNext (void); +void GUIDEMO_HideInfoWin (void); +int GUIDEMO_WaitKey (void); + + +extern const GUI_BITMAP GUIDEMO_bm4bpp; + + +/********************************************************************* +* +* Demo modules +* +********************************************************************* + + The demo consists of different modules which are usually called + by the main routine. + The following are the declarations for the individual routines. +*/ + +void GUIDEMO_Messagebox(void); +void GUIDEMO_Dialog(void); +void GUIDEMO_Cursor(void); +void GUIDEMO_HardwareInfo(void); +void GUIDEMO_Graph(void); +void GUIDEMO_Automotive(void); +void GUIDEMO_Bitmap(void); +void GUIDEMO_Intro(void); +void GUIDEMO_Navigation(void); +void GUIDEMO_ShowMemoryDevice(void); +void GUIDEMO_DemoBITMAPObj(void); +void GUIDEMO_Circle(void); +void GUIDEMO_Speed(void); +void GUIDEMO_ShowInternationalFonts(void); +void GUIDEMO_ShowColorBar(void); +void GUIDEMO_ShowColorList(void); +void GUIDEMO_DemoFrameWin(void); +void GUIDEMO_DemoLISTBOX(void); +void GUIDEMO_DemoWidgets(void); +void GUIDEMO_DemoPolygon(void); +void GUIDEMO_DemoProgBar(void); +//void GUIDEMO_ShowUCMix(void); +void GUIDEMO_DemoLISTBOX(void); +void GUIDEMO_DemoFrameWin(void); +void GUIDEMO_DemoLUT(void); +void GUIDEMO_ModifyLUT(int RFaktor, int GFaktor, int BFaktor); +void GUIDEMO_ShowColorList(void); +void GUIDEMO_Touch(void); + +extern const GUI_BITMAP bmemWinGSCLogo320x46; +extern const GUI_BITMAP bmSeggerLogoBlue; + +/********************************************************************* +* +* GUIDEMO defines +* +********************************************************************* +*/ + +#define GUIDEMO_LARGE ((LCD_XSIZE >= 240) && (LCD_YSIZE >= 200)) +#define GUIDEMO_TINY ((LCD_XSIZE < 140) || (LCD_YSIZE < 100)) + +#if defined(__cplusplus) + } +#endif + +#endif + diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Automotive.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Automotive.c new file mode 100644 index 0000000..b59753b --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Automotive.c @@ -0,0 +1,625 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Automotive.c +Purpose : Automotive samples +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" +#include "LCD_ConfDefaults.h" + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +#if (GUI_SUPPORT_MEMDEV & GUI_SUPPORT_AA) + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define countof(Obj) (sizeof(Obj) / sizeof(Obj[0])) +#define DEG2RAD (3.1415926f / 180) + +#define MAG 3 + +#if ((LCD_XSIZE >= 200) && !(GUIDEMO_TINY)) + +/********************************************************************* +* +* static data, scale bitmap (large) +* +********************************************************************** +*/ +static GUI_CONST_STORAGE GUI_COLOR _ColorsScaleR140[] = { + 0x000000, 0x00B400, 0xF5F5F5, 0x0000B4 + ,0x00F500, 0x494949, 0xE1E1E1, 0xC0C0C0 + ,0x7F7F7F, 0x8DD78D, 0x9B9B9B, 0xD7D7D7 + ,0xA8A8A8, 0xB4D7B4, 0x5D5D5D, 0xD7F5D7 + ,0x5DB45D, 0xB4B4D7, 0x5D5DB4, 0xD7D7F5 + ,0x8D8DD7, 0xEBEBEB, 0x8DB4B4, 0x8D8D8D + ,0x5D8DB4, 0x8DB48D, 0xB4D7D7, 0x6F6F6F + ,0xB4B4B4 +}; + +static GUI_CONST_STORAGE GUI_LOGPALETTE _PalScaleR140 = { + 29, /* number of entries */ + 0, /* No transparency */ + &_ColorsScaleR140[0] +}; + +static GUI_CONST_STORAGE unsigned char _acScaleR140[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x0C, 0x07, 0x07, 0x07, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x07, 0x07, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x07, 0x0A, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x0C, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0C, 0x08, 0x08, 0x02, 0x02, 0x0B, 0x09, 0x09, 0x09, 0x09, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x07, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x07, 0x0A, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x09, 0x09, 0x0D, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x0C, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0C, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x0C, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x09, 0x09, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x09, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x0A, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x15, 0x07, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x0D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x07, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x09, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x08, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x10, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x09, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x0D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x0D, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x0D, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x0F, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x0F, 0x02, 0x02, 0x02, 0x06, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x0F, 0x02, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x02, 0x02, 0x15, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x1A, 0x13, 0x02, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x07, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x12, 0x03, 0x14, 0x13, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x0B, 0x0E, 0x00, 0x00, 0x05, 0x02, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x02, 0x14, 0x03, 0x03, 0x03, 0x12, 0x11, 0x02, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x02, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x13, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x02, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x13, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x02, 0x16, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x14, 0x13, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x11, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0A, 0x07, 0x07, 0x07, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x0D, 0x0D, 0x0D, 0x0D, 0x09, 0x09, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x02, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x14, 0x02, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x0C, 0x07, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x0D, 0x0D, 0x09, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x14, 0x13, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0A, 0x08, 0x08, 0x08, 0x17, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x0D, 0x09, 0x10, 0x01, 0x10, 0x02, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x13, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x02, 0x0B, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x07, 0x0A, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x08, 0x07, 0x07, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x15, 0x02, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x02, 0x16, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x08, 0x07, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x0D, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x14, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0C, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x0C, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0D, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x02, 0x18, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x14, 0x02, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x07, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0D, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x0D, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x13, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x0D, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x0F, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x13, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x02, 0x16, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x12, 0x13, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, + 0x00, 0x05, 0x06, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x02, 0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x02, 0x08, 0x00, + 0x05, 0x06, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x06, 0x0A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x0D, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x02, 0x02, 0x18, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x02, 0x08, + 0x0B, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0B, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0D, 0x10, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x02, 0x0D, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x06, + 0x02, 0x02, 0x02, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0D, 0x10, 0x01, 0x10, 0x02, 0x0F, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x17, + 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x0E, 0x0E, 0x0B, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x0F, 0x09, 0x0F, 0x02, 0x16, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x17, 0x00, + 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x02, 0x02, 0x02, 0x02, 0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x02, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x02, 0x02, 0x13, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x02, 0x02, 0x0B, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x02, 0x02, 0x02, 0x02, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x13, 0x14, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x02, 0x02, 0x11, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x0B, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x02, 0x02, 0x02, 0x13, 0x14, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x02, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x06, 0x02, 0x02, 0x02, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x02, 0x02, 0x13, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x02, 0x02, 0x14, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0x02, 0x02, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x02, 0x13, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x02, 0x02, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x02, 0x13, 0x12, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x02, 0x14, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x06, 0x02, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x14, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x02, 0x02, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x11, 0x03, 0x03, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x05, 0x00, 0x08, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x02, 0x02, 0x11, 0x03, 0x11, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x06, 0x17, 0x02, 0x02, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x06, 0x02, 0x02, 0x13, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static GUI_CONST_STORAGE GUI_BITMAP _bmScaleR140 = { + 200, /* XSize */ + 73, /* YSize */ + 200, /* BytesPerLine */ + 8, /* BitsPerPixel */ + _acScaleR140, /* Pointer to picture data (indices) */ + &_PalScaleR140 /* Pointer to palette */ +}; + +#else + +/********************************************************************* +* +* static data, scale bitmap (small) +* +********************************************************************** +*/ +static GUI_CONST_STORAGE GUI_COLOR _ColorsScaleR80[] = { + 0x000000,0x101010,0x313031,0x525552 + ,0x83858B,0x94959C,0xA4AAAC,0xC5CACD + ,0xD5DADE,0xFFFFFF,0xE6EAEE,0x202020 + ,0xB4BABD,0x292C29,0x737973,0x626562 + ,0x414041,0xDEE2E6,0x5ADE5A,0x41DA41 + ,0x52DE52,0x62DE62,0x83E68B,0xA4EEAC + ,0xC5F2CD,0xE6FAEE,0x393C39,0x31D631 + ,0x00CE00,0x10CE10,0x94EA9C,0xB4EEBD + ,0x737573,0xC5F2D5,0x737173,0x8BE694 + ,0x20D220,0x73E273,0xD5F6DE,0xBDC2C5 + ,0xD5DAE6,0x5A595A,0xA4B2BD,0xBDBEC5 + ,0xE6F6EE,0x9499EE,0xE6EAFF,0xB4BAF6 + ,0x0000CD,0x2020D5,0xA4AAEE,0x5255DE + ,0x8385E6,0x1010D5,0x7375E6,0xD5F2DE + ,0x6265E6,0x3130D5,0xD5DAFF,0xC5CAF6 + ,0x4140DE,0xEEFAEE,0xEEEEF6,0xF6FAFF + ,0x6A6D6A,0xF6F6FF,0x7B797B,0xCDD2D5 + ,0x4148D5,0x293429,0x181C18,0x181CD5 + ,0x8B8D8B,0x00FF00,0x94E69C,0xB4BEC5 + ,0x2028D5,0xC5C6CD +}; + +static GUI_CONST_STORAGE GUI_LOGPALETTE _PalScaleR80 = { + 78, /* number of entries */ + 0, /* No transparency */ + &_ColorsScaleR80[0] +}; + +static GUI_CONST_STORAGE unsigned char _acScaleR80[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x08, 0x08, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x04, 0x0C, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x0C, 0x04, 0x03, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0E, 0x05, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x08, 0x06, 0x05, 0x04, 0x0F, 0x03, 0x03, 0x10, 0x02, 0x11, 0x09, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x16, 0x17, 0x18, 0x19, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x06, 0x0E, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x05, 0x0F, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1B, 0x15, 0x1E, 0x1F, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x11, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x15, 0x21, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x08, 0x09, 0x09, 0x09, 0x09, 0x08, 0x05, 0x22, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x17, 0x09, 0x23, 0x16, 0x18, 0x09, 0x09, 0x09, 0x09, 0x08, 0x04, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x09, 0x09, 0x09, 0x09, 0x08, 0x04, 0x02, 0x00, 0x00, 0x01, 0x09, 0x09, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x19, 0x09, 0x1B, 0x1C, 0x1C, 0x24, 0x25, 0x18, 0x09, 0x09, 0x09, 0x09, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x09, 0x09, 0x09, 0x09, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x09, 0x19, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x16, 0x19, 0x09, 0x09, 0x09, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x08, 0x09, 0x09, 0x09, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x25, 0x09, 0x17, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x14, 0x26, 0x09, 0x09, 0x09, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x09, 0x09, 0x09, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x09, 0x15, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x13, 0x1F, 0x09, 0x09, 0x09, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x27, 0x09, 0x09, 0x09, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x09, 0x09, 0x24, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x17, 0x09, 0x09, 0x09, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x09, 0x09, 0x09, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x13, 0x09, 0x26, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x1F, 0x09, 0x09, 0x09, 0x2A, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x08, 0x09, 0x09, 0x09, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x16, 0x09, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x09, 0x09, 0x09, 0x0A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x09, 0x09, 0x09, 0x05, 0x09, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x18, 0x09, 0x14, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x2C, 0x09, 0x2D, 0x2E, 0x09, 0x09, 0x07, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0A, 0x09, 0x09, 0x07, 0x02, 0x00, 0x04, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x09, 0x09, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x09, 0x2F, 0x30, 0x31, 0x32, 0x09, 0x09, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x09, 0x20, 0x00, 0x00, 0x00, 0x01, 0x08, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x14, 0x09, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x09, 0x09, 0x31, 0x30, 0x30, 0x30, 0x33, 0x2E, 0x09, 0x09, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x09, 0x09, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x09, 0x16, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x09, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x2F, 0x09, 0x09, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x09, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x26, 0x09, 0x13, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x14, 0x09, 0x2E, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x36, 0x09, 0x09, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x09, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x09, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x09, 0x19, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x37, 0x09, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x3A, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x08, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x15, 0x09, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x16, 0x09, 0x3B, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x2F, 0x09, 0x09, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x09, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x20, 0x04, 0x06, 0x07, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x26, 0x26, 0x17, 0x1E, 0x25, 0x14, 0x24, 0x1C, 0x1C, 0x1C, 0x1C, 0x17, 0x09, 0x25, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x24, 0x09, 0x09, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x09, 0x09, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x08, 0x09, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x29, 0x04, 0x0C, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x1F, 0x16, 0x14, 0x3D, 0x09, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x17, 0x09, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x09, 0x09, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x09, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x20, 0x3E, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0C, 0x05, 0x04, 0x0F, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x05, 0x06, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3F, 0x16, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x09, 0x09, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x09, 0x09, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x41, 0x09, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x20, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x05, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x05, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x26, 0x16, 0x1B, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x18, 0x09, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x2E, 0x09, 0x09, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x3F, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x05, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x18, 0x14, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x15, 0x09, 0x3A, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x44, 0x3F, 0x3F, 0x43, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x45, 0x3F, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x09, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x08, 0x09, 0x09, 0x09, 0x0A, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0A, 0x09, 0x09, 0x09, 0x19, 0x16, 0x1D, 0x1C, 0x1C, 0x1C, 0x1D, 0x37, 0x09, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x3F, 0x45, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x0C, 0x00, 0x00, 0x04, 0x0A, 0x09, 0x09, 0x09, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x09, 0x09, 0x09, 0x09, 0x1E, 0x1D, 0x1C, 0x16, 0x09, 0x3B, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x09, 0x48, 0x08, 0x09, 0x09, 0x09, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x05, 0x09, 0x09, 0x09, 0x19, 0x4A, 0x09, 0x09, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x09, 0x09, 0x09, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x05, 0x09, 0x09, 0x09, 0x09, 0x2F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x09, 0x09, 0x09, 0x4B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x05, 0x09, 0x09, 0x09, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0A, 0x09, 0x09, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0x09, 0x09, 0x09, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x09, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0A, 0x09, 0x09, 0x2F, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x09, 0x09, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x09, 0x09, 0x2E, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x09, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x09, 0x09, 0x09, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x09, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x09, 0x09, 0x32, 0x30, 0x30, 0x30, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x05, 0x09, 0x09, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x09, 0x09, 0x2F, 0x35, 0x30, 0x47, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x41, 0x46, 0x0C, 0x09, 0x09, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x09, 0x3A, 0x4C, 0x41, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x09, 0x3F, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x09, 0x3F, 0x09, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x3F, 0x3F, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x09, 0x3F, 0x3F, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x4D, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static GUI_CONST_STORAGE GUI_BITMAP _bmScaleR80 = { + 122, /* XSize */ + 55, /* YSize */ + 122, /* BytesPerLine */ + 8, /* BitsPerPixel */ + _acScaleR80, /* Pointer to picture data (indices) */ + &_PalScaleR80 /* Pointer to palette */ +}; + +#endif + +/********************************************************************* +* +* static data, shape of polygons +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE +static const GUI_POINT _aNeedle_0[] = { + { MAG * ( 0), MAG * ( 0 + 125)}, + { MAG * (-3), MAG * (-15 + 125)}, + { MAG * (-3), MAG * (-65 + 125)}, + { MAG * ( 3), MAG * (-65 + 125)}, + { MAG * ( 3), MAG * (-15 + 125)}, +}; +#endif + +static const GUI_POINT _aNeedle_1[] = { + { MAG * ( 0), MAG * ( 0 + 125)}, + { MAG * (-6), MAG * (-15 + 125)}, + { MAG * ( 0), MAG * (-65 + 125)}, + { MAG * ( 6), MAG * (-15 + 125)}, +}; + +/********************************************************************* +* +* Structure containing information for drawing routine +* +********************************************************************** +*/ + +typedef struct { + GUI_AUTODEV_INFO AutoDevInfo; /* Information about what has to be displayed */ + GUI_POINT aPoints[7]; /* Polygon data */ + float Angle; +} PARAM; + +/********************************************************************* +* +* static code, get angle +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +/********************************************************************* +* +* _GetAngle_0 +*/ +static float _GetAngle_0(int tDiff) { + if (tDiff < 6000) + return 225; + tDiff -= 6000; + if (tDiff < 15000) { + return 225 - 0.006 * tDiff ; + } + tDiff -= 15000; + if (tDiff < 7500) { + return 225 - 90 + 0.012 * tDiff ; + } + return 225; +} + +/********************************************************************* +* +* _GetAngle_1 +*/ +static float _GetAngle_1(int tDiff) { + if (tDiff < 12000) { + return 225 - 0.0075 * tDiff ; + } + tDiff -= 18000; + if (tDiff > 0) { + return 225 - 90 + 0.0075 * tDiff; + } + return 225 - 90; +} + +#else /* GUIDEMO_LARGE */ + +/********************************************************************* +* +* _GetAngle +*/ +static float _GetAngle(int tDiff) { + if (tDiff < 10000) { + return 225 - 0.009 * tDiff ; + } + tDiff -= 10000; + if (tDiff > 0) { + return 225 - 90 + 0.015 * tDiff; + } + return 225 - 90; +} + +#endif + +/********************************************************************* +* +* static code, drawing routines +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +/********************************************************************* +* +* _Draw_0 +*/ +static void _Draw_0(void * p) { + PARAM* pParam = (PARAM *)p; + /* Fixed background */ + if (pParam->AutoDevInfo.DrawFixed) { + GUI_ClearRect (1, + (LCD_YSIZE / 2 - 80) + _bmScaleR140.YSize, + 1 + _bmScaleR140.XSize - 1, + (LCD_YSIZE / 2 + 20)); + GUI_DrawBitmap(&_bmScaleR140, 1, (LCD_YSIZE / 2 - 80)); + } + /* Moving needle */ + GUI_SetColor(GUI_WHITE); + GUI_AA_FillPolygon(pParam->aPoints, + countof(_aNeedle_0), + MAG * 101, + MAG * (LCD_YSIZE / 2 + 60)); + /* Fixed foreground */ + if (pParam->AutoDevInfo.DrawFixed) { + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetColor(GUI_RED); + GUI_SetFont(&GUI_Font24B_ASCII); + GUI_DispStringHCenterAt("RPM / 1000", 101, (LCD_YSIZE / 2 - 20)); + } +} + +/********************************************************************* +* +* _Draw_1 +*/ +static void _Draw_1(void * p) { + PARAM* pParam = (PARAM *)p; + /* Fixed background */ + if (pParam->AutoDevInfo.DrawFixed) { + GUI_ClearRect (1, + (LCD_YSIZE / 2 + 21) + _bmScaleR140.YSize, + 1 + _bmScaleR140.XSize - 1, + (LCD_YSIZE / 2 + 121)); + GUI_DrawBitmap(&_bmScaleR140, 1, (LCD_YSIZE / 2 + 21)); + } + /* Moving needle */ + GUI_SetColor(GUI_WHITE); + GUI_AA_FillPolygon(pParam->aPoints, + countof(_aNeedle_1), + MAG * 101, + MAG * (LCD_YSIZE / 2 + 161)); + /* Fixed foreground */ + if (pParam->AutoDevInfo.DrawFixed) { + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetColor(GUI_RED); + GUI_SetFont(&GUI_Font24B_ASCII); + GUI_DispStringHCenterAt("MPH / 10", 101, (LCD_YSIZE / 2 + 81)); + } +} + +#else /* GUIDEMO_LARGE */ + +/********************************************************************* +* +* _MagnifyPolygon +*/ +#if (GUIDEMO_TINY || (LCD_XSIZE < 200)) +static void _MagnifyPolygon(GUI_POINT* pPolygon, int NumPoints, float Mag) { + int j; + for (j = 0; j < NumPoints; j++) { + (pPolygon + j)->x = (pPolygon + j)->x * Mag; + (pPolygon + j)->y = (pPolygon + j)->y * Mag; + } +} +#endif + +/********************************************************************* +* +* _Draw +*/ +static void _Draw(void* p) { + GUI_CONST_STORAGE GUI_BITMAP* pBitmap; + PARAM* pParam = (PARAM *)p; + int xMid = LCD_XSIZE >> 1; + int yMid = (LCD_YSIZE >> 1) + 3; + int bmSizeX, bmSizeY; + #if (GUIDEMO_TINY || (LCD_XSIZE < 200)) + pBitmap = &_bmScaleR80; + #else + pBitmap = &_bmScaleR140; + #endif + bmSizeX = pBitmap->XSize; + bmSizeY = pBitmap->YSize; + /* Fixed background */ + if (pParam->AutoDevInfo.DrawFixed) { + #if (GUIDEMO_TINY || (LCD_XSIZE < 200)) + GUI_Clear(); + GUI_DrawBitmap(pBitmap, xMid - (bmSizeX >> 1), (yMid - 35)); + #else + GUI_ClearRect (xMid - (bmSizeX >> 1), (yMid - 50) + bmSizeY, + xMid + (bmSizeX >> 1) - 1, (yMid + 50)); + GUI_DrawBitmap(pBitmap, xMid - (bmSizeX >> 1), (yMid - 50)); + #endif + } + /* Moving needle */ + GUI_SetColor(GUI_WHITE); + #if (GUIDEMO_TINY || (LCD_XSIZE < 200)) + GUI_AA_FillPolygon(pParam->aPoints, countof(_aNeedle_1), MAG * xMid, MAG * (yMid + 49)); + #else + GUI_AA_FillPolygon(pParam->aPoints, countof(_aNeedle_1), MAG * xMid, MAG * (yMid + 90)); + #endif + /* Fixed foreground */ + if (pParam->AutoDevInfo.DrawFixed) { + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetColor(GUI_RED); + #if (GUIDEMO_TINY || (LCD_XSIZE < 200)) + GUI_SetFont(&GUI_Font13B_ASCII); + #else + GUI_SetFont(&GUI_Font24B_ASCII); + #endif + GUI_DispStringHCenterAt("MPH / 10", xMid, yMid + 10); + } +} + +#endif + +/********************************************************************* +* +* static code, demo +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +/********************************************************************* +* +* _AutomotiveDemo +*/ +static void _AutomotiveDemo(void) { + int Cnt, i; + int tDiff; + int tDiff1 = 0; + int tDiff2 = 0; + int t0, t1; + float Angle_0_Old, Angle_1_Old; + PARAM Param[2]; /* Parameters for drawing routine */ + GUI_AUTODEV AutoDev[2]; /* Object for banding memory device */ + /* Create GUI_AUTODEV-objects */ + for (i = 0; i < 2; i++) { + GUI_MEMDEV_CreateAuto(&AutoDev[i]); + } + t0 = GUI_GetTime(); /* Get current time */ + Angle_0_Old = Angle_1_Old = -1; + /* Show needle for a fixed time */ + for (Cnt = 0; ((tDiff = GUI_GetTime() - t0) < 30000) && !GUIDEMO_CheckCancel(); Cnt++) { + /* Get values to display and calculate polygon for needle 1 */ + Param[0].Angle = _GetAngle_0(tDiff)* DEG2RAD; + if (Angle_0_Old != Param[0].Angle) { + Angle_0_Old = Param[0].Angle; + t1 = GUI_GetTime(); + GUI_RotatePolygon(Param[0].aPoints, _aNeedle_0, countof(_aNeedle_0), Param[0].Angle); + GUI_MEMDEV_DrawAuto(&AutoDev[0], &Param[0].AutoDevInfo, _Draw_0, &Param[0]); + tDiff1 = GUI_GetTime() - t1; + if (tDiff1 < 50) { + GUI_Delay(50 - tDiff1); + } + } + /* Get values to display and calculate polygon for needle 2 */ + Param[1].Angle = _GetAngle_1(tDiff)* DEG2RAD; + if (Angle_1_Old != Param[1].Angle) { + Angle_1_Old = Param[1].Angle; + t1 = GUI_GetTime(); + GUI_RotatePolygon(Param[1].aPoints, _aNeedle_1, countof(_aNeedle_1), Param[1].Angle); + GUI_MEMDEV_DrawAuto(&AutoDev[1], &Param[1].AutoDevInfo, _Draw_1, &Param[1]); + tDiff2 = GUI_GetTime() - t1; + } + /* Display used time */ + if (!(Cnt % 20)) { + GUI_SetColor(GUI_WHITE); + GUI_SetTextMode(GUI_TM_NORMAL); + GUI_SetFont(&GUI_Font8_1); + GUI_DispStringAt("msec/picture:\n", 10, 10); + GUI_SetFont(&GUI_Font6x8); + GUI_GotoX(10); + GUI_DispDec(tDiff1, 3); + GUI_DispNextLine(); + GUI_GotoX(10); + GUI_DispDec(tDiff2, 3); + } + } + GUIDEMO_Delay(1000); + /* Delete GUI_AUTODEV-objects */ + for (i = 0; i < 2; i++) { + GUI_MEMDEV_DeleteAuto(&AutoDev[i]); + } +} + +#else /* GUIDEMO_LARGE */ + +/********************************************************************* +* +* _AutomotiveDemo +*/ +static void _AutomotiveDemo(void) { + int Cnt; + int tDiff, t0; + float Angle_Old; + PARAM Param; /* Parameters for drawing routine */ + GUI_AUTODEV AutoDev; /* Object for banding memory device */ + /* Create GUI_AUTODEV-objects */ + GUI_MEMDEV_CreateAuto(&AutoDev); + t0 = GUI_GetTime(); /* Get current time */ + Angle_Old = -1; + /* Show needle for a fixed time */ + for (Cnt = 0; ((tDiff = GUI_GetTime() - t0) < 16000) && !GUIDEMO_CheckCancel(); Cnt++) { + /* Get values to display and calculate polygon for needle 2 */ + Param.Angle = _GetAngle(tDiff) * DEG2RAD; + if (Angle_Old != Param.Angle) { + Angle_Old = Param.Angle; + GUI_RotatePolygon(Param.aPoints, _aNeedle_1, countof(_aNeedle_1), Param.Angle); + #if (GUIDEMO_TINY || (LCD_XSIZE < 200)) + _MagnifyPolygon(Param.aPoints, countof(_aNeedle_1), 0.575f); + #endif + GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, _Draw, &Param); + } + } + GUIDEMO_Delay(1000); + /* Delete GUI_AUTODEV-objects */ + GUI_MEMDEV_DeleteAuto(&AutoDev); +} + +#endif + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIDEMO_Automotive +*/ +void GUIDEMO_Automotive(void) { + /* Show intro message */ + GUIDEMO_ShowIntro("Automotive samples", + "\nExamples for the" + "\nautomotive industrie"); + GUIDEMO_NotifyStartNext(); + GUI_SetBkColor(GUI_BLACK); + GUI_Clear(); + /* Enable high resolution for antialiasing */ + GUI_AA_EnableHiRes(); + GUI_AA_SetFactor(MAG); + _AutomotiveDemo(); +} + +#else /* GUI_SUPPORT_MEMDEV | GUI_SUPPORT_AA */ + +void GUIDEMO_Automotive(void) {} + +#endif /* GUI_SUPPORT_MEMDEV | GUI_SUPPORT_AA */ diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap.c new file mode 100644 index 0000000..f46a3de --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap.c @@ -0,0 +1,1125 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Bitmap.c +Purpose : Draws bitmaps with and without compression +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" +#include + +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +#define PI4 12.5663706f + +/********************************************************************* +* +* Bug bitmap +* +********************************************************************** +*/ + +static const GUI_COLOR _ColorsLadyBug[] = { + 0xFFFFFF, 0x000000, 0x0000ff, 0xFFCCCC +}; + +static const GUI_LOGPALETTE _PalLadyBug = { + 4, /* number of entries */ + 0, /* No transparency */ + &_ColorsLadyBug[0] +}; + +static const unsigned char _acLadyBug[] = { + /* RLE: 056 Pixels @ 000,000*/ 56, 0x00, + /* RLE: 007 Pixels @ 056,000*/ 7, 0x01, + /* RLE: 152 Pixels @ 063,000*/ 152, 0x00, + /* RLE: 009 Pixels @ 055,001*/ 9, 0x01, + /* RLE: 150 Pixels @ 064,001*/ 150, 0x00, + /* RLE: 010 Pixels @ 054,002*/ 10, 0x01, + /* RLE: 149 Pixels @ 064,002*/ 149, 0x00, + /* RLE: 012 Pixels @ 053,003*/ 12, 0x01, + /* RLE: 148 Pixels @ 065,003*/ 148, 0x00, + /* RLE: 012 Pixels @ 053,004*/ 12, 0x01, + /* RLE: 147 Pixels @ 065,004*/ 147, 0x00, + /* RLE: 013 Pixels @ 052,005*/ 13, 0x01, + /* RLE: 147 Pixels @ 065,005*/ 147, 0x00, + /* RLE: 013 Pixels @ 052,006*/ 13, 0x01, + /* RLE: 146 Pixels @ 065,006*/ 146, 0x00, + /* RLE: 014 Pixels @ 051,007*/ 14, 0x01, + /* RLE: 146 Pixels @ 065,007*/ 146, 0x00, + /* RLE: 014 Pixels @ 051,008*/ 14, 0x01, + /* RLE: 146 Pixels @ 065,008*/ 146, 0x00, + /* RLE: 014 Pixels @ 051,009*/ 14, 0x01, + /* RLE: 145 Pixels @ 065,009*/ 145, 0x00, + /* RLE: 014 Pixels @ 050,010*/ 14, 0x01, + /* RLE: 146 Pixels @ 064,010*/ 146, 0x00, + /* RLE: 014 Pixels @ 050,011*/ 14, 0x01, + /* RLE: 146 Pixels @ 064,011*/ 146, 0x00, + /* RLE: 014 Pixels @ 050,012*/ 14, 0x01, + /* RLE: 146 Pixels @ 064,012*/ 146, 0x00, + /* RLE: 013 Pixels @ 050,013*/ 13, 0x01, + /* RLE: 146 Pixels @ 063,013*/ 146, 0x00, + /* RLE: 014 Pixels @ 049,014*/ 14, 0x01, + /* RLE: 146 Pixels @ 063,014*/ 146, 0x00, + /* RLE: 013 Pixels @ 049,015*/ 13, 0x01, + /* RLE: 147 Pixels @ 062,015*/ 147, 0x00, + /* RLE: 013 Pixels @ 049,016*/ 13, 0x01, + /* RLE: 147 Pixels @ 062,016*/ 147, 0x00, + /* RLE: 012 Pixels @ 049,017*/ 12, 0x01, + /* RLE: 148 Pixels @ 061,017*/ 148, 0x00, + /* RLE: 012 Pixels @ 049,018*/ 12, 0x01, + /* RLE: 148 Pixels @ 061,018*/ 148, 0x00, + /* RLE: 012 Pixels @ 049,019*/ 12, 0x01, + /* RLE: 147 Pixels @ 061,019*/ 147, 0x00, + /* RLE: 012 Pixels @ 048,020*/ 12, 0x01, + /* RLE: 148 Pixels @ 060,020*/ 148, 0x00, + /* RLE: 012 Pixels @ 048,021*/ 12, 0x01, + /* RLE: 148 Pixels @ 060,021*/ 148, 0x00, + /* RLE: 011 Pixels @ 048,022*/ 11, 0x01, + /* RLE: 149 Pixels @ 059,022*/ 149, 0x00, + /* RLE: 011 Pixels @ 048,023*/ 11, 0x01, + /* RLE: 149 Pixels @ 059,023*/ 149, 0x00, + /* RLE: 011 Pixels @ 048,024*/ 11, 0x01, + /* RLE: 149 Pixels @ 059,024*/ 149, 0x00, + /* RLE: 010 Pixels @ 048,025*/ 10, 0x01, + /* RLE: 150 Pixels @ 058,025*/ 150, 0x00, + /* RLE: 010 Pixels @ 048,026*/ 10, 0x01, + /* RLE: 150 Pixels @ 058,026*/ 150, 0x00, + /* RLE: 010 Pixels @ 048,027*/ 10, 0x01, + /* RLE: 150 Pixels @ 058,027*/ 150, 0x00, + /* RLE: 009 Pixels @ 048,028*/ 9, 0x01, + /* RLE: 152 Pixels @ 057,028*/ 152, 0x00, + /* RLE: 008 Pixels @ 049,029*/ 8, 0x01, + /* RLE: 152 Pixels @ 057,029*/ 152, 0x00, + /* RLE: 008 Pixels @ 049,030*/ 8, 0x01, + /* RLE: 152 Pixels @ 057,030*/ 152, 0x00, + /* RLE: 008 Pixels @ 049,031*/ 8, 0x01, + /* RLE: 152 Pixels @ 057,031*/ 152, 0x00, + /* RLE: 008 Pixels @ 049,032*/ 8, 0x01, + /* RLE: 152 Pixels @ 057,032*/ 152, 0x00, + /* RLE: 008 Pixels @ 049,033*/ 8, 0x01, + /* RLE: 152 Pixels @ 057,033*/ 152, 0x00, + /* RLE: 008 Pixels @ 049,034*/ 8, 0x01, + /* RLE: 153 Pixels @ 057,034*/ 153, 0x00, + /* RLE: 007 Pixels @ 050,035*/ 7, 0x01, + /* RLE: 153 Pixels @ 057,035*/ 153, 0x00, + /* RLE: 007 Pixels @ 050,036*/ 7, 0x01, + /* RLE: 153 Pixels @ 057,036*/ 153, 0x00, + /* RLE: 007 Pixels @ 050,037*/ 7, 0x01, + /* RLE: 153 Pixels @ 057,037*/ 153, 0x00, + /* RLE: 007 Pixels @ 050,038*/ 7, 0x01, + /* RLE: 154 Pixels @ 057,038*/ 154, 0x00, + /* RLE: 006 Pixels @ 051,039*/ 6, 0x01, + /* RLE: 154 Pixels @ 057,039*/ 154, 0x00, + /* RLE: 007 Pixels @ 051,040*/ 7, 0x01, + /* RLE: 154 Pixels @ 058,040*/ 154, 0x00, + /* RLE: 006 Pixels @ 052,041*/ 6, 0x01, + /* RLE: 154 Pixels @ 058,041*/ 154, 0x00, + /* RLE: 007 Pixels @ 052,042*/ 7, 0x01, + /* RLE: 154 Pixels @ 059,042*/ 154, 0x00, + /* RLE: 006 Pixels @ 053,043*/ 6, 0x01, + /* RLE: 154 Pixels @ 059,043*/ 154, 0x00, + /* RLE: 007 Pixels @ 053,044*/ 7, 0x01, + /* RLE: 049 Pixels @ 060,044*/ 49, 0x00, + /* RLE: 010 Pixels @ 109,044*/ 10, 0x01, + /* RLE: 095 Pixels @ 119,044*/ 95, 0x00, + /* RLE: 006 Pixels @ 054,045*/ 6, 0x01, + /* RLE: 046 Pixels @ 060,045*/ 46, 0x00, + /* RLE: 014 Pixels @ 106,045*/ 14, 0x01, + /* RLE: 095 Pixels @ 120,045*/ 95, 0x00, + /* RLE: 006 Pixels @ 055,046*/ 6, 0x01, + /* RLE: 043 Pixels @ 061,046*/ 43, 0x00, + /* RLE: 017 Pixels @ 104,046*/ 17, 0x01, + /* RLE: 094 Pixels @ 121,046*/ 94, 0x00, + /* RLE: 007 Pixels @ 055,047*/ 7, 0x01, + /* RLE: 040 Pixels @ 062,047*/ 40, 0x00, + /* RLE: 020 Pixels @ 102,047*/ 20, 0x01, + /* RLE: 054 Pixels @ 122,047*/ 54, 0x00, + /* RLE: 019 Pixels @ 016,048*/ 19, 0x01, + /* RLE: 021 Pixels @ 035,048*/ 21, 0x00, + /* RLE: 006 Pixels @ 056,048*/ 6, 0x01, + /* RLE: 004 Pixels @ 062,048*/ 4, 0x00, + /* RLE: 006 Pixels @ 066,048*/ 6, 0x01, + /* RLE: 029 Pixels @ 072,048*/ 29, 0x00, + /* RLE: 022 Pixels @ 101,048*/ 22, 0x01, + /* RLE: 049 Pixels @ 123,048*/ 49, 0x00, + /* RLE: 027 Pixels @ 012,049*/ 27, 0x01, + /* RLE: 018 Pixels @ 039,049*/ 18, 0x00, + /* RLE: 006 Pixels @ 057,049*/ 6, 0x01, + /* RLE: 001 Pixels @ 063,049*/ 1, 0x00, + /* RLE: 009 Pixels @ 064,049*/ 9, 0x01, + /* RLE: 026 Pixels @ 073,049*/ 26, 0x00, + /* RLE: 024 Pixels @ 099,049*/ 24, 0x01, + /* RLE: 046 Pixels @ 123,049*/ 46, 0x00, + /* RLE: 032 Pixels @ 009,050*/ 32, 0x01, + /* RLE: 017 Pixels @ 041,050*/ 17, 0x00, + /* RLE: 016 Pixels @ 058,050*/ 16, 0x01, + /* RLE: 024 Pixels @ 074,050*/ 24, 0x00, + /* RLE: 026 Pixels @ 098,050*/ 26, 0x01, + /* RLE: 043 Pixels @ 124,050*/ 43, 0x00, + /* RLE: 036 Pixels @ 007,051*/ 36, 0x01, + /* RLE: 015 Pixels @ 043,051*/ 15, 0x00, + /* RLE: 017 Pixels @ 058,051*/ 17, 0x01, + /* RLE: 022 Pixels @ 075,051*/ 22, 0x00, + /* RLE: 027 Pixels @ 097,051*/ 27, 0x01, + /* RLE: 040 Pixels @ 124,051*/ 40, 0x00, + /* RLE: 041 Pixels @ 004,052*/ 41, 0x01, + /* RLE: 014 Pixels @ 045,052*/ 14, 0x00, + /* RLE: 016 Pixels @ 059,052*/ 16, 0x01, + /* RLE: 021 Pixels @ 075,052*/ 21, 0x00, + /* RLE: 016 Pixels @ 096,052*/ 16, 0x01, + /* RLE: 005 Pixels @ 112,052*/ 5, 0x00, + /* RLE: 012 Pixels @ 117,052*/ 12, 0x01, + /* RLE: 034 Pixels @ 129,052*/ 34, 0x00, + /* RLE: 044 Pixels @ 003,053*/ 44, 0x01, + /* RLE: 010 Pixels @ 047,053*/ 10, 0x00, + /* RLE: 018 Pixels @ 057,053*/ 18, 0x01, + /* RLE: 020 Pixels @ 075,053*/ 20, 0x00, + /* RLE: 016 Pixels @ 095,053*/ 16, 0x01, + /* RLE: 007 Pixels @ 111,053*/ 7, 0x00, + /* RLE: 013 Pixels @ 118,053*/ 13, 0x01, + /* RLE: 031 Pixels @ 131,053*/ 31, 0x00, + /* RLE: 046 Pixels @ 002,054*/ 46, 0x01, + /* RLE: 008 Pixels @ 048,054*/ 8, 0x00, + /* RLE: 020 Pixels @ 056,054*/ 20, 0x01, + /* RLE: 018 Pixels @ 076,054*/ 18, 0x00, + /* RLE: 015 Pixels @ 094,054*/ 15, 0x01, + /* RLE: 008 Pixels @ 109,054*/ 8, 0x00, + /* RLE: 016 Pixels @ 117,054*/ 16, 0x01, + /* RLE: 028 Pixels @ 133,054*/ 28, 0x00, + /* RLE: 049 Pixels @ 001,055*/ 49, 0x01, + /* RLE: 005 Pixels @ 050,055*/ 5, 0x00, + /* RLE: 021 Pixels @ 055,055*/ 21, 0x01, + /* RLE: 003 Pixels @ 076,055*/ 3, 0x00, + /* RLE: 030 Pixels @ 079,055*/ 30, 0x01, + /* RLE: 006 Pixels @ 109,055*/ 6, 0x00, + /* RLE: 018 Pixels @ 115,055*/ 18, 0x01, + /* RLE: 027 Pixels @ 133,055*/ 27, 0x00, + /* RLE: 028 Pixels @ 000,056*/ 28, 0x01, + /* RLE: 012 Pixels @ 028,056*/ 12, 0x00, + /* RLE: 011 Pixels @ 040,056*/ 11, 0x01, + /* RLE: 003 Pixels @ 051,056*/ 3, 0x00, + /* RLE: 054 Pixels @ 054,056*/ 54, 0x01, + /* RLE: 006 Pixels @ 108,056*/ 6, 0x00, + /* RLE: 020 Pixels @ 114,056*/ 20, 0x01, + /* RLE: 026 Pixels @ 134,056*/ 26, 0x00, + /* RLE: 025 Pixels @ 000,057*/ 25, 0x01, + /* RLE: 018 Pixels @ 025,057*/ 18, 0x00, + /* RLE: 009 Pixels @ 043,057*/ 9, 0x01, + /* ABS: 002 Pixels @ 052,057*/ 0, 2, 0x00, + /* RLE: 053 Pixels @ 054,057*/ 53, 0x01, + /* RLE: 005 Pixels @ 107,057*/ 5, 0x00, + /* RLE: 023 Pixels @ 112,057*/ 23, 0x01, + /* RLE: 025 Pixels @ 135,057*/ 25, 0x00, + /* RLE: 023 Pixels @ 000,058*/ 23, 0x01, + /* RLE: 022 Pixels @ 023,058*/ 22, 0x00, + /* RLE: 061 Pixels @ 045,058*/ 61, 0x01, + /* RLE: 005 Pixels @ 106,058*/ 5, 0x00, + /* RLE: 024 Pixels @ 111,058*/ 24, 0x01, + /* RLE: 025 Pixels @ 135,058*/ 25, 0x00, + /* RLE: 021 Pixels @ 000,059*/ 21, 0x01, + /* RLE: 026 Pixels @ 021,059*/ 26, 0x00, + /* RLE: 058 Pixels @ 047,059*/ 58, 0x01, + /* RLE: 004 Pixels @ 105,059*/ 4, 0x00, + /* RLE: 027 Pixels @ 109,059*/ 27, 0x01, + /* RLE: 024 Pixels @ 136,059*/ 24, 0x00, + /* RLE: 019 Pixels @ 000,060*/ 19, 0x01, + /* RLE: 029 Pixels @ 019,060*/ 29, 0x00, + /* RLE: 059 Pixels @ 048,060*/ 59, 0x01, + /* RLE: 001 Pixels @ 107,060*/ 1, 0x00, + /* RLE: 029 Pixels @ 108,060*/ 29, 0x01, + /* RLE: 023 Pixels @ 137,060*/ 23, 0x00, + /* RLE: 017 Pixels @ 000,061*/ 17, 0x01, + /* RLE: 033 Pixels @ 017,061*/ 33, 0x00, + /* RLE: 030 Pixels @ 050,061*/ 30, 0x01, + /* RLE: 004 Pixels @ 080,061*/ 4, 0x03, + /* RLE: 053 Pixels @ 084,061*/ 53, 0x01, + /* RLE: 023 Pixels @ 137,061*/ 23, 0x00, + /* RLE: 015 Pixels @ 000,062*/ 15, 0x01, + /* RLE: 036 Pixels @ 015,062*/ 36, 0x00, + /* RLE: 028 Pixels @ 051,062*/ 28, 0x01, + /* RLE: 005 Pixels @ 079,062*/ 5, 0x03, + /* RLE: 038 Pixels @ 084,062*/ 38, 0x01, + /* RLE: 001 Pixels @ 122,062*/ 1, 0x00, + /* RLE: 014 Pixels @ 123,062*/ 14, 0x01, + /* RLE: 024 Pixels @ 137,062*/ 24, 0x00, + /* RLE: 012 Pixels @ 001,063*/ 12, 0x01, + /* RLE: 038 Pixels @ 013,063*/ 38, 0x00, + /* RLE: 027 Pixels @ 051,063*/ 27, 0x01, + /* RLE: 006 Pixels @ 078,063*/ 6, 0x03, + /* RLE: 009 Pixels @ 084,063*/ 9, 0x01, + /* RLE: 005 Pixels @ 093,063*/ 5, 0x02, + /* RLE: 023 Pixels @ 098,063*/ 23, 0x01, + /* ABS: 002 Pixels @ 121,063*/ 0, 2, 0x00, + /* RLE: 015 Pixels @ 123,063*/ 15, 0x01, + /* RLE: 025 Pixels @ 138,063*/ 25, 0x00, + /* RLE: 007 Pixels @ 003,064*/ 7, 0x01, + /* RLE: 041 Pixels @ 010,064*/ 41, 0x00, + /* RLE: 027 Pixels @ 051,064*/ 27, 0x01, + /* RLE: 006 Pixels @ 078,064*/ 6, 0x03, + /* RLE: 008 Pixels @ 084,064*/ 8, 0x01, + /* RLE: 011 Pixels @ 092,064*/ 11, 0x02, + /* RLE: 017 Pixels @ 103,064*/ 17, 0x01, + /* RLE: 004 Pixels @ 120,064*/ 4, 0x00, + /* RLE: 014 Pixels @ 124,064*/ 14, 0x01, + /* RLE: 072 Pixels @ 138,064*/ 72, 0x00, + /* RLE: 028 Pixels @ 050,065*/ 28, 0x01, + /* RLE: 006 Pixels @ 078,065*/ 6, 0x03, + /* RLE: 006 Pixels @ 084,065*/ 6, 0x01, + /* RLE: 015 Pixels @ 090,065*/ 15, 0x02, + /* RLE: 014 Pixels @ 105,065*/ 14, 0x01, + /* RLE: 006 Pixels @ 119,065*/ 6, 0x00, + /* RLE: 013 Pixels @ 125,065*/ 13, 0x01, + /* RLE: 072 Pixels @ 138,065*/ 72, 0x00, + /* RLE: 028 Pixels @ 050,066*/ 28, 0x01, + /* RLE: 006 Pixels @ 078,066*/ 6, 0x03, + /* RLE: 006 Pixels @ 084,066*/ 6, 0x01, + /* RLE: 017 Pixels @ 090,066*/ 17, 0x02, + /* RLE: 012 Pixels @ 107,066*/ 12, 0x01, + /* RLE: 007 Pixels @ 119,066*/ 7, 0x00, + /* RLE: 013 Pixels @ 126,066*/ 13, 0x01, + /* RLE: 006 Pixels @ 139,066*/ 6, 0x00, + /* ABS: 002 Pixels @ 145,066*/ 0, 2, 0x11, + /* RLE: 063 Pixels @ 147,066*/ 63, 0x00, + /* RLE: 028 Pixels @ 050,067*/ 28, 0x01, + /* RLE: 005 Pixels @ 078,067*/ 5, 0x03, + /* RLE: 006 Pixels @ 083,067*/ 6, 0x01, + /* RLE: 011 Pixels @ 089,067*/ 11, 0x02, + /* ABS: 002 Pixels @ 100,067*/ 0, 2, 0x11, + /* RLE: 006 Pixels @ 102,067*/ 6, 0x02, + /* RLE: 010 Pixels @ 108,067*/ 10, 0x01, + /* RLE: 009 Pixels @ 118,067*/ 9, 0x00, + /* RLE: 013 Pixels @ 127,067*/ 13, 0x01, + /* RLE: 004 Pixels @ 140,067*/ 4, 0x00, + /* RLE: 004 Pixels @ 144,067*/ 4, 0x01, + /* RLE: 062 Pixels @ 148,067*/ 62, 0x00, + /* RLE: 038 Pixels @ 050,068*/ 38, 0x01, + /* RLE: 010 Pixels @ 088,068*/ 10, 0x02, + /* RLE: 006 Pixels @ 098,068*/ 6, 0x01, + /* RLE: 006 Pixels @ 104,068*/ 6, 0x02, + /* RLE: 007 Pixels @ 110,068*/ 7, 0x01, + /* RLE: 012 Pixels @ 117,068*/ 12, 0x00, + /* RLE: 012 Pixels @ 129,068*/ 12, 0x01, + /* RLE: 003 Pixels @ 141,068*/ 3, 0x00, + /* RLE: 004 Pixels @ 144,068*/ 4, 0x01, + /* RLE: 062 Pixels @ 148,068*/ 62, 0x00, + /* RLE: 038 Pixels @ 050,069*/ 38, 0x01, + /* RLE: 009 Pixels @ 088,069*/ 9, 0x02, + /* RLE: 008 Pixels @ 097,069*/ 8, 0x01, + /* RLE: 006 Pixels @ 105,069*/ 6, 0x02, + /* RLE: 007 Pixels @ 111,069*/ 7, 0x01, + /* RLE: 013 Pixels @ 118,069*/ 13, 0x00, + /* RLE: 011 Pixels @ 131,069*/ 11, 0x01, + /* RLE: 001 Pixels @ 142,069*/ 1, 0x00, + /* RLE: 006 Pixels @ 143,069*/ 6, 0x01, + /* RLE: 061 Pixels @ 149,069*/ 61, 0x00, + /* RLE: 037 Pixels @ 050,070*/ 37, 0x01, + /* RLE: 009 Pixels @ 087,070*/ 9, 0x02, + /* RLE: 010 Pixels @ 096,070*/ 10, 0x01, + /* RLE: 006 Pixels @ 106,070*/ 6, 0x02, + /* RLE: 006 Pixels @ 112,070*/ 6, 0x01, + /* RLE: 010 Pixels @ 118,070*/ 10, 0x00, + /* RLE: 021 Pixels @ 128,070*/ 21, 0x01, + /* RLE: 061 Pixels @ 149,070*/ 61, 0x00, + /* RLE: 037 Pixels @ 050,071*/ 37, 0x01, + /* RLE: 008 Pixels @ 087,071*/ 8, 0x02, + /* RLE: 012 Pixels @ 095,071*/ 12, 0x01, + /* RLE: 006 Pixels @ 107,071*/ 6, 0x02, + /* RLE: 006 Pixels @ 113,071*/ 6, 0x01, + /* RLE: 007 Pixels @ 119,071*/ 7, 0x00, + /* RLE: 023 Pixels @ 126,071*/ 23, 0x01, + /* RLE: 061 Pixels @ 149,071*/ 61, 0x00, + /* RLE: 037 Pixels @ 050,072*/ 37, 0x01, + /* RLE: 008 Pixels @ 087,072*/ 8, 0x02, + /* RLE: 012 Pixels @ 095,072*/ 12, 0x01, + /* RLE: 007 Pixels @ 107,072*/ 7, 0x02, + /* RLE: 006 Pixels @ 114,072*/ 6, 0x01, + /* RLE: 005 Pixels @ 120,072*/ 5, 0x00, + /* RLE: 025 Pixels @ 125,072*/ 25, 0x01, + /* RLE: 060 Pixels @ 150,072*/ 60, 0x00, + /* RLE: 036 Pixels @ 050,073*/ 36, 0x01, + /* RLE: 008 Pixels @ 086,073*/ 8, 0x02, + /* RLE: 014 Pixels @ 094,073*/ 14, 0x01, + /* RLE: 007 Pixels @ 108,073*/ 7, 0x02, + /* RLE: 006 Pixels @ 115,073*/ 6, 0x01, + /* ABS: 002 Pixels @ 121,073*/ 0, 2, 0x00, + /* RLE: 027 Pixels @ 123,073*/ 27, 0x01, + /* RLE: 060 Pixels @ 150,073*/ 60, 0x00, + /* RLE: 037 Pixels @ 050,074*/ 37, 0x01, + /* RLE: 007 Pixels @ 087,074*/ 7, 0x02, + /* RLE: 014 Pixels @ 094,074*/ 14, 0x01, + /* RLE: 007 Pixels @ 108,074*/ 7, 0x02, + /* RLE: 006 Pixels @ 115,074*/ 6, 0x01, + /* RLE: 001 Pixels @ 121,074*/ 1, 0x00, + /* RLE: 028 Pixels @ 122,074*/ 28, 0x01, + /* RLE: 062 Pixels @ 150,074*/ 62, 0x00, + /* RLE: 013 Pixels @ 052,075*/ 13, 0x01, + /* RLE: 004 Pixels @ 065,075*/ 4, 0x03, + /* RLE: 018 Pixels @ 069,075*/ 18, 0x01, + /* RLE: 008 Pixels @ 087,075*/ 8, 0x02, + /* RLE: 013 Pixels @ 095,075*/ 13, 0x01, + /* RLE: 008 Pixels @ 108,075*/ 8, 0x02, + /* RLE: 033 Pixels @ 116,075*/ 33, 0x01, + /* RLE: 068 Pixels @ 149,075*/ 68, 0x00, + /* RLE: 007 Pixels @ 057,076*/ 7, 0x01, + /* RLE: 006 Pixels @ 064,076*/ 6, 0x03, + /* RLE: 018 Pixels @ 070,076*/ 18, 0x01, + /* RLE: 007 Pixels @ 088,076*/ 7, 0x02, + /* RLE: 013 Pixels @ 095,076*/ 13, 0x01, + /* RLE: 009 Pixels @ 108,076*/ 9, 0x02, + /* RLE: 019 Pixels @ 117,076*/ 19, 0x01, + /* RLE: 003 Pixels @ 136,076*/ 3, 0x00, + /* RLE: 009 Pixels @ 139,076*/ 9, 0x01, + /* RLE: 069 Pixels @ 148,076*/ 69, 0x00, + /* RLE: 007 Pixels @ 057,077*/ 7, 0x01, + /* RLE: 006 Pixels @ 064,077*/ 6, 0x03, + /* RLE: 019 Pixels @ 070,077*/ 19, 0x01, + /* RLE: 007 Pixels @ 089,077*/ 7, 0x02, + /* RLE: 012 Pixels @ 096,077*/ 12, 0x01, + /* RLE: 009 Pixels @ 108,077*/ 9, 0x02, + /* RLE: 017 Pixels @ 117,077*/ 17, 0x01, + /* RLE: 006 Pixels @ 134,077*/ 6, 0x00, + /* RLE: 008 Pixels @ 140,077*/ 8, 0x01, + /* RLE: 069 Pixels @ 148,077*/ 69, 0x00, + /* RLE: 007 Pixels @ 057,078*/ 7, 0x01, + /* RLE: 006 Pixels @ 064,078*/ 6, 0x03, + /* RLE: 020 Pixels @ 070,078*/ 20, 0x01, + /* RLE: 007 Pixels @ 090,078*/ 7, 0x02, + /* RLE: 011 Pixels @ 097,078*/ 11, 0x01, + /* RLE: 010 Pixels @ 108,078*/ 10, 0x02, + /* RLE: 015 Pixels @ 118,078*/ 15, 0x01, + /* RLE: 008 Pixels @ 133,078*/ 8, 0x00, + /* RLE: 007 Pixels @ 141,078*/ 7, 0x01, + /* RLE: 069 Pixels @ 148,078*/ 69, 0x00, + /* RLE: 007 Pixels @ 057,079*/ 7, 0x01, + /* RLE: 005 Pixels @ 064,079*/ 5, 0x03, + /* RLE: 013 Pixels @ 069,079*/ 13, 0x01, + /* RLE: 001 Pixels @ 082,079*/ 1, 0x02, + /* RLE: 008 Pixels @ 083,079*/ 8, 0x01, + /* RLE: 007 Pixels @ 091,079*/ 7, 0x02, + /* RLE: 010 Pixels @ 098,079*/ 10, 0x01, + /* RLE: 010 Pixels @ 108,079*/ 10, 0x02, + /* RLE: 014 Pixels @ 118,079*/ 14, 0x01, + /* RLE: 010 Pixels @ 132,079*/ 10, 0x00, + /* RLE: 006 Pixels @ 142,079*/ 6, 0x01, + /* RLE: 069 Pixels @ 148,079*/ 69, 0x00, + /* RLE: 007 Pixels @ 057,080*/ 7, 0x01, + /* RLE: 005 Pixels @ 064,080*/ 5, 0x03, + /* RLE: 008 Pixels @ 069,080*/ 8, 0x01, + /* RLE: 008 Pixels @ 077,080*/ 8, 0x02, + /* RLE: 007 Pixels @ 085,080*/ 7, 0x01, + /* RLE: 008 Pixels @ 092,080*/ 8, 0x02, + /* RLE: 007 Pixels @ 100,080*/ 7, 0x01, + /* RLE: 012 Pixels @ 107,080*/ 12, 0x02, + /* RLE: 012 Pixels @ 119,080*/ 12, 0x01, + /* RLE: 011 Pixels @ 131,080*/ 11, 0x00, + /* RLE: 007 Pixels @ 142,080*/ 7, 0x01, + /* RLE: 067 Pixels @ 149,080*/ 67, 0x00, + /* RLE: 008 Pixels @ 056,081*/ 8, 0x01, + /* RLE: 004 Pixels @ 064,081*/ 4, 0x03, + /* RLE: 006 Pixels @ 068,081*/ 6, 0x01, + /* RLE: 013 Pixels @ 074,081*/ 13, 0x02, + /* RLE: 007 Pixels @ 087,081*/ 7, 0x01, + /* RLE: 025 Pixels @ 094,081*/ 25, 0x02, + /* RLE: 011 Pixels @ 119,081*/ 11, 0x01, + /* RLE: 013 Pixels @ 130,081*/ 13, 0x00, + /* RLE: 006 Pixels @ 143,081*/ 6, 0x01, + /* RLE: 067 Pixels @ 149,081*/ 67, 0x00, + /* RLE: 016 Pixels @ 056,082*/ 16, 0x01, + /* RLE: 016 Pixels @ 072,082*/ 16, 0x02, + /* RLE: 007 Pixels @ 088,082*/ 7, 0x01, + /* RLE: 016 Pixels @ 095,082*/ 16, 0x02, + /* RLE: 005 Pixels @ 111,082*/ 5, 0x01, + /* RLE: 004 Pixels @ 116,082*/ 4, 0x02, + /* RLE: 009 Pixels @ 120,082*/ 9, 0x01, + /* RLE: 014 Pixels @ 129,082*/ 14, 0x00, + /* RLE: 007 Pixels @ 143,082*/ 7, 0x01, + /* RLE: 006 Pixels @ 150,082*/ 6, 0x00, + /* ABS: 002 Pixels @ 156,082*/ 0, 2, 0x11, + /* RLE: 058 Pixels @ 158,082*/ 58, 0x00, + /* RLE: 014 Pixels @ 056,083*/ 14, 0x01, + /* RLE: 019 Pixels @ 070,083*/ 19, 0x02, + /* RLE: 007 Pixels @ 089,083*/ 7, 0x01, + /* RLE: 013 Pixels @ 096,083*/ 13, 0x02, + /* RLE: 008 Pixels @ 109,083*/ 8, 0x01, + /* RLE: 003 Pixels @ 117,083*/ 3, 0x02, + /* RLE: 009 Pixels @ 120,083*/ 9, 0x01, + /* RLE: 015 Pixels @ 129,083*/ 15, 0x00, + /* RLE: 007 Pixels @ 144,083*/ 7, 0x01, + /* RLE: 004 Pixels @ 151,083*/ 4, 0x00, + /* RLE: 003 Pixels @ 155,083*/ 3, 0x01, + /* RLE: 058 Pixels @ 158,083*/ 58, 0x00, + /* RLE: 013 Pixels @ 056,084*/ 13, 0x01, + /* RLE: 007 Pixels @ 069,084*/ 7, 0x02, + /* RLE: 007 Pixels @ 076,084*/ 7, 0x01, + /* RLE: 007 Pixels @ 083,084*/ 7, 0x02, + /* RLE: 007 Pixels @ 090,084*/ 7, 0x01, + /* RLE: 011 Pixels @ 097,084*/ 11, 0x02, + /* RLE: 010 Pixels @ 108,084*/ 10, 0x01, + /* RLE: 003 Pixels @ 118,084*/ 3, 0x02, + /* RLE: 007 Pixels @ 121,084*/ 7, 0x01, + /* RLE: 016 Pixels @ 128,084*/ 16, 0x00, + /* RLE: 007 Pixels @ 144,084*/ 7, 0x01, + /* RLE: 004 Pixels @ 151,084*/ 4, 0x00, + /* RLE: 004 Pixels @ 155,084*/ 4, 0x01, + /* RLE: 057 Pixels @ 159,084*/ 57, 0x00, + /* RLE: 012 Pixels @ 056,085*/ 12, 0x01, + /* RLE: 007 Pixels @ 068,085*/ 7, 0x02, + /* RLE: 009 Pixels @ 075,085*/ 9, 0x01, + /* RLE: 008 Pixels @ 084,085*/ 8, 0x02, + /* RLE: 006 Pixels @ 092,085*/ 6, 0x01, + /* RLE: 009 Pixels @ 098,085*/ 9, 0x02, + /* RLE: 011 Pixels @ 107,085*/ 11, 0x01, + /* RLE: 003 Pixels @ 118,085*/ 3, 0x02, + /* RLE: 006 Pixels @ 121,085*/ 6, 0x01, + /* RLE: 018 Pixels @ 127,085*/ 18, 0x00, + /* RLE: 008 Pixels @ 145,085*/ 8, 0x01, + /* RLE: 001 Pixels @ 153,085*/ 1, 0x00, + /* RLE: 006 Pixels @ 154,085*/ 6, 0x01, + /* RLE: 056 Pixels @ 000,086*/ 56, 0x00, + /* RLE: 012 Pixels @ 056,086*/ 12, 0x01, + /* RLE: 006 Pixels @ 068,086*/ 6, 0x02, + /* RLE: 010 Pixels @ 074,086*/ 10, 0x01, + /* RLE: 009 Pixels @ 084,086*/ 9, 0x02, + /* RLE: 006 Pixels @ 093,086*/ 6, 0x01, + /* RLE: 008 Pixels @ 099,086*/ 8, 0x02, + /* RLE: 012 Pixels @ 107,086*/ 12, 0x01, + /* RLE: 003 Pixels @ 119,086*/ 3, 0x02, + /* RLE: 005 Pixels @ 122,086*/ 5, 0x01, + /* RLE: 018 Pixels @ 127,086*/ 18, 0x00, + /* RLE: 015 Pixels @ 145,086*/ 15, 0x01, + /* RLE: 056 Pixels @ 000,087*/ 56, 0x00, + /* RLE: 011 Pixels @ 056,087*/ 11, 0x01, + /* RLE: 006 Pixels @ 067,087*/ 6, 0x02, + /* RLE: 012 Pixels @ 073,087*/ 12, 0x01, + /* RLE: 009 Pixels @ 085,087*/ 9, 0x02, + /* RLE: 007 Pixels @ 094,087*/ 7, 0x01, + /* RLE: 005 Pixels @ 101,087*/ 5, 0x02, + /* RLE: 013 Pixels @ 106,087*/ 13, 0x01, + /* RLE: 003 Pixels @ 119,087*/ 3, 0x02, + /* RLE: 005 Pixels @ 122,087*/ 5, 0x01, + /* RLE: 019 Pixels @ 127,087*/ 19, 0x00, + /* RLE: 014 Pixels @ 146,087*/ 14, 0x01, + /* RLE: 056 Pixels @ 000,088*/ 56, 0x00, + /* RLE: 011 Pixels @ 056,088*/ 11, 0x01, + /* RLE: 006 Pixels @ 067,088*/ 6, 0x02, + /* RLE: 012 Pixels @ 073,088*/ 12, 0x01, + /* RLE: 010 Pixels @ 085,088*/ 10, 0x02, + /* RLE: 007 Pixels @ 095,088*/ 7, 0x01, + /* RLE: 004 Pixels @ 102,088*/ 4, 0x02, + /* RLE: 013 Pixels @ 106,088*/ 13, 0x01, + /* RLE: 003 Pixels @ 119,088*/ 3, 0x02, + /* RLE: 006 Pixels @ 122,088*/ 6, 0x01, + /* RLE: 018 Pixels @ 128,088*/ 18, 0x00, + /* RLE: 014 Pixels @ 146,088*/ 14, 0x01, + /* RLE: 056 Pixels @ 000,089*/ 56, 0x00, + /* RLE: 010 Pixels @ 056,089*/ 10, 0x01, + /* RLE: 007 Pixels @ 066,089*/ 7, 0x02, + /* RLE: 013 Pixels @ 073,089*/ 13, 0x01, + /* RLE: 010 Pixels @ 086,089*/ 10, 0x02, + /* RLE: 007 Pixels @ 096,089*/ 7, 0x01, + /* RLE: 004 Pixels @ 103,089*/ 4, 0x02, + /* RLE: 012 Pixels @ 107,089*/ 12, 0x01, + /* RLE: 004 Pixels @ 119,089*/ 4, 0x02, + /* RLE: 005 Pixels @ 123,089*/ 5, 0x01, + /* RLE: 019 Pixels @ 128,089*/ 19, 0x00, + /* RLE: 013 Pixels @ 147,089*/ 13, 0x01, + /* RLE: 056 Pixels @ 000,090*/ 56, 0x00, + /* RLE: 010 Pixels @ 056,090*/ 10, 0x01, + /* RLE: 007 Pixels @ 066,090*/ 7, 0x02, + /* RLE: 013 Pixels @ 073,090*/ 13, 0x01, + /* RLE: 011 Pixels @ 086,090*/ 11, 0x02, + /* RLE: 007 Pixels @ 097,090*/ 7, 0x01, + /* RLE: 003 Pixels @ 104,090*/ 3, 0x02, + /* RLE: 012 Pixels @ 107,090*/ 12, 0x01, + /* RLE: 004 Pixels @ 119,090*/ 4, 0x02, + /* RLE: 005 Pixels @ 123,090*/ 5, 0x01, + /* RLE: 020 Pixels @ 128,090*/ 20, 0x00, + /* RLE: 012 Pixels @ 148,090*/ 12, 0x01, + /* RLE: 055 Pixels @ 000,091*/ 55, 0x00, + /* RLE: 010 Pixels @ 055,091*/ 10, 0x01, + /* RLE: 008 Pixels @ 065,091*/ 8, 0x02, + /* RLE: 013 Pixels @ 073,091*/ 13, 0x01, + /* RLE: 011 Pixels @ 086,091*/ 11, 0x02, + /* RLE: 007 Pixels @ 097,091*/ 7, 0x01, + /* RLE: 003 Pixels @ 104,091*/ 3, 0x02, + /* RLE: 012 Pixels @ 107,091*/ 12, 0x01, + /* RLE: 004 Pixels @ 119,091*/ 4, 0x02, + /* RLE: 005 Pixels @ 123,091*/ 5, 0x01, + /* RLE: 021 Pixels @ 128,091*/ 21, 0x00, + /* RLE: 011 Pixels @ 149,091*/ 11, 0x01, + /* RLE: 053 Pixels @ 000,092*/ 53, 0x00, + /* RLE: 012 Pixels @ 053,092*/ 12, 0x01, + /* RLE: 008 Pixels @ 065,092*/ 8, 0x02, + /* RLE: 013 Pixels @ 073,092*/ 13, 0x01, + /* RLE: 012 Pixels @ 086,092*/ 12, 0x02, + /* RLE: 007 Pixels @ 098,092*/ 7, 0x01, + /* RLE: 003 Pixels @ 105,092*/ 3, 0x02, + /* RLE: 011 Pixels @ 108,092*/ 11, 0x01, + /* RLE: 004 Pixels @ 119,092*/ 4, 0x02, + /* RLE: 005 Pixels @ 123,092*/ 5, 0x01, + /* RLE: 023 Pixels @ 128,092*/ 23, 0x00, + /* RLE: 008 Pixels @ 151,092*/ 8, 0x01, + /* RLE: 052 Pixels @ 159,092*/ 52, 0x00, + /* RLE: 014 Pixels @ 051,093*/ 14, 0x01, + /* RLE: 009 Pixels @ 065,093*/ 9, 0x02, + /* RLE: 012 Pixels @ 074,093*/ 12, 0x01, + /* RLE: 013 Pixels @ 086,093*/ 13, 0x02, + /* RLE: 007 Pixels @ 099,093*/ 7, 0x01, + /* RLE: 003 Pixels @ 106,093*/ 3, 0x02, + /* RLE: 010 Pixels @ 109,093*/ 10, 0x01, + /* RLE: 005 Pixels @ 119,093*/ 5, 0x02, + /* RLE: 004 Pixels @ 124,093*/ 4, 0x01, + /* RLE: 025 Pixels @ 128,093*/ 25, 0x00, + /* RLE: 004 Pixels @ 153,093*/ 4, 0x01, + /* RLE: 052 Pixels @ 157,093*/ 52, 0x00, + /* RLE: 015 Pixels @ 049,094*/ 15, 0x01, + /* RLE: 011 Pixels @ 064,094*/ 11, 0x02, + /* RLE: 011 Pixels @ 075,094*/ 11, 0x01, + /* RLE: 014 Pixels @ 086,094*/ 14, 0x02, + /* RLE: 006 Pixels @ 100,094*/ 6, 0x01, + /* RLE: 004 Pixels @ 106,094*/ 4, 0x02, + /* RLE: 008 Pixels @ 110,094*/ 8, 0x01, + /* RLE: 006 Pixels @ 118,094*/ 6, 0x02, + /* RLE: 005 Pixels @ 124,094*/ 5, 0x01, + /* RLE: 079 Pixels @ 129,094*/ 79, 0x00, + /* RLE: 016 Pixels @ 048,095*/ 16, 0x01, + /* RLE: 012 Pixels @ 064,095*/ 12, 0x02, + /* RLE: 010 Pixels @ 076,095*/ 10, 0x01, + /* RLE: 015 Pixels @ 086,095*/ 15, 0x02, + /* RLE: 006 Pixels @ 101,095*/ 6, 0x01, + /* RLE: 004 Pixels @ 107,095*/ 4, 0x02, + /* RLE: 007 Pixels @ 111,095*/ 7, 0x01, + /* RLE: 006 Pixels @ 118,095*/ 6, 0x02, + /* RLE: 005 Pixels @ 124,095*/ 5, 0x01, + /* RLE: 077 Pixels @ 129,095*/ 77, 0x00, + /* RLE: 018 Pixels @ 046,096*/ 18, 0x01, + /* RLE: 014 Pixels @ 064,096*/ 14, 0x02, + /* RLE: 007 Pixels @ 078,096*/ 7, 0x01, + /* RLE: 016 Pixels @ 085,096*/ 16, 0x02, + /* RLE: 007 Pixels @ 101,096*/ 7, 0x01, + /* RLE: 005 Pixels @ 108,096*/ 5, 0x02, + /* RLE: 004 Pixels @ 113,096*/ 4, 0x01, + /* RLE: 007 Pixels @ 117,096*/ 7, 0x02, + /* RLE: 005 Pixels @ 124,096*/ 5, 0x01, + /* RLE: 076 Pixels @ 129,096*/ 76, 0x00, + /* RLE: 019 Pixels @ 045,097*/ 19, 0x01, + /* RLE: 016 Pixels @ 064,097*/ 16, 0x02, + /* RLE: 004 Pixels @ 080,097*/ 4, 0x01, + /* RLE: 018 Pixels @ 084,097*/ 18, 0x02, + /* RLE: 006 Pixels @ 102,097*/ 6, 0x01, + /* RLE: 016 Pixels @ 108,097*/ 16, 0x02, + /* RLE: 005 Pixels @ 124,097*/ 5, 0x01, + /* RLE: 075 Pixels @ 129,097*/ 75, 0x00, + /* RLE: 020 Pixels @ 044,098*/ 20, 0x01, + /* RLE: 028 Pixels @ 064,098*/ 28, 0x02, + /* RLE: 005 Pixels @ 092,098*/ 5, 0x01, + /* RLE: 005 Pixels @ 097,098*/ 5, 0x02, + /* RLE: 007 Pixels @ 102,098*/ 7, 0x01, + /* RLE: 015 Pixels @ 109,098*/ 15, 0x02, + /* RLE: 005 Pixels @ 124,098*/ 5, 0x01, + /* RLE: 074 Pixels @ 129,098*/ 74, 0x00, + /* RLE: 021 Pixels @ 043,099*/ 21, 0x01, + /* RLE: 027 Pixels @ 064,099*/ 27, 0x02, + /* RLE: 008 Pixels @ 091,099*/ 8, 0x01, + /* RLE: 004 Pixels @ 099,099*/ 4, 0x02, + /* RLE: 007 Pixels @ 103,099*/ 7, 0x01, + /* RLE: 014 Pixels @ 110,099*/ 14, 0x02, + /* RLE: 005 Pixels @ 124,099*/ 5, 0x01, + /* RLE: 073 Pixels @ 129,099*/ 73, 0x00, + /* RLE: 022 Pixels @ 042,100*/ 22, 0x01, + /* RLE: 026 Pixels @ 064,100*/ 26, 0x02, + /* RLE: 009 Pixels @ 090,100*/ 9, 0x01, + /* RLE: 005 Pixels @ 099,100*/ 5, 0x02, + /* RLE: 006 Pixels @ 104,100*/ 6, 0x01, + /* RLE: 014 Pixels @ 110,100*/ 14, 0x02, + /* RLE: 005 Pixels @ 124,100*/ 5, 0x01, + /* RLE: 072 Pixels @ 129,100*/ 72, 0x00, + /* RLE: 023 Pixels @ 041,101*/ 23, 0x01, + /* RLE: 025 Pixels @ 064,101*/ 25, 0x02, + /* RLE: 011 Pixels @ 089,101*/ 11, 0x01, + /* RLE: 004 Pixels @ 100,101*/ 4, 0x02, + /* RLE: 007 Pixels @ 104,101*/ 7, 0x01, + /* RLE: 013 Pixels @ 111,101*/ 13, 0x02, + /* RLE: 005 Pixels @ 124,101*/ 5, 0x01, + /* RLE: 071 Pixels @ 129,101*/ 71, 0x00, + /* RLE: 025 Pixels @ 040,102*/ 25, 0x01, + /* RLE: 015 Pixels @ 065,102*/ 15, 0x02, + /* ABS: 002 Pixels @ 080,102*/ 0, 2, 0x11, + /* RLE: 006 Pixels @ 082,102*/ 6, 0x02, + /* RLE: 012 Pixels @ 088,102*/ 12, 0x01, + /* RLE: 005 Pixels @ 100,102*/ 5, 0x02, + /* RLE: 006 Pixels @ 105,102*/ 6, 0x01, + /* RLE: 013 Pixels @ 111,102*/ 13, 0x02, + /* RLE: 005 Pixels @ 124,102*/ 5, 0x01, + /* RLE: 071 Pixels @ 129,102*/ 71, 0x00, + /* RLE: 015 Pixels @ 040,103*/ 15, 0x01, + /* RLE: 005 Pixels @ 055,103*/ 5, 0x00, + /* RLE: 005 Pixels @ 060,103*/ 5, 0x01, + /* RLE: 012 Pixels @ 065,103*/ 12, 0x02, + /* RLE: 007 Pixels @ 077,103*/ 7, 0x01, + /* RLE: 004 Pixels @ 084,103*/ 4, 0x02, + /* RLE: 013 Pixels @ 088,103*/ 13, 0x01, + /* RLE: 004 Pixels @ 101,103*/ 4, 0x02, + /* RLE: 007 Pixels @ 105,103*/ 7, 0x01, + /* RLE: 012 Pixels @ 112,103*/ 12, 0x02, + /* RLE: 005 Pixels @ 124,103*/ 5, 0x01, + /* RLE: 070 Pixels @ 129,103*/ 70, 0x00, + /* RLE: 013 Pixels @ 039,104*/ 13, 0x01, + /* RLE: 008 Pixels @ 052,104*/ 8, 0x00, + /* RLE: 005 Pixels @ 060,104*/ 5, 0x01, + /* RLE: 011 Pixels @ 065,104*/ 11, 0x02, + /* RLE: 009 Pixels @ 076,104*/ 9, 0x01, + /* RLE: 003 Pixels @ 085,104*/ 3, 0x02, + /* RLE: 013 Pixels @ 088,104*/ 13, 0x01, + /* RLE: 004 Pixels @ 101,104*/ 4, 0x02, + /* RLE: 007 Pixels @ 105,104*/ 7, 0x01, + /* RLE: 012 Pixels @ 112,104*/ 12, 0x02, + /* RLE: 004 Pixels @ 124,104*/ 4, 0x01, + /* RLE: 071 Pixels @ 128,104*/ 71, 0x00, + /* RLE: 010 Pixels @ 039,105*/ 10, 0x01, + /* RLE: 011 Pixels @ 049,105*/ 11, 0x00, + /* RLE: 006 Pixels @ 060,105*/ 6, 0x01, + /* RLE: 009 Pixels @ 066,105*/ 9, 0x02, + /* RLE: 011 Pixels @ 075,105*/ 11, 0x01, + /* ABS: 002 Pixels @ 086,105*/ 0, 2, 0x22, + /* RLE: 013 Pixels @ 088,105*/ 13, 0x01, + /* RLE: 005 Pixels @ 101,105*/ 5, 0x02, + /* RLE: 007 Pixels @ 106,105*/ 7, 0x01, + /* RLE: 010 Pixels @ 113,105*/ 10, 0x02, + /* RLE: 005 Pixels @ 123,105*/ 5, 0x01, + /* RLE: 071 Pixels @ 128,105*/ 71, 0x00, + /* RLE: 009 Pixels @ 039,106*/ 9, 0x01, + /* RLE: 013 Pixels @ 048,106*/ 13, 0x00, + /* RLE: 005 Pixels @ 061,106*/ 5, 0x01, + /* RLE: 009 Pixels @ 066,106*/ 9, 0x02, + /* RLE: 011 Pixels @ 075,106*/ 11, 0x01, + /* ABS: 002 Pixels @ 086,106*/ 0, 2, 0x22, + /* RLE: 013 Pixels @ 088,106*/ 13, 0x01, + /* RLE: 005 Pixels @ 101,106*/ 5, 0x02, + /* RLE: 007 Pixels @ 106,106*/ 7, 0x01, + /* RLE: 010 Pixels @ 113,106*/ 10, 0x02, + /* RLE: 005 Pixels @ 123,106*/ 5, 0x01, + /* RLE: 071 Pixels @ 128,106*/ 71, 0x00, + /* RLE: 008 Pixels @ 039,107*/ 8, 0x01, + /* RLE: 014 Pixels @ 047,107*/ 14, 0x00, + /* RLE: 006 Pixels @ 061,107*/ 6, 0x01, + /* RLE: 007 Pixels @ 067,107*/ 7, 0x02, + /* RLE: 013 Pixels @ 074,107*/ 13, 0x01, + /* ABS: 002 Pixels @ 087,107*/ 0, 2, 0x22, + /* RLE: 012 Pixels @ 089,107*/ 12, 0x01, + /* RLE: 005 Pixels @ 101,107*/ 5, 0x02, + /* RLE: 008 Pixels @ 106,107*/ 8, 0x01, + /* RLE: 008 Pixels @ 114,107*/ 8, 0x02, + /* RLE: 006 Pixels @ 122,107*/ 6, 0x01, + /* RLE: 071 Pixels @ 128,107*/ 71, 0x00, + /* RLE: 008 Pixels @ 039,108*/ 8, 0x01, + /* RLE: 015 Pixels @ 047,108*/ 15, 0x00, + /* RLE: 006 Pixels @ 062,108*/ 6, 0x01, + /* RLE: 006 Pixels @ 068,108*/ 6, 0x02, + /* RLE: 013 Pixels @ 074,108*/ 13, 0x01, + /* RLE: 003 Pixels @ 087,108*/ 3, 0x02, + /* RLE: 011 Pixels @ 090,108*/ 11, 0x01, + /* RLE: 006 Pixels @ 101,108*/ 6, 0x02, + /* RLE: 007 Pixels @ 107,108*/ 7, 0x01, + /* RLE: 008 Pixels @ 114,108*/ 8, 0x02, + /* RLE: 006 Pixels @ 122,108*/ 6, 0x01, + /* RLE: 071 Pixels @ 128,108*/ 71, 0x00, + /* RLE: 007 Pixels @ 039,109*/ 7, 0x01, + /* RLE: 017 Pixels @ 046,109*/ 17, 0x00, + /* RLE: 005 Pixels @ 063,109*/ 5, 0x01, + /* RLE: 006 Pixels @ 068,109*/ 6, 0x02, + /* RLE: 013 Pixels @ 074,109*/ 13, 0x01, + /* RLE: 004 Pixels @ 087,109*/ 4, 0x02, + /* RLE: 010 Pixels @ 091,109*/ 10, 0x01, + /* RLE: 006 Pixels @ 101,109*/ 6, 0x02, + /* RLE: 008 Pixels @ 107,109*/ 8, 0x01, + /* RLE: 006 Pixels @ 115,109*/ 6, 0x02, + /* RLE: 006 Pixels @ 121,109*/ 6, 0x01, + /* RLE: 072 Pixels @ 127,109*/ 72, 0x00, + /* RLE: 007 Pixels @ 039,110*/ 7, 0x01, + /* RLE: 015 Pixels @ 046,110*/ 15, 0x00, + /* RLE: 008 Pixels @ 061,110*/ 8, 0x01, + /* RLE: 005 Pixels @ 069,110*/ 5, 0x02, + /* RLE: 013 Pixels @ 074,110*/ 13, 0x01, + /* RLE: 005 Pixels @ 087,110*/ 5, 0x02, + /* RLE: 009 Pixels @ 092,110*/ 9, 0x01, + /* RLE: 006 Pixels @ 101,110*/ 6, 0x02, + /* RLE: 008 Pixels @ 107,110*/ 8, 0x01, + /* RLE: 005 Pixels @ 115,110*/ 5, 0x02, + /* RLE: 007 Pixels @ 120,110*/ 7, 0x01, + /* RLE: 072 Pixels @ 127,110*/ 72, 0x00, + /* RLE: 008 Pixels @ 039,111*/ 8, 0x01, + /* RLE: 012 Pixels @ 047,111*/ 12, 0x00, + /* RLE: 011 Pixels @ 059,111*/ 11, 0x01, + /* RLE: 005 Pixels @ 070,111*/ 5, 0x02, + /* RLE: 013 Pixels @ 075,111*/ 13, 0x01, + /* RLE: 006 Pixels @ 088,111*/ 6, 0x02, + /* RLE: 006 Pixels @ 094,111*/ 6, 0x01, + /* RLE: 007 Pixels @ 100,111*/ 7, 0x02, + /* RLE: 009 Pixels @ 107,111*/ 9, 0x01, + /* RLE: 003 Pixels @ 116,111*/ 3, 0x02, + /* RLE: 008 Pixels @ 119,111*/ 8, 0x01, + /* RLE: 073 Pixels @ 127,111*/ 73, 0x00, + /* RLE: 007 Pixels @ 040,112*/ 7, 0x01, + /* RLE: 011 Pixels @ 047,112*/ 11, 0x00, + /* RLE: 013 Pixels @ 058,112*/ 13, 0x01, + /* RLE: 004 Pixels @ 071,112*/ 4, 0x02, + /* RLE: 013 Pixels @ 075,112*/ 13, 0x01, + /* RLE: 019 Pixels @ 088,112*/ 19, 0x02, + /* RLE: 009 Pixels @ 107,112*/ 9, 0x01, + /* ABS: 002 Pixels @ 116,112*/ 0, 2, 0x22, + /* RLE: 008 Pixels @ 118,112*/ 8, 0x01, + /* RLE: 074 Pixels @ 126,112*/ 74, 0x00, + /* RLE: 008 Pixels @ 040,113*/ 8, 0x01, + /* RLE: 008 Pixels @ 048,113*/ 8, 0x00, + /* RLE: 016 Pixels @ 056,113*/ 16, 0x01, + /* RLE: 004 Pixels @ 072,113*/ 4, 0x02, + /* RLE: 011 Pixels @ 076,113*/ 11, 0x01, + /* RLE: 020 Pixels @ 087,113*/ 20, 0x02, + /* RLE: 019 Pixels @ 107,113*/ 19, 0x01, + /* RLE: 075 Pixels @ 126,113*/ 75, 0x00, + /* RLE: 008 Pixels @ 041,114*/ 8, 0x01, + /* RLE: 006 Pixels @ 049,114*/ 6, 0x00, + /* RLE: 018 Pixels @ 055,114*/ 18, 0x01, + /* RLE: 005 Pixels @ 073,114*/ 5, 0x02, + /* RLE: 009 Pixels @ 078,114*/ 9, 0x01, + /* RLE: 020 Pixels @ 087,114*/ 20, 0x02, + /* RLE: 018 Pixels @ 107,114*/ 18, 0x01, + /* RLE: 077 Pixels @ 125,114*/ 77, 0x00, + /* RLE: 007 Pixels @ 042,115*/ 7, 0x01, + /* RLE: 005 Pixels @ 049,115*/ 5, 0x00, + /* RLE: 020 Pixels @ 054,115*/ 20, 0x01, + /* RLE: 005 Pixels @ 074,115*/ 5, 0x02, + /* RLE: 008 Pixels @ 079,115*/ 8, 0x01, + /* RLE: 021 Pixels @ 087,115*/ 21, 0x02, + /* RLE: 017 Pixels @ 108,115*/ 17, 0x01, + /* RLE: 077 Pixels @ 125,115*/ 77, 0x00, + /* RLE: 008 Pixels @ 042,116*/ 8, 0x01, + /* RLE: 003 Pixels @ 050,116*/ 3, 0x00, + /* RLE: 022 Pixels @ 053,116*/ 22, 0x01, + /* RLE: 007 Pixels @ 075,116*/ 7, 0x02, + /* RLE: 003 Pixels @ 082,116*/ 3, 0x01, + /* RLE: 023 Pixels @ 085,116*/ 23, 0x02, + /* RLE: 016 Pixels @ 108,116*/ 16, 0x01, + /* RLE: 079 Pixels @ 124,116*/ 79, 0x00, + /* RLE: 008 Pixels @ 043,117*/ 8, 0x01, + /* RLE: 001 Pixels @ 051,117*/ 1, 0x00, + /* RLE: 024 Pixels @ 052,117*/ 24, 0x01, + /* RLE: 032 Pixels @ 076,117*/ 32, 0x02, + /* RLE: 016 Pixels @ 108,117*/ 16, 0x01, + /* RLE: 080 Pixels @ 124,117*/ 80, 0x00, + /* RLE: 035 Pixels @ 044,118*/ 35, 0x01, + /* RLE: 028 Pixels @ 079,118*/ 28, 0x02, + /* RLE: 016 Pixels @ 107,118*/ 16, 0x01, + /* RLE: 082 Pixels @ 123,118*/ 82, 0x00, + /* RLE: 025 Pixels @ 045,119*/ 25, 0x01, + /* RLE: 001 Pixels @ 070,119*/ 1, 0x00, + /* RLE: 008 Pixels @ 071,119*/ 8, 0x01, + /* RLE: 028 Pixels @ 079,119*/ 28, 0x02, + /* RLE: 006 Pixels @ 107,119*/ 6, 0x01, + /* RLE: 001 Pixels @ 113,119*/ 1, 0x00, + /* RLE: 008 Pixels @ 114,119*/ 8, 0x01, + /* RLE: 084 Pixels @ 122,119*/ 84, 0x00, + /* RLE: 019 Pixels @ 046,120*/ 19, 0x01, + /* RLE: 007 Pixels @ 065,120*/ 7, 0x00, + /* RLE: 009 Pixels @ 072,120*/ 9, 0x01, + /* RLE: 026 Pixels @ 081,120*/ 26, 0x02, + /* RLE: 005 Pixels @ 107,120*/ 5, 0x01, + /* RLE: 004 Pixels @ 112,120*/ 4, 0x00, + /* RLE: 005 Pixels @ 116,120*/ 5, 0x01, + /* RLE: 086 Pixels @ 121,120*/ 86, 0x00, + /* RLE: 015 Pixels @ 047,121*/ 15, 0x01, + /* RLE: 011 Pixels @ 062,121*/ 11, 0x00, + /* RLE: 010 Pixels @ 073,121*/ 10, 0x01, + /* RLE: 024 Pixels @ 083,121*/ 24, 0x02, + /* RLE: 005 Pixels @ 107,121*/ 5, 0x01, + /* RLE: 005 Pixels @ 112,121*/ 5, 0x00, + /* RLE: 004 Pixels @ 117,121*/ 4, 0x01, + /* RLE: 086 Pixels @ 121,121*/ 86, 0x00, + /* RLE: 013 Pixels @ 047,122*/ 13, 0x01, + /* RLE: 013 Pixels @ 060,122*/ 13, 0x00, + /* RLE: 012 Pixels @ 073,122*/ 12, 0x01, + /* RLE: 021 Pixels @ 085,122*/ 21, 0x02, + /* RLE: 006 Pixels @ 106,122*/ 6, 0x01, + /* RLE: 096 Pixels @ 112,122*/ 96, 0x00, + /* RLE: 010 Pixels @ 048,123*/ 10, 0x01, + /* RLE: 014 Pixels @ 058,123*/ 14, 0x00, + /* RLE: 014 Pixels @ 072,123*/ 14, 0x01, + /* RLE: 020 Pixels @ 086,123*/ 20, 0x02, + /* RLE: 007 Pixels @ 106,123*/ 7, 0x01, + /* RLE: 095 Pixels @ 113,123*/ 95, 0x00, + /* RLE: 009 Pixels @ 048,124*/ 9, 0x01, + /* RLE: 014 Pixels @ 057,124*/ 14, 0x00, + /* RLE: 019 Pixels @ 071,124*/ 19, 0x01, + /* RLE: 014 Pixels @ 090,124*/ 14, 0x02, + /* RLE: 009 Pixels @ 104,124*/ 9, 0x01, + /* RLE: 096 Pixels @ 113,124*/ 96, 0x00, + /* RLE: 008 Pixels @ 049,125*/ 8, 0x01, + /* RLE: 012 Pixels @ 057,125*/ 12, 0x00, + /* RLE: 025 Pixels @ 069,125*/ 25, 0x01, + /* RLE: 007 Pixels @ 094,125*/ 7, 0x02, + /* RLE: 012 Pixels @ 101,125*/ 12, 0x01, + /* RLE: 095 Pixels @ 113,125*/ 95, 0x00, + /* RLE: 008 Pixels @ 048,126*/ 8, 0x01, + /* RLE: 012 Pixels @ 056,126*/ 12, 0x00, + /* RLE: 045 Pixels @ 068,126*/ 45, 0x01, + /* RLE: 093 Pixels @ 113,126*/ 93, 0x00, + /* RLE: 010 Pixels @ 046,127*/ 10, 0x01, + /* RLE: 012 Pixels @ 056,127*/ 12, 0x00, + /* RLE: 044 Pixels @ 068,127*/ 44, 0x01, + /* RLE: 092 Pixels @ 112,127*/ 92, 0x00, + /* RLE: 013 Pixels @ 044,128*/ 13, 0x01, + /* RLE: 010 Pixels @ 057,128*/ 10, 0x00, + /* RLE: 044 Pixels @ 067,128*/ 44, 0x01, + /* RLE: 093 Pixels @ 111,128*/ 93, 0x00, + /* RLE: 013 Pixels @ 044,129*/ 13, 0x01, + /* RLE: 009 Pixels @ 057,129*/ 9, 0x00, + /* RLE: 018 Pixels @ 066,129*/ 18, 0x01, + /* RLE: 004 Pixels @ 084,129*/ 4, 0x00, + /* RLE: 020 Pixels @ 088,129*/ 20, 0x01, + /* RLE: 097 Pixels @ 108,129*/ 97, 0x00, + /* RLE: 013 Pixels @ 045,130*/ 13, 0x01, + /* RLE: 008 Pixels @ 058,130*/ 8, 0x00, + /* RLE: 013 Pixels @ 066,130*/ 13, 0x01, + /* RLE: 014 Pixels @ 079,130*/ 14, 0x00, + /* RLE: 010 Pixels @ 093,130*/ 10, 0x01, + /* RLE: 102 Pixels @ 103,130*/ 102, 0x00, + /* RLE: 013 Pixels @ 045,131*/ 13, 0x01, + /* RLE: 007 Pixels @ 058,131*/ 7, 0x00, + /* RLE: 011 Pixels @ 065,131*/ 11, 0x01, + /* RLE: 130 Pixels @ 076,131*/ 130, 0x00, + /* RLE: 013 Pixels @ 046,132*/ 13, 0x01, + /* RLE: 006 Pixels @ 059,132*/ 6, 0x00, + /* RLE: 010 Pixels @ 065,132*/ 10, 0x01, + /* RLE: 132 Pixels @ 075,132*/ 132, 0x00, + /* RLE: 013 Pixels @ 047,133*/ 13, 0x01, + /* RLE: 005 Pixels @ 060,133*/ 5, 0x00, + /* RLE: 009 Pixels @ 065,133*/ 9, 0x01, + /* RLE: 134 Pixels @ 074,133*/ 134, 0x00, + /* RLE: 013 Pixels @ 048,134*/ 13, 0x01, + /* RLE: 004 Pixels @ 061,134*/ 4, 0x00, + /* RLE: 008 Pixels @ 065,134*/ 8, 0x01, + /* RLE: 141 Pixels @ 073,134*/ 141, 0x00, + /* RLE: 008 Pixels @ 054,135*/ 8, 0x01, + /* RLE: 003 Pixels @ 062,135*/ 3, 0x00, + /* RLE: 007 Pixels @ 065,135*/ 7, 0x01, + /* RLE: 143 Pixels @ 072,135*/ 143, 0x00, + /* RLE: 008 Pixels @ 055,136*/ 8, 0x01, + /* ABS: 002 Pixels @ 063,136*/ 0, 2, 0x00, + /* RLE: 007 Pixels @ 065,136*/ 7, 0x01, + /* RLE: 144 Pixels @ 072,136*/ 144, 0x00, + /* RLE: 008 Pixels @ 056,137*/ 8, 0x01, + /* RLE: 001 Pixels @ 064,137*/ 1, 0x00, + /* RLE: 007 Pixels @ 065,137*/ 7, 0x01, + /* RLE: 145 Pixels @ 072,137*/ 145, 0x00, + /* RLE: 007 Pixels @ 057,138*/ 7, 0x01, + /* RLE: 001 Pixels @ 064,138*/ 1, 0x00, + /* RLE: 008 Pixels @ 065,138*/ 8, 0x01, + /* RLE: 144 Pixels @ 073,138*/ 144, 0x00, + /* RLE: 008 Pixels @ 057,139*/ 8, 0x01, + /* RLE: 001 Pixels @ 065,139*/ 1, 0x00, + /* RLE: 007 Pixels @ 066,139*/ 7, 0x01, + /* RLE: 145 Pixels @ 073,139*/ 145, 0x00, + /* RLE: 007 Pixels @ 058,140*/ 7, 0x01, + /* RLE: 001 Pixels @ 065,140*/ 1, 0x00, + /* RLE: 008 Pixels @ 066,140*/ 8, 0x01, + /* RLE: 144 Pixels @ 074,140*/ 144, 0x00, + /* RLE: 007 Pixels @ 058,141*/ 7, 0x01, + /* ABS: 002 Pixels @ 065,141*/ 0, 2, 0x00, + /* RLE: 008 Pixels @ 067,141*/ 8, 0x01, + /* RLE: 144 Pixels @ 075,141*/ 144, 0x00, + /* RLE: 006 Pixels @ 059,142*/ 6, 0x01, + /* RLE: 003 Pixels @ 065,142*/ 3, 0x00, + /* RLE: 008 Pixels @ 068,142*/ 8, 0x01, + /* RLE: 142 Pixels @ 076,142*/ 142, 0x00, + /* RLE: 007 Pixels @ 058,143*/ 7, 0x01, + /* RLE: 004 Pixels @ 065,143*/ 4, 0x00, + /* RLE: 008 Pixels @ 069,143*/ 8, 0x01, + /* RLE: 139 Pixels @ 077,143*/ 139, 0x00, + /* RLE: 010 Pixels @ 056,144*/ 10, 0x01, + /* RLE: 004 Pixels @ 066,144*/ 4, 0x00, + /* RLE: 008 Pixels @ 070,144*/ 8, 0x01, + /* RLE: 136 Pixels @ 078,144*/ 136, 0x00, + /* RLE: 012 Pixels @ 054,145*/ 12, 0x01, + /* RLE: 005 Pixels @ 066,145*/ 5, 0x00, + /* RLE: 008 Pixels @ 071,145*/ 8, 0x01, + /* RLE: 135 Pixels @ 079,145*/ 135, 0x00, + /* RLE: 011 Pixels @ 054,146*/ 11, 0x01, + /* RLE: 007 Pixels @ 065,146*/ 7, 0x00, + /* RLE: 007 Pixels @ 072,146*/ 7, 0x01, + /* RLE: 136 Pixels @ 079,146*/ 136, 0x00, + /* RLE: 010 Pixels @ 055,147*/ 10, 0x01, + /* RLE: 007 Pixels @ 065,147*/ 7, 0x00, + /* RLE: 008 Pixels @ 072,147*/ 8, 0x01, + /* RLE: 135 Pixels @ 080,147*/ 135, 0x00, + /* RLE: 010 Pixels @ 055,148*/ 10, 0x01, + /* RLE: 008 Pixels @ 065,148*/ 8, 0x00, + /* RLE: 007 Pixels @ 073,148*/ 7, 0x01, + /* RLE: 136 Pixels @ 080,148*/ 136, 0x00, + /* RLE: 009 Pixels @ 056,149*/ 9, 0x01, + /* RLE: 009 Pixels @ 065,149*/ 9, 0x00, + /* RLE: 007 Pixels @ 074,149*/ 7, 0x01, + /* RLE: 136 Pixels @ 081,149*/ 136, 0x00, + /* RLE: 007 Pixels @ 057,150*/ 7, 0x01, + /* RLE: 010 Pixels @ 064,150*/ 10, 0x00, + /* RLE: 007 Pixels @ 074,150*/ 7, 0x01, + /* RLE: 137 Pixels @ 081,150*/ 137, 0x00, + /* RLE: 005 Pixels @ 058,151*/ 5, 0x01, + /* RLE: 012 Pixels @ 063,151*/ 12, 0x00, + /* RLE: 006 Pixels @ 075,151*/ 6, 0x01, + /* RLE: 154 Pixels @ 081,151*/ 154, 0x00, + /* RLE: 006 Pixels @ 075,152*/ 6, 0x01, + /* RLE: 153 Pixels @ 081,152*/ 153, 0x00, + /* RLE: 008 Pixels @ 074,153*/ 8, 0x01, + /* RLE: 148 Pixels @ 082,153*/ 148, 0x00, + /* RLE: 012 Pixels @ 070,154*/ 12, 0x01, + /* RLE: 148 Pixels @ 082,154*/ 148, 0x00, + /* RLE: 012 Pixels @ 070,155*/ 12, 0x01, + /* RLE: 148 Pixels @ 082,155*/ 148, 0x00, + /* RLE: 011 Pixels @ 070,156*/ 11, 0x01, + /* RLE: 150 Pixels @ 081,156*/ 150, 0x00, + /* RLE: 010 Pixels @ 071,157*/ 10, 0x01, + /* RLE: 150 Pixels @ 081,157*/ 150, 0x00, + /* RLE: 010 Pixels @ 071,158*/ 10, 0x01, + /* RLE: 151 Pixels @ 081,158*/ 151, 0x00, + /* RLE: 008 Pixels @ 072,159*/ 8, 0x01, + /* RLE: 153 Pixels @ 080,159*/ 153, 0x00, + /* RLE: 006 Pixels @ 073,160*/ 6, 0x01, + /* RLE: 081 Pixels @ 079,160*/ 81, 0x00, + 0 +}; /* 1927 for 25760 pixels */ + +static const GUI_BITMAP _bmLadyBug = { + 160, /* XSize */ + 161, /* YSize */ + 40, /* BytesPerLine */ + GUI_COMPRESS_RLE4, /* BitsPerPixel */ + _acLadyBug, /* Pointer to picture data (indices) */ + &_PalLadyBug /* Pointer to palette */ + ,GUI_DRAW_RLE4 +}; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + #define MAG_FACTOR 3 +#else + #define MAG_FACTOR 2 +#endif + +/********************************************************************* +* +* _ShowMagnifiedBitmap +*/ +static void _ShowMagnifiedBitmap(void) { + int xCenter = LCD_XSIZE >> 1; + int yCenter = LCD_YSIZE >> 1; + int x0, y0; + x0 = xCenter - (GUIDEMO_bm4bpp.XSize >> 1) * MAG_FACTOR; + y0 = yCenter - (GUIDEMO_bm4bpp.YSize >> 1) * MAG_FACTOR; + GUI_DrawBitmapMag(&GUIDEMO_bm4bpp, x0, y0, MAG_FACTOR, MAG_FACTOR); + #if GUIDEMO_LARGE + GUI_DispStringHCenterAt("Bitmaps can be magnified...", xCenter, 100); + #else + GUI_DispStringAt("Bitmaps can be magnified...", 8, 10); + #endif +} + +#if GUIDEMO_LARGE + +/********************************************************************* +* +* _BitmapDemo (GUIDEMO_LARGE) +*/ +static void _BitmapDemo(void) { + int ix, iy; + GUI_DrawBitmap(&_bmLadyBug, 20, 50); + GUI_SetFont(&GUI_Font13_1); + GUI_DispStringAt("RLE Compressed bitmaps", 8, 10); + GUIDEMO_Wait(); + GUI_Clear(); + GUI_DispStringAt("1/2/4/8 bpp bitmaps", 8, 10); + GUI_DrawBitmap(&GUIDEMO_bm4bpp, 20, 50); + GUIDEMO_Delay(4000); + GUIDEMO_NotifyStartNext(); + /* Tile display with image */ + for (ix = 0; ix < LCD_XSIZE / GUIDEMO_bm4bpp.XSize + 1; ix++) { + for (iy = 0; iy < LCD_YSIZE / GUIDEMO_bm4bpp.YSize + 1; iy++) { + GUI_DrawBitmap(&GUIDEMO_bm4bpp, + GUIDEMO_bm4bpp.XSize * ix, + GUIDEMO_bm4bpp.YSize * iy); + } + } + GUIDEMO_Delay(2000); + GUIDEMO_NotifyStartNext(); + GUIDEMO_ShowInfo("Bitmaps may also be\nmagnified and rotated"); + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetFont(&GUI_Font16_1); + _ShowMagnifiedBitmap(); +} + +#else + +/********************************************************************* +* +* _BitmapDemo +*/ +static void _BitmapDemo(void) { + const GUI_BITMAP * pBm; + int TextModeOld = GUI_SetTextMode(GUI_TM_XOR); + GUI_SetFont(&GUI_Font8_ASCII); + pBm = &_bmLadyBug; + GUI_DrawBitmap(pBm, (LCD_XSIZE - (int)pBm->XSize) >> 1, (LCD_YSIZE - (int)pBm->YSize) >> 1); + GUI_DispStringAt("RLE Compressed bitmaps", 8, 10); + GUIDEMO_Wait(); + GUI_Clear(); + GUI_SetTextMode(GUI_TM_TRANS); + pBm = &GUIDEMO_bm4bpp; + GUI_DrawBitmap(pBm, (LCD_XSIZE - (int)pBm->XSize) >> 1, (LCD_YSIZE - (int)pBm->YSize) >> 1); + GUI_DispStringAt("1/2/4/8 bpp bitmaps", 8, 10); + GUIDEMO_Wait(); + GUI_Clear(); + _ShowMagnifiedBitmap(); + GUI_SetTextMode(TextModeOld); +} + +#endif + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIDEMO_Bitmap +*/ +void GUIDEMO_Bitmap(void) { + GUIDEMO_ShowIntro("Bitmaps", "Showing\ndifferent bitmaps with\nand without compression"); + GUIDEMO_SetBkColor(GUI_BLUE); + GUI_Clear(); + _BitmapDemo(); + GUIDEMO_Wait(); +} diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap4bpp.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap4bpp.c new file mode 100644 index 0000000..9f9c46c --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Bitmap4bpp.c @@ -0,0 +1,152 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Bitmap4bpp.c +Purpose : Contains a 4bpp bitmap +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const GUI_COLOR _ColorsJoerg[] = { + 0x000000, 0x111111, 0x222222, 0x333333 + ,0x444444, 0x555555, 0x666666, 0x777777 + ,0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB + ,0xCCCCCC, 0xDDDDDD, 0xEEEEEE, 0xFFFFFF +}; + +static const GUI_LOGPALETTE _PalJoerg = { + 16, /* number of entries */ + 0, /* No transparency */ + &_ColorsJoerg[0] +}; + +static const unsigned char _acJoerg[] = { + 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x99, 0x99, 0x89, 0x99, 0x88, 0x99, 0x98, 0x88, 0x98, 0x88, 0x89, 0x88, 0x89, 0x99, 0x88, 0x89, 0x88, 0x98, 0x98, 0x89, 0x88, 0x89, 0x98, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, 0x89, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x89, 0x88, 0x98, 0x88, 0x89, 0x98, 0x89, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x88, 0x77, 0x75, 0x68, 0x56, 0x55, 0x55, 0x68, 0x88, 0x88, 0x99, 0x98, 0x99, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x88, 0x88, 0x85, 0x44, 0x55, 0x53, 0x54, 0x35, 0x33, 0x44, 0x44, 0x46, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x75, 0x43, 0x33, 0x33, 0x33, 0x34, 0x33, 0x33, 0x33, 0x44, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x98, 0x99, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x63, 0x33, 0x33, 0x33, 0x33, 0x23, 0x22, 0x22, 0x23, 0x33, 0x33, 0x34, 0x56, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x85, 0x47, 0x54, 0x33, 0x33, 0x32, 0x22, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x43, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x43, 0x44, 0x33, 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x23, 0x23, 0x33, 0x45, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x43, 0x33, 0x33, 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x34, 0x46, 0x76, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x98, 0x88, 0x88, 0x88, 0x76, 0x54, 0x33, 0x33, 0x23, 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x12, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x44, 0x48, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x9A, 0x99, 0x99, 0x99, 0x75, 0x43, 0x33, 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x12, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x33, 0x33, 0x34, 0x76, 0x78, 0x88, 0x88, 0x88, 0x80, + 0x99, 0x99, 0x99, 0x97, 0x43, 0x33, 0x32, 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x12, 0x22, 0x12, 0x22, 0x22, 0x32, 0x22, 0x22, 0x34, 0x34, 0x88, 0x99, 0x99, 0x99, 0x90, + 0x99, 0x99, 0x99, 0x75, 0x43, 0x32, 0x22, 0x22, 0x22, 0x23, 0x23, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x34, 0x68, 0x89, 0x89, 0x89, 0x80, + 0xAA, 0xAA, 0xA9, 0x86, 0x53, 0x22, 0x21, 0x22, 0x22, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0x58, 0x99, 0x99, 0x99, 0x90, + 0xAA, 0xAA, 0xAA, 0x85, 0x32, 0x22, 0x21, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0x46, 0x79, 0x99, 0x99, 0x90, + 0xAA, 0xAA, 0xA6, 0x33, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x22, 0x22, 0x22, 0x22, 0x22, 0x35, 0x68, 0x99, 0x99, 0x90, + 0xBB, 0xBA, 0xA4, 0x32, 0x22, 0x21, 0x21, 0x22, 0x23, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x34, 0x66, 0x99, 0x99, 0x90, + 0xBB, 0xBA, 0x83, 0x22, 0x21, 0x12, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x23, 0x33, 0x22, 0x33, 0x32, 0x22, 0x21, 0x12, 0x22, 0x33, 0x89, 0x99, 0x90, + 0xBB, 0xBA, 0x63, 0x22, 0x21, 0x11, 0x23, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x34, 0x45, 0x43, 0x33, 0x33, 0x32, 0x32, 0x21, 0x12, 0x22, 0x23, 0x69, 0x99, 0x90, + 0xBB, 0xBA, 0x32, 0x22, 0x21, 0x22, 0x34, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x44, 0x45, 0x44, 0x54, 0x43, 0x33, 0x33, 0x33, 0x43, 0x21, 0x12, 0x22, 0x33, 0x58, 0x99, 0x90, + 0xBB, 0xB6, 0x33, 0x22, 0x22, 0x23, 0x44, 0x55, 0x55, 0x56, 0x66, 0x66, 0x76, 0x66, 0x66, 0x55, 0x66, 0x55, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x32, 0x22, 0x22, 0x23, 0x36, 0x99, 0x90, + 0xBB, 0x92, 0x33, 0x22, 0x22, 0x34, 0x55, 0x55, 0x56, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x66, 0x67, 0x76, 0x66, 0x66, 0x66, 0x65, 0x55, 0x55, 0x43, 0x22, 0x22, 0x22, 0x34, 0x99, 0x90, + 0xBB, 0x43, 0x32, 0x22, 0x23, 0x44, 0x55, 0x55, 0x56, 0x66, 0x66, 0x76, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x65, 0x54, 0x21, 0x12, 0x22, 0x33, 0x69, 0x90, + 0xBC, 0x33, 0x32, 0x22, 0x24, 0x45, 0x55, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x65, 0x55, 0x42, 0x12, 0x22, 0x34, 0x79, 0x90, + 0xBB, 0x33, 0x22, 0x22, 0x34, 0x45, 0x55, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x55, 0x43, 0x11, 0x22, 0x33, 0x69, 0x90, + 0xBB, 0x23, 0x23, 0x22, 0x34, 0x55, 0x55, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x43, 0x22, 0x22, 0x33, 0x49, 0x90, + 0xBB, 0x23, 0x33, 0x33, 0x34, 0x55, 0x55, 0x66, 0x67, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x87, 0x77, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x65, 0x54, 0x32, 0x22, 0x33, 0x47, 0x90, + 0xBA, 0x33, 0x33, 0x33, 0x44, 0x55, 0x55, 0x66, 0x67, 0x67, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x76, 0x65, 0x55, 0x32, 0x22, 0x33, 0x38, 0x90, + 0xB8, 0x33, 0x23, 0x33, 0x44, 0x55, 0x55, 0x66, 0x66, 0x77, 0x77, 0x77, 0x78, 0x88, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x76, 0x66, 0x55, 0x32, 0x23, 0x24, 0x38, 0x90, + 0xB9, 0x33, 0x33, 0x33, 0x45, 0x55, 0x55, 0x56, 0x66, 0x67, 0x77, 0x78, 0x88, 0x88, 0x89, 0x98, 0x99, 0x99, 0x98, 0x88, 0x87, 0x77, 0x77, 0x76, 0x66, 0x65, 0x43, 0x23, 0x33, 0x49, 0x90, + 0xB9, 0x32, 0x33, 0x34, 0x44, 0x55, 0x55, 0x56, 0x66, 0x67, 0x77, 0x88, 0x88, 0x88, 0x89, 0x88, 0x99, 0x89, 0x98, 0x88, 0x88, 0x77, 0x77, 0x76, 0x66, 0x65, 0x43, 0x33, 0x33, 0x49, 0x90, + 0xB9, 0x22, 0x33, 0x34, 0x44, 0x55, 0x55, 0x56, 0x66, 0x67, 0x77, 0x88, 0x88, 0x88, 0x99, 0x89, 0x98, 0x98, 0x88, 0x88, 0x88, 0x77, 0x76, 0x76, 0x66, 0x55, 0x43, 0x33, 0x34, 0x79, 0x90, + 0xB8, 0x32, 0x33, 0x34, 0x44, 0x55, 0x55, 0x56, 0x66, 0x67, 0x77, 0x87, 0x88, 0x88, 0x89, 0x89, 0x99, 0x98, 0x88, 0x88, 0x88, 0x77, 0x76, 0x66, 0x65, 0x55, 0x44, 0x33, 0x33, 0x89, 0x90, + 0xB5, 0x32, 0x33, 0x34, 0x44, 0x55, 0x55, 0x56, 0x66, 0x67, 0x77, 0x77, 0x88, 0x88, 0x89, 0x89, 0x99, 0x88, 0x88, 0x88, 0x78, 0x77, 0x76, 0x66, 0x66, 0x65, 0x43, 0x33, 0x33, 0x99, 0x90, + 0xB5, 0x32, 0x23, 0x34, 0x45, 0x55, 0x56, 0x66, 0x66, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x98, 0x89, 0x88, 0x88, 0x87, 0x77, 0x77, 0x66, 0x66, 0x55, 0x43, 0x33, 0x25, 0x99, 0x90, + 0xBA, 0x32, 0x23, 0x33, 0x45, 0x55, 0x66, 0x56, 0x66, 0x77, 0x77, 0x77, 0x78, 0x88, 0x89, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x77, 0x77, 0x76, 0x66, 0x55, 0x43, 0x33, 0x28, 0x99, 0x90, + 0xB9, 0x23, 0x33, 0x34, 0x45, 0x55, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x66, 0x65, 0x43, 0x23, 0x29, 0x99, 0x90, + 0xB9, 0x23, 0x33, 0x33, 0x55, 0x56, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x78, 0x77, 0x77, 0x77, 0x76, 0x65, 0x43, 0x23, 0x39, 0x99, 0x90, + 0xBB, 0x33, 0x33, 0x34, 0x55, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x76, 0x66, 0x53, 0x23, 0x1A, 0x99, 0x90, + 0xAA, 0x33, 0x33, 0x33, 0x55, 0x56, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x88, 0x78, 0x77, 0x77, 0x76, 0x66, 0x53, 0x23, 0x1A, 0xA9, 0x90, + 0xAA, 0x23, 0x33, 0x34, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x76, 0x66, 0x53, 0x23, 0x1A, 0x99, 0x90, + 0xAA, 0x73, 0x33, 0x45, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x66, 0x66, 0x77, 0x76, 0x66, 0x53, 0x33, 0x3A, 0x9A, 0xA0, + 0xAB, 0x84, 0x33, 0x35, 0x66, 0x56, 0x55, 0x44, 0x45, 0x43, 0x33, 0x34, 0x56, 0x67, 0x87, 0x77, 0x77, 0x88, 0x65, 0x65, 0x45, 0x55, 0x65, 0x66, 0x66, 0x66, 0x64, 0x33, 0x5A, 0x9A, 0xA0, + 0xAA, 0x33, 0x33, 0x36, 0x66, 0x65, 0x44, 0x45, 0x56, 0x55, 0x44, 0x44, 0x55, 0x66, 0x77, 0x67, 0x77, 0x77, 0x54, 0x44, 0x44, 0x44, 0x45, 0x55, 0x66, 0x66, 0x63, 0x33, 0x8A, 0x9A, 0xA0, + 0xA6, 0x63, 0x33, 0x46, 0x66, 0x65, 0x55, 0x56, 0x67, 0x77, 0x76, 0x55, 0x55, 0x66, 0x78, 0x77, 0x87, 0x76, 0x55, 0x55, 0x67, 0x77, 0x76, 0x55, 0x55, 0x66, 0x63, 0x43, 0x99, 0x9A, 0xA0, + 0xA5, 0x35, 0x33, 0x46, 0x66, 0x55, 0x55, 0x65, 0x65, 0x52, 0x34, 0x45, 0x54, 0x56, 0x78, 0x88, 0x88, 0x76, 0x66, 0x77, 0x88, 0x87, 0x77, 0x65, 0x65, 0x56, 0x63, 0x33, 0x34, 0xAA, 0xA0, + 0xB4, 0x45, 0x44, 0x46, 0x66, 0x65, 0x55, 0x43, 0x12, 0x2A, 0x12, 0x54, 0x44, 0x45, 0x68, 0x88, 0x88, 0x76, 0x66, 0x44, 0x12, 0x46, 0x77, 0x66, 0x66, 0x66, 0x63, 0x33, 0x77, 0x9A, 0xA0, + 0xB4, 0x45, 0x54, 0x46, 0x66, 0x66, 0x65, 0x32, 0x83, 0x22, 0x35, 0x75, 0x55, 0x45, 0x68, 0x88, 0x87, 0x65, 0x54, 0x51, 0x2A, 0x24, 0x24, 0x66, 0x67, 0x76, 0x63, 0x37, 0x75, 0x8A, 0xA0, + 0xB6, 0x45, 0x44, 0x56, 0x66, 0x66, 0x54, 0x55, 0x66, 0x34, 0x58, 0x56, 0x67, 0x44, 0x67, 0x88, 0x86, 0x68, 0x56, 0x83, 0x32, 0x39, 0x74, 0x46, 0x67, 0x77, 0x64, 0x57, 0x66, 0x9A, 0xA0, + 0xA7, 0x56, 0x54, 0x56, 0x66, 0x66, 0x56, 0x66, 0x66, 0x66, 0x77, 0x66, 0x66, 0x55, 0x67, 0x88, 0x87, 0x77, 0x65, 0x67, 0x44, 0x77, 0x66, 0x55, 0x67, 0x77, 0x64, 0x68, 0x76, 0x9A, 0xA0, + 0xA8, 0x56, 0x54, 0x56, 0x66, 0x66, 0x65, 0x56, 0x66, 0x77, 0x87, 0x66, 0x65, 0x55, 0x67, 0x78, 0x87, 0x67, 0x66, 0x67, 0x76, 0x77, 0x76, 0x66, 0x67, 0x76, 0x64, 0x78, 0x65, 0x9A, 0xA0, + 0xAB, 0x66, 0x43, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x55, 0x56, 0x67, 0x87, 0x77, 0x76, 0x77, 0x77, 0x78, 0x88, 0x77, 0x77, 0x76, 0x76, 0x64, 0x88, 0x67, 0xAA, 0xA0, + 0xAB, 0x56, 0x44, 0x56, 0x66, 0x66, 0x76, 0x66, 0x77, 0x77, 0x77, 0x66, 0x65, 0x56, 0x67, 0x77, 0x87, 0x76, 0x77, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x68, 0x78, 0xAA, 0xA0, + 0xAA, 0x46, 0x46, 0x56, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x76, 0x77, 0x65, 0x66, 0x67, 0x88, 0x87, 0x76, 0x77, 0x88, 0x88, 0x77, 0x88, 0x77, 0x77, 0x76, 0x66, 0x68, 0x7A, 0xAA, 0xA0, + 0xBA, 0x46, 0x55, 0x56, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, 0x65, 0x67, 0x78, 0x87, 0x66, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x67, 0x78, 0x7A, 0xAA, 0xA0, + 0xAA, 0x46, 0x63, 0x67, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, 0x66, 0x67, 0x78, 0x87, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x76, 0x76, 0x78, 0x9A, 0xAA, 0xA0, + 0xAA, 0x55, 0x65, 0x37, 0x66, 0x66, 0x67, 0x67, 0x77, 0x77, 0x77, 0x77, 0x66, 0x56, 0x66, 0x78, 0x77, 0x66, 0x77, 0x88, 0x77, 0x77, 0x78, 0x88, 0x77, 0x76, 0x86, 0x78, 0xAA, 0xAA, 0xA0, + 0xAA, 0x95, 0x76, 0x56, 0x66, 0x66, 0x66, 0x77, 0x77, 0x87, 0x77, 0x87, 0x75, 0x56, 0x67, 0x78, 0x77, 0x76, 0x88, 0x88, 0x88, 0x77, 0x78, 0x87, 0x77, 0x77, 0x67, 0x77, 0xAA, 0xAA, 0xA0, + 0xAA, 0xA5, 0x66, 0x57, 0x66, 0x66, 0x67, 0x77, 0x77, 0x87, 0x88, 0x87, 0x55, 0x56, 0x67, 0x77, 0x87, 0x66, 0x78, 0x88, 0x88, 0x88, 0x87, 0x87, 0x78, 0x76, 0x79, 0x77, 0xAA, 0xAA, 0xA0, + 0xAA, 0xA7, 0x66, 0x57, 0x66, 0x66, 0x67, 0x77, 0x77, 0x88, 0x88, 0x76, 0x56, 0x66, 0x67, 0x78, 0x87, 0x66, 0x68, 0x89, 0x88, 0x88, 0x88, 0x87, 0x77, 0x76, 0x99, 0x77, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0x66, 0x56, 0x66, 0x66, 0x77, 0x77, 0x78, 0x88, 0x77, 0x65, 0x57, 0x66, 0x67, 0x8A, 0x97, 0x77, 0x77, 0x79, 0x98, 0x98, 0x88, 0x88, 0x87, 0x76, 0x88, 0x6A, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0x66, 0x57, 0x66, 0x66, 0x77, 0x77, 0x78, 0x88, 0x76, 0x65, 0x57, 0x76, 0x68, 0x89, 0x88, 0x77, 0x77, 0x77, 0x89, 0x98, 0x88, 0x88, 0x87, 0x76, 0x87, 0x6A, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0xA6, 0x57, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x44, 0x46, 0x68, 0x88, 0x88, 0x77, 0x77, 0x77, 0x88, 0x98, 0x88, 0x88, 0x87, 0x76, 0x88, 0x7A, 0xAA, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0xA8, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x76, 0x76, 0x55, 0x44, 0x47, 0x77, 0x86, 0x55, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x77, 0x76, 0x76, 0xAA, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0xAA, 0xA9, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x54, 0x45, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x8B, 0xAA, 0xAA, 0xAA, 0xA0, + 0x9A, 0xAA, 0xA9, 0x9A, 0x77, 0x66, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x65, 0x45, 0x56, 0x67, 0x77, 0x77, 0x87, 0x88, 0x88, 0x88, 0x77, 0x75, 0xBA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0xAA, 0xAA, 0x67, 0x66, 0x77, 0x77, 0x77, 0x77, 0x66, 0x66, 0x67, 0x67, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x87, 0x78, 0x88, 0x88, 0x77, 0x64, 0xBA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0xAA, 0x67, 0x66, 0x67, 0x77, 0x77, 0x77, 0x56, 0x55, 0x55, 0x66, 0x77, 0x77, 0x78, 0x87, 0x67, 0x77, 0x88, 0x77, 0x88, 0x88, 0x77, 0x75, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0xAA, 0xA9, 0x57, 0x66, 0x67, 0x78, 0x87, 0x76, 0x33, 0x34, 0x33, 0x45, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x79, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0xAA, 0xAA, 0x76, 0x66, 0x77, 0x77, 0x89, 0x77, 0x66, 0x54, 0x44, 0x43, 0x23, 0x34, 0x34, 0x56, 0x66, 0x75, 0x68, 0x78, 0x88, 0x88, 0x77, 0x5B, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xAA, 0xAA, 0xAA, 0xAA, 0x76, 0x66, 0x75, 0x78, 0x88, 0x77, 0x76, 0x65, 0x55, 0x56, 0x65, 0x55, 0x55, 0x43, 0x34, 0x67, 0x67, 0x88, 0x88, 0x88, 0x76, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0xAA, 0x76, 0x77, 0x76, 0x77, 0x78, 0x87, 0x76, 0x66, 0x65, 0x56, 0x66, 0x67, 0x66, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0xAA, 0x66, 0x67, 0x67, 0x77, 0x78, 0x87, 0x76, 0x76, 0x76, 0x66, 0x76, 0x67, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xA9, 0x9A, 0xAA, 0xAA, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x76, 0x76, 0x77, 0x67, 0x66, 0x67, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x7B, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0xAA, 0x66, 0x56, 0x67, 0x77, 0x77, 0x77, 0x76, 0x67, 0x67, 0x77, 0x77, 0x77, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x6A, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0x74, 0x65, 0x55, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0xAA, 0x9A, 0xA8, 0x54, 0x65, 0x55, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x5B, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0x99, 0xA9, 0x97, 0x45, 0x66, 0x65, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x66, 0x67, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA, 0xA0, + 0x99, 0x99, 0x85, 0x75, 0x66, 0x66, 0x55, 0x55, 0x66, 0x66, 0x67, 0x77, 0x67, 0x77, 0x78, 0x87, 0x88, 0x88, 0x88, 0x88, 0x78, 0x77, 0x75, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xAA, 0xA0, + 0x99, 0x99, 0x93, 0x73, 0x66, 0x66, 0x55, 0x55, 0x56, 0x66, 0x66, 0x77, 0x67, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x87, 0x77, 0x67, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0x99, 0x99, 0x95, 0x63, 0x65, 0x66, 0x56, 0x55, 0x55, 0x56, 0x67, 0x77, 0x67, 0x67, 0x78, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x76, 0x66, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0x99, 0x99, 0x97, 0x33, 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x88, 0x87, 0x77, 0x77, 0x76, 0x66, 0x74, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, + 0x99, 0x99, 0xA3, 0x32, 0x55, 0x66, 0x65, 0x55, 0x55, 0x55, 0x65, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x66, 0x67, 0x62, 0xA9, 0xAA, 0xBA, 0xAA, 0xBB, 0xAA, 0xAA, 0xA0, + 0x99, 0x9A, 0x91, 0x23, 0x56, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x87, 0x77, 0x66, 0x76, 0x77, 0x62, 0x9A, 0xAA, 0xBA, 0xBA, 0xAA, 0xBA, 0xBA, 0xA0, + 0x99, 0x9A, 0xA1, 0x33, 0x56, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x67, 0x77, 0x76, 0x76, 0x76, 0x66, 0x67, 0x77, 0x77, 0x33, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xAB, 0xB0, + 0x99, 0x9A, 0xA2, 0x23, 0x55, 0x66, 0x66, 0x65, 0x55, 0x55, 0x55, 0x55, 0x56, 0x66, 0x66, 0x66, 0x66, 0x55, 0x56, 0x67, 0x77, 0x77, 0x23, 0x9A, 0xAA, 0xBB, 0xBB, 0xAA, 0xBA, 0xAA, 0xB0, + 0x99, 0x9A, 0xA5, 0x34, 0x55, 0x66, 0x66, 0x65, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x67, 0x77, 0x77, 0x77, 0x22, 0x9A, 0xAB, 0xAA, 0xBA, 0xAA, 0xBA, 0xAA, 0xA0, + 0x99, 0x9A, 0xA8, 0x34, 0x45, 0x66, 0x66, 0x56, 0x66, 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x66, 0x67, 0x77, 0x77, 0x77, 0x75, 0x31, 0x8A, 0xAA, 0x9A, 0xAA, 0xBB, 0xAB, 0xBA, 0xA0, + 0x99, 0x9A, 0xA9, 0x34, 0x45, 0x66, 0x76, 0x66, 0x66, 0x65, 0x66, 0x66, 0x66, 0x65, 0x67, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x75, 0x31, 0x9B, 0xBA, 0xBA, 0xAA, 0x9A, 0xBB, 0xBA, 0xB0, + 0x9A, 0x9A, 0xAA, 0x54, 0x45, 0x56, 0x66, 0x76, 0x77, 0x66, 0x66, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x77, 0x78, 0x77, 0x77, 0x64, 0x31, 0xAA, 0xAA, 0xAB, 0xBB, 0xBA, 0x9A, 0xAA, 0xB0, + 0x99, 0x9A, 0xAA, 0xA3, 0x45, 0x56, 0x66, 0x77, 0x77, 0x67, 0x67, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x64, 0x35, 0xAA, 0xBA, 0xBB, 0xBA, 0xAA, 0xBB, 0xAA, 0xA0, + 0xA9, 0xAA, 0xAA, 0xB8, 0x44, 0x56, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x89, 0x88, 0x88, 0x88, 0x78, 0x77, 0x77, 0x53, 0x27, 0xAB, 0xBA, 0xBA, 0xBB, 0xBB, 0xBA, 0xAA, 0xB0 +}; + +/********************************************************************* +* +* GUIDEMO_bm4bpp +* +********************************************************************** +*/ + +const GUI_BITMAP GUIDEMO_bm4bpp = { + 61, /* XSize */ + 92, /* YSize */ + 31, /* BytesPerLine */ + 4, /* BitsPerPixel */ + _acJoerg, /* Pointer to picture data (indices) */ + &_PalJoerg /* Pointer to palette */ +}; diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Circle.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Circle.c new file mode 100644 index 0000000..6836833 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Circle.c @@ -0,0 +1,76 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Circle.c +Purpose : Drawing circles +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" + +/********************************************************************* +* +* GUIDEMO_Circle +* +********************************************************************** +*/ + +void GUIDEMO_Circle(void) { + int x0, y0, r; + GUIDEMO_ShowIntro("Circles", + "\nArbitrary circles" + "\nand arcs."); + GUI_Clear(); + GUI_SetFont(&GUI_Font8x16); + GUI_SetColor(GUI_WHITE); + x0 = LCD_XSIZE >> 1; + y0 = LCD_YSIZE >> 1; + #if GUIDEMO_LARGE + r = 50; + GUI_DispStringAt("Circle", 0, 0); + #elif !(GUIDEMO_TINY) + r = 40; + #else + #if (LCD_YSIZE < 80) + r = 23; + #else + r = 30; + #endif + #endif + GUI_FillCircle (x0, y0, r); + GUIDEMO_Wait(); + GUI_SetDrawMode(GUI_DM_XOR); + #if GUIDEMO_LARGE + GUI_FillCircle (x0, y0, r + 10); + #elif !(GUIDEMO_TINY) + GUI_FillCircle (x0, y0, r + 8); + #else + GUI_FillCircle (x0, y0, r + 6); + #endif + GUI_SetDrawMode(0); + GUIDEMO_Wait(); + #if GUI_SUPPORT_AA + #if GUIDEMO_LARGE + GUIDEMO_ShowInfo("Circles with\nAntialiasing"); + #endif + GUI_Clear(); + GUI_SetColor(GUI_WHITE); + #if GUIDEMO_LARGE + GUI_DispStringAt("Antialiased\ncircle", 0, 0); + #endif + GUI_AA_FillCircle(x0, y0, r - 2); + GUIDEMO_Wait(); + #endif +} diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorBar.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorBar.c new file mode 100644 index 0000000..bf8198a --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorBar.c @@ -0,0 +1,166 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_ShowColorBar.c +Purpose : Draws color bars +---------------------------------------------------------------------- +*/ + +#include "LCD.h" /* interface definitions */ +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ +#include "GUI.h" +#include "GUIDEMO.h" + +/********************************************************************* +* +* GUIDEMO_ShowColorBar +* +********************************************************************** +*/ + +#if LCD_BITSPERPIXEL > 2 + +void GUIDEMO_ShowColorBar(void) { + int nBars = 13; + int NumColors = LCD_GetDevCap(LCD_DEVCAP_NUMCOLORS); + int XSize = LCD_XSIZE; + int i, yStep, y0, x0; + #if GUIDEMO_LARGE + y0 = 70; + x0 = 60; + GUIDEMO_ShowIntro("Color bar", + "emWin features " + "\nan integrated color" + "\nmanagement" + "\nwill always find the best available color" + "\nfor any logical color"); + #else + #if !(GUIDEMO_TINY) + y0 = 55; + x0 = 55; + GUIDEMO_ShowIntro("Color bar", + "emWin features " + "\nan integrated color" + "\nmanagement will always" + "\nfind the best available" + "\ncolor for any logical color"); + #else + y0 = 16; + x0 = 40; + GUIDEMO_ShowIntro("Color bar", + "emWin features " + "\nan integrated color" + "\nmanagement"); + #endif + #endif + XSize -= x0; + #if (LCD_YSIZE < 320) + yStep = (LCD_YSIZE - y0) / nBars; + #else + yStep = (LCD_YSIZE - y0 - 60) / nBars; + #endif + GUI_SetColor(GUI_WHITE); + GUI_SetBkColor(GUI_BLACK); + GUI_Clear(); + GUI_SetFont(&GUI_Font8x16); + GUI_DispString("Color bars\n"); + #if !(GUIDEMO_TINY) + GUI_SetFont(&GUI_Font8_ASCII); + #ifdef LCD_CONTROLLER + GUI_DispString("\nLCD_CONTROLLER: "); + GUI_DispDecMin(LCD_CONTROLLER); + GUI_DispString("\n"); + #endif + GUI_DispDecMin(LCD_BITSPERPIXEL); + GUI_DispString(" bpp"); + #ifdef LCD_BUSWIDTH + GUI_DispString(", "); + GUI_DispDecMin(LCD_BUSWIDTH); + GUI_DispString(" bit bus"); + #endif + GUI_DispString(", "); + GUI_DispDecMin(NumColors); + GUI_DispString(" colors\n"); + #if (LCD_FIXEDPALETTE) + GUI_DispString("Fixed palette: "); + GUI_DispDecMin(LCD_FIXEDPALETTE); + #else + GUI_DispString("(Custom)"); + #endif + #endif + #if !GUIDEMO_LARGE + #if (LCD_YSIZE < 100) + GUI_SetFont(&GUI_Font4x6); + #elif (LCD_YSIZE < 160) + GUI_SetFont(&GUI_Font6x8); + #else + GUI_SetFont(&GUI_Font8x8); + #endif + #else + GUI_SetFont(&GUI_Font8x8); + #endif + GUI_SetColor(GUI_WHITE); + GUI_DispStringAt("Red", 0, y0 + yStep); + GUI_DispStringAt("Green", 0, y0 + 3 * yStep); + GUI_DispStringAt("Blue", 0, y0 + 5 * yStep); + GUI_DispStringAt("Grey", 0, y0 + 6 * yStep); + GUI_DispStringAt("Yellow", 0, y0 + 8 * yStep); + GUI_DispStringAt("Cyan", 0, y0 + 10 * yStep); + GUI_DispStringAt("Magenta", 0, y0 + 12 * yStep); + for (i = 0; (i < XSize) && !GUIDEMO_CheckCancel(); i++) { + U16 cs = (255 * (U32)i) / XSize; + U16 x = x0 + i;; +/* Red */ + GUI_SetColor(cs); + GUI_DrawVLine(x, y0, y0 + yStep - 1); + GUI_SetColor(0x0000ff + (255 - cs) * 0x10100L); + GUI_DrawVLine(x, y0 + yStep, y0 + 2 * yStep - 1); +/* Green */ + GUI_SetColor(cs<<8); + GUI_DrawVLine(x, y0 + 2 * yStep, y0 + 3 * yStep - 1); + GUI_SetColor(0x00ff00 + (255 - cs) * 0x10001L); + GUI_DrawVLine(x, y0 + 3 * yStep, y0 + 4 * yStep - 1); +/* Blue */ + GUI_SetColor(cs * 0x10000L); + GUI_DrawVLine(x, y0 + 4 * yStep, y0 + 5 * yStep - 1); + GUI_SetColor(0xff0000 + (255 - cs) * 0x00101L); + GUI_DrawVLine(x, y0 + 5 * yStep, y0 + 6 * yStep - 1); +/* Gray */ + GUI_SetColor(cs * 0x10101L); + GUI_DrawVLine(x, y0 + 6 * yStep, y0 + 7 * yStep - 1); +/* Yellow */ + GUI_SetColor(cs * 0x00101L); + GUI_DrawVLine(x, y0 + 7 * yStep, y0 + 8 * yStep - 1); + GUI_SetColor(0x00ffff + (255 - cs) * 0x10000L); + GUI_DrawVLine(x, y0 + 8 * yStep, y0 + 9 * yStep - 1); +/* Cyan */ + GUI_SetColor(cs * 0x10100L); + GUI_DrawVLine(x, y0 + 9 * yStep, y0 + 10 * yStep - 1); + GUI_SetColor(0xffff00 + (255 - cs) * 0x00001L); + GUI_DrawVLine(x, y0 + 10 * yStep, y0 + 11 * yStep - 1); +/* Magenta */ + GUI_SetColor(cs * 0x10001L); + GUI_DrawVLine(x, y0 + 11 * yStep, y0 + 12 * yStep - 1); + GUI_SetColor(0xff00ff + (255 - cs) * 0x00100L); + GUI_DrawVLine(x, y0 + 12 * yStep, y0 + 13 * yStep - 1); + } + GUIDEMO_Wait(); +} + +#else + +void GUIDEMO_ShowColorBar(void) {} + +#endif + diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorList.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorList.c new file mode 100644 index 0000000..8617877 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ColorList.c @@ -0,0 +1,118 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_ColorList.c +Purpose : Shows color list +---------------------------------------------------------------------- +*/ + +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ +#include "GUI.h" +#include "GUIDEMO.h" + +/********************************************************************* +* +* GUIDEMO_ShowColorList +* +********************************************************************** +*/ + +#if (LCD_BITSPERPIXEL > 2) && (LCD_BITSPERPIXEL <= 8) + +void GUIDEMO_ShowColorList(void) { + int NumColors = LCD_GetDevCap(LCD_DEVCAP_NUMCOLORS); + int Lines = (NumColors - 1) / 16 + 1; + int y0; + #if (LCD_BITSPERPIXEL > 8) + int XStep = LCD_XSIZE / 256; + int YStep = NumColors / 256; + #endif + int i; + #if GUIDEMO_LARGE + y0 = 70; + #elif !(GUIDEMO_TINY) + #if (LCD_YSIZE < 120) + y0 = 50; + #else + y0 = 55; + #endif + #else + y0 = 16; + #endif + GUIDEMO_ShowIntro("Available colors", + "Shows the first of the" + "\navailable colors in the" + "\nsimulated configuration"); + GUI_SetColor(GUI_WHITE); + GUI_SetBkColor(GUI_BLACK); + GUI_Clear(); + GUI_SetFont(&GUI_Font8x16); + GUI_DispString("Available colors\n"); + #if !(GUIDEMO_TINY) + GUI_SetFont(&GUI_Font8_ASCII); + #ifdef LCD_CONTROLLER + GUI_DispString("\nLCD_CONTROLLER: "); + GUI_DispDecMin(LCD_CONTROLLER); + GUI_DispString("\n"); + #endif + GUI_DispDecMin(LCD_BITSPERPIXEL); + GUI_DispString(" bpp"); + #ifdef LCD_BUSWIDTH + GUI_DispString(", "); + GUI_DispDecMin(LCD_BUSWIDTH); + GUI_DispString(" bit bus"); + #endif + GUI_DispString(", "); + GUI_DispDecMin(NumColors); + GUI_DispString(" colors\n"); + #if (LCD_FIXEDPALETTE) + GUI_DispString("Fixed palette: "); + GUI_DispDecMin(LCD_FIXEDPALETTE); + #else + GUI_DispString("(Custom)"); + #endif + #endif + #if (LCD_BITSPERPIXEL <= 8) + { + int XStep = LCD_XSIZE / 16; + #if (LCD_YSIZE < 320) + int YStep = (LCD_YSIZE - y0) / Lines; + #else + int YStep = (LCD_YSIZE - y0 - 60) / Lines; + #endif + int dy = (YStep <= 3) ? 1 : 2; + for (i = 0; i < NumColors; i++) { + GUI_SetColorIndex(i); + GUI_FillRect((i%16) * XStep + 2, + (i/16) * YStep + y0 + 1, + (i%16 + 1) * XStep - 1, + (i/16 + 1) * YStep + y0 - dy); + } + } + #else + { + for (i = 0; i < NumColors; i++) { + GUI_SetColorIndex(i); + GUI_DrawPoint((U8)(i) + ((LCD_XSIZE - 1 - 256) >> 1), (i >> 8) + y0); + } + } + #endif + GUIDEMO_Delay(2500); +} + +#else + +void GUIDEMO_ShowColorList(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Cursor.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Cursor.c new file mode 100644 index 0000000..1f938bb --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Cursor.c @@ -0,0 +1,303 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Cursor.c +Purpose : shows Cursor-API +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" + +#if (GUI_SUPPORT_CURSOR & GUI_SUPPORT_TOUCH) + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define countof(Obj) (sizeof(Obj)/sizeof(Obj[0])) + +#if GUIDEMO_LARGE + #define NUM_CURSORS 3 + #define XMAX 28 +#else + #define NUM_CURSORS 2 + #define XMAX 24 +#endif + +/********************************************************************* +* +* types +* +********************************************************************** +*/ + +typedef struct { + const GUI_CURSOR* pCursor; + char Size; +} CURSOR_INFO; + +typedef struct { + const CURSOR_INFO aCursor[NUM_CURSORS]; + const char* pType; +} CURSORTYPE_INFO; + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +static const CURSORTYPE_INFO _CursorArrow = { + &GUI_CursorArrowS, 'S', + &GUI_CursorArrowM, 'M', + #if (NUM_CURSORS == 3) + &GUI_CursorArrowL, 'L', + "arrow cursors" + #else + "arrow\ncursors" + #endif +}; + +#if !(GUIDEMO_TINY) + static const CURSORTYPE_INFO _CursorArrowI = { + &GUI_CursorArrowSI, 'S', + &GUI_CursorArrowMI, 'M', + #if (NUM_CURSORS == 3) + &GUI_CursorArrowLI, 'L', + "inverted arrow cursors" + #else + "inverted\narrow cursors" + #endif + }; +#endif + +static const CURSORTYPE_INFO _CursorCross = { + &GUI_CursorCrossS, 'S', + &GUI_CursorCrossM, 'M', + #if (NUM_CURSORS == 3) + &GUI_CursorCrossL, 'L', + "cross cursors" + #else + "cross\ncursors" + #endif +}; + +#if !(GUIDEMO_TINY) + static const CURSORTYPE_INFO _CursorCrossI = { + &GUI_CursorCrossSI, 'S', + &GUI_CursorCrossMI, 'M', + #if (NUM_CURSORS == 3) + &GUI_CursorCrossLI, 'L', + "inverted cross cursors" + #else + "inverted\ncross cursors" + #endif + }; +#endif + +static const GUI_CURSOR* _aCursor[] = { + &GUI_CursorArrowM, + #if !(GUIDEMO_TINY) + &GUI_CursorArrowMI, + #endif + &GUI_CursorCrossM, + #if !(GUIDEMO_TINY) + &GUI_CursorCrossMI, + #endif +}; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _ShowCursorType +*/ +static void _ShowCursorType(const CURSORTYPE_INFO* pCursorType, int x0, int y0) { + const GUI_CURSOR* pCursor; + char Char; + int i, x, y; + int yMax = 0; + int yHot = 0; + /* Calculate height and width of biggest cursor */ + for (i = 0; i < NUM_CURSORS; i++) { + pCursor = pCursorType->aCursor[i].pCursor; + if (pCursor->pBitmap->YSize > yMax) { + yMax = pCursor->pBitmap->YSize; + yHot = pCursor->yHot; + } + } + #if ((LCD_YSIZE >= 220) && (LCD_XSIZE >= 300)) + GUI_SetFont(&GUI_FontComic18B_ASCII); + #else + GUI_SetFont(&GUI_Font13B_ASCII); + #endif + #if (NUM_CURSORS != 3) + GUI_SetLBorder(x0); + #endif + GUI_DispStringAt(pCursorType->pType, x0, y0); + #if GUIDEMO_LARGE + y0 += GUI_GetFontDistY() + 1; + GUI_SetFont(&GUI_Font13B_ASCII); + #else + #if (LCD_YSIZE < 80) + x0 += 50; + #else + y0 += GUI_GetFontDistY() * 2 + 1; + #endif + GUI_SetFont(&GUI_Font10_ASCII); + #endif + for (i = 0; i < NUM_CURSORS; i++) { + pCursor = pCursorType->aCursor[i].pCursor; + Char = pCursorType->aCursor[i].Size; + y = y0 + yHot - pCursor->yHot; + x = ((pCursor->pBitmap->XSize - GUI_GetCharDistX(Char)) >> 1); + GUI_DrawBitmap(pCursor->pBitmap, x0 + XMAX * i + 5, y); + GUI_DispCharAt(Char, x0 + XMAX * i + 5 + x, y0 + yMax + 2); + } +} + +/********************************************************************* +* +* _MoveCursor +*/ +static void _MoveCursor(const GUI_CURSOR* Cursor){ + int x, y; + int xMax = LCD_XSIZE >> 1; + int yMax = LCD_YSIZE >> 1; + #if !GUIDEMO_LARGE + xMax *= 1.3; + yMax *= 1.3; + #endif + GUI_CURSOR_Select(Cursor); + for(x = y = 0; ((x < xMax) && (y < yMax) && !GUIDEMO_CheckCancel()); x += 6, y += 6) { + if ( x == xMax) { + x = xMax; + } + if ( y == yMax) { + y = yMax; + } + GUI_CURSOR_SetPosition(x, y); + GUIDEMO_Delay(75); + } +} + +/********************************************************************* +* +* _DispCursor +*/ +static void _DispCursor(void) { + #if !(GUIDEMO_LARGE) + int x0 = 0; + #endif + int y0, dx, dy; + GUI_CURSOR_Hide(); + GUI_SetTextMode(GUI_TM_TRANS); + #if GUIDEMO_LARGE + GUI_SetFont(&GUI_FontComic24B_ASCII); + GUI_DispStringAt("Available\n cursors:", 18, 12); + #else + #if GUIDEMO_TINY + GUI_SetFont(&GUI_Font13B_ASCII); + #else + GUI_SetFont(&GUI_FontComic18B_ASCII); + #endif + GUI_DispStringHCenterAt("Available cursors:", LCD_XSIZE >> 1, LCD_YSIZE >> 5); + #endif + /* Display the cursors */ + #if GUIDEMO_LARGE + y0 = 68; + dx = LCD_XSIZE / 2.5; + #if (LCD_YSIZE > 240) + dy = LCD_YSIZE / 3.2; + #else + dy = 75; + #endif + #if ((LCD_YSIZE < 220) || (LCD_XSIZE < 300)) + y0 -= 3; + dy -= 12; + #endif + _ShowCursorType(&_CursorArrow, 0, y0); + _ShowCursorType(&_CursorCross, 0, y0 + dy); + _ShowCursorType(&_CursorArrowI, dx, y0); + _ShowCursorType(&_CursorCrossI, dx, y0 + dy); + #else + #if GUIDEMO_TINY + y0 = 20; + #else + y0 = 30; + #endif + #if ((LCD_XSIZE < 160) && ((LCD_YSIZE >= 160) || (LCD_YSIZE < 90))) + x0 = 10; + #endif + dx = LCD_XSIZE / 2.2; + dy = LCD_YSIZE / 2.6; + _ShowCursorType(&_CursorArrow, x0, y0); + #if (LCD_YSIZE >= 160) + _ShowCursorType(&_CursorCross, x0, y0 + dy); + #elif (LCD_YSIZE < 90) + GUIDEMO_Delay(2000); + GUI_ClearRect(0, 20, LCD_XSIZE - 1, LCD_YSIZE - 1); + _ShowCursorType(&_CursorCross, x0, y0); + #else + _ShowCursorType(&_CursorCross, dx, y0); + #endif + #if ((LCD_YSIZE >= 160) && (LCD_XSIZE >= 160)) + _ShowCursorType(&_CursorArrowI, dx, y0); + _ShowCursorType(&_CursorCrossI, dx, y0 + dy); + #endif + #endif +} + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIDEMO_Cursor +*/ +void GUIDEMO_Cursor(void) { + int i = 0; + GUIDEMO_ShowIntro("Cursor", + "\nemWin supports" + "\nsoftware cursor"); + GUIDEMO_SetBkColor(GUI_BLUE); + GUI_Clear(); + _DispCursor(); + GUIDEMO_Delay(1500); + GUIDEMO_NotifyStartNext(); + GUI_CURSOR_Show(); + for ( i = 0;(i < countof(_aCursor) && !GUIDEMO_CheckCancel()); i++) { + _MoveCursor(_aCursor[i]); + } + GUI_CURSOR_SetPosition(0,0); + GUI_CURSOR_Select(&GUI_CursorArrowM); +} + +#else + +void GUIDEMO_Cursor(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Dialog.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Dialog.c new file mode 100644 index 0000000..6354e62 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Dialog.c @@ -0,0 +1,272 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Dialog.c +Purpose : Automotive samples +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "GUI.h" +#include "GUIDEMO.h" +#include "LCD_ConfDefaults.h" + +#if GUI_SUPPORT_MEMDEV && GUI_WINSUPPORT + +#include "WM.h" +#include "DIALOG.h" +#include "LISTBOX.h" +#include "EDIT.h" +#include "SLIDER.h" +#include "FRAMEWIN.h" + +/********************************************************************* +* +* types +* +********************************************************************** +*/ + +typedef struct { + unsigned char Id; + int Time; +} KEYSIM; + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +static const GUI_WIDGET_CREATE_INFO aDialogCreate[] = { + { FRAMEWIN_CreateIndirect, "Dialog", 0, 10, 10, 162, 214, FRAMEWIN_CF_MOVEABLE}, + { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 90, 5, 60, 20 }, + { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 90, 30, 60, 20 }, + { TEXT_CreateIndirect, "LText", 0, 5, 59, 43, 15, TEXT_CF_LEFT }, + { TEXT_CreateIndirect, "RText", 0, 5, 79, 43, 15, TEXT_CF_RIGHT }, + { TEXT_CreateIndirect, "Hex", 0, 5, 99, 48, 15, TEXT_CF_LEFT }, + { TEXT_CreateIndirect, "Bin", 0, 5, 119, 48, 15, TEXT_CF_LEFT }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT0, 50, 59, 100, 15, EDIT_CF_LEFT, 50 }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT1, 50, 79, 100, 15, EDIT_CF_RIGHT, 50 }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT2, 50, 99, 100, 15, EDIT_CF_RIGHT, 6 }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT3, 50, 119, 100, 15, EDIT_CF_LEFT, 0 }, + { LISTBOX_CreateIndirect, "", GUI_ID_LISTBOX0, 5, 5, 75, 45, 0, 0 }, + { SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER1, 5, 140, 100, 20, 0, 0 }, + { SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER0, 5, 165, 145, 26, 0, 0 } +}; + +static const KEYSIM _aID[] = { + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_DOWN, 250 }, + { GUI_KEY_DOWN, 250 }, + { GUI_KEY_DOWN, 250 }, + { GUI_KEY_DOWN, 250 }, + { GUI_KEY_UP, 250 }, + { GUI_KEY_UP, 250 } +}; + +static const GUI_ConstString _apListBox[] = { + "English", "Deutsch", "Franais", "Japanese", "Italiano", NULL +}; + +#elif !(GUIDEMO_TINY) + +static const GUI_WIDGET_CREATE_INFO aDialogCreate[] = { + { FRAMEWIN_CreateIndirect, "Dialog", 0, 10, 10, 132, 113, FRAMEWIN_CF_MOVEABLE}, + { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 5, 5, 55, 20 }, + { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 65, 5, 55, 20 }, + { TEXT_CreateIndirect, "LText", 0, 5, 32, 33, 15, TEXT_CF_LEFT }, + { TEXT_CreateIndirect, "RText", 0, 5, 52, 33, 15, TEXT_CF_RIGHT }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT0, 40, 32, 80, 15, EDIT_CF_LEFT, 50 }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT1, 40, 52, 80, 15, EDIT_CF_RIGHT, 50 }, + { SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER0, 5, 74, 116, 20, 0, 0 }, +}; + +static const KEYSIM _aID[] = { + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, +}; + +#else + +static const GUI_WIDGET_CREATE_INFO aDialogCreate[] = { + { FRAMEWIN_CreateIndirect, "Dialog", 0, 0, 0, 110, 84, FRAMEWIN_CF_MOVEABLE}, + { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 4, 3, 95, 18 }, + { TEXT_CreateIndirect, "Text", 0, 5, 25, 28, 15, TEXT_CF_LEFT }, + { EDIT_CreateIndirect, "", GUI_ID_EDIT0, 30, 25, 69, 15, EDIT_CF_LEFT, 50 }, +}; + +static const KEYSIM _aID[] = { + { GUI_KEY_TAB, 400 }, + { GUI_KEY_TAB, 400 }, +}; + +#endif + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _cbCallback +*/ +static void _cbCallback(WM_MESSAGE * pMsg) { + WM_HWIN hWin = pMsg->hWin; + #if GUIDEMO_LARGE + int NCode, Id; + #endif + switch (pMsg->MsgId) { + case WM_INIT_DIALOG: + /* Initialize all widgets */ + #if GUIDEMO_TINY + EDIT_SetText(WM_GetDialogItem(hWin, GUI_ID_EDIT0), "EDIT"); + #else + EDIT_SetText(WM_GetDialogItem(hWin, GUI_ID_EDIT0), "EDIT widget 0"); + EDIT_SetText(WM_GetDialogItem(hWin, GUI_ID_EDIT1), "EDIT widget 1"); + #endif + { + #if GUIDEMO_LARGE + WM_HWIN hListBox; + EDIT_SetHexMode(WM_GetDialogItem(hWin, GUI_ID_EDIT2), 0x1234, 0, 0xffffff); + EDIT_SetBinMode(WM_GetDialogItem(hWin, GUI_ID_EDIT3), 0x1234, 0, 0xffff); + hListBox = WM_GetDialogItem(hWin, GUI_ID_LISTBOX0); + LISTBOX_SetText(hListBox, _apListBox); + SCROLLBAR_CreateAttached(hListBox, SCROLLBAR_CF_VERTICAL); + #else + GUI_RECT Rect; + int x, y, ySize; + ySize = LCD_GetYSize(); + if (ySize < 120) { + WM_ResizeWindow(hWin, 0, -24); + } + WM_GetWindowRectEx(hWin, &Rect); + x = (LCD_GetXSize() - (Rect.x1 - Rect.x0 + 1)) >> 1; + y = (ySize - (Rect.y1 - Rect.y0 + 1)) >> 1; + #if GUIDEMO_TINY + WM_MoveTo(hWin, x, y); + #else + WM_MoveTo(hWin, x, y - 4); + #endif + #endif + } + break; + case WM_KEY: + switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) { + case GUI_KEY_ESCAPE: + GUI_EndDialog(hWin, 1); + break; + case GUI_KEY_ENTER: + GUI_EndDialog(hWin, 0); + break; + } + break; + #if GUIDEMO_LARGE + case WM_NOTIFY_PARENT: + Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ + NCode = pMsg->Data.v; /* Notification code */ + switch (NCode) { + case WM_NOTIFICATION_RELEASED: /* React only if released */ + if (Id == GUI_ID_OK) { /* OK Button */ + GUI_EndDialog(hWin, 0); + } + if (Id == GUI_ID_CANCEL) { /* Cancel Button */ + GUI_EndDialog(hWin, 1); + } + break; + case WM_NOTIFICATION_SEL_CHANGED: /* Selection changed */ + FRAMEWIN_SetText(hWin, "Dialog - sel changed"); + break; + default: + FRAMEWIN_SetText(hWin, "Dialog - notification received"); + } + break; + #endif + default: + WM_DefaultProc(pMsg); + } +} + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIDEMO_Dialog +*/ +void GUIDEMO_Dialog(void) { + int i; + WM_HWIN hWin; + GUI_COLOR DesktopColorOld; + GUIDEMO_ShowIntro("Dialog boxes", "\nDialog boxes\ncan easily be created"); + GUIDEMO_HideInfoWin(); + DesktopColorOld = GUIDEMO_SetBkColor(GUI_RED); + DesktopColorOld = WM_SetDesktopColor(DesktopColorOld); /* Automatically update desktop window */ + hWin = GUI_CreateDialogBox(aDialogCreate, GUI_COUNTOF(aDialogCreate), _cbCallback, 0, 0, 0); + for (i = 0; i < GUI_COUNTOF(_aID); i++) { + GUIDEMO_Delay(_aID[i].Time); + GUI_SendKeyMsg(_aID[i].Id, 1); + } + #if !(GUIDEMO_TINY) + #if !(GUIDEMO_LARGE) + if (LCD_GetYSize() < 120) { + } else + #endif + { + GUIDEMO_Delay(1000); + for (i = 0; i <= 100; i += 10) { + if (WM_IsWindow(hWin)) { + SLIDER_SetValue(WM_GetDialogItem(hWin, GUI_ID_SLIDER0), i); + } + GUIDEMO_Delay(100); + } + } + #endif + GUIDEMO_Delay(800); + if (WM_IsWindow(hWin)) { + WM_MoveTo(hWin, 20, 20); + GUIDEMO_Delay(500); + } + if (WM_IsWindow(hWin)) { + WM_MoveTo(hWin, 60, 20); + GUIDEMO_Delay(800); + } + /* Cleanup ... */ + if (WM_IsWindow(hWin)) { + WM_DeleteWindow(hWin); + } + GUIDEMO_NotifyStartNext(); + WM_SetDesktopColor(DesktopColorOld); /* Restore old settings */ +} + +#else + +void GUIDEMO_Dialog(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Font.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Font.c new file mode 100644 index 0000000..362a289 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Font.c @@ -0,0 +1,1069 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Font.c +Purpose : GUIDEMO font routines +---------------------------------------------------------------------- +*/ + +#include +#include "GUI.h" +#include "GUIDEMO.h" + +/********************************************************************* +* +* Japanese SJIS font +* +********************************************************************** +*/ + +/* SPACE */ +static const unsigned char _acFontSJIS16_0020[ 16] = { /* code 0020 */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +/* HYPHEN-MINUS */ +static const unsigned char _acFontSJIS16_002D[ 16] = { /* code 002D */ + ________, + ________, + ________, + ________, + ________, + ________, + ________, + _XXXXXX_, + ________, + ________, + ________, + ________, + ________, + ________, + ________, + ________}; + +/* QUESTION MARK */ +static const unsigned char _acFontSJIS16_003F[ 16] = { /* code 003F */ + ________, + ___XX___, + __X__X__, + _XX___X_, + _XX___X_, + ______X_, + _____X__, + ____X___, + ___X____, + ___X____, + ________, + ________, + ___X____, + __XXX___, + ___X____, + ________}; + +/* LATIN CAPITAL LETTER H */ +static const unsigned char _acFontSJIS16_0048[ 16] = { /* code 0048 */ + ________, + XXX_XXX_, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _XXXXX__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + XXX_XXX_, + ________, + ________}; + +/* LATIN CAPITAL LETTER L */ +static const unsigned char _acFontSJIS16_004C[ 16] = { /* code 004C */ + ________, + XXX_____, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X______, + _X____X_, + _X____X_, + XXXXXXX_, + ________, + ________}; + +/* LATIN SMALL LETTER A */ +static const unsigned char _acFontSJIS16_0061[ 16] = { /* code 0061 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXX___, + X____X__, + X____X__, + __XXXX__, + _X___X__, + X____X__, + X___XX__, + _XXX_XX_, + ________, + ________}; + +/* LATIN SMALL LETTER E */ +static const unsigned char _acFontSJIS16_0065[ 16] = { /* code 0065 */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + __X__X__, + _X____X_, + _XXXXXX_, + _X______, + _X______, + __X___X_, + ___XXX__, + ________, + ________}; + +/* LATIN SMALL LETTER L */ +static const unsigned char _acFontSJIS16_006C[ 16] = { /* code 006C */ + ________, + __XX____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + ___X____, + __XXX___, + ________, + ________}; + +/* LATIN SMALL LETTER N */ +static const unsigned char _acFontSJIS16_006E[ 16] = { /* code 006E */ + ________, + ________, + ________, + ________, + ________, + ________, + XX_XX___, + _XX__X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + XXX_XXX_, + ________, + ________}; + +/* LATIN SMALL LETTER O */ +static const unsigned char _acFontSJIS16_006F[ 16] = { /* code 006F */ + ________, + ________, + ________, + ________, + ________, + ________, + ___XX___, + __X__X__, + _X____X_, + _X____X_, + _X____X_, + _X____X_, + __X__X__, + ___XX___, + ________, + ________}; + +/* LATIN SMALL LETTER R */ +static const unsigned char _acFontSJIS16_0072[ 16] = { /* code 0072 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XX_XX__, + __XX__X_, + __X___X_, + __X_____, + __X_____, + __X_____, + __X_____, + _XXX____, + ________, + ________}; + +/* LATIN SMALL LETTER S */ +static const unsigned char _acFontSJIS16_0073[ 16] = { /* code 0073 */ + ________, + ________, + ________, + ________, + ________, + ________, + _XXXX_X_, + X____XX_, + X_____X_, + _XX_____, + ___XXX__, + X_____X_, + XX____X_, + X_XXXX__, + ________, + ________}; + +/* LATIN SMALL LETTER U */ +static const unsigned char _acFontSJIS16_0075[ 16] = { /* code 0075 */ + ________, + ________, + ________, + ________, + ________, + ________, + XX__XX__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X___X__, + _X__XX__, + __XX_XX_, + ________, + ________}; + +/* LATIN SMALL LETTER W */ +static const unsigned char _acFontSJIS16_0077[ 16] = { /* code 0077 */ + ________, + ________, + ________, + ________, + ________, + ________, + XX_X_XX_, + X__X__X_, + X__X__X_, + X_X_X_X_, + X_X_X_X_, + _X___X__, + _X___X__, + _X___X__, + ________, + ________}; + +/* LATIN SMALL LETTER X */ +static const unsigned char _acFontSJIS16_0078[ 16] = { /* code 0078 */ + ________, + ________, + ________, + ________, + ________, + ________, + XX___XX_, + _X___X__, + __X_X___, + ___X____, + ___X____, + __X_X___, + _X___X__, + XX___XX_, + ________, + ________}; + +/* LATIN SMALL LETTER Y */ +static const unsigned char _acFontSJIS16_0079[ 16] = { /* code 0079 */ + ________, + ________, + ________, + ________, + ________, + ________, + XXX_XXX_, + _X___X__, + _X___X__, + __X_X___, + __X_X___, + __XX____, + ___X____, + X_X_____, + XX______, + ________}; + +/* IDEOGRAPHIC SPACE */ +static const unsigned char _acFontSJIS16_8140[ 32] = { /* code 8140 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ________,________}; + +/* FULLWIDTH QUESTION MARK */ +static const unsigned char _acFontSJIS16_8148[ 32] = { /* code 8148 */ + ________,________, + ______XX,X_______, + _____X__,_X______, + ____X___,__X_____, + ____XX__,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + _______X,________, + _______X,________, + ________,________, + ________,________, + _______X,________, + _______X,________, + ________,________, + ________,________}; + +/* HIRAGANA LETTER O */ +static const unsigned char _acFontSJIS16_82A8[ 32] = { /* code 82A8 */ + ____XX__,________, + _____XX_,________, + _____X__,X__XX___, + _X___XXX,_____X__, + __XXXX__,______X_, + _____X__,______X_, + _____X_X,XXXX____, + _____XX_,____X___, + ____XX__,_____X__, + ___X_X__,_____X__, + _XX__X__,_____X__, + ___X_X__,X___X___, + ____XX__,_XXX____, + _____X__,________, + ________,________, + ________,________}; + +/* HIRAGANA LETTER KA */ +static const unsigned char _acFontSJIS16_82A9[ 32] = { /* code 82A9 */ + ________,________, + ____XX__,________, + _____XX_,________, + _____X__,________, + _X___XXX,X__XX___, + _XXXXX__,_X___X__, + ____X___,_X____X_, + ____X___,_X____X_, + ____X___,_X__XXX_, + ___X____,_X____X_, + ___X_X__,_X______, + __X___X_,X_______, + _XX____X,X_______, + _X_____X,________, + ________,________, + ________,________}; + +/* HIRAGANA LETTER KO */ +static const unsigned char _acFontSJIS16_82B1[ 32] = { /* code 82B1 */ + ________,________, + ________,________, + ____X___,________, + _____XXX,XXXX____, + ________,XX______, + _______X,________, + ________,________, + ________,________, + ________,________, + ________,________, + __X_____,________, + ___X____,________, + ___XX___,________, + _____XXX,XXXXX___, + ________,________, + ________,________}; + +/* HIRAGANA LETTER SA */ +static const unsigned char _acFontSJIS16_82B3[ 32] = { /* code 82B3 */ + _______X,X_______, + ________,X_______, + ________,X_______, + __X_____,_X_XX___, + ___XXXXX,XXX_____, + ________,_X______, + ________,__X_____, + ____XXXX,X_X_____, + ___X____,_XXX____, + __X_____,___X____, + __X_____,________, + __X_____,________, + ___XX___,________, + _____XXX,XX______, + ________,________, + ________,________}; + +/* HIRAGANA LETTER SU */ +static const unsigned char _acFontSJIS16_82B7[ 32] = { /* code 82B7 */ + _______X,X_______, + ________,XX______, + ________,X___X___, + XX__XXXX,XXXXXX__, + _XXX____,X_______, + _____XX_,X_______, + ____X__X,X_______, + ____X___,X_______, + ____X___,X_______, + ____X__X,X_______, + _____XX_,X_______, + _______X,________, + _______X,________, + ______X_,________, + _____X__,________, + ________,________}; + +/* HIRAGANA LETTER TI */ +static const unsigned char _acFontSJIS16_82BF[ 32] = { /* code 82BF */ + ________,________, + ____XX__,________, + _____X__,_XX_____, + _X___XXX,X_______, + __XXXX__,________, + ____X___,________, + ____X___,________, + ____X__X,XXX_____, + ___XXXX_,___X____, + ___XX___,____X___, + ___X____,____X___, + ________,____X___, + ________,___X____, + ________,__XX____, + _____XXX,XX______, + ________,________}; + +/* HIRAGANA LETTER DE */ +static const unsigned char _acFontSJIS16_82C5[ 32] = { /* code 82C5 */ + ________,________, + ________,________, + _X____XX,XXXXXX__, + __XXXX__,_XX_____, + ________,X____X__, + _______X,___X__X_, + ______X_,____X___, + ______X_,________, + _____X__,________, + _____X__,________, + _____X__,________, + ______X_,________, + ______XX,__X_____, + ________,XXXX____, + ________,________, + ________,________}; + +/* HIRAGANA LETTER NI */ +static const unsigned char _acFontSJIS16_82C9[ 32] = { /* code 82C9 */ + ________,________, + _XX_____,________, + __XX____,________, + __X_____,_XXXX___, + __X____X,X_______, + _X______,________, + _X______,________, + _X______,________, + _X__X___,________, + _X__X_X_,________, + _X_X__X_,________, + _X_X___X,X_______, + __XX____,_XXXXX__, + ___XX___,________, + ________,________, + ________,________}; + +/* HIRAGANA LETTER HA */ +static const unsigned char _acFontSJIS16_82CD[ 32] = { /* code 82CD */ + ________,________, + _XX_____,__XX____, + __XX____,___X____, + __X___X_,___XXX__, + __X____X,XXXX____, + _X______,___X____, + _X______,___X____, + _X______,___X____, + _X__X___,___X____, + _X_X____,___X____, + _X_X___X,XXXX____, + _XXX__X_,___XX___, + __X___X_,___X_X__, + __X____X,XXX_____, + ________,________, + ________,________}; + +/* HIRAGANA LETTER N */ +static const unsigned char _acFontSJIS16_82F1[ 32] = { /* code 82F1 */ + ________,________, + _____XX_,________, + ______XX,________, + ______X_,________, + _____X__,________, + _____X__,________, + ____X___,________, + ____XXX_,________, + ___XX__X,________, + ___X___X,_____X__, + __XX____,X____X__, + __X_____,X____X__, + _XX_____,X___X___, + _X______,_XXX____, + ________,________, + ________,________}; + +/* KATAKANA LETTER KU */ +static const unsigned char _acFontSJIS16_834E[ 32] = { /* code 834E */ + ________,________, + _____XX_,________, + ______XX,________, + ______X_,___X____, + _____XXX,XXXXX___, + _____X__,___X____, + ____X___,___X____, + ___X____,__X_____, + __X_____,__X_____, + ________,_X______, + ________,X_______, + _______X,________, + _____XX_,________, + ___XX___,________, + ________,________, + ________,________}; + +/* KATAKANA LETTER SU */ +static const unsigned char _acFontSJIS16_8358[ 32] = { /* code 8358 */ + ________,________, + ________,________, + ________,________, + ________,__X_____, + __XXXXXX,XXXX____, + ___X____,__X_____, + ________,_X______, + ________,X_______, + ________,X_______, + _______X,_X______, + ______X_,__X_____, + _____X__,___X____, + ___XX___,___XX___, + _XX_____,____X___, + ________,________, + ________,________}; + +/* KATAKANA LETTER SMALL TU */ +static const unsigned char _acFontSJIS16_8362[ 32] = { /* code 8362 */ + ________,________, + ________,________, + ________,________, + ________,________, + ________,________, + ______X_,__XX____, + ___X___X,___XX___, + ____X__X,___X____, + ____X___,__X_____, + ________,__X_____, + ________,_X______, + ________,X_______, + ______XX,________, + ____XX__,________, + ________,________, + ________,________}; + +/* KATAKANA LETTER RA */ +static const unsigned char _acFontSJIS16_8389[ 32] = { /* code 8389 */ + ________,________, + ________,__X_____, + ___XXXXX,XXXX____, + ____X___,________, + ________,____X___, + __XXXXXX,XXXXXX__, + ___X____,____X___, + ________,____X___, + ________,___X____, + ________,___X____, + ________,__X_____, + ________,_X______, + _______X,X_______, + ____XXX_,________, + ________,________, + ________,________}; + +/* */ +static const unsigned char _acFontSJIS16_8B43[ 32] = { /* code 8B43 */ + ___XX___,________, + ___X____,___X____, + __XXXXXX,XXXXX___, + _X______,________, + X__XXXXX,XXX_____, + ________,________, + _XXXXXXX,XXXX____, + ________,___X____, + _______X,X__X____, + __XX___X,___X____, + ____XXX_,___X____, + ______X_,___X__X_, + _____X_X,____X_X_, + ___XX___,X___XX__, + _XX_____,_____XX_, + ________,________}; + +/* */ +static const unsigned char _acFontSJIS16_8CB3[ 32] = { /* code 8CB3 */ + ________,__X_____, + __XXXXXX,XXXX____, + ________,________, + ________,________, + ________,________, + ________,____X___, + XXXXXXXX,XXXXXX__, + ____X___,X_______, + ____X___,X_______, + ____X___,X_______, + ____X___,X_______, + ___X____,X____X__, + ___X____,X____X__, + __X_____,X____XX_, + XX______,_XXXXX__, + ________,________}; + +static const GUI_CHARINFO _FontSJIS16_CharInfo[34] = { + { 8, 8, 1, _acFontSJIS16_0020 } /* code 0020 */ + ,{ 8, 8, 1, _acFontSJIS16_002D } /* code 002D */ + ,{ 8, 8, 1, _acFontSJIS16_003F } /* code 003F */ + ,{ 8, 8, 1, _acFontSJIS16_0048 } /* code 0048 */ + ,{ 8, 8, 1, _acFontSJIS16_004C } /* code 004C */ + ,{ 8, 8, 1, _acFontSJIS16_0061 } /* code 0061 */ + ,{ 8, 8, 1, _acFontSJIS16_0065 } /* code 0065 */ + ,{ 8, 8, 1, _acFontSJIS16_006C } /* code 006C */ + ,{ 8, 8, 1, _acFontSJIS16_006E } /* code 006E */ + ,{ 8, 8, 1, _acFontSJIS16_006F } /* code 006F */ + ,{ 8, 8, 1, _acFontSJIS16_0072 } /* code 0072 */ + ,{ 8, 8, 1, _acFontSJIS16_0073 } /* code 0073 */ + ,{ 8, 8, 1, _acFontSJIS16_0075 } /* code 0075 */ + ,{ 8, 8, 1, _acFontSJIS16_0077 } /* code 0077 */ + ,{ 8, 8, 1, _acFontSJIS16_0078 } /* code 0078 */ + ,{ 8, 8, 1, _acFontSJIS16_0079 } /* code 0079 */ + ,{ 16, 16, 2, _acFontSJIS16_8140 } /* code 8140 */ + ,{ 16, 16, 2, _acFontSJIS16_8148 } /* code 8148 */ + ,{ 16, 16, 2, _acFontSJIS16_82A8 } /* code 82A8 */ + ,{ 16, 16, 2, _acFontSJIS16_82A9 } /* code 82A9 */ + ,{ 16, 16, 2, _acFontSJIS16_82B1 } /* code 82B1 */ + ,{ 16, 16, 2, _acFontSJIS16_82B3 } /* code 82B3 */ + ,{ 16, 16, 2, _acFontSJIS16_82B7 } /* code 82B7 */ + ,{ 16, 16, 2, _acFontSJIS16_82BF } /* code 82BF */ + ,{ 16, 16, 2, _acFontSJIS16_82C5 } /* code 82C5 */ + ,{ 16, 16, 2, _acFontSJIS16_82C9 } /* code 82C9 */ + ,{ 16, 16, 2, _acFontSJIS16_82CD } /* code 82CD */ + ,{ 16, 16, 2, _acFontSJIS16_82F1 } /* code 82F1 */ + ,{ 16, 16, 2, _acFontSJIS16_834E } /* code 834E */ + ,{ 16, 16, 2, _acFontSJIS16_8358 } /* code 8358 */ + ,{ 16, 16, 2, _acFontSJIS16_8362 } /* code 8362 */ + ,{ 16, 16, 2, _acFontSJIS16_8389 } /* code 8389 */ + ,{ 16, 16, 2, _acFontSJIS16_8B43 } /* code 8B43 */ + ,{ 16, 16, 2, _acFontSJIS16_8CB3 } /* code 8CB3 */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop29 = { + 0x8CB3 /* first character */ + ,0x8CB3 /* last character */ + ,&_FontSJIS16_CharInfo[ 33] /* address of first character */ + ,(const GUI_FONT_PROP*)0 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop28 = { + 0x8B43 /* first character */ + ,0x8B43 /* last character */ + ,&_FontSJIS16_CharInfo[ 32] /* address of first character */ + ,&_FontSJIS16_Prop29 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop27 = { + 0x8389 /* first character */ + ,0x8389 /* last character */ + ,&_FontSJIS16_CharInfo[ 31] /* address of first character */ + ,&_FontSJIS16_Prop28 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop26 = { + 0x8362 /* first character */ + ,0x8362 /* last character */ + ,&_FontSJIS16_CharInfo[ 30] /* address of first character */ + ,&_FontSJIS16_Prop27 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop25 = { + 0x8358 /* first character */ + ,0x8358 /* last character */ + ,&_FontSJIS16_CharInfo[ 29] /* address of first character */ + ,&_FontSJIS16_Prop26 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop24 = { + 0x834E /* first character */ + ,0x834E /* last character */ + ,&_FontSJIS16_CharInfo[ 28] /* address of first character */ + ,&_FontSJIS16_Prop25 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop23 = { + 0x82F1 /* first character */ + ,0x82F1 /* last character */ + ,&_FontSJIS16_CharInfo[ 27] /* address of first character */ + ,&_FontSJIS16_Prop24 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop22 = { + 0x82CD /* first character */ + ,0x82CD /* last character */ + ,&_FontSJIS16_CharInfo[ 26] /* address of first character */ + ,&_FontSJIS16_Prop23 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop21 = { + 0x82C9 /* first character */ + ,0x82C9 /* last character */ + ,&_FontSJIS16_CharInfo[ 25] /* address of first character */ + ,&_FontSJIS16_Prop22 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop20 = { + 0x82C5 /* first character */ + ,0x82C5 /* last character */ + ,&_FontSJIS16_CharInfo[ 24] /* address of first character */ + ,&_FontSJIS16_Prop21 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop19 = { + 0x82BF /* first character */ + ,0x82BF /* last character */ + ,&_FontSJIS16_CharInfo[ 23] /* address of first character */ + ,&_FontSJIS16_Prop20 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop18 = { + 0x82B7 /* first character */ + ,0x82B7 /* last character */ + ,&_FontSJIS16_CharInfo[ 22] /* address of first character */ + ,&_FontSJIS16_Prop19 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop17 = { + 0x82B3 /* first character */ + ,0x82B3 /* last character */ + ,&_FontSJIS16_CharInfo[ 21] /* address of first character */ + ,&_FontSJIS16_Prop18 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop16 = { + 0x82B1 /* first character */ + ,0x82B1 /* last character */ + ,&_FontSJIS16_CharInfo[ 20] /* address of first character */ + ,&_FontSJIS16_Prop17 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop15 = { + 0x82A8 /* first character */ + ,0x82A9 /* last character */ + ,&_FontSJIS16_CharInfo[ 18] /* address of first character */ + ,&_FontSJIS16_Prop16 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop14 = { + 0x8148 /* first character */ + ,0x8148 /* last character */ + ,&_FontSJIS16_CharInfo[ 17] /* address of first character */ + ,&_FontSJIS16_Prop15 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop13 = { + 0x8140 /* first character */ + ,0x8140 /* last character */ + ,&_FontSJIS16_CharInfo[ 16] /* address of first character */ + ,&_FontSJIS16_Prop14 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop12 = { + 0x0077 /* first character */ + ,0x0079 /* last character */ + ,&_FontSJIS16_CharInfo[ 13] /* address of first character */ + ,&_FontSJIS16_Prop13 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop11 = { + 0x0075 /* first character */ + ,0x0075 /* last character */ + ,&_FontSJIS16_CharInfo[ 12] /* address of first character */ + ,&_FontSJIS16_Prop12 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop10 = { + 0x0072 /* first character */ + ,0x0073 /* last character */ + ,&_FontSJIS16_CharInfo[ 10] /* address of first character */ + ,&_FontSJIS16_Prop11 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop9 = { + 0x006E /* first character */ + ,0x006F /* last character */ + ,&_FontSJIS16_CharInfo[ 8] /* address of first character */ + ,&_FontSJIS16_Prop10 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop8 = { + 0x006C /* first character */ + ,0x006C /* last character */ + ,&_FontSJIS16_CharInfo[ 7] /* address of first character */ + ,&_FontSJIS16_Prop9 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop7 = { + 0x0065 /* first character */ + ,0x0065 /* last character */ + ,&_FontSJIS16_CharInfo[ 6] /* address of first character */ + ,&_FontSJIS16_Prop8 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop6 = { + 0x0061 /* first character */ + ,0x0061 /* last character */ + ,&_FontSJIS16_CharInfo[ 5] /* address of first character */ + ,&_FontSJIS16_Prop7 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop5 = { + 0x004C /* first character */ + ,0x004C /* last character */ + ,&_FontSJIS16_CharInfo[ 4] /* address of first character */ + ,&_FontSJIS16_Prop6 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop4 = { + 0x0048 /* first character */ + ,0x0048 /* last character */ + ,&_FontSJIS16_CharInfo[ 3] /* address of first character */ + ,&_FontSJIS16_Prop5 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop3 = { + 0x003F /* first character */ + ,0x003F /* last character */ + ,&_FontSJIS16_CharInfo[ 2] /* address of first character */ + ,&_FontSJIS16_Prop4 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop2 = { + 0x002D /* first character */ + ,0x002D /* last character */ + ,&_FontSJIS16_CharInfo[ 1] /* address of first character */ + ,&_FontSJIS16_Prop3 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT_PROP _FontSJIS16_Prop1 = { + 0x0020 /* first character */ + ,0x0020 /* last character */ + ,&_FontSJIS16_CharInfo[ 0] /* address of first character */ + ,&_FontSJIS16_Prop2 /* pointer to next GUI_FONT_PROP */ +}; + +static const GUI_FONT _FontSJIS16 = { + GUI_FONTTYPE_PROP_SJIS /* type of font */ + ,16 /* height of font */ + ,16 /* space of font y */ + ,1 /* magnification x */ + ,1 /* magnification y */ + ,{&_FontSJIS16_Prop1} +}; + +/********************************************************************* +* +* Static variables +* +********************************************************************** +*/ + +static const GUI_FONT * _apPropFonts[] = { + &GUI_Font10S_ASCII, + &GUI_Font8_ASCII, + &GUI_Font13_ASCII, + &GUI_Font13H_ASCII, + &GUI_Font16_ASCII, + &GUI_Font13HB_ASCII, + 0 +}; + +static const GUI_FONT * _apMonoFonts[] = { + &GUI_Font4x6, + &GUI_Font6x8, + &GUI_Font8x13_ASCII, + &GUI_Font8x8, + &GUI_Font8x15B_ASCII, + &GUI_Font8x16, + 0 +}; + +static const GUI_FONT * _apDigitFonts[] = { + &GUI_FontD32, + 0 +}; + +static const char * _apSJIS[] = { + "\x82\xa8\x8c\xb3\x8b\x43\x82\xc5\x82\xb7\x82\xa9\x81\x48\nHow are you?\x0", +}; + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +static void _Label(const char * sText) { + GUI_Clear(); + #if GUIDEMO_LARGE + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_SetLBorder(5); + GUI_DispStringAt(sText, 5, 5); + GUI_SetLBorder(0); + #else + GUI_USE_PARA(sText); + #endif +} + +static int _GetYPos(void) { + #if GUIDEMO_LARGE + return 70; + #else + return 0; + #endif +} + +static void _ShowCharacters(const char*s, const GUI_FONT* pFont, int IncX) { + int i; + int ix=0, y; + int FontSizeY; + GUI_SetFont(pFont); + FontSizeY = GUI_GetFontSizeY(); + _Label(s); + GUI_SetFont(pFont); + y = _GetYPos(); + for (i = 0; i < 20000; i++) { + if (GUI_IsInFont(NULL, (U16)i)) { + GUI_GotoXY(ix * IncX, y); + if (ix++ > 20) { + ix = 0; + y += FontSizeY; + } + GUI_DispChar((U16)i); + } + } + GUIDEMO_Delay(2000); + GUIDEMO_NotifyStartNext(); +} + +static void _ShowFonts(const char *s, const char *pMessage, const GUI_FONT **pPropFonts) { + int i; + _Label(s); + GUI_GotoXY(0, _GetYPos()); + for (i=0;pPropFonts[i];i++) { + GUI_SetFont(pPropFonts[i]); + GUI_DispString(pMessage); + GUI_DispNextLine(); + } + GUIDEMO_Wait(); + GUIDEMO_NotifyStartNext(); +} + +static void _ShowJapaneseSample(void) { + int i; + _Label("Japanese text\nmixed with\nASCIItext"); + GUI_SetFont(&_FontSJIS16); + for (i=0;i +#include "GUI.h" +#include "GUIDEMO.h" + +#if GUI_WINSUPPORT + +#include "WM.h" +#include "LISTBOX.h" +#include "FRAMEWIN.h" + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + #define BORDER 10 +#elif !(GUIDEMO_TINY) + #define BORDER 8 +#else + #define BORDER 4 +#endif + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +static const GUI_ConstString _asLang[] = { + "English", + "Deutsch", + "Franais", + "Espa\xf1ol", /* "Espaol" -> "Espa\xf1ol" to avoid problems with NC308 */ + "Italiano", + NULL +}; + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIDEMO_DemoFrameWin +*/ +void GUIDEMO_DemoFrameWin(void) { + FRAMEWIN_Handle hFrame; + LISTBOX_Handle hListBox; + int xSize = LCD_GetXSize(); + int ySize = LCD_GetYSize(); + int i, x, y, w, h; + const GUI_FONT* pFont = &GUI_FontComic18B_1; + GUI_COLOR DesktopColorOld; + #if GUIDEMO_LARGE + GUIDEMO_ShowIntro("Frame Window & Listbox", NULL); + #else + GUIDEMO_ShowIntro("Frame Window\n & Listbox", NULL); + #endif + DesktopColorOld = GUIDEMO_SetBkColor(GUI_RED); + DesktopColorOld = WM_SetDesktopColor(DesktopColorOld); /* Automatically update desktop window */ + x = BORDER; + #if GUIDEMO_LARGE + y = 75; + #else + y = BORDER; + #endif + w = xSize - x - BORDER; + h = ySize - y - BORDER; + if (w > 140) { + w = 140; + } + if (h > 120) { + h = 120; + } + hFrame = FRAMEWIN_Create("Select language", NULL, WM_CF_SHOW, x, y, w, h); + FRAMEWIN_SetActive(hFrame, 1); + FRAMEWIN_SetMoveable(hFrame, 1); + FRAMEWIN_AddMaxButton(hFrame, FRAMEWIN_BUTTON_RIGHT, 0); + FRAMEWIN_AddMinButton(hFrame, FRAMEWIN_BUTTON_RIGHT, 1); + FRAMEWIN_SetFont(hFrame, &GUI_Font13_ASCII); + hListBox = LISTBOX_CreateAsChild(_asLang, WM_GetClientWindow(hFrame), 0, 0, 0, 0, WM_CF_SHOW | WM_SF_ANCHOR_LEFT | WM_SF_ANCHOR_TOP | WM_SF_ANCHOR_RIGHT | WM_SF_ANCHOR_BOTTOM); + WM_SetFocus(hListBox); + LISTBOX_SetFont(hListBox, pFont); + GUIDEMO_Wait(); + for (i = 0; (i < 10) && !GUIDEMO_CheckCancel(); i++) { + LISTBOX_IncSel(hListBox); + GUIDEMO_Delay(250); + } + for (i = 0; (i < 10) && !GUIDEMO_CheckCancel(); i++) { + LISTBOX_DecSel(hListBox); + GUIDEMO_Delay(250); + } + GUIDEMO_Delay(500); + LISTBOX_Delete(hListBox); + FRAMEWIN_Delete(hFrame); + WM_SetDesktopColor(DesktopColorOld); +} + +#elif defined(NC30) || defined(NC308) + +void GUIDEMO_FrameWin(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Graph.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Graph.c new file mode 100644 index 0000000..86b49f9 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Graph.c @@ -0,0 +1,421 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Graph.c +Purpose : Several GUIDEMO routines +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ +#include +#include +#include "GUIDEMO.h" + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* + * + * Structure containing information for drawing routine + * + ********************************************************************** + */ + +typedef struct +{ + I16 *aY; +} PARAM; + +/********************************************************************* + * + * Defines + * + ********************************************************************** + */ + +#if GUIDEMO_LARGE +#define YSIZE (LCD_YSIZE - 100) +#else +#define YSIZE (LCD_YSIZE - 30) +#endif + +#define DEG2RAD (3.1415926f / 180) + +#if LCD_BITSPERPIXEL == 1 +#define COLOR_GRAPH0 GUI_WHITE +#define COLOR_GRAPH1 GUI_WHITE +#else +#define COLOR_GRAPH0 GUI_GREEN +#define COLOR_GRAPH1 GUI_YELLOW +#endif + +/********************************************************************* + * + * static data + * + ********************************************************************** + */ + +static int _YSize; + +/********************************************************************* + * + * Draws the graph + * + ********************************************************************** + */ + +static void _Draw(void *p) +{ + int i; + PARAM *pParam = (PARAM *)p; + GUI_SetBkColor(GUI_BLACK); + GUI_SetColor(GUI_DARKGRAY); + GUI_ClearRect(19, (LCD_YSIZE - 20) - _YSize, (LCD_XSIZE - 2), (LCD_YSIZE - 21)); + for (i = 0; i < (_YSize / 2); i += 20) + { + GUI_DrawHLine((LCD_YSIZE - 20) - (_YSize / 2) + i, 19, (LCD_XSIZE - 2)); + if (i) + { + GUI_DrawHLine((LCD_YSIZE - 20) - (_YSize / 2) - i, 19, (LCD_XSIZE - 2)); + } + } + for (i = 40; i < (LCD_XSIZE - 20); i += 40) + { + GUI_DrawVLine(18 + i, (LCD_YSIZE - 20) - _YSize, (LCD_YSIZE - 21)); + } + GUIDEMO_SetColor(COLOR_GRAPH0); + GUI_DrawGraph(pParam->aY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - _YSize); +} + +static void _Draw2(void *p) +{ + PARAM *pParam = (PARAM *)p; + _Draw(p); + GUI_SetColor(COLOR_GRAPH1); + GUI_DrawGraph(pParam->aY + 15, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - _YSize); +} + +/********************************************************************* + * + * Labels the x & y-axis + * + ********************************************************************** + */ + +static void _Label(void) +{ + int x, y; + GUI_SetPenSize(1); + GUI_ClearRect(0, (LCD_YSIZE - 21) - _YSize, (LCD_XSIZE - 1), (LCD_YSIZE - 1)); + GUI_DrawRect(18, (LCD_YSIZE - 21) - _YSize, (LCD_XSIZE - 1), (LCD_YSIZE - 20)); + GUI_SetFont(&GUI_Font6x8); + for (x = 0; x < (LCD_XSIZE - 20); x += 40) + { + int xPos = x + 18; + GUI_DrawVLine(xPos, (LCD_YSIZE - 20), (LCD_YSIZE - 14)); + GUI_DispDecAt(x / 40, xPos - 2, (LCD_YSIZE - 9), 1); + } + for (y = 0; y < _YSize / 2; y += 20) + { + int yPos = (LCD_YSIZE - 20) - _YSize / 2 + y; + GUI_DrawHLine(yPos, 13, 18); + if (y) + { + GUI_GotoXY(1, yPos - 4); + GUI_DispSDec(-y / 20, 2); + yPos = (LCD_YSIZE - 20) - _YSize / 2 - y; + GUI_DrawHLine(yPos, 13, 18); + GUI_GotoXY(1, yPos - 4); + GUI_DispSDec(y / 20, 2); + } + else + { + GUI_DispCharAt('0', 7, yPos - 4); + } + } +} + +/********************************************************************* + * + * Draws random data + * + ********************************************************************** + */ + +static void _GetRandomData(I16 *paY, int Time, int n) +{ + int aDiff, i; + if (Time > 5000) + Time -= 5000; + if (Time > 2500) + Time = 5000 - Time; + Time /= 200; + aDiff = Time * Time + 1; + for (i = 0; i < n; i++) + { + if (!i) + { + paY[i] = rand() % _YSize; + } + else + { + int Rnd0, Rnd1, yD; + I16 yNew; + Rnd0 = rand(); + yD = aDiff - (Rnd0 % aDiff); + Rnd1 = rand(); + if (Rnd1 > Rnd0) + { + yNew = paY[i - 1] + yD; + } + else + { + yNew = paY[i - 1] - yD; + } + if (yNew > _YSize) + { + yNew -= yD; + } + else + { + if (yNew < 0) + yNew += yD; + } + paY[i] = yNew; + } + } +} + +static void _ShowText(const char *sText) +{ + GUIDEMO_SetColor(GUI_WHITE); + GUIDEMO_SetBkColor(GUI_RED); +#if GUIDEMO_LARGE + GUI_ClearRect(0, 0, LCD_XSIZE, 60); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringAt(sText, 10, 20); +#else + sText = sText; /* Avoid warning */ +#endif +} + +static void _LabelMS(void) +{ + GUI_SetFont(&GUI_Font6x8); +#if GUIDEMO_LARGE + GUI_DispStringAt("msec/graph:", 10, 50); +#endif +} + +static void _DisplayTime(int tDiff) +{ +#if GUIDEMO_LARGE + GUI_GotoXY(80, 50); + GUIDEMO_SetColor(GUI_WHITE); + GUIDEMO_SetBkColor(GUI_RED); + GUI_DispDecSpace(tDiff, 3); +#else + tDiff = tDiff; /* Avoid warning */ +#endif +} + +static void _DemoRandomGraph(void) +{ + PARAM Param; + int tDiff, t0; + int Cnt = 0; + GUI_HMEM hMem; + GUI_RECT Rect; + Rect.x0 = 19; + Rect.y0 = (LCD_YSIZE - 20) - _YSize; + Rect.x1 = LCD_XSIZE - 2; + Rect.y1 = LCD_YSIZE - 21; + hMem = GUI_ALLOC_AllocZero((LCD_XSIZE - 20) * sizeof(I16)); + _ShowText("Random graph"); + GUI_LOCK(); + Param.aY = (I16 *)GUI_ALLOC_h2p(hMem); + GUI_UNLOCK(); /* Note: unlocking is permitted only if no further allocation is done so hMem stays valid */ + /* + GUI_SetFont(&GUI_Font6x8); + GUI_DispStringAt("msec/graph:", 10, 50); + */ + _LabelMS(); + t0 = GUI_GetTime(); + while (((tDiff = (GUI_GetTime() - t0)) < 10000) && !GUIDEMO_CheckCancel()) + { + U32 t1, tDiff2; + _GetRandomData(Param.aY, tDiff, (LCD_XSIZE - 20)); + t1 = GUI_GetTime(); + GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS); + tDiff2 = GUI_GetTime() - t1; + if (tDiff2 < 100) + { + GUI_Delay(100 - tDiff2); + } + if (!((++Cnt) % 10)) + { + _DisplayTime(tDiff2); + /* + GUI_GotoXY(80, 50); + GUI_SetColor(GUI_WHITE); + GUI_SetBkColor(GUI_RED); + GUI_DispDecSpace(tDiff2, 3); + */ + } + } + GUI_ALLOC_Free(hMem); +} + +/********************************************************************* + * + * Draws a sine wave + * + ********************************************************************** + */ + +static void _GetSineData(I16 *paY, int n) +{ + int i; + for (i = 0; i < n; i++) + { + float s = sin(i * DEG2RAD * 4); + paY[i] = s * _YSize / 2 + _YSize / 2; + } +} + +static void _DemoSineWave(void) +{ + PARAM Param; + I16 *pStart; + int t0, Cnt = 0; + GUI_HMEM hMem; + GUI_RECT Rect; + Rect.x0 = 19; + Rect.y0 = (LCD_YSIZE - 20) - _YSize; + Rect.x1 = LCD_XSIZE - 2; + Rect.y1 = LCD_YSIZE - 21; + hMem = GUI_ALLOC_AllocZero((LCD_XSIZE + 90) * sizeof(I16)); + _ShowText("Sine wave"); + GUI_LOCK(); + pStart = (I16 *)GUI_ALLOC_h2p(hMem); + GUI_UNLOCK(); /* Note: unlocking is permitted only if no further allocation is done so hMem stays valid */ + _GetSineData(pStart, LCD_XSIZE + 90); + /* + GUI_SetFont(&GUI_Font6x8); + GUI_DispStringAt("msec/graph:", 10, 50); + */ + _LabelMS(); + t0 = GUI_GetTime(); + while (((GUI_GetTime() - t0) < 10000) && !GUIDEMO_CheckCancel()) + { + U32 t1, tDiff2; + if (Cnt % 90) + { + Param.aY++; + } + else + { + Param.aY = pStart; + } + t1 = GUI_GetTime(); + GUI_MEMDEV_Draw(&Rect, _Draw2, &Param, 0, GUI_MEMDEV_NOTRANS); + tDiff2 = GUI_GetTime() - t1; + if (tDiff2 < 100) + { + GUI_Delay(100 - tDiff2); + } + if (!((++Cnt) % 10)) + { + _DisplayTime(tDiff2); + /* + GUI_GotoXY(80, 50); + GUI_SetColor(GUI_WHITE); + GUI_SetBkColor(GUI_RED); + GUI_DispDecSpace(tDiff2, 3); + */ + } + } + GUI_ALLOC_Free(hMem); +} + +/********************************************************************* + * + * Adds several waves + * + ********************************************************************** + */ + +static void _DrawOrData(GUI_COLOR Color, I16 *paY) +{ + GUIDEMO_SetColor(Color); + GUI_DrawGraph(paY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - _YSize); +} + +static void _DemoOrData(void) +{ + int i; + PARAM Param; + GUI_RECT Rect; + GUI_HMEM hMem; + Rect.x0 = 19; + Rect.y0 = (LCD_YSIZE - 20) - _YSize; + Rect.x1 = LCD_XSIZE - 2; + Rect.y1 = LCD_YSIZE - 21; + hMem = GUI_ALLOC_AllocZero((LCD_XSIZE + 90) * sizeof(I16)); + _ShowText("Several waves..."); + GUI_LOCK(); + Param.aY = (I16 *)GUI_ALLOC_h2p(hMem); + GUI_UNLOCK(); + _GetSineData(Param.aY, LCD_XSIZE + 90); + GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS); + for (i = 0; (i < 90) && !GUIDEMO_CheckCancel(); i++) + { + _DrawOrData(GUI_GREEN, ++Param.aY); + GUI_Delay(10); + } + GUI_ALLOC_Free(hMem); +} + +/********************************************************************* + * + * GUIDEMO_Graph + * + ********************************************************************** + */ + +void GUIDEMO_Graph(void) +{ +#if GUIDEMO_LARGE + _YSize = (LCD_YSIZE - 100); +#else + _YSize = (LCD_YSIZE - 30); +#endif + GUIDEMO_ShowIntro("Drawing a graph", + "\nOptimized drawing routine" + "\nfor drawing graph data"); + GUI_Clear(); + _Label(); + _DemoRandomGraph(); + GUIDEMO_NotifyStartNext(); + _DemoSineWave(); + GUIDEMO_NotifyStartNext(); + _DemoOrData(); +} + +#elif defined(NC30) || defined(NC308) + +void GUIDEMO_Graph(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_HardwareInfo.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_HardwareInfo.c new file mode 100644 index 0000000..fc88e0d --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_HardwareInfo.c @@ -0,0 +1,108 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_HardwareInfo.c +Purpose : Displays hardware info +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +#if (LCD_CONTROLLER == 1375) | (LCD_CONTROLLER == 13705) | (LCD_CONTROLLER == 1386) | (LCD_CONTROLLER == 13806) +static void _Show(const char* s0, const char* s1) { + GUIDEMO_SetColor(GUI_WHITE); + #if (LCD_YSIZE < 160) + GUI_SetFont(&GUI_Font8_ASCII); + #else + GUI_SetFont(&GUI_Font13B_ASCII); + #endif + GUI_DispString("\n"); + #if (LCD_YSIZE < 128) + GUIDEMO_Delay(200); + GUI_GotoXY(0, LCD_YSIZE / 2 - 6); + GUI_ClearRect(0, 24, LCD_XSIZE - 1, LCD_YSIZE - 1); + GUIDEMO_Delay(200); + #endif + GUI_DispString(s0); + GUIDEMO_Delay(500); + #if GUIDEMO_LARGE + GUI_GotoX(110); + GUIDEMO_SetColor(GUI_GREEN); + #else + GUI_GotoX(100); + GUIDEMO_SetColor(GUI_BLUE); + #endif + #if (LCD_XSIZE < 320) + GUI_DispString("\n"); + #if (LCD_XSIZE < 200) + GUI_GotoX(10); + #else + GUI_GotoX(LCD_XSIZE / 6); + #endif + #endif + GUI_DispString(s1); + GUIDEMO_Delay(1000); +} +#endif + +/********************************************************************* +* +* GUIDEMO_HardwareInfo +* +********************************************************************** +*/ + +void GUIDEMO_HardwareInfo(void) { + #if (LCD_CONTROLLER == 1375) | (LCD_CONTROLLER == 13705) | (LCD_CONTROLLER == 1386) | (LCD_CONTROLLER == 13806) + GUIDEMO_ShowIntro("Hardware info", "" ); + GUI_Clear(); + #if GUIDEMO_LARGE + GUI_SetFont(&GUI_FontComic24B_ASCII); + #else + GUI_SetFont(&GUI_FontComic18B_ASCII); + #endif + GUIDEMO_SetColor(GUI_WHITE); + #if (LCD_CONTROLLER == 1375) | (LCD_CONTROLLER == 13705) + #if GUIDEMO_LARGE + GUI_DispStringAt("EPSON 13705\n", 10, 65 ); + #else + GUI_DispStringHCenterAt("EPSON 13705\n", LCD_XSIZE >> 1, LCD_YSIZE / 14); + #endif + _Show("On chip VRAM", "80 kb"); + _Show("Max. colors", "4096 (4 bit per color)"); + _Show("Display types", "Mono / color / TFT"); + _Show("LUT", "256 index colors"); + #elif (LCD_CONTROLLER == 1386) | (LCD_CONTROLLER == 13806) + #if GUIDEMO_LARGE + GUI_DispStringAt("EPSON 13806\n", 10, 65 ); + #else + GUI_DispStringHCenterAt("EPSON 13806\n", LCD_XSIZE >> 1, LCD_YSIZE / 14); + #endif + _Show("On chip VRAM", "1200 kb"); + _Show("Max. colors", "65536 (up to 16 bpp)"); + _Show("Display types", "Mono / color / TFT (analog / digital)"); + _Show("LUT", "256 index colors"); + #endif + GUIDEMO_Delay(1500); + #endif +} diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Intro.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Intro.c new file mode 100644 index 0000000..d382ff9 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Intro.c @@ -0,0 +1,165 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Intro.c +Purpose : Introduction for emWin generic demo + (This is also a good file to demo and explain basic + emWin features by setting breakpoints) +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" +#include + +/********************************************************************* +* +* GUIDEMO_Intro +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +void GUIDEMO_Intro(void) { + int xCenter = LCD_XSIZE >> 1; + int y, yPos; + char acText[50] = "Version of emWin: "; + strcat(acText, GUI_GetVersionString()); + GUIDEMO_SetBkColor(GUI_BLUE); + GUIDEMO_SetColor(GUI_WHITE); + GUI_Clear(); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringHCenterAt("emWin", xCenter, y = 12); + GUI_SetFont(&GUI_Font13H_ASCII); + GUI_DispStringHCenterAt("Universal graphic software" + "\nfor embedded applications" + , xCenter, y += 23); + GUI_SetColor(GUI_RED); + GUI_SetFont(&GUI_Font16_ASCII); + GUI_DispStringHCenterAt("Any CPU - Any LCD - Any Application" + , xCenter, y += 32); + GUI_SetFont(&GUI_Font10S_ASCII); + GUI_DispStringHCenterAt("Compiled " __DATE__ " "__TIME__, xCenter, y += 18); + GUI_SetFont(&GUI_Font13HB_ASCII); + GUI_SetColor(GUI_WHITE); + GUI_DispStringHCenterAt(acText, xCenter, y += 15); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_SetColor(GUI_WHITE); + GUI_DispStringHCenterAt("www.segger.com", LCD_XSIZE >> 1, LCD_YSIZE - 20); + yPos = y + 15 + ((LCD_YSIZE - y - 33) >> 1); + yPos -= bmSeggerLogoBlue.YSize >> 1; + if (yPos > 160) { + yPos = 160; + } + GUI_DrawBitmap(&bmSeggerLogoBlue, (LCD_XSIZE - bmSeggerLogoBlue.XSize) >> 1, yPos); + #if (LCD_YSIZE >= 220) + GUI_SetFont(&GUI_Font10S_ASCII); + GUI_DispStringAt("GUI_OS: ", 0, LCD_YSIZE - 30); GUI_DispDecMin(GUI_OS); + GUI_DispStringAt("GUI_ALLOC_SIZE: ",0, LCD_YSIZE - 20); GUI_DispDecMin(GUI_ALLOC_SIZE); + GUI_DispStringAt("Compiler: " + #ifdef _MSC_VER + "Microsoft" + #elif defined (NC308) + "Mitsubishi NC308" + #elif defined (NC30) + "Mitsubishi NC30" + #elif defined (__TID__) + #if (((__TID__ >>8) &0x7f) == 48) /* IAR MC80 */ + "IAR M32C" + #elif (((__TID__ >>8) &0x7f) == 85) /* IAR V850 */ + "IAR V850" + #elif defined (__ICCARM__) /* IAR ARM */ + "IAR ARM" + #else /* IAR MC16 */ + "IAR M32C" + #endif + #elif defined __WATCOMC__ /* WATCOM */ + "WATCOM" + #elif defined __GNUC__ + "GNU" + #else + "Unknown" + #endif + ,0, LCD_YSIZE - 10); + #endif + GUIDEMO_Delay(5000); + GUIDEMO_NotifyStartNext(); +} + +#else /* GUIDEMO_LARGE */ + +void GUIDEMO_Intro(void) { + #if GUIDEMO_TINY + char acText[20] = "Version: "; + #else + char acText[32] = "Version of emWin: "; + #endif + int xCenter, dy, y0 = 0; + xCenter = LCD_XSIZE >> 1; + #if (LCD_YSIZE < 72) + dy = 0; + #else + dy = ((LCD_YSIZE - 72) >> 3); + if (dy > 14) dy = 14; + #endif + strcat(acText, GUI_GetVersionString()); + /* Clear the background */ + GUIDEMO_SetBkColor(GUI_BLUE); + GUIDEMO_SetColor(GUI_WHITE); + GUI_Clear(); + /* Display headline */ + GUI_SetFont(&GUI_Font13B_ASCII); + GUI_DispStringHCenterAt("emWin", xCenter, dy + 1); + /* Display description */ + #if (LCD_XSIZE < 140) + GUI_SetFont(&GUI_Font8_ASCII); + #else + GUI_SetFont(&GUI_Font10_ASCII); + #endif + GUI_DispStringHCenterAt("Universal graphic software\n" + "for embedded applications", xCenter, 2 * dy + 18); + /* Display compile time */ + GUI_SetFont(&GUI_Font10S_ASCII); + GUI_DispStringHCenterAt("Compiled " __DATE__ " "__TIME__, xCenter, 3 * dy + 37); + /* Display version number */ + #if (LCD_YSIZE < 80) + GUI_DispStringAt(acText, 6, LCD_YSIZE - 13); + #else + GUI_DispStringHCenterAt(acText, xCenter, 4 * dy + 49); + #endif + GUIDEMO_Delay(5000); + GUIDEMO_NotifyStartNext(); + /* Show SEGGER logo */ + GUI_Clear(); + #if GUIDEMO_TINY + y0 = 2; + #endif + #if (LCD_YSIZE >= 90) + y0 += (LCD_YSIZE - 90) >> 1; + #endif + GUI_DrawBitmap(&bmSeggerLogoBlue, xCenter - (bmSeggerLogoBlue.XSize >> 1), y0); + /* Display URL */ + #if (LCD_YSIZE < 80) + GUI_SetFont(&GUI_Font10_ASCII); + #else + GUI_SetFont(&GUI_Font13B_ASCII); + #endif + y0 += bmSeggerLogoBlue.YSize + 1; + GUI_DispStringHCenterAt("www.segger.com", xCenter, y0); + GUIDEMO_Delay(5000); + GUIDEMO_NotifyStartNext(); +} + +#endif diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_LUT.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_LUT.c new file mode 100644 index 0000000..61f1e16 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_LUT.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Lut.c +Purpose : Modify lookup table +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ + +#if (LCD_BITSPERPIXEL > 2) && (LCD_BITSPERPIXEL <= 8) + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +static void _ModifyLUT(int RFaktor, int GFaktor, int BFaktor) { + int NumColors = LCD_GetDevCap(LCD_DEVCAP_NUMCOLORS); + int i; + for (i = 0; (i < NumColors) && !GUIDEMO_CheckCancel(); i++) { + U32 Color = LCD_GetDevCap(LCD_DEVCAP_COLOR + i); + U32 R = Color & 0xff; + U32 G = (Color >> 8) & 0xff; + U32 B = (Color >> 16) & 0xff; + /* Now modify color */ + R = (R * RFaktor) / 100; if (R > 255) R = 255; + G = (G * GFaktor) / 100; if (G > 255) G = 255; + B = (B * BFaktor) / 100; if (B > 255) B = 255; + /* Write modified color into lookup table */ + Color = R | (G << 8) | (B << 16); + GUI_SetLUTEntry((U8)i, Color); + } +} + +/********************************************************************* +* +* GUIDEMO_DemoLUT +* +********************************************************************** +*/ + +void GUIDEMO_DemoLUT(void) { + int i; + GUIDEMO_ShowIntro("Modify LUT", "... after drawing color bars"); + GUIDEMO_ShowColorBar(); + for (i = 100; (i >= 0) && !GUIDEMO_CheckCancel(); i -= 2) { + _ModifyLUT(100, 100, i); + GUI_Delay(20); + } + for (i = 100; (i >= 0) && !GUIDEMO_CheckCancel(); i -= 2) { + _ModifyLUT(100, i, 0); + GUI_Delay(20); + } + for (i = 100; (i >= 0) && !GUIDEMO_CheckCancel(); i -= 2) { + _ModifyLUT(i, i, i); + GUI_Delay(20); + } + LCD_InitLUT(); + GUIDEMO_Wait(); +} + +#else + +void GUIDEMO_DemoLUT(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_MemDevB.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_MemDevB.c new file mode 100644 index 0000000..69075ba --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_MemDevB.c @@ -0,0 +1,157 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_MemDevB.c +Purpose : Memory device demo +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" +#if GUI_WINSUPPORT +#include "WM.h" +#endif +#include "stdio.h" + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const GUI_POINT _aArrow[] = { + { 0, 0 +85}, + {-40, -35 +85}, + {-10, -25 +85}, + {-10, -85 +85}, + { 10, -85 +85}, + { 10, -25 +85}, + { 40, -35 +85} +}; + +/* Define the callback structure. The structure should contain all the data + required by the callback drawing funtion +*/ +typedef struct { + int Angle; + int DoClear; + GUI_COLOR BkColor; +} tDrawContext; + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +/* The user defined callback routine */ +static void _Draw(void * p) { + int XSize = LCD_GetXSize(); + int YSize = LCD_GetYSize(); + tDrawContext * pContext = (tDrawContext *)p; + int i = pContext->Angle; + static int iLast = -1; + static GUI_POINT aPoint[7]; + if (pContext->DoClear) { + GUI_SetBkColor(pContext->BkColor); + GUI_Clear(); + } + GUI_SetFont(&GUI_FontD24x32); + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetColor(GUI_GRAY); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringHCenterAt("Below arrow", XSize / 2, YSize / 2 - 20); + if (iLast != i) { + float Angle = 0.02 * (float)i; + iLast = i; + GUI_RotatePolygon(aPoint, _aArrow, 7, Angle); + } + GUI_SetColor(GUI_WHITE); + GUI_FillPolygon(&aPoint[0], 7, XSize / 2, YSize / 2 + 30); + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetColor(GUI_DARKGRAY); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringHCenterAt("Above arrow", XSize / 2, YSize / 2); +} + +/********************************************************************* +* +* GUIDEMO_ShowMemoryDevice +* +********************************************************************** +*/ + +void GUIDEMO_ShowMemoryDevice(void) { + int i; + U32 tDiff, t0; + tDrawContext DrawContext; + GUI_RECT rView, rPrev, rTemp; + GUIDEMO_ShowIntro("Memory devices", + "\nFor flicker free animation" + "\nand other purposes"); + GUIDEMO_NotifyStartNext(); + GUI_SetBkColor(GUI_GREEN); + GUI_Clear(); + /* Use banding memory device */ + GUI_GetClientRect(&rView); + DrawContext.BkColor = GUI_ColorIsAvailable(GUI_RED) ? GUI_RED : GUI_BLACK; + GUI_SetBkColor(DrawContext.BkColor); + GUI_Clear(); + t0 = GUI_GetTime(); + for (i = 0; tDiff = GUI_GetTime() - t0, (tDiff < 8000) && !GUIDEMO_CheckCancel(); i++) { + U32 t = GUI_GetTime(); + DrawContext.Angle = 90 + tDiff / 50; + /* Calculate required size */ + { + GUI_HMEM hMem = GUI_MEASDEV_Create(); + GUI_MEASDEV_Select(hMem); + DrawContext.DoClear = 0; + _Draw(&DrawContext); + GUI_MEASDEV_GetRect(hMem, &rView); + GUI_MEASDEV_Delete(hMem); + rTemp = rView; + if (i) + GUI_MergeRect(&rView, &rView, &rPrev); + rPrev = rTemp; + } + DrawContext.DoClear = 1; + GUI_MEMDEV_Draw(&rView, _Draw, &DrawContext, 0, GUI_MEMDEV_NOTRANS); + t = (GUI_GetTime() - t); + if (t < 20) { + GUI_Delay(20 -t); + } + } + GUI_SetFont(&GUI_FontComic24B_ASCII); + GUI_SetColor(GUI_WHITE); + GUI_SetBkColor(DrawContext.BkColor); + GUI_DispStringAt("ms/Update: ", 10 , 200); + if (i) { + GUI_DispDecMin(tDiff / i); + } + GUIDEMO_Delay(1000); + GUI_Clear(); +} + +#else + + void GUIDEMO_ShowMemoryDevice(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + + + diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Messagebox.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Messagebox.c new file mode 100644 index 0000000..61ff5f9 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Messagebox.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Messagebox.c +Purpose : Messagebox samples +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "GUI.h" +#include "GUIDEMO.h" +#include "LCD_ConfDefaults.h" + +#if GUI_WINSUPPORT + +#include "WM.h" +#include "DIALOG.h" + +/********************************************************************* +* +* GUIDEMO_Dialog +* +********************************************************************** +*/ + +void GUIDEMO_Messagebox(void) { + GUI_COLOR Color; + GUIDEMO_ShowIntro("Message boxes", + "Message boxes" "\ncan easily be created"); + Color = WM_SetDesktopColor(GUI_RED); + GUI_MessageBox("Message", "Text", 0); + GUI_Delay(1000); + GUI_MessageBox("2. Message", "Text", 0); + GUI_Delay(1000); + WM_SetDesktopColor(Color); + GUIDEMO_NotifyStartNext(); + +} + +#else + +void GUIDEMO_Messagebox(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Navi.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Navi.c new file mode 100644 index 0000000..3c91013 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Navi.c @@ -0,0 +1,190 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Navi.c +Purpose : Navigation system demo +---------------------------------------------------------------------- +*/ + +#include + +#include "GUI.h" +#include "GUIDEMO.h" + +#if GUI_WINSUPPORT & GUI_SUPPORT_MEMDEV + +#include "WM.h" +#include "FRAMEWIN.h" + +#include "Map.h" + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#if GUIDEMO_TINY + #define BORDER 0 +#else + #define BORDER 8 +#endif + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +static int _MapX = 0; +static int _MapY = 0; +static int _MapHereX = 90; +static int _MapHereY = 15; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _cbNaviWindow +*/ +static void _cbNaviWindow(WM_MESSAGE* pMsg) { + switch (pMsg->MsgId) { + case WM_PAINT: + GUI_SetDrawMode(GUI_DRAWMODE_NORMAL); + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_SetColor(0x0050FF); + GUI_DrawBitmap(&bmMap, -_MapX, -_MapY); + GUI_DrawCircle(_MapHereX - _MapX, _MapHereY - _MapY, 4); + GUI_DrawCircle(_MapHereX - _MapX, _MapHereY - _MapY, 5); + GUI_DispStringAt("You are here", _MapHereX - _MapX - 45, _MapHereY - _MapY - 22); + break; + default: + WM_DefaultProc(pMsg); + } +} + +/********************************************************************* +* +* _NavigationDriveTo +*/ +static void _NavigationDriveTo(WM_HWIN hWin, int x1, int y1) { + GUI_RECT Rect; + int x0 = _MapHereX; + int y0 = _MapHereY; + float dx = x1 - x0; + float dy = y1 - y0; + float Len = sqrt((dx * dx) + (dy * dy)); + float sx = dx / Len; + float sy = dy / Len; + int i, tRef; + WM_GetClientRectEx(hWin, &Rect); + for (i = 1; (i <= Len) && !GUIDEMO_CheckCancel(); i += 2) { + tRef = GUI_GetTime(); + _MapHereX = x0 + (i * sx); + _MapHereY = y0 + (i * sy); + _MapX = _MapHereX - (Rect.x1 >> 1); + _MapY = _MapHereY - (Rect.y1 >> 1); + if (_MapX < 0) { + _MapX = 0; + } else if ((_MapX + Rect.x1) >= bmMap.XSize) { + _MapX = bmMap.XSize - Rect.x1 - 1; + } + if (_MapY < 0) { + _MapY = 0; + } else if ((_MapY + Rect.y1) >= bmMap.YSize) { + _MapY = bmMap.YSize - Rect.y1 - 1; + } + WM_InvalidateWindow(hWin); + do { + GUI_Exec(); + } while (((GUI_GetTime() - tRef) < 100) && !GUIDEMO_CheckCancel()); + } + _MapHereX = x1; + _MapHereY = y1; + WM_InvalidateWindow(hWin); +} + +/********************************************************************* +* +* _ShowMovingMap +*/ +static void _ShowMovingMap(void) { + WM_HWIN hWin; + WM_HWIN hClient; + int i, x, y, w, h; + int xSize = LCD_GetXSize(); + int ySize = LCD_GetYSize(); + const GUI_POINT aRouteToSegger[] = { + { 90, 15}, {131, 54}, {141, 62}, + {166, 46}, {180, 40}, {204, 113}, + {213, 156}, {217, 172}, {206, 173}, + {205, 165} + }; + #if GUIDEMO_LARGE + y = 70; + #else + y = BORDER; + #endif + x = BORDER; + w = xSize - x - BORDER; + h = ySize - y - BORDER; + if (w > bmMap.XSize) { + w = bmMap.XSize; + } + if (h > bmMap.YSize) { + h = bmMap.YSize; + } + /* Initialize starting point */ + _MapHereX = aRouteToSegger[0].x; + _MapHereY = aRouteToSegger[0].y; + /* Create framewin */ + hWin = FRAMEWIN_CreateEx(x, y, w, h, WM_HBKWIN, WM_CF_SHOW | WM_CF_MEMDEV, 0, 0, "Map to Segger (Hilden)", _cbNaviWindow); + FRAMEWIN_SetActive(hWin, 0); + hClient = WM_GetClientWindow(hWin); + WM_SetCallback(hClient, &_cbNaviWindow); + /* Move over map */ + for (i = 1; (i < 10) && !GUIDEMO_CheckCancel(); i++) { + _NavigationDriveTo(hClient, aRouteToSegger[i].x, aRouteToSegger[i].y); + } + GUIDEMO_Delay(1000); + /* Delete framewin */ + WM_DeleteWindow(hWin); +} + +#else + +#define _ShowMovingMap() + +#endif + +/********************************************************************* +* +* GUIDEMO_Navigation +* +********************************************************************** +*/ + +void GUIDEMO_Navigation(void) { + GUIDEMO_ShowIntro("Navigation system", + "\nSamples used in" + "\nNavigation systems"); + _ShowMovingMap(); +} diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Polygon.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Polygon.c new file mode 100644 index 0000000..4bd8acc --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Polygon.c @@ -0,0 +1,147 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Polygon.c +Purpose : Several GUIDEMO routines +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" + +#define COUNTOF(Obj) (sizeof(Obj)/sizeof(Obj[0])) + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const GUI_POINT _aArrow[] = { + { 0, 30 }, + {-40, 0 }, + {-10, 10 }, + {-10, -50 }, + { 10, -50 }, + { 10, 10 }, + { 40, 0 } +}; + +static const GUI_POINT _aTriangle[] = { + { 0, 0 }, + {-30, 30 }, + { 30, 30 }, +}; + +#if GUI_SUPPORT_AA +static const GUI_POINT _aiCursor[] = { + { 0, -10 }, + { 50, 0 }, + { 0, -100 }, + {-50, 0 } +}; +#endif + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _MagnifyPolygon +*/ +#if ((LCD_XSIZE != 320) || (LCD_YSIZE != 240)) +static void _MagnifyPolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, float Mag) { + int j; + for (j = 0; j < NumPoints; j++) { + (pDest + j)->x = (pSrc + j)->x * Mag; + (pDest + j)->y = (pSrc + j)->y * Mag; + } +} +#endif + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUIDEMO_DemoPolygon +*/ +void GUIDEMO_DemoPolygon(void) { + GUI_COLOR Color; + int XMid = (LCD_XSIZE >> 1); + int YMid = (LCD_YSIZE >> 1); + GUIDEMO_ShowIntro("Arbitrary Polygons", + "\nStandard and antialiased"); + GUI_SetColor(GUI_WHITE); + #if GUIDEMO_LARGE + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringAt("Arbitrary\nPolygons", 0, 0); + YMid += 10; + #endif + #if ((LCD_XSIZE != 320) || (LCD_YSIZE != 240)) + { + GUI_POINT aPolygon[8]; + float Factor; + #if ((LCD_XSIZE / 320) < (LCD_YSIZE / 240)) + Factor = LCD_XSIZE / 320.f; + #else + Factor = LCD_YSIZE / 240.f; + #endif + #if !(GUIDEMO_LARGE) + Factor *= 1.2f; + #endif + /* Draw arrows */ + _MagnifyPolygon(aPolygon, _aArrow, COUNTOF(_aArrow), Factor); + GUI_FillPolygon(aPolygon, 7, XMid - (50 * Factor), YMid); + GUI_FillPolygon(aPolygon, 7, XMid + (50 * Factor), YMid); + /* Draw triangle */ + _MagnifyPolygon(aPolygon, _aTriangle, COUNTOF(_aTriangle), Factor); + Color = GUIDEMO_SetColor(GUI_GREEN); + if (Color != GUI_GREEN) { + GUI_SetColor(GUI_YELLOW); + } + GUI_FillPolygon(aPolygon, 3, XMid, YMid + (10 * Factor)); + /* Draw cursor */ + #if GUI_SUPPORT_AA + GUI_SetColor(GUI_WHITE); + GUI_AA_EnableHiRes(); + _MagnifyPolygon(aPolygon, _aiCursor, COUNTOF(_aiCursor), Factor); + GUI_AA_FillPolygon(aPolygon, 4, XMid * 3, (YMid - (10 * Factor)) * 3); + #endif + } + #else + GUI_FillPolygon(_aArrow, 7, XMid - 50, YMid); + GUI_FillPolygon(_aArrow, 7, XMid + 50, YMid); + /* Draw triangle */ + Color = GUIDEMO_SetColor(GUI_GREEN); + if (Color != GUI_GREEN) { + GUI_SetColor(GUI_YELLOW); + } + GUI_FillPolygon(_aTriangle, 3, XMid, YMid + 10); + /* Draw cursor */ + #if GUI_SUPPORT_AA + GUI_SetColor(GUI_WHITE); + GUI_AA_EnableHiRes(); + GUI_AA_FillPolygon((GUI_POINT*)_aiCursor, 4, XMid * 3, (YMid - 10) * 3); + #endif + #endif + GUIDEMO_Wait(); +} diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ProgBar.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ProgBar.c new file mode 100644 index 0000000..536a2c6 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_ProgBar.c @@ -0,0 +1,147 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_DemoProgBar.c +Purpose : Progress bar demo +---------------------------------------------------------------------- +*/ + +#include "GUI.h" +#include "GUIDEMO.h" + +#if GUI_WINSUPPORT + +#include "PROGBAR.h" + +/********************************************************************* +* +* GUIDEMO_DemoProgBar +* +********************************************************************** +*/ + +void GUIDEMO_DemoProgBar(void) { + PROGBAR_Handle ahProgBar[2]; + int i, iRep; + int XMid = LCD_GetXSize() / 2; + int YMid = LCD_GetYSize() / 2; + #if GUIDEMO_LARGE + int MaxReps = 2; + int Length[2] = {110, 140}; + int Height[2] = {20, 10}; + int y0 = YMid - 40; + int dy = 10; + #elif !(GUIDEMO_TINY) + int MaxReps = 1; + int Length[2] = {100, 130}; + int Height[2] = {18, 10}; + int y0 = YMid - 38; + int dy = 9; + #else + int MaxReps = 1; + int Length[2] = {85, 115}; + int Height[2] = {16, 8}; + int y0 = YMid - 35; + int dy = 8; + #endif + if (YMid < 40) { + Height[0] = 14; + y0 = 1; + dy = 4; + } + GUIDEMO_ShowIntro("Widgets", + "\nProgressbars in" + "\nall variations"); + GUI_Clear(); + GUI_SetColor(GUI_WHITE); + GUI_SetFont(&GUI_Font8x16); + GUI_DispStringHCenterAt("Progress bar", XMid, y0); + /* Create `em */ + ahProgBar[0] = PROGBAR_Create(XMid - Length[0] / 2, + YMid - Height[0], + Length[0], + Height[0], + WM_CF_SHOW); + ahProgBar[1] = PROGBAR_Create(XMid - Length[1] / 2, + YMid + dy, + Length[1], + Height[1], + WM_CF_SHOW); + /* Use memory device (optional, for better looks) */ + #if GUI_SUPPORT_MEMDEV + PROGBAR_EnableMemdev(ahProgBar[0]); + PROGBAR_EnableMemdev(ahProgBar[1]); + #endif + GUIDEMO_Delay (800); + PROGBAR_SetMinMax(ahProgBar[1], 0, 500); + for (iRep = 0; iRep < MaxReps; iRep++) { + #if !(GUIDEMO_TINY) + PROGBAR_SetFont(ahProgBar[0], &GUI_Font8x16); + #endif + #if (LCD_BITSPERPIXEL == 2) + PROGBAR_SetBarColor(ahProgBar[0], 0, GUI_DARKGRAY); + PROGBAR_SetBarColor(ahProgBar[1], 0, GUI_DARKGRAY); + PROGBAR_SetBarColor(ahProgBar[0], 1, GUI_WHITE); + PROGBAR_SetBarColor(ahProgBar[1], 1, GUI_WHITE); + #elif (LCD_BITSPERPIXEL <= 4) + PROGBAR_SetBarColor(ahProgBar[0], 0, GUI_DARKGRAY); + PROGBAR_SetBarColor(ahProgBar[0], 1, GUI_LIGHTGRAY); + #else + PROGBAR_SetBarColor(ahProgBar[0], 0, GUI_GREEN); + PROGBAR_SetBarColor(ahProgBar[0], 1, GUI_RED); + #endif + for (i = 0; (i <= 100) && !GUIDEMO_CheckCancel(); i++) { + PROGBAR_SetValue(ahProgBar[0], i); + PROGBAR_SetValue(ahProgBar[1], i); + GUI_Delay(5); + } + PROGBAR_SetText(ahProgBar[0], "Tank empty"); + for (; (i >= 0)&& !GUIDEMO_CheckCancel(); i--) { + PROGBAR_SetValue(ahProgBar[0], i); + PROGBAR_SetValue(ahProgBar[1], 200 - i); + GUI_Delay(5); + } + PROGBAR_SetText(ahProgBar[0], "Any text ..."); + PROGBAR_SetTextAlign(ahProgBar[0], GUI_TA_LEFT); + for (; (i <= 100)&& !GUIDEMO_CheckCancel(); i++) { + PROGBAR_SetValue(ahProgBar[0], i); + PROGBAR_SetValue(ahProgBar[1], 200 + i); + GUI_Delay(5); + } + for (; (i >= 0)&& !GUIDEMO_CheckCancel(); i--) { + PROGBAR_SetValue(ahProgBar[0], i); + PROGBAR_SetValue(ahProgBar[1], 400 - i); + GUI_Delay(5); + } + PROGBAR_SetFont(ahProgBar[0], &GUI_FontComic18B_1); + PROGBAR_SetText(ahProgBar[0], "Any font ..."); + for (; (i <= 100)&& !GUIDEMO_CheckCancel(); i++) { + PROGBAR_SetValue(ahProgBar[0], i); + PROGBAR_SetValue(ahProgBar[1], 400 + i); + GUI_Delay(5); + } + GUIDEMO_Delay(1000); + } + GUIDEMO_Delay(1000); + PROGBAR_Delete(ahProgBar[0]); + PROGBAR_Delete(ahProgBar[1]); + GUIDEMO_Delay(1000); + GUI_SetFont(&GUI_Font10S_ASCII); +} + +#elif defined(NC30) || defined(NC308) + +void GUIDEMO_ProgBar(void) {} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Speed.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Speed.c new file mode 100644 index 0000000..0eca653 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Speed.c @@ -0,0 +1,91 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Speed.c +Purpose : Speed demo +---------------------------------------------------------------------- +*/ + +#include /* for rand */ +#include "GUI.h" +#include "GUIDEMO.h" + +static const GUI_COLOR _aColor[8] = { + 0x000000, + 0x0000FF, + 0x00FF00, + 0x00FFFF, + 0xFF0000, + 0xFF00FF, + 0xFFFF00, + 0xFFFFFF +}; + +/********************************************************************* +* +* GUIDEMO_Speed +* +********************************************************************** +*/ + +void GUIDEMO_Speed(void) { + int t, i; + I32 NumPixels = 0; + U16 aColorIndex[8]; + GUIDEMO_ShowIntro("High speed", + "\nmulti layer clipping" + "\nhighly optimized drivers" + ); + for (i = 0; i< 8; i++) { + aColorIndex[i] = GUI_Color2Index(_aColor[i]); + } + t = GUI_GetTime(); + for (i = 0; ((GUI_GetTime() - t) < 8000) && !GUIDEMO_CheckCancel(); i++) { + GUI_RECT r; + GUI_SetColorIndex(aColorIndex[i&7]); + /* Calculate random positions */ + r.x0 = rand() % LCD_XSIZE - LCD_XSIZE / 2; + r.y0 = rand() % LCD_YSIZE - LCD_YSIZE / 2; + r.x1 = r.x0 + 20 + rand() % LCD_XSIZE; + r.y1 = r.y0 + 20 + rand() % LCD_YSIZE; + GUI_FillRect(r.x0, r.y0, r.x1, r.y1); + /* Clip rectangle to visible area and add the number of pixels (for speed computation) */ + if (r.x1 >= LCD_XSIZE) + r.x1 = LCD_XSIZE - 1; + if (r.y1 >= LCD_YSIZE) + r.y1 = LCD_YSIZE - 1; + if (r.x0 < 0 ) + r.x0 = 0; + if (r.y1 < 0) + r.y1 = 0; + NumPixels += (r.x1 - r.x0) * (r.y1 - r.y0); + /* Allow short breaks so we do not use all available CPU time ... */ + } + t = (GUI_GetTime() - t) / 100; + GUI_Clear(); + GUIDEMO_NotifyStartNext(); + #if GUIDEMO_LARGE + GUI_SetFont(&GUI_FontComic24B_ASCII); + #elif !(GUIDEMO_TINY) + GUI_SetFont(&GUI_Font16B_ASCII); + #else + GUI_SetFont(&GUI_Font13B_ASCII); + #endif + GUI_SetColor(GUI_WHITE); + GUI_DispStringAt("Pixels/sec: ", 5, (LCD_YSIZE - GUI_GetFontSizeY()) / 2); + if (t == 0) + t++; + GUI_DispDecMin(10 * (NumPixels / t)); + GUIDEMO_Wait(); +} diff --git a/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Touch.c b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Touch.c new file mode 100644 index 0000000..7a07eac --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/GUIDEMO_Touch.c @@ -0,0 +1,388 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUIDEMO_Touch +Purpose : Touch demo +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "LCD_ConfDefaults.h" /* valid LCD configuration */ +#include "GUIDEMO.h" + +#if (GUI_WINSUPPORT && GUI_SUPPORT_TOUCH) + +#include "BUTTON.h" +#include "EDIT.h" + +#define countof(Obj) (sizeof(Obj)/sizeof(Obj[0])) + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +static int _Log2Phys(int l, I32 l0, I32 l1, I32 p0, I32 p1) { + return p0 + ((p1 - p0) * (l - l0)) / (l1 - l0); +} + +static void _Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1, int *p0, int *p1) { + int l0 = 0; + int l1 = (Coord == GUI_COORD_X) ? LCD_XSIZE - 1 : LCD_YSIZE - 1; + *p0 = _Log2Phys(l0, Log0, Log1, Phys0, Phys1); + *p1 = _Log2Phys(l1, Log0, Log1, Phys0, Phys1); +} + +/********************************************************************* +* +* _ExecCalibration +* +********************************************************************** +*/ + +static void _ExecCalibration(void) { + int ax_Phys[2],ay_Phys[2]; +/* calculate log. Positions */ + int ax[2] = { 15, LCD_XSIZE -1-15}; +// const int ay[2] = { 15, LCD_YSIZE-1-15}; + int ay[2] = { LCD_YSIZE-1-15, 15}; + GUI_TOUCH_SetDefaultCalibration(); +/* _Calibrate upper left */ + GUI_SetBkColor(GUI_RED); + GUI_Clear(); + GUI_SetColor(GUI_WHITE); GUI_FillCircle(ax[0], ay[0], 10); + GUI_SetColor(GUI_RED); GUI_FillCircle(ax[0], ay[0], 5); + GUI_SetColor(GUI_WHITE); + GUI_DispStringAt("Press here", ax[0]+20, ay[0]); + do { + GUI_PID_STATE State; + GUI_TOUCH_GetState(&State); + if (State.Pressed) { + ax_Phys[0] = GUI_TOUCH_GetxPhys(); + ay_Phys[0] = GUI_TOUCH_GetyPhys(); + break; + } + GUI_Delay (100); + } while (1); +/* Tell user to release */ + GUI_Clear(); + GUI_DispStringAt("OK", ax[0]+20, ay[0]); + do { + GUI_PID_STATE State; + GUI_TOUCH_GetState(&State); + if (State.Pressed == 0) { + break; + } + GUI_Delay (100); + } while (1); +/* _Calibrate lower right */ + GUI_SetBkColor(GUI_RED); + GUI_Clear(); + GUI_SetColor(GUI_WHITE); GUI_FillCircle(ax[1], ay[1], 10); + GUI_SetColor(GUI_RED); GUI_FillCircle(ax[1], ay[1], 5); + GUI_SetColor(GUI_WHITE); + GUI_SetTextAlign(GUI_TA_RIGHT); + GUI_DispStringAt("Press here", ax[1]-20, ay[1]); + do { + GUI_PID_STATE State; + GUI_TOUCH_GetState(&State); + if (State.Pressed) { + ax_Phys[1] = GUI_TOUCH_GetxPhys(); + ay_Phys[1] = GUI_TOUCH_GetyPhys(); + break; + } + GUI_Delay (100); + } while (1); + GUI_TOUCH_Calibrate(GUI_COORD_X, ax[0], ax[1], ax_Phys[0], ax_Phys[1]); + GUI_TOUCH_Calibrate(GUI_COORD_Y, ay[0], ay[1], ay_Phys[0], ay_Phys[1]); + { /* calculate and display values for configuration file */ + int x0, x1; + int y0, y1; + GUI_Clear(); + _Calibrate(GUI_COORD_X, ax[0], ax[1], ax_Phys[0], ax_Phys[1], &x0, &x1); + _Calibrate(GUI_COORD_Y, ay[0], ay[1], ay_Phys[0], ay_Phys[1], &y0, &y1); + GUI_DispStringAt("x0: ", 0, 0); GUI_DispDec(x0, 4); GUI_DispNextLine(); + GUI_DispString ("x1: "); GUI_DispDec(x1, 4); GUI_DispNextLine(); + GUI_DispString ("y0: "); GUI_DispDec(y0, 4); GUI_DispNextLine(); + GUI_DispString ("y1: "); GUI_DispDec(y1, 4); GUI_DispNextLine(); + GUI_DispString ("Please touch display to continue..."); + GUI_Delay(1000); + do { + GUI_PID_STATE State; + GUI_TOUCH_GetState(&State); + if (State.Pressed) + break; + GUI_Delay (10); + } while (1); + } +} + +/********************************************************************* +* +* _TestCalibration +* +********************************************************************** +*/ + +static void _TestCalibration(void) { + int IdleCnt=0; + BUTTON_Handle hButton; + GUI_SetBkColor(GUI_RED); + GUI_SetColor(GUI_WHITE); + GUI_Clear(); + hButton = BUTTON_Create( 225, 15, 80, 40, 1, BUTTON_CF_SHOW ); + BUTTON_SetText (hButton, "ABORT"); + BUTTON_SetFont (hButton, &GUI_FontComic18B_ASCII); + while ((IdleCnt<50) && (GUI_GetKey()==0)) { + static GUI_PID_STATE StateLast; + GUI_PID_STATE State; + GUI_TOUCH_GetState(&State); + if ((StateLast.Pressed != State.Pressed) && (State.Pressed == 0)) { + GUI_Clear(); + } + if ((StateLast.x != State.x) || ((StateLast.y != State.y))) { + if (State.Pressed) { + GUI_FillCircle(State.x, State.y, 5); + } + StateLast = State; + } + if (State.Pressed) { + IdleCnt =0; + } else { + IdleCnt++; + } + GUI_Delay (100); + } + EDIT_Delete(hButton); +} + +/********************************************************************* +* +* _ExecKeyboard +* +********************************************************************** + +This creates a sample keyboard. +The routine returns after ENTER or ESC has been pressed. +*/ + +#if (LCD_XSIZE == 320) && (LCD_YSIZE == 240) + +static char _acText[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '=' + ,0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P' + ,0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Q' + ,0, 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '', '', '' + ,' ', ' ', ' ', ' ', ' ', 0, 0 +}; + +static int _ExecKeyboard(void) { + int i; + int Key; + BUTTON_Handle ahButton[52]; + BUTTON_Handle hButtonESC; + EDIT_Handle hEdit; + GUI_RECT rText = {000,0, LCD_XSIZE, 20}; + GUI_SetBkColor(GUI_RED); + GUI_Clear(); + GUI_DrawBitmap(&bmSeggerLogoBlue, 0, 0); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_SetColor(GUI_WHITE); + GUI_DispStringInRect("emWin", &rText, GUI_TA_RIGHT | GUI_TA_VCENTER); + rText.y0 +=20; + rText.y1 +=20; + GUI_DispStringInRect("Touch screen demo", &rText, GUI_TA_RIGHT | GUI_TA_VCENTER); + /* Create Keyboard Buttons */ + for (i=0; i< 51; i++) { + int Pos = (i < 47) ? i : i+4; + int x0 = 5 + 28*(Pos%11); + int y0 = 100 + 28*(Pos/11); + char c = _acText[i]; + int Id = c ? c : 1; + char ac[2] = {0}; + char *s= ac; + ac[0] = c; + ahButton[i] = BUTTON_Create( x0, y0, 25, 25, Id,BUTTON_CF_SHOW ); + BUTTON_SetText (ahButton[i], s); + #if GUI_SUPPORT_MEMDEV + BUTTON_EnableMemdev(ahButton[i]); + #endif + } + ahButton[i] = BUTTON_Create( 89, 212, 109, 25, ' ',BUTTON_CF_SHOW ); + hButtonESC = BUTTON_Create( 230, 40, 80, 25, GUI_ID_CANCEL,BUTTON_CF_SHOW ); + BUTTON_SetText (hButtonESC, "ESC"); + hEdit = EDIT_Create( 5, 70, 310, 25, ' ', 80, 0 ); + EDIT_SetFont(hEdit, &GUI_Font8x16); + BUTTON_SetBkColor(ahButton[49], 0, GUI_RED); + BUTTON_SetBkColor(ahButton[50], 0, GUI_BLUE); + /* Handle Keyboard until ESC or ENTER is pressed */ + do { + Key = GUIDEMO_WaitKey(); + switch (Key) { + case 0: + case GUI_ID_CANCEL: + break; + default: + EDIT_AddKey(hEdit, Key); + } + } while ((Key != 'N') && (Key!=GUI_ID_CANCEL) && (Key!=0)); + /* Cleanup */ + for (i=0; i< countof(ahButton); i++) { + BUTTON_Delete(ahButton[i]); + } + BUTTON_Delete(hButtonESC); + EDIT_Delete(hEdit); + return Key; +} + +#else + +static char _acText[] = { + '7','8','9','/', + '4','5','6','*', + '1','2','3','-', + '0',',','+','=',0 +}; + +static int _ExecKeyboard(void) { + int y0 = 75; + int XSize = LCD_GetXSize(); + int YSize = LCD_GetYSize(); + int XStep = XSize / 4; + int YStep = (YSize - y0) / 4; + int i; + int Key; + BUTTON_Handle ahButton[16]; + BUTTON_Handle hButtonESC; + EDIT_Handle hEdit; + GUI_RECT rText = {0}; + rText.x1 = LCD_GetXSize() - 3; + rText.y1 = 20; + GUI_SetBkColor(GUI_RED); + GUI_Clear(); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_SetColor(GUI_WHITE); + GUI_DispStringInRect("emWin", &rText, GUI_TA_RIGHT | GUI_TA_VCENTER); + rText.y0 +=20; + rText.y1 +=20; + GUI_DispStringInRect("Touch screen demo", &rText, GUI_TA_RIGHT | GUI_TA_VCENTER); + /* Create Keyboard Buttons */ + for (i=0; _acText[i]; i++) { + int XPos = (i%4) * XStep + 3; + int YPos = (i/4) * YStep + 3 + y0; + char c = _acText[i]; + int Id = c ? c : 1; + char ac[2] = {0}; + char *s= ac; + ac[0] = c; + ahButton[i] = BUTTON_Create( XPos, YPos, XStep - 5, YStep - 5, Id, BUTTON_CF_SHOW ); + BUTTON_SetText(ahButton[i], s); + BUTTON_EnableMemdev(ahButton[i]); + } + hButtonESC = BUTTON_Create( 3, 3, 80, 25, GUI_ID_CANCEL, BUTTON_CF_SHOW ); + BUTTON_SetText(hButtonESC, "ESC"); + hEdit = EDIT_Create( 5, y0 - 30, XSize - 10, 25, ' ', 80, 0 ); + EDIT_SetFont(hEdit, &GUI_Font8x16); + /* Handle Keyboard until ESC or ENTER is pressed */ + do { + Key = GUIDEMO_WaitKey(); + switch (Key) { + case 0: + case GUI_ID_CANCEL: + break; + default: + EDIT_AddKey(hEdit, Key); + } + } while ((Key != 'N') && (Key!=GUI_ID_CANCEL) && (Key!=0)); + /* Cleanup */ + for (i=0; i< countof(ahButton); i++) { + BUTTON_Delete(ahButton[i]); + } + BUTTON_Delete(hButtonESC); + EDIT_Delete(hEdit); + return Key; +} + +#endif + +/* +********************************************************************** +* +* USER_Task +* +********************************************************************** +*/ + +#if GUIDEMO_LARGE + +void GUIDEMO_Touch(void) { + #define ID_KEYBOARD 1 + #define ID_TESTCAL 2 + #define ID_CALIBRATE 3 + int i, r; + int XSize = LCD_GetXSize(); + int YSize = LCD_GetYSize(); + int XMid = XSize / 2; + int YMid = YSize / 2; + GUIDEMO_NotifyStartNext(); + GUIDEMO_HideInfoWin(); + do { + GUI_RECT rText;/*= {0, 80, XSize, 120};*/ + BUTTON_Handle ahButton[3]; + rText.x0=0; + rText.y0=80; + rText.x1=XSize; + rText.y1=120; + GUI_SetBkColor(GUI_BLUE); + GUI_Clear(); + GUI_DrawBitmap(&bmSeggerLogoBlue, (XSize - 1 - bmSeggerLogoBlue.XSize) / 2, 15); + GUI_SetFont(&GUI_FontComic18B_ASCII); + GUI_DispStringInRect("emWin Touch screen demo", &rText, GUI_TA_HCENTER | GUI_TA_VCENTER); + ahButton[0] = BUTTON_Create( XMid - 50, YMid - 20, 100, 50, ID_CALIBRATE,BUTTON_CF_SHOW ); + ahButton[1] = BUTTON_Create( XMid - 90, YMid + 40, 80, 30, ID_KEYBOARD, BUTTON_CF_SHOW ); + ahButton[2] = BUTTON_Create( XMid + 10, YMid + 40, 80, 30, ID_TESTCAL,BUTTON_CF_SHOW ); + BUTTON_SetText (ahButton[0], "Calibrate"); + BUTTON_SetBkColor(ahButton[0], 0, GUI_RED); + BUTTON_SetText (ahButton[1], "Keyboard"); + BUTTON_SetText (ahButton[2], "Test calibration"); + BUTTON_SetFont(ahButton[0], &GUI_FontComic18B_ASCII); + r = GUIDEMO_WaitKey(); + if (r==0) { + r = ID_KEYBOARD; + BUTTON_SetState(ahButton[1], BUTTON_STATE_PRESSED); + GUIDEMO_Delay(500); + } + for (i=0; i< countof(ahButton); i++) { + BUTTON_Delete(ahButton[i]); + } + switch (r) { + case ID_KEYBOARD: r= _ExecKeyboard(); break; + case ID_CALIBRATE: _ExecCalibration(); break; + case ID_TESTCAL: _TestCalibration(); break; + } + } while (r && (r!='n') && (r!='N')); +} + +#else + +void GUIDEMO_Touch(void) {} + +#endif + +#else + +void GUIDEMO_Touch(void) {} /* avoid empty object files */ + +#endif /* #if GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/GUIDemo/Map.h b/User/system/lib/lcd/gui/GUIDemo/Map.h new file mode 100644 index 0000000..4382446 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/Map.h @@ -0,0 +1,5793 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : Map.h +Purpose : Bitmap file +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "stdlib.h" + +#include "GUI.h" + +/* Palette + + +The following are the entries of the palette table. +Every entry is a 32-bit value (of which 24 bits are actually used) +the lower 8 bits represent the Red component, +the middle 8 bits represent the Green component, +the highest 8 bits (of the 24 bits used) represent the Blue component +as follows: 0xBBGGRR +*/ +const GUI_COLOR ColorsMap[] = { + 0xEEEEEE,0x99CCFF,0xCCFFCC,0xFFFFFF + ,0xCCCCCC,0x0000FF,0x888888,0x000000 + ,0x33FFFF,0x444444,0xDDDDDD,0xBBBBBB + ,0x99CC99,0x777777,0xAAAAAA,0x555555 + ,0x00FFFF,0x666666,0x999999,0x660000 + ,0x669966,0xCCCCFF,0xFF0066,0xCC0033 + ,0xCCFFFF,0x9999FF,0x6666FF,0x99FFFF +}; + + +const GUI_LOGPALETTE PalMap = { + 28, /* number of entries */ + 0, /* No transparency */ + &ColorsMap[0] +}; + + + +const unsigned char acMap[] = { + /* RLE: 011 Pixels @ 000,000*/ 11, 0x0C, + /* RLE: 001 Pixels @ 011,000*/ 1, 0x14, + /* RLE: 026 Pixels @ 012,000*/ 26, 0x0C, + /* RLE: 001 Pixels @ 038,000*/ 1, 0x02, + /* RLE: 033 Pixels @ 039,000*/ 33, 0x01, + /* RLE: 001 Pixels @ 072,000*/ 1, 0x04, + /* RLE: 007 Pixels @ 073,000*/ 7, 0x03, + /* ABS: 002 Pixels @ 080,000*/ 0, 2, 0x04, 0x04, + /* RLE: 091 Pixels @ 082,000*/ 91, 0x00, + /* ABS: 004 Pixels @ 173,000*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 047 Pixels @ 177,000*/ 47, 0x01, + /* RLE: 001 Pixels @ 224,000*/ 1, 0x04, + /* RLE: 019 Pixels @ 225,000*/ 19, 0x03, + /* RLE: 003 Pixels @ 244,000*/ 3, 0x04, + /* RLE: 141 Pixels @ 247,000*/ 141, 0x01, + /* RLE: 006 Pixels @ 000,001*/ 6, 0x0C, + /* RLE: 001 Pixels @ 006,001*/ 1, 0x14, + /* RLE: 005 Pixels @ 007,001*/ 5, 0x0C, + /* RLE: 001 Pixels @ 012,001*/ 1, 0x14, + /* RLE: 007 Pixels @ 013,001*/ 7, 0x0C, + /* RLE: 003 Pixels @ 020,001*/ 3, 0x14, + /* RLE: 014 Pixels @ 023,001*/ 14, 0x0C, + /* RLE: 001 Pixels @ 037,001*/ 1, 0x02, + /* RLE: 034 Pixels @ 038,001*/ 34, 0x01, + /* RLE: 001 Pixels @ 072,001*/ 1, 0x04, + /* RLE: 008 Pixels @ 073,001*/ 8, 0x03, + /* ABS: 002 Pixels @ 081,001*/ 0, 2, 0x04, 0x04, + /* RLE: 091 Pixels @ 083,001*/ 91, 0x00, + /* ABS: 004 Pixels @ 174,001*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 046 Pixels @ 178,001*/ 46, 0x01, + /* RLE: 001 Pixels @ 224,001*/ 1, 0x04, + /* RLE: 015 Pixels @ 225,001*/ 15, 0x03, + /* RLE: 003 Pixels @ 240,001*/ 3, 0x04, + /* RLE: 145 Pixels @ 243,001*/ 145, 0x01, + /* RLE: 019 Pixels @ 000,002*/ 19, 0x0C, + /* ABS: 005 Pixels @ 019,002*/ 0, 5, 0x14, 0x0C, 0x0C, 0x14, 0x14, + /* RLE: 012 Pixels @ 024,002*/ 12, 0x0C, + /* RLE: 001 Pixels @ 036,002*/ 1, 0x02, + /* RLE: 036 Pixels @ 037,002*/ 36, 0x01, + /* RLE: 001 Pixels @ 073,002*/ 1, 0x04, + /* RLE: 008 Pixels @ 074,002*/ 8, 0x03, + /* ABS: 002 Pixels @ 082,002*/ 0, 2, 0x04, 0x04, + /* RLE: 091 Pixels @ 084,002*/ 91, 0x00, + /* RLE: 001 Pixels @ 175,002*/ 1, 0x0D, + /* RLE: 004 Pixels @ 176,002*/ 4, 0x06, + /* RLE: 044 Pixels @ 180,002*/ 44, 0x01, + /* RLE: 001 Pixels @ 224,002*/ 1, 0x04, + /* RLE: 011 Pixels @ 225,002*/ 11, 0x03, + /* RLE: 003 Pixels @ 236,002*/ 3, 0x04, + /* RLE: 149 Pixels @ 239,002*/ 149, 0x01, + /* RLE: 019 Pixels @ 000,003*/ 19, 0x0C, + /* ABS: 006 Pixels @ 019,003*/ 0, 6, 0x14, 0x0C, 0x0C, 0x0C, 0x14, 0x14, + /* RLE: 006 Pixels @ 025,003*/ 6, 0x0C, + /* ABS: 005 Pixels @ 031,003*/ 0, 5, 0x14, 0x0C, 0x0C, 0x0C, 0x02, + /* RLE: 037 Pixels @ 036,003*/ 37, 0x01, + /* ABS: 002 Pixels @ 073,003*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 075,003*/ 8, 0x03, + /* ABS: 002 Pixels @ 083,003*/ 0, 2, 0x04, 0x04, + /* RLE: 091 Pixels @ 085,003*/ 91, 0x00, + /* ABS: 005 Pixels @ 176,003*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 043 Pixels @ 181,003*/ 43, 0x01, + /* ABS: 002 Pixels @ 224,003*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 226,003*/ 6, 0x03, + /* RLE: 003 Pixels @ 232,003*/ 3, 0x04, + /* RLE: 153 Pixels @ 235,003*/ 153, 0x01, + /* RLE: 001 Pixels @ 000,004*/ 1, 0x14, + /* RLE: 017 Pixels @ 001,004*/ 17, 0x0C, + /* RLE: 001 Pixels @ 018,004*/ 1, 0x14, + /* RLE: 004 Pixels @ 019,004*/ 4, 0x0C, + /* ABS: 002 Pixels @ 023,004*/ 0, 2, 0x14, 0x14, + /* RLE: 007 Pixels @ 025,004*/ 7, 0x0C, + /* ABS: 003 Pixels @ 032,004*/ 0, 3, 0x14, 0x0C, 0x02, + /* RLE: 038 Pixels @ 035,004*/ 38, 0x01, + /* RLE: 003 Pixels @ 073,004*/ 3, 0x04, + /* RLE: 008 Pixels @ 076,004*/ 8, 0x03, + /* ABS: 002 Pixels @ 084,004*/ 0, 2, 0x04, 0x04, + /* RLE: 091 Pixels @ 086,004*/ 91, 0x00, + /* ABS: 005 Pixels @ 177,004*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x0D, + /* RLE: 043 Pixels @ 182,004*/ 43, 0x01, + /* RLE: 006 Pixels @ 225,004*/ 6, 0x04, + /* RLE: 157 Pixels @ 231,004*/ 157, 0x01, + /* RLE: 007 Pixels @ 000,005*/ 7, 0x0C, + /* RLE: 001 Pixels @ 007,005*/ 1, 0x14, + /* RLE: 011 Pixels @ 008,005*/ 11, 0x0C, + /* ABS: 005 Pixels @ 019,005*/ 0, 5, 0x14, 0x0C, 0x0C, 0x0C, 0x14, + /* RLE: 009 Pixels @ 024,005*/ 9, 0x0C, + /* RLE: 042 Pixels @ 033,005*/ 42, 0x01, + /* ABS: 002 Pixels @ 075,005*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 077,005*/ 8, 0x03, + /* ABS: 002 Pixels @ 085,005*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 087,005*/ 92, 0x00, + /* ABS: 004 Pixels @ 179,005*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 205 Pixels @ 183,005*/ 205, 0x01, + /* RLE: 006 Pixels @ 000,006*/ 6, 0x0C, + /* ABS: 003 Pixels @ 006,006*/ 0, 3, 0x14, 0x0C, 0x14, + /* RLE: 005 Pixels @ 009,006*/ 5, 0x0C, + /* RLE: 001 Pixels @ 014,006*/ 1, 0x14, + /* RLE: 005 Pixels @ 015,006*/ 5, 0x0C, + /* ABS: 004 Pixels @ 020,006*/ 0, 4, 0x14, 0x0C, 0x14, 0x14, + /* RLE: 008 Pixels @ 024,006*/ 8, 0x0C, + /* RLE: 044 Pixels @ 032,006*/ 44, 0x01, + /* ABS: 002 Pixels @ 076,006*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 078,006*/ 8, 0x03, + /* ABS: 002 Pixels @ 086,006*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 088,006*/ 92, 0x00, + /* ABS: 004 Pixels @ 180,006*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 204 Pixels @ 184,006*/ 204, 0x01, + /* RLE: 004 Pixels @ 000,007*/ 4, 0x0C, + /* ABS: 006 Pixels @ 004,007*/ 0, 6, 0x14, 0x14, 0x0C, 0x0C, 0x14, 0x14, + /* RLE: 012 Pixels @ 010,007*/ 12, 0x0C, + /* RLE: 001 Pixels @ 022,007*/ 1, 0x14, + /* RLE: 008 Pixels @ 023,007*/ 8, 0x0C, + /* RLE: 046 Pixels @ 031,007*/ 46, 0x01, + /* ABS: 002 Pixels @ 077,007*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 079,007*/ 8, 0x03, + /* ABS: 002 Pixels @ 087,007*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 089,007*/ 92, 0x00, + /* ABS: 004 Pixels @ 181,007*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 203 Pixels @ 185,007*/ 203, 0x01, + /* RLE: 003 Pixels @ 000,008*/ 3, 0x0C, + /* RLE: 001 Pixels @ 003,008*/ 1, 0x14, + /* RLE: 005 Pixels @ 004,008*/ 5, 0x0C, + /* ABS: 002 Pixels @ 009,008*/ 0, 2, 0x14, 0x14, + /* RLE: 011 Pixels @ 011,008*/ 11, 0x0C, + /* RLE: 001 Pixels @ 022,008*/ 1, 0x14, + /* RLE: 007 Pixels @ 023,008*/ 7, 0x0C, + /* RLE: 048 Pixels @ 030,008*/ 48, 0x01, + /* ABS: 002 Pixels @ 078,008*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 080,008*/ 8, 0x03, + /* ABS: 002 Pixels @ 088,008*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 090,008*/ 92, 0x00, + /* ABS: 005 Pixels @ 182,008*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 201 Pixels @ 187,008*/ 201, 0x01, + /* RLE: 004 Pixels @ 000,009*/ 4, 0x0C, + /* RLE: 001 Pixels @ 004,009*/ 1, 0x14, + /* RLE: 004 Pixels @ 005,009*/ 4, 0x0C, + /* ABS: 002 Pixels @ 009,009*/ 0, 2, 0x14, 0x14, + /* RLE: 011 Pixels @ 011,009*/ 11, 0x0C, + /* RLE: 001 Pixels @ 022,009*/ 1, 0x14, + /* RLE: 006 Pixels @ 023,009*/ 6, 0x0C, + /* RLE: 050 Pixels @ 029,009*/ 50, 0x01, + /* ABS: 002 Pixels @ 079,009*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 081,009*/ 8, 0x03, + /* ABS: 002 Pixels @ 089,009*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 091,009*/ 92, 0x00, + /* ABS: 005 Pixels @ 183,009*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 200 Pixels @ 188,009*/ 200, 0x01, + /* RLE: 003 Pixels @ 000,010*/ 3, 0x0C, + /* RLE: 001 Pixels @ 003,010*/ 1, 0x14, + /* RLE: 006 Pixels @ 004,010*/ 6, 0x0C, + /* ABS: 002 Pixels @ 010,010*/ 0, 2, 0x14, 0x14, + /* RLE: 016 Pixels @ 012,010*/ 16, 0x0C, + /* RLE: 052 Pixels @ 028,010*/ 52, 0x01, + /* ABS: 002 Pixels @ 080,010*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 082,010*/ 8, 0x03, + /* ABS: 002 Pixels @ 090,010*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 092,010*/ 92, 0x00, + /* ABS: 005 Pixels @ 184,010*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 199 Pixels @ 189,010*/ 199, 0x01, + /* RLE: 003 Pixels @ 000,011*/ 3, 0x0C, + /* RLE: 001 Pixels @ 003,011*/ 1, 0x14, + /* RLE: 005 Pixels @ 004,011*/ 5, 0x0C, + /* ABS: 002 Pixels @ 009,011*/ 0, 2, 0x14, 0x14, + /* RLE: 015 Pixels @ 011,011*/ 15, 0x0C, + /* RLE: 001 Pixels @ 026,011*/ 1, 0x14, + /* RLE: 054 Pixels @ 027,011*/ 54, 0x01, + /* ABS: 002 Pixels @ 081,011*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 083,011*/ 8, 0x03, + /* ABS: 002 Pixels @ 091,011*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 093,011*/ 93, 0x00, + /* ABS: 004 Pixels @ 186,011*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 198 Pixels @ 190,011*/ 198, 0x01, + /* RLE: 004 Pixels @ 000,012*/ 4, 0x0C, + /* ABS: 006 Pixels @ 004,012*/ 0, 6, 0x14, 0x0C, 0x0C, 0x0C, 0x14, 0x14, + /* RLE: 016 Pixels @ 010,012*/ 16, 0x0C, + /* RLE: 056 Pixels @ 026,012*/ 56, 0x01, + /* ABS: 002 Pixels @ 082,012*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 084,012*/ 8, 0x03, + /* ABS: 002 Pixels @ 092,012*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 094,012*/ 93, 0x00, + /* ABS: 004 Pixels @ 187,012*/ 0, 4, 0x0D, 0x06, 0x06, 0x0D, + /* RLE: 197 Pixels @ 191,012*/ 197, 0x01, + /* RLE: 005 Pixels @ 000,013*/ 5, 0x0C, + /* ABS: 004 Pixels @ 005,013*/ 0, 4, 0x14, 0x0C, 0x0C, 0x14, + /* RLE: 008 Pixels @ 009,013*/ 8, 0x0C, + /* RLE: 001 Pixels @ 017,013*/ 1, 0x14, + /* RLE: 006 Pixels @ 018,013*/ 6, 0x0C, + /* RLE: 059 Pixels @ 024,013*/ 59, 0x01, + /* ABS: 002 Pixels @ 083,013*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 085,013*/ 8, 0x03, + /* ABS: 002 Pixels @ 093,013*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 095,013*/ 93, 0x00, + /* ABS: 004 Pixels @ 188,013*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 196 Pixels @ 192,013*/ 196, 0x01, + /* RLE: 008 Pixels @ 000,014*/ 8, 0x0C, + /* RLE: 001 Pixels @ 008,014*/ 1, 0x14, + /* RLE: 014 Pixels @ 009,014*/ 14, 0x0C, + /* RLE: 061 Pixels @ 023,014*/ 61, 0x01, + /* ABS: 002 Pixels @ 084,014*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 086,014*/ 8, 0x03, + /* ABS: 002 Pixels @ 094,014*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 096,014*/ 93, 0x00, + /* ABS: 004 Pixels @ 189,014*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 195 Pixels @ 193,014*/ 195, 0x01, + /* RLE: 008 Pixels @ 000,015*/ 8, 0x0C, + /* ABS: 002 Pixels @ 008,015*/ 0, 2, 0x14, 0x14, + /* RLE: 012 Pixels @ 010,015*/ 12, 0x0C, + /* RLE: 063 Pixels @ 022,015*/ 63, 0x01, + /* ABS: 002 Pixels @ 085,015*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 087,015*/ 8, 0x03, + /* ABS: 002 Pixels @ 095,015*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 097,015*/ 93, 0x00, + /* ABS: 005 Pixels @ 190,015*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 193 Pixels @ 195,015*/ 193, 0x01, + /* RLE: 013 Pixels @ 000,016*/ 13, 0x0C, + /* RLE: 001 Pixels @ 013,016*/ 1, 0x14, + /* RLE: 007 Pixels @ 014,016*/ 7, 0x0C, + /* RLE: 065 Pixels @ 021,016*/ 65, 0x01, + /* ABS: 002 Pixels @ 086,016*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 088,016*/ 8, 0x03, + /* ABS: 002 Pixels @ 096,016*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 098,016*/ 93, 0x00, + /* RLE: 001 Pixels @ 191,016*/ 1, 0x0D, + /* RLE: 004 Pixels @ 192,016*/ 4, 0x06, + /* RLE: 192 Pixels @ 196,016*/ 192, 0x01, + /* RLE: 019 Pixels @ 000,017*/ 19, 0x0C, + /* ABS: 002 Pixels @ 019,017*/ 0, 2, 0x07, 0x07, + /* RLE: 066 Pixels @ 021,017*/ 66, 0x01, + /* ABS: 002 Pixels @ 087,017*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 089,017*/ 8, 0x03, + /* ABS: 002 Pixels @ 097,017*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 099,017*/ 93, 0x00, + /* ABS: 005 Pixels @ 192,017*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 191 Pixels @ 197,017*/ 191, 0x01, + /* RLE: 007 Pixels @ 000,018*/ 7, 0x0C, + /* RLE: 001 Pixels @ 007,018*/ 1, 0x14, + /* RLE: 010 Pixels @ 008,018*/ 10, 0x0C, + /* ABS: 002 Pixels @ 018,018*/ 0, 2, 0x07, 0x02, + /* RLE: 068 Pixels @ 020,018*/ 68, 0x01, + /* ABS: 002 Pixels @ 088,018*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 090,018*/ 9, 0x03, + /* ABS: 002 Pixels @ 099,018*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 101,018*/ 93, 0x00, + /* ABS: 004 Pixels @ 194,018*/ 0, 4, 0x0D, 0x06, 0x06, 0x0D, + /* RLE: 190 Pixels @ 198,018*/ 190, 0x01, + /* RLE: 003 Pixels @ 000,019*/ 3, 0x14, + /* RLE: 013 Pixels @ 003,019*/ 13, 0x0C, + /* RLE: 004 Pixels @ 016,019*/ 4, 0x02, + /* RLE: 069 Pixels @ 020,019*/ 69, 0x01, + /* ABS: 002 Pixels @ 089,019*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 091,019*/ 9, 0x03, + /* ABS: 002 Pixels @ 100,019*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 102,019*/ 93, 0x00, + /* ABS: 004 Pixels @ 195,019*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 189 Pixels @ 199,019*/ 189, 0x01, + /* ABS: 004 Pixels @ 000,020*/ 0, 4, 0x0C, 0x0C, 0x14, 0x14, + /* RLE: 008 Pixels @ 004,020*/ 8, 0x0C, + /* ABS: 003 Pixels @ 012,020*/ 0, 3, 0x14, 0x07, 0x07, + /* RLE: 006 Pixels @ 015,020*/ 6, 0x02, + /* RLE: 069 Pixels @ 021,020*/ 69, 0x01, + /* ABS: 002 Pixels @ 090,020*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 092,020*/ 9, 0x03, + /* ABS: 002 Pixels @ 101,020*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 103,020*/ 93, 0x00, + /* ABS: 004 Pixels @ 196,020*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 188 Pixels @ 200,020*/ 188, 0x01, + /* RLE: 003 Pixels @ 000,021*/ 3, 0x0C, + /* ABS: 002 Pixels @ 003,021*/ 0, 2, 0x14, 0x14, + /* RLE: 007 Pixels @ 005,021*/ 7, 0x0C, + /* RLE: 001 Pixels @ 012,021*/ 1, 0x07, + /* RLE: 008 Pixels @ 013,021*/ 8, 0x02, + /* RLE: 001 Pixels @ 021,021*/ 1, 0x07, + /* RLE: 069 Pixels @ 022,021*/ 69, 0x01, + /* ABS: 002 Pixels @ 091,021*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 093,021*/ 9, 0x03, + /* ABS: 002 Pixels @ 102,021*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 104,021*/ 93, 0x00, + /* RLE: 001 Pixels @ 197,021*/ 1, 0x0D, + /* RLE: 004 Pixels @ 198,021*/ 4, 0x06, + /* RLE: 186 Pixels @ 202,021*/ 186, 0x01, + /* RLE: 003 Pixels @ 000,022*/ 3, 0x0C, + /* ABS: 002 Pixels @ 003,022*/ 0, 2, 0x14, 0x14, + /* RLE: 005 Pixels @ 005,022*/ 5, 0x0C, + /* RLE: 011 Pixels @ 010,022*/ 11, 0x02, + /* RLE: 001 Pixels @ 021,022*/ 1, 0x07, + /* RLE: 070 Pixels @ 022,022*/ 70, 0x01, + /* ABS: 002 Pixels @ 092,022*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 094,022*/ 9, 0x03, + /* ABS: 002 Pixels @ 103,022*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 105,022*/ 93, 0x00, + /* RLE: 001 Pixels @ 198,022*/ 1, 0x0D, + /* RLE: 004 Pixels @ 199,022*/ 4, 0x06, + /* RLE: 185 Pixels @ 203,022*/ 185, 0x01, + /* RLE: 003 Pixels @ 000,023*/ 3, 0x0C, + /* ABS: 006 Pixels @ 003,023*/ 0, 6, 0x14, 0x14, 0x0C, 0x0C, 0x07, 0x07, + /* RLE: 012 Pixels @ 009,023*/ 12, 0x02, + /* RLE: 001 Pixels @ 021,023*/ 1, 0x07, + /* RLE: 071 Pixels @ 022,023*/ 71, 0x01, + /* RLE: 003 Pixels @ 093,023*/ 3, 0x04, + /* RLE: 008 Pixels @ 096,023*/ 8, 0x03, + /* ABS: 002 Pixels @ 104,023*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 106,023*/ 93, 0x00, + /* ABS: 005 Pixels @ 199,023*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 184 Pixels @ 204,023*/ 184, 0x01, + /* ABS: 007 Pixels @ 000,024*/ 0, 7, 0x0C, 0x0C, 0x14, 0x14, 0x0C, 0x0C, 0x07, + /* RLE: 014 Pixels @ 007,024*/ 14, 0x02, + /* RLE: 074 Pixels @ 021,024*/ 74, 0x01, + /* ABS: 002 Pixels @ 095,024*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 097,024*/ 8, 0x03, + /* ABS: 002 Pixels @ 105,024*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 107,024*/ 94, 0x00, + /* ABS: 004 Pixels @ 201,024*/ 0, 4, 0x0D, 0x03, 0x06, 0x0D, + /* RLE: 183 Pixels @ 205,024*/ 183, 0x01, + /* ABS: 004 Pixels @ 000,025*/ 0, 4, 0x0C, 0x0C, 0x14, 0x0C, + /* RLE: 017 Pixels @ 004,025*/ 17, 0x02, + /* RLE: 075 Pixels @ 021,025*/ 75, 0x01, + /* ABS: 002 Pixels @ 096,025*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 098,025*/ 8, 0x03, + /* ABS: 002 Pixels @ 106,025*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 108,025*/ 94, 0x00, + /* ABS: 004 Pixels @ 202,025*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 182 Pixels @ 206,025*/ 182, 0x01, + /* ABS: 003 Pixels @ 000,026*/ 0, 3, 0x0C, 0x07, 0x07, + /* RLE: 019 Pixels @ 003,026*/ 19, 0x02, + /* RLE: 075 Pixels @ 022,026*/ 75, 0x01, + /* ABS: 002 Pixels @ 097,026*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 099,026*/ 8, 0x03, + /* ABS: 002 Pixels @ 107,026*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 109,026*/ 94, 0x00, + /* ABS: 004 Pixels @ 203,026*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 181 Pixels @ 207,026*/ 181, 0x01, + /* RLE: 001 Pixels @ 000,027*/ 1, 0x07, + /* RLE: 021 Pixels @ 001,027*/ 21, 0x02, + /* RLE: 001 Pixels @ 022,027*/ 1, 0x07, + /* RLE: 075 Pixels @ 023,027*/ 75, 0x01, + /* ABS: 002 Pixels @ 098,027*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 100,027*/ 8, 0x03, + /* ABS: 002 Pixels @ 108,027*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 110,027*/ 94, 0x00, + /* ABS: 004 Pixels @ 204,027*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 180 Pixels @ 208,027*/ 180, 0x01, + /* RLE: 022 Pixels @ 000,028*/ 22, 0x02, + /* RLE: 001 Pixels @ 022,028*/ 1, 0x07, + /* RLE: 076 Pixels @ 023,028*/ 76, 0x01, + /* ABS: 002 Pixels @ 099,028*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 101,028*/ 8, 0x03, + /* ABS: 002 Pixels @ 109,028*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 111,028*/ 94, 0x00, + /* RLE: 001 Pixels @ 205,028*/ 1, 0x0D, + /* RLE: 004 Pixels @ 206,028*/ 4, 0x06, + /* RLE: 176 Pixels @ 210,028*/ 176, 0x01, + /* ABS: 002 Pixels @ 386,028*/ 0, 2, 0x15, 0x00, + /* RLE: 021 Pixels @ 000,029*/ 21, 0x02, + /* RLE: 005 Pixels @ 021,029*/ 5, 0x04, + /* RLE: 074 Pixels @ 026,029*/ 74, 0x01, + /* ABS: 002 Pixels @ 100,029*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 102,029*/ 8, 0x03, + /* ABS: 002 Pixels @ 110,029*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 112,029*/ 94, 0x00, + /* ABS: 005 Pixels @ 206,029*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 175 Pixels @ 211,029*/ 175, 0x01, + /* ABS: 002 Pixels @ 386,029*/ 0, 2, 0x03, 0x00, + /* RLE: 020 Pixels @ 000,030*/ 20, 0x02, + /* ABS: 007 Pixels @ 020,030*/ 0, 7, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, + /* RLE: 074 Pixels @ 027,030*/ 74, 0x01, + /* ABS: 002 Pixels @ 101,030*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 103,030*/ 8, 0x03, + /* ABS: 002 Pixels @ 111,030*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 113,030*/ 94, 0x00, + /* ABS: 005 Pixels @ 207,030*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x0D, + /* RLE: 174 Pixels @ 212,030*/ 174, 0x01, + /* ABS: 002 Pixels @ 386,030*/ 0, 2, 0x03, 0x0E, + /* RLE: 020 Pixels @ 000,031*/ 20, 0x02, + /* RLE: 001 Pixels @ 020,031*/ 1, 0x04, + /* RLE: 005 Pixels @ 021,031*/ 5, 0x03, + /* RLE: 001 Pixels @ 026,031*/ 1, 0x04, + /* RLE: 075 Pixels @ 027,031*/ 75, 0x01, + /* ABS: 002 Pixels @ 102,031*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 104,031*/ 8, 0x03, + /* ABS: 002 Pixels @ 112,031*/ 0, 2, 0x04, 0x04, + /* RLE: 095 Pixels @ 114,031*/ 95, 0x00, + /* ABS: 004 Pixels @ 209,031*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 172 Pixels @ 213,031*/ 172, 0x01, + /* ABS: 003 Pixels @ 385,031*/ 0, 3, 0x00, 0x03, 0x03, + /* RLE: 019 Pixels @ 000,032*/ 19, 0x02, + /* ABS: 002 Pixels @ 019,032*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 021,032*/ 6, 0x03, + /* RLE: 076 Pixels @ 027,032*/ 76, 0x01, + /* ABS: 002 Pixels @ 103,032*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 105,032*/ 8, 0x03, + /* ABS: 002 Pixels @ 113,032*/ 0, 2, 0x04, 0x04, + /* RLE: 095 Pixels @ 115,032*/ 95, 0x00, + /* ABS: 004 Pixels @ 210,032*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 166 Pixels @ 214,032*/ 166, 0x01, + /* RLE: 003 Pixels @ 380,032*/ 3, 0x18, + /* ABS: 005 Pixels @ 383,032*/ 0, 5, 0x15, 0x03, 0x03, 0x06, 0x0E, + /* RLE: 020 Pixels @ 000,033*/ 20, 0x02, + /* RLE: 001 Pixels @ 020,033*/ 1, 0x04, + /* RLE: 006 Pixels @ 021,033*/ 6, 0x03, + /* RLE: 001 Pixels @ 027,033*/ 1, 0x04, + /* RLE: 076 Pixels @ 028,033*/ 76, 0x01, + /* ABS: 002 Pixels @ 104,033*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 106,033*/ 8, 0x03, + /* ABS: 002 Pixels @ 114,033*/ 0, 2, 0x04, 0x04, + /* RLE: 095 Pixels @ 116,033*/ 95, 0x00, + /* ABS: 004 Pixels @ 211,033*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 165 Pixels @ 215,033*/ 165, 0x01, + /* ABS: 008 Pixels @ 380,033*/ 0, 8, 0x03, 0x04, 0x03, 0x03, 0x0A, 0x12, 0x0F, 0x0A, + /* RLE: 020 Pixels @ 000,034*/ 20, 0x02, + /* RLE: 001 Pixels @ 020,034*/ 1, 0x04, + /* RLE: 006 Pixels @ 021,034*/ 6, 0x03, + /* RLE: 001 Pixels @ 027,034*/ 1, 0x04, + /* RLE: 077 Pixels @ 028,034*/ 77, 0x01, + /* ABS: 002 Pixels @ 105,034*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 107,034*/ 8, 0x03, + /* ABS: 002 Pixels @ 115,034*/ 0, 2, 0x04, 0x04, + /* RLE: 062 Pixels @ 117,034*/ 62, 0x00, + /* ABS: 002 Pixels @ 179,034*/ 0, 2, 0x03, 0x03, + /* RLE: 031 Pixels @ 181,034*/ 31, 0x00, + /* ABS: 005 Pixels @ 212,034*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 163 Pixels @ 217,034*/ 163, 0x01, + /* ABS: 008 Pixels @ 380,034*/ 0, 8, 0x03, 0x0F, 0x04, 0x04, 0x00, 0x07, 0x0D, 0x03, + /* RLE: 020 Pixels @ 000,035*/ 20, 0x02, + /* RLE: 001 Pixels @ 020,035*/ 1, 0x04, + /* RLE: 006 Pixels @ 021,035*/ 6, 0x03, + /* RLE: 001 Pixels @ 027,035*/ 1, 0x04, + /* RLE: 078 Pixels @ 028,035*/ 78, 0x01, + /* ABS: 002 Pixels @ 106,035*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 108,035*/ 8, 0x03, + /* ABS: 002 Pixels @ 116,035*/ 0, 2, 0x04, 0x04, + /* RLE: 060 Pixels @ 118,035*/ 60, 0x00, + /* ABS: 004 Pixels @ 178,035*/ 0, 4, 0x03, 0x0A, 0x0E, 0x03, + /* RLE: 031 Pixels @ 182,035*/ 31, 0x00, + /* ABS: 005 Pixels @ 213,035*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 162 Pixels @ 218,035*/ 162, 0x01, + /* ABS: 008 Pixels @ 380,035*/ 0, 8, 0x03, 0x11, 0x07, 0x0D, 0x03, 0x0E, 0x07, 0x00, + /* RLE: 020 Pixels @ 000,036*/ 20, 0x02, + /* RLE: 001 Pixels @ 020,036*/ 1, 0x04, + /* RLE: 006 Pixels @ 021,036*/ 6, 0x03, + /* RLE: 001 Pixels @ 027,036*/ 1, 0x04, + /* RLE: 079 Pixels @ 028,036*/ 79, 0x01, + /* ABS: 002 Pixels @ 107,036*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 109,036*/ 8, 0x03, + /* ABS: 002 Pixels @ 117,036*/ 0, 2, 0x04, 0x04, + /* RLE: 054 Pixels @ 119,036*/ 54, 0x00, + /* ABS: 009 Pixels @ 173,036*/ 0, 9, 0x03, 0x00, 0x03, 0x00, 0x03, 0x0B, 0x0D, 0x0E, 0x03, + /* RLE: 004 Pixels @ 182,036*/ 4, 0x00, + /* RLE: 001 Pixels @ 186,036*/ 1, 0x0A, + /* RLE: 027 Pixels @ 187,036*/ 27, 0x00, + /* ABS: 005 Pixels @ 214,036*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 122 Pixels @ 219,036*/ 122, 0x01, + /* RLE: 005 Pixels @ 341,036*/ 5, 0x04, + /* RLE: 034 Pixels @ 346,036*/ 34, 0x01, + /* ABS: 008 Pixels @ 380,036*/ 0, 8, 0x03, 0x11, 0x0F, 0x06, 0x03, 0x03, 0x0D, 0x0F, + /* RLE: 020 Pixels @ 000,037*/ 20, 0x02, + /* RLE: 001 Pixels @ 020,037*/ 1, 0x04, + /* RLE: 006 Pixels @ 021,037*/ 6, 0x03, + /* RLE: 001 Pixels @ 027,037*/ 1, 0x04, + /* RLE: 080 Pixels @ 028,037*/ 80, 0x01, + /* ABS: 002 Pixels @ 108,037*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 110,037*/ 8, 0x03, + /* ABS: 002 Pixels @ 118,037*/ 0, 2, 0x04, 0x04, + /* RLE: 053 Pixels @ 120,037*/ 53, 0x00, + /* ABS: 014 Pixels @ 173,037*/ 0, 14, 0x03, 0x0E, 0x0E, 0x00, 0x03, 0x0F, 0x07, 0x03, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, + /* RLE: 029 Pixels @ 187,037*/ 29, 0x00, + /* ABS: 004 Pixels @ 216,037*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 120 Pixels @ 220,037*/ 120, 0x01, + /* ABS: 002 Pixels @ 340,037*/ 0, 2, 0x04, 0x04, + /* RLE: 005 Pixels @ 342,037*/ 5, 0x03, + /* ABS: 002 Pixels @ 347,037*/ 0, 2, 0x04, 0x04, + /* RLE: 028 Pixels @ 349,037*/ 28, 0x01, + /* RLE: 005 Pixels @ 377,037*/ 5, 0x03, + /* ABS: 006 Pixels @ 382,037*/ 0, 6, 0x0B, 0x07, 0x0B, 0x03, 0x00, 0x07, + /* RLE: 021 Pixels @ 000,038*/ 21, 0x02, + /* RLE: 007 Pixels @ 021,038*/ 7, 0x03, + /* RLE: 001 Pixels @ 028,038*/ 1, 0x04, + /* RLE: 080 Pixels @ 029,038*/ 80, 0x01, + /* ABS: 002 Pixels @ 109,038*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 111,038*/ 8, 0x03, + /* ABS: 002 Pixels @ 119,038*/ 0, 2, 0x04, 0x04, + /* RLE: 052 Pixels @ 121,038*/ 52, 0x00, + /* ABS: 014 Pixels @ 173,038*/ 0, 14, 0x03, 0x0B, 0x07, 0x07, 0x00, 0x04, 0x07, 0x04, 0x03, 0x00, 0x03, 0x11, 0x12, 0x03, + /* RLE: 030 Pixels @ 187,038*/ 30, 0x00, + /* ABS: 004 Pixels @ 217,038*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 119 Pixels @ 221,038*/ 119, 0x01, + /* RLE: 001 Pixels @ 340,038*/ 1, 0x04, + /* RLE: 009 Pixels @ 341,038*/ 9, 0x03, + /* ABS: 002 Pixels @ 350,038*/ 0, 2, 0x04, 0x04, + /* RLE: 024 Pixels @ 352,038*/ 24, 0x01, + /* ABS: 012 Pixels @ 376,038*/ 0, 12, 0x03, 0x03, 0x06, 0x07, 0x12, 0x03, 0x03, 0x12, 0x07, 0x0E, 0x0B, 0x0A, + /* RLE: 021 Pixels @ 000,039*/ 21, 0x02, + /* RLE: 001 Pixels @ 021,039*/ 1, 0x04, + /* RLE: 006 Pixels @ 022,039*/ 6, 0x03, + /* RLE: 001 Pixels @ 028,039*/ 1, 0x04, + /* RLE: 081 Pixels @ 029,039*/ 81, 0x01, + /* ABS: 002 Pixels @ 110,039*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 112,039*/ 8, 0x03, + /* ABS: 002 Pixels @ 120,039*/ 0, 2, 0x04, 0x04, + /* RLE: 050 Pixels @ 122,039*/ 50, 0x00, + /* ABS: 015 Pixels @ 172,039*/ 0, 15, 0x04, 0x03, 0x0E, 0x07, 0x11, 0x03, 0x03, 0x06, 0x0F, 0x03, 0x03, 0x03, 0x0A, 0x00, 0x03, + /* RLE: 031 Pixels @ 187,039*/ 31, 0x00, + /* ABS: 004 Pixels @ 218,039*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 118 Pixels @ 222,039*/ 118, 0x01, + /* RLE: 001 Pixels @ 340,039*/ 1, 0x04, + /* RLE: 012 Pixels @ 341,039*/ 12, 0x03, + /* ABS: 002 Pixels @ 353,039*/ 0, 2, 0x04, 0x04, + /* RLE: 020 Pixels @ 355,039*/ 20, 0x01, + /* ABS: 013 Pixels @ 375,039*/ 0, 13, 0x15, 0x03, 0x11, 0x0E, 0x0A, 0x00, 0x00, 0x03, 0x03, 0x0D, 0x0F, 0x04, 0x03, + /* RLE: 021 Pixels @ 000,040*/ 21, 0x02, + /* RLE: 001 Pixels @ 021,040*/ 1, 0x04, + /* RLE: 006 Pixels @ 022,040*/ 6, 0x03, + /* RLE: 001 Pixels @ 028,040*/ 1, 0x04, + /* RLE: 082 Pixels @ 029,040*/ 82, 0x01, + /* ABS: 002 Pixels @ 111,040*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 113,040*/ 8, 0x03, + /* ABS: 002 Pixels @ 121,040*/ 0, 2, 0x04, 0x04, + /* RLE: 048 Pixels @ 123,040*/ 48, 0x00, + /* RLE: 004 Pixels @ 171,040*/ 4, 0x03, + /* ABS: 011 Pixels @ 175,040*/ 0, 11, 0x0A, 0x07, 0x0B, 0x03, 0x00, 0x07, 0x0E, 0x03, 0x00, 0x03, 0x03, + /* RLE: 033 Pixels @ 186,040*/ 33, 0x00, + /* ABS: 005 Pixels @ 219,040*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 116 Pixels @ 224,040*/ 116, 0x01, + /* RLE: 001 Pixels @ 340,040*/ 1, 0x04, + /* RLE: 015 Pixels @ 341,040*/ 15, 0x03, + /* ABS: 002 Pixels @ 356,040*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 358,040*/ 10, 0x01, + /* RLE: 003 Pixels @ 368,040*/ 3, 0x15, + /* RLE: 004 Pixels @ 371,040*/ 4, 0x01, + /* ABS: 008 Pixels @ 375,040*/ 0, 8, 0x00, 0x00, 0x07, 0x0B, 0x0D, 0x07, 0x07, 0x0E, + /* RLE: 004 Pixels @ 383,040*/ 4, 0x03, + /* RLE: 001 Pixels @ 387,040*/ 1, 0x00, + /* RLE: 021 Pixels @ 000,041*/ 21, 0x02, + /* RLE: 001 Pixels @ 021,041*/ 1, 0x04, + /* RLE: 006 Pixels @ 022,041*/ 6, 0x03, + /* RLE: 001 Pixels @ 028,041*/ 1, 0x04, + /* RLE: 083 Pixels @ 029,041*/ 83, 0x01, + /* ABS: 002 Pixels @ 112,041*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 114,041*/ 8, 0x03, + /* ABS: 002 Pixels @ 122,041*/ 0, 2, 0x04, 0x04, + /* RLE: 046 Pixels @ 124,041*/ 46, 0x00, + /* ABS: 015 Pixels @ 170,041*/ 0, 15, 0x03, 0x0A, 0x06, 0x12, 0x03, 0x03, 0x0E, 0x07, 0x04, 0x04, 0x04, 0x00, 0x03, 0x04, 0x04, + /* RLE: 035 Pixels @ 185,041*/ 35, 0x00, + /* ABS: 005 Pixels @ 220,041*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 115 Pixels @ 225,041*/ 115, 0x01, + /* ABS: 002 Pixels @ 340,041*/ 0, 2, 0x04, 0x04, + /* RLE: 017 Pixels @ 342,041*/ 17, 0x03, + /* ABS: 002 Pixels @ 359,041*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 361,041*/ 6, 0x01, + /* ABS: 005 Pixels @ 367,041*/ 0, 5, 0x15, 0x03, 0x00, 0x03, 0x18, + /* RLE: 005 Pixels @ 372,041*/ 5, 0x03, + /* ABS: 011 Pixels @ 377,041*/ 0, 11, 0x0D, 0x07, 0x0D, 0x04, 0x0E, 0x06, 0x03, 0x03, 0x04, 0x04, 0x04, + /* RLE: 021 Pixels @ 000,042*/ 21, 0x02, + /* RLE: 001 Pixels @ 021,042*/ 1, 0x04, + /* RLE: 006 Pixels @ 022,042*/ 6, 0x03, + /* RLE: 001 Pixels @ 028,042*/ 1, 0x04, + /* RLE: 084 Pixels @ 029,042*/ 84, 0x01, + /* ABS: 002 Pixels @ 113,042*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 115,042*/ 8, 0x03, + /* ABS: 002 Pixels @ 123,042*/ 0, 2, 0x04, 0x04, + /* RLE: 044 Pixels @ 125,042*/ 44, 0x00, + /* ABS: 011 Pixels @ 169,042*/ 0, 11, 0x03, 0x0E, 0x11, 0x0B, 0x0A, 0x03, 0x03, 0x03, 0x11, 0x07, 0x04, + /* RLE: 004 Pixels @ 180,042*/ 4, 0x03, + /* RLE: 001 Pixels @ 184,042*/ 1, 0x04, + /* RLE: 036 Pixels @ 185,042*/ 36, 0x00, + /* ABS: 005 Pixels @ 221,042*/ 0, 5, 0x06, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 115 Pixels @ 226,042*/ 115, 0x01, + /* ABS: 002 Pixels @ 341,042*/ 0, 2, 0x04, 0x04, + /* RLE: 019 Pixels @ 343,042*/ 19, 0x03, + /* ABS: 026 Pixels @ 362,042*/ 0, 26, 0x04, 0x04, 0x01, 0x01, 0x01, 0x15, 0x00, 0x0F, 0x04, 0x03, 0x03, 0x06, 0x07, 0x11, 0x00, 0x03, 0x03, 0x0A, 0x0A, 0x0F, 0x0B, 0x03, 0x04, 0x04, 0x01, 0x01, + /* RLE: 021 Pixels @ 000,043*/ 21, 0x02, + /* RLE: 001 Pixels @ 021,043*/ 1, 0x04, + /* RLE: 007 Pixels @ 022,043*/ 7, 0x03, + /* RLE: 085 Pixels @ 029,043*/ 85, 0x01, + /* ABS: 002 Pixels @ 114,043*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 116,043*/ 8, 0x03, + /* ABS: 002 Pixels @ 124,043*/ 0, 2, 0x04, 0x04, + /* RLE: 039 Pixels @ 126,043*/ 39, 0x00, + /* ABS: 014 Pixels @ 165,043*/ 0, 14, 0x03, 0x03, 0x00, 0x03, 0x03, 0x07, 0x0B, 0x0E, 0x11, 0x07, 0x0E, 0x03, 0x03, 0x00, + /* RLE: 006 Pixels @ 179,043*/ 6, 0x03, + /* RLE: 038 Pixels @ 185,043*/ 38, 0x00, + /* ABS: 004 Pixels @ 223,043*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 116 Pixels @ 227,043*/ 116, 0x01, + /* RLE: 003 Pixels @ 343,043*/ 3, 0x04, + /* RLE: 023 Pixels @ 346,043*/ 23, 0x03, + /* ABS: 019 Pixels @ 369,043*/ 0, 19, 0x0F, 0x12, 0x03, 0x06, 0x06, 0x00, 0x0D, 0x0F, 0x03, 0x0B, 0x07, 0x0F, 0x0B, 0x03, 0x00, 0x04, 0x01, 0x01, 0x01, + /* RLE: 022 Pixels @ 000,044*/ 22, 0x02, + /* RLE: 001 Pixels @ 022,044*/ 1, 0x04, + /* RLE: 006 Pixels @ 023,044*/ 6, 0x03, + /* RLE: 001 Pixels @ 029,044*/ 1, 0x04, + /* RLE: 085 Pixels @ 030,044*/ 85, 0x01, + /* ABS: 002 Pixels @ 115,044*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 117,044*/ 8, 0x03, + /* ABS: 002 Pixels @ 125,044*/ 0, 2, 0x04, 0x04, + /* RLE: 037 Pixels @ 127,044*/ 37, 0x00, + /* ABS: 012 Pixels @ 164,044*/ 0, 12, 0x03, 0x00, 0x0F, 0x07, 0x0E, 0x03, 0x0E, 0x07, 0x0F, 0x0E, 0x06, 0x11, + /* RLE: 009 Pixels @ 176,044*/ 9, 0x03, + /* RLE: 001 Pixels @ 185,044*/ 1, 0x04, + /* RLE: 038 Pixels @ 186,044*/ 38, 0x00, + /* ABS: 004 Pixels @ 224,044*/ 0, 4, 0x0D, 0x06, 0x03, 0x0D, + /* RLE: 118 Pixels @ 228,044*/ 118, 0x01, + /* RLE: 003 Pixels @ 346,044*/ 3, 0x04, + /* RLE: 016 Pixels @ 349,044*/ 16, 0x03, + /* ABS: 013 Pixels @ 365,044*/ 0, 13, 0x00, 0x0D, 0x00, 0x03, 0x0B, 0x07, 0x00, 0x07, 0x04, 0x0B, 0x0F, 0x04, 0x00, + /* RLE: 004 Pixels @ 378,044*/ 4, 0x03, + /* RLE: 001 Pixels @ 382,044*/ 1, 0x00, + /* RLE: 005 Pixels @ 383,044*/ 5, 0x01, + /* RLE: 022 Pixels @ 000,045*/ 22, 0x02, + /* RLE: 001 Pixels @ 022,045*/ 1, 0x04, + /* RLE: 006 Pixels @ 023,045*/ 6, 0x03, + /* RLE: 001 Pixels @ 029,045*/ 1, 0x04, + /* RLE: 086 Pixels @ 030,045*/ 86, 0x01, + /* ABS: 002 Pixels @ 116,045*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 118,045*/ 8, 0x03, + /* ABS: 002 Pixels @ 126,045*/ 0, 2, 0x04, 0x04, + /* RLE: 034 Pixels @ 128,045*/ 34, 0x00, + /* ABS: 016 Pixels @ 162,045*/ 0, 16, 0x04, 0x03, 0x0E, 0x06, 0x0B, 0x0B, 0x07, 0x04, 0x03, 0x03, 0x00, 0x00, 0x0D, 0x0E, 0x03, 0x04, + /* RLE: 007 Pixels @ 178,045*/ 7, 0x03, + /* RLE: 001 Pixels @ 185,045*/ 1, 0x04, + /* RLE: 039 Pixels @ 186,045*/ 39, 0x00, + /* ABS: 004 Pixels @ 225,045*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 120 Pixels @ 229,045*/ 120, 0x01, + /* RLE: 003 Pixels @ 349,045*/ 3, 0x04, + /* RLE: 013 Pixels @ 352,045*/ 13, 0x03, + /* ABS: 017 Pixels @ 365,045*/ 0, 17, 0x11, 0x07, 0x0F, 0x0A, 0x00, 0x07, 0x0B, 0x11, 0x07, 0x12, 0x03, 0x0E, 0x06, 0x03, 0x03, 0x04, 0x04, + /* RLE: 006 Pixels @ 382,045*/ 6, 0x01, + /* RLE: 022 Pixels @ 000,046*/ 22, 0x02, + /* RLE: 001 Pixels @ 022,046*/ 1, 0x04, + /* RLE: 007 Pixels @ 023,046*/ 7, 0x03, + /* RLE: 001 Pixels @ 030,046*/ 1, 0x00, + /* RLE: 086 Pixels @ 031,046*/ 86, 0x01, + /* ABS: 002 Pixels @ 117,046*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 119,046*/ 8, 0x03, + /* ABS: 002 Pixels @ 127,046*/ 0, 2, 0x04, 0x04, + /* RLE: 031 Pixels @ 129,046*/ 31, 0x00, + /* RLE: 004 Pixels @ 160,046*/ 4, 0x03, + /* ABS: 015 Pixels @ 164,046*/ 0, 15, 0x11, 0x07, 0x03, 0x03, 0x06, 0x0F, 0x03, 0x0B, 0x07, 0x07, 0x0E, 0x03, 0x03, 0x00, 0x04, + /* RLE: 007 Pixels @ 179,046*/ 7, 0x03, + /* RLE: 040 Pixels @ 186,046*/ 40, 0x00, + /* ABS: 004 Pixels @ 226,046*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 122 Pixels @ 230,046*/ 122, 0x01, + /* RLE: 003 Pixels @ 352,046*/ 3, 0x04, + /* RLE: 007 Pixels @ 355,046*/ 7, 0x03, + /* ABS: 019 Pixels @ 362,046*/ 0, 19, 0x00, 0x03, 0x03, 0x0B, 0x07, 0x06, 0x07, 0x04, 0x12, 0x11, 0x0A, 0x07, 0x12, 0x0B, 0x0F, 0x0B, 0x03, 0x04, 0x04, + /* RLE: 007 Pixels @ 381,046*/ 7, 0x01, + /* RLE: 021 Pixels @ 000,047*/ 21, 0x02, + /* RLE: 001 Pixels @ 021,047*/ 1, 0x18, + /* RLE: 005 Pixels @ 022,047*/ 5, 0x03, + /* ABS: 005 Pixels @ 027,047*/ 0, 5, 0x00, 0x04, 0x0E, 0x03, 0x18, + /* RLE: 086 Pixels @ 032,047*/ 86, 0x01, + /* ABS: 002 Pixels @ 118,047*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 120,047*/ 9, 0x03, + /* ABS: 002 Pixels @ 129,047*/ 0, 2, 0x04, 0x04, + /* RLE: 028 Pixels @ 131,047*/ 28, 0x00, + /* ABS: 012 Pixels @ 159,047*/ 0, 12, 0x03, 0x0A, 0x06, 0x0E, 0x00, 0x0A, 0x07, 0x0B, 0x03, 0x00, 0x0F, 0x0E, + /* RLE: 005 Pixels @ 171,047*/ 5, 0x03, + /* RLE: 003 Pixels @ 176,047*/ 3, 0x00, + /* RLE: 001 Pixels @ 179,047*/ 1, 0x04, + /* RLE: 006 Pixels @ 180,047*/ 6, 0x03, + /* RLE: 001 Pixels @ 186,047*/ 1, 0x04, + /* RLE: 040 Pixels @ 187,047*/ 40, 0x00, + /* RLE: 001 Pixels @ 227,047*/ 1, 0x0D, + /* RLE: 004 Pixels @ 228,047*/ 4, 0x06, + /* RLE: 123 Pixels @ 232,047*/ 123, 0x01, + /* RLE: 003 Pixels @ 355,047*/ 3, 0x04, + /* RLE: 003 Pixels @ 358,047*/ 3, 0x03, + /* ABS: 018 Pixels @ 361,047*/ 0, 18, 0x00, 0x07, 0x0D, 0x03, 0x00, 0x07, 0x04, 0x0E, 0x07, 0x11, 0x07, 0x0A, 0x0A, 0x0D, 0x0D, 0x04, 0x03, 0x00, + /* RLE: 009 Pixels @ 379,047*/ 9, 0x01, + /* RLE: 021 Pixels @ 000,048*/ 21, 0x02, + /* ABS: 005 Pixels @ 021,048*/ 0, 5, 0x03, 0x00, 0x0B, 0x12, 0x0D, + /* RLE: 004 Pixels @ 026,048*/ 4, 0x07, + /* ABS: 002 Pixels @ 030,048*/ 0, 2, 0x0A, 0x15, + /* RLE: 083 Pixels @ 032,048*/ 83, 0x01, + /* ABS: 005 Pixels @ 115,048*/ 0, 5, 0x15, 0x03, 0x00, 0x18, 0x00, + /* RLE: 010 Pixels @ 120,048*/ 10, 0x03, + /* ABS: 002 Pixels @ 130,048*/ 0, 2, 0x04, 0x04, + /* RLE: 026 Pixels @ 132,048*/ 26, 0x00, + /* ABS: 015 Pixels @ 158,048*/ 0, 15, 0x03, 0x04, 0x0F, 0x0B, 0x0D, 0x0F, 0x03, 0x12, 0x0F, 0x00, 0x03, 0x04, 0x00, 0x03, 0x04, + /* RLE: 005 Pixels @ 173,048*/ 5, 0x00, + /* ABS: 002 Pixels @ 178,048*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 180,048*/ 6, 0x03, + /* RLE: 001 Pixels @ 186,048*/ 1, 0x04, + /* RLE: 041 Pixels @ 187,048*/ 41, 0x00, + /* RLE: 001 Pixels @ 228,048*/ 1, 0x0D, + /* RLE: 004 Pixels @ 229,048*/ 4, 0x06, + /* RLE: 125 Pixels @ 233,048*/ 125, 0x01, + /* ABS: 015 Pixels @ 358,048*/ 0, 15, 0x04, 0x04, 0x00, 0x03, 0x04, 0x07, 0x0D, 0x03, 0x06, 0x12, 0x03, 0x04, 0x07, 0x07, 0x0E, + /* RLE: 004 Pixels @ 373,048*/ 4, 0x03, + /* RLE: 001 Pixels @ 377,048*/ 1, 0x00, + /* RLE: 010 Pixels @ 378,048*/ 10, 0x01, + /* RLE: 021 Pixels @ 000,049*/ 21, 0x02, + /* ABS: 011 Pixels @ 021,049*/ 0, 11, 0x03, 0x06, 0x07, 0x07, 0x06, 0x0E, 0x04, 0x0A, 0x03, 0x03, 0x15, + /* RLE: 083 Pixels @ 032,049*/ 83, 0x01, + /* ABS: 007 Pixels @ 115,049*/ 0, 7, 0x03, 0x0A, 0x04, 0x03, 0x03, 0x0B, 0x0A, + /* RLE: 009 Pixels @ 122,049*/ 9, 0x03, + /* ABS: 002 Pixels @ 131,049*/ 0, 2, 0x04, 0x04, + /* RLE: 023 Pixels @ 133,049*/ 23, 0x00, + /* ABS: 014 Pixels @ 156,049*/ 0, 14, 0x04, 0x04, 0x03, 0x06, 0x0E, 0x00, 0x06, 0x12, 0x00, 0x00, 0x0F, 0x12, 0x03, 0x03, + /* RLE: 009 Pixels @ 170,049*/ 9, 0x00, + /* RLE: 001 Pixels @ 179,049*/ 1, 0x04, + /* RLE: 007 Pixels @ 180,049*/ 7, 0x03, + /* RLE: 042 Pixels @ 187,049*/ 42, 0x00, + /* RLE: 001 Pixels @ 229,049*/ 1, 0x0D, + /* RLE: 004 Pixels @ 230,049*/ 4, 0x06, + /* RLE: 127 Pixels @ 234,049*/ 127, 0x01, + /* ABS: 015 Pixels @ 361,049*/ 0, 15, 0x00, 0x03, 0x04, 0x0F, 0x0D, 0x0E, 0x07, 0x00, 0x03, 0x0A, 0x0F, 0x0B, 0x03, 0x04, 0x04, + /* RLE: 012 Pixels @ 376,049*/ 12, 0x01, + /* RLE: 021 Pixels @ 000,050*/ 21, 0x02, + /* ABS: 010 Pixels @ 021,050*/ 0, 10, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x04, + /* RLE: 084 Pixels @ 031,050*/ 84, 0x01, + /* ABS: 007 Pixels @ 115,050*/ 0, 7, 0x03, 0x06, 0x0F, 0x00, 0x00, 0x07, 0x0A, + /* RLE: 010 Pixels @ 122,050*/ 10, 0x03, + /* ABS: 002 Pixels @ 132,050*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 134,050*/ 16, 0x00, + /* RLE: 001 Pixels @ 150,050*/ 1, 0x03, + /* RLE: 004 Pixels @ 151,050*/ 4, 0x00, + /* RLE: 004 Pixels @ 155,050*/ 4, 0x03, + /* ABS: 011 Pixels @ 159,050*/ 0, 11, 0x0E, 0x0F, 0x11, 0x0A, 0x04, 0x06, 0x03, 0x0A, 0x00, 0x03, 0x04, + /* RLE: 010 Pixels @ 170,050*/ 10, 0x00, + /* RLE: 001 Pixels @ 180,050*/ 1, 0x04, + /* RLE: 006 Pixels @ 181,050*/ 6, 0x03, + /* RLE: 001 Pixels @ 187,050*/ 1, 0x04, + /* RLE: 043 Pixels @ 188,050*/ 43, 0x00, + /* ABS: 004 Pixels @ 231,050*/ 0, 4, 0x0D, 0x03, 0x06, 0x0D, + /* RLE: 127 Pixels @ 235,050*/ 127, 0x01, + /* ABS: 007 Pixels @ 362,050*/ 0, 7, 0x18, 0x03, 0x00, 0x0F, 0x07, 0x07, 0x0B, + /* RLE: 004 Pixels @ 369,050*/ 4, 0x03, + /* ABS: 002 Pixels @ 373,050*/ 0, 2, 0x00, 0x04, + /* RLE: 013 Pixels @ 375,050*/ 13, 0x01, + /* RLE: 021 Pixels @ 000,051*/ 21, 0x02, + /* ABS: 010 Pixels @ 021,051*/ 0, 10, 0x18, 0x03, 0x04, 0x0E, 0x06, 0x0F, 0x07, 0x07, 0x03, 0x04, + /* RLE: 084 Pixels @ 031,051*/ 84, 0x01, + /* ABS: 007 Pixels @ 115,051*/ 0, 7, 0x03, 0x00, 0x0F, 0x0D, 0x00, 0x07, 0x00, + /* RLE: 011 Pixels @ 122,051*/ 11, 0x03, + /* ABS: 002 Pixels @ 133,051*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 135,051*/ 14, 0x00, + /* ABS: 017 Pixels @ 149,051*/ 0, 17, 0x03, 0x0B, 0x03, 0x00, 0x00, 0x03, 0x0A, 0x06, 0x12, 0x03, 0x00, 0x07, 0x12, 0x0A, 0x06, 0x0E, 0x03, + /* RLE: 014 Pixels @ 166,051*/ 14, 0x00, + /* RLE: 001 Pixels @ 180,051*/ 1, 0x04, + /* RLE: 006 Pixels @ 181,051*/ 6, 0x03, + /* RLE: 001 Pixels @ 187,051*/ 1, 0x04, + /* RLE: 044 Pixels @ 188,051*/ 44, 0x00, + /* ABS: 004 Pixels @ 232,051*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 127 Pixels @ 236,051*/ 127, 0x01, + /* ABS: 010 Pixels @ 363,051*/ 0, 10, 0x15, 0x03, 0x00, 0x11, 0x07, 0x11, 0x03, 0x04, 0x04, 0x04, + /* RLE: 015 Pixels @ 373,051*/ 15, 0x01, + /* RLE: 022 Pixels @ 000,052*/ 22, 0x02, + /* ABS: 009 Pixels @ 022,052*/ 0, 9, 0x03, 0x06, 0x07, 0x06, 0x0E, 0x0E, 0x0D, 0x03, 0x00, + /* RLE: 084 Pixels @ 031,052*/ 84, 0x01, + /* ABS: 009 Pixels @ 115,052*/ 0, 9, 0x00, 0x03, 0x0A, 0x07, 0x0D, 0x07, 0x07, 0x0E, 0x00, + /* RLE: 010 Pixels @ 124,052*/ 10, 0x03, + /* ABS: 002 Pixels @ 134,052*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 136,052*/ 13, 0x00, + /* ABS: 018 Pixels @ 149,052*/ 0, 18, 0x0A, 0x07, 0x0B, 0x03, 0x03, 0x0E, 0x11, 0x0B, 0x0A, 0x03, 0x03, 0x0A, 0x11, 0x0F, 0x0E, 0x03, 0x00, 0x04, + /* RLE: 012 Pixels @ 167,052*/ 12, 0x00, + /* ABS: 002 Pixels @ 179,052*/ 0, 2, 0x0A, 0x04, + /* RLE: 007 Pixels @ 181,052*/ 7, 0x03, + /* RLE: 045 Pixels @ 188,052*/ 45, 0x00, + /* ABS: 004 Pixels @ 233,052*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 127 Pixels @ 237,052*/ 127, 0x01, + /* ABS: 006 Pixels @ 364,052*/ 0, 6, 0x15, 0x03, 0x03, 0x06, 0x0A, 0x03, + /* RLE: 018 Pixels @ 370,052*/ 18, 0x01, + /* RLE: 022 Pixels @ 000,053*/ 22, 0x02, + /* RLE: 006 Pixels @ 022,053*/ 6, 0x03, + /* ABS: 003 Pixels @ 028,053*/ 0, 3, 0x06, 0x0B, 0x03, + /* RLE: 082 Pixels @ 031,053*/ 82, 0x01, + /* ABS: 014 Pixels @ 113,053*/ 0, 14, 0x15, 0x03, 0x03, 0x0A, 0x00, 0x0E, 0x07, 0x0D, 0x0B, 0x11, 0x07, 0x0E, 0x03, 0x04, + /* RLE: 008 Pixels @ 127,053*/ 8, 0x03, + /* ABS: 002 Pixels @ 135,053*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 137,053*/ 8, 0x00, + /* RLE: 005 Pixels @ 145,053*/ 5, 0x03, + /* ABS: 010 Pixels @ 150,053*/ 0, 10, 0x0E, 0x07, 0x00, 0x03, 0x07, 0x0B, 0x0E, 0x11, 0x07, 0x0E, + /* RLE: 005 Pixels @ 160,053*/ 5, 0x03, + /* RLE: 016 Pixels @ 165,053*/ 16, 0x00, + /* RLE: 001 Pixels @ 181,053*/ 1, 0x04, + /* RLE: 006 Pixels @ 182,053*/ 6, 0x03, + /* RLE: 001 Pixels @ 188,053*/ 1, 0x04, + /* RLE: 045 Pixels @ 189,053*/ 45, 0x00, + /* RLE: 001 Pixels @ 234,053*/ 1, 0x0D, + /* RLE: 004 Pixels @ 235,053*/ 4, 0x06, + /* RLE: 127 Pixels @ 239,053*/ 127, 0x01, + /* ABS: 004 Pixels @ 366,053*/ 0, 4, 0x00, 0x03, 0x03, 0x15, + /* RLE: 018 Pixels @ 370,053*/ 18, 0x01, + /* RLE: 022 Pixels @ 000,054*/ 22, 0x02, + /* ABS: 009 Pixels @ 022,054*/ 0, 9, 0x00, 0x03, 0x03, 0x0A, 0x04, 0x0E, 0x0F, 0x0B, 0x03, + /* RLE: 081 Pixels @ 031,054*/ 81, 0x01, + /* ABS: 016 Pixels @ 112,054*/ 0, 16, 0x04, 0x03, 0x00, 0x0D, 0x07, 0x0F, 0x03, 0x0D, 0x0F, 0x03, 0x03, 0x0A, 0x03, 0x00, 0x04, 0x04, + /* RLE: 008 Pixels @ 128,054*/ 8, 0x03, + /* ABS: 002 Pixels @ 136,054*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 138,054*/ 6, 0x00, + /* ABS: 020 Pixels @ 144,054*/ 0, 20, 0x03, 0x03, 0x0D, 0x00, 0x03, 0x03, 0x03, 0x11, 0x06, 0x03, 0x0E, 0x07, 0x0F, 0x0E, 0x06, 0x11, 0x03, 0x04, 0x04, 0x04, + /* RLE: 017 Pixels @ 164,054*/ 17, 0x00, + /* RLE: 001 Pixels @ 181,054*/ 1, 0x04, + /* RLE: 006 Pixels @ 182,054*/ 6, 0x03, + /* RLE: 001 Pixels @ 188,054*/ 1, 0x04, + /* RLE: 046 Pixels @ 189,054*/ 46, 0x00, + /* RLE: 001 Pixels @ 235,054*/ 1, 0x0D, + /* RLE: 004 Pixels @ 236,054*/ 4, 0x06, + /* RLE: 148 Pixels @ 240,054*/ 148, 0x01, + /* RLE: 022 Pixels @ 000,055*/ 22, 0x02, + /* ABS: 002 Pixels @ 022,055*/ 0, 2, 0x00, 0x0A, + /* RLE: 005 Pixels @ 024,055*/ 5, 0x07, + /* ABS: 003 Pixels @ 029,055*/ 0, 3, 0x00, 0x03, 0x04, + /* RLE: 077 Pixels @ 032,055*/ 77, 0x01, + /* ABS: 014 Pixels @ 109,055*/ 0, 14, 0x15, 0x00, 0x00, 0x00, 0x03, 0x06, 0x12, 0x03, 0x00, 0x03, 0x00, 0x07, 0x0E, 0x03, + /* RLE: 004 Pixels @ 123,055*/ 4, 0x00, + /* ABS: 002 Pixels @ 127,055*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 129,055*/ 8, 0x03, + /* ABS: 002 Pixels @ 137,055*/ 0, 2, 0x04, 0x04, + /* RLE: 004 Pixels @ 139,055*/ 4, 0x00, + /* ABS: 020 Pixels @ 143,055*/ 0, 20, 0x03, 0x0E, 0x00, 0x0B, 0x03, 0x0B, 0x00, 0x03, 0x0A, 0x07, 0x0B, 0x03, 0x03, 0x00, 0x00, 0x0D, 0x0E, 0x03, 0x04, 0x0A, + /* RLE: 018 Pixels @ 163,055*/ 18, 0x00, + /* RLE: 001 Pixels @ 181,055*/ 1, 0x04, + /* RLE: 007 Pixels @ 182,055*/ 7, 0x03, + /* RLE: 047 Pixels @ 189,055*/ 47, 0x00, + /* ABS: 005 Pixels @ 236,055*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 147 Pixels @ 241,055*/ 147, 0x01, + /* RLE: 022 Pixels @ 000,056*/ 22, 0x02, + /* ABS: 010 Pixels @ 022,056*/ 0, 10, 0x18, 0x03, 0x0B, 0x04, 0x0A, 0x03, 0x0B, 0x0D, 0x03, 0x00, + /* RLE: 075 Pixels @ 032,056*/ 75, 0x01, + /* ABS: 017 Pixels @ 107,056*/ 0, 17, 0x15, 0x03, 0x03, 0x0A, 0x00, 0x03, 0x03, 0x07, 0x0B, 0x03, 0x03, 0x0B, 0x06, 0x0A, 0x03, 0x03, 0x04, + /* RLE: 004 Pixels @ 124,056*/ 4, 0x00, + /* ABS: 002 Pixels @ 128,056*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 130,056*/ 8, 0x03, + /* ABS: 022 Pixels @ 138,056*/ 0, 22, 0x04, 0x04, 0x00, 0x03, 0x03, 0x03, 0x0E, 0x00, 0x03, 0x03, 0x0F, 0x12, 0x03, 0x03, 0x12, 0x0F, 0x03, 0x0B, 0x07, 0x07, 0x0E, 0x03, + /* RLE: 021 Pixels @ 160,056*/ 21, 0x00, + /* ABS: 002 Pixels @ 181,056*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 183,056*/ 6, 0x03, + /* RLE: 001 Pixels @ 189,056*/ 1, 0x04, + /* RLE: 048 Pixels @ 190,056*/ 48, 0x00, + /* ABS: 004 Pixels @ 238,056*/ 0, 4, 0x0D, 0x03, 0x06, 0x0D, + /* RLE: 146 Pixels @ 242,056*/ 146, 0x01, + /* RLE: 023 Pixels @ 000,057*/ 23, 0x02, + /* RLE: 005 Pixels @ 023,057*/ 5, 0x03, + /* ABS: 004 Pixels @ 028,057*/ 0, 4, 0x04, 0x07, 0x00, 0x00, + /* RLE: 071 Pixels @ 032,057*/ 71, 0x01, + /* ABS: 020 Pixels @ 103,057*/ 0, 20, 0x15, 0x00, 0x00, 0x15, 0x03, 0x00, 0x0D, 0x07, 0x07, 0x0F, 0x00, 0x0D, 0x0F, 0x03, 0x03, 0x0E, 0x11, 0x03, 0x00, 0x04, + /* RLE: 006 Pixels @ 123,057*/ 6, 0x00, + /* ABS: 002 Pixels @ 129,057*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 131,057*/ 10, 0x03, + /* ABS: 014 Pixels @ 141,057*/ 0, 14, 0x00, 0x0F, 0x00, 0x03, 0x0E, 0x00, 0x03, 0x0B, 0x07, 0x0A, 0x03, 0x00, 0x0F, 0x12, + /* RLE: 005 Pixels @ 155,057*/ 5, 0x03, + /* RLE: 022 Pixels @ 160,057*/ 22, 0x00, + /* RLE: 001 Pixels @ 182,057*/ 1, 0x04, + /* RLE: 006 Pixels @ 183,057*/ 6, 0x03, + /* RLE: 001 Pixels @ 189,057*/ 1, 0x04, + /* RLE: 049 Pixels @ 190,057*/ 49, 0x00, + /* ABS: 004 Pixels @ 239,057*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 145 Pixels @ 243,057*/ 145, 0x01, + /* RLE: 023 Pixels @ 000,058*/ 23, 0x02, + /* ABS: 009 Pixels @ 023,058*/ 0, 9, 0x03, 0x04, 0x0E, 0x0D, 0x07, 0x07, 0x0F, 0x03, 0x00, + /* RLE: 071 Pixels @ 032,058*/ 71, 0x01, + /* ABS: 018 Pixels @ 103,058*/ 0, 18, 0x03, 0x00, 0x0A, 0x03, 0x03, 0x12, 0x0D, 0x03, 0x00, 0x0F, 0x0D, 0x0A, 0x07, 0x11, 0x0E, 0x07, 0x04, 0x03, + /* RLE: 009 Pixels @ 121,058*/ 9, 0x00, + /* ABS: 002 Pixels @ 130,058*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 132,058*/ 9, 0x03, + /* ABS: 016 Pixels @ 141,058*/ 0, 16, 0x00, 0x0F, 0x06, 0x03, 0x0F, 0x06, 0x03, 0x03, 0x06, 0x0F, 0x03, 0x03, 0x0A, 0x00, 0x03, 0x04, + /* RLE: 024 Pixels @ 157,058*/ 24, 0x00, + /* ABS: 002 Pixels @ 181,058*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 183,058*/ 6, 0x03, + /* RLE: 001 Pixels @ 189,058*/ 1, 0x04, + /* RLE: 050 Pixels @ 190,058*/ 50, 0x00, + /* ABS: 004 Pixels @ 240,058*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 144 Pixels @ 244,058*/ 144, 0x01, + /* RLE: 023 Pixels @ 000,059*/ 23, 0x02, + /* ABS: 009 Pixels @ 023,059*/ 0, 9, 0x03, 0x0B, 0x0F, 0x06, 0x0B, 0x04, 0x03, 0x03, 0x04, + /* RLE: 071 Pixels @ 032,059*/ 71, 0x01, + /* ABS: 017 Pixels @ 103,059*/ 0, 17, 0x03, 0x0F, 0x0F, 0x03, 0x03, 0x07, 0x0B, 0x03, 0x03, 0x0B, 0x07, 0x03, 0x0A, 0x12, 0x06, 0x0A, 0x03, + /* RLE: 011 Pixels @ 120,059*/ 11, 0x00, + /* ABS: 002 Pixels @ 131,059*/ 0, 2, 0x04, 0x04, + /* RLE: 005 Pixels @ 133,059*/ 5, 0x03, + /* ABS: 018 Pixels @ 138,059*/ 0, 18, 0x0B, 0x03, 0x03, 0x03, 0x04, 0x07, 0x04, 0x0A, 0x07, 0x0B, 0x03, 0x04, 0x07, 0x0E, 0x03, 0x03, 0x00, 0x0A, + /* RLE: 027 Pixels @ 156,059*/ 27, 0x00, + /* RLE: 007 Pixels @ 183,059*/ 7, 0x03, + /* RLE: 001 Pixels @ 190,059*/ 1, 0x04, + /* RLE: 050 Pixels @ 191,059*/ 50, 0x00, + /* RLE: 001 Pixels @ 241,059*/ 1, 0x0D, + /* RLE: 004 Pixels @ 242,059*/ 4, 0x06, + /* RLE: 142 Pixels @ 246,059*/ 142, 0x01, + /* RLE: 023 Pixels @ 000,060*/ 23, 0x02, + /* RLE: 001 Pixels @ 023,060*/ 1, 0x00, + /* RLE: 008 Pixels @ 024,060*/ 8, 0x03, + /* RLE: 001 Pixels @ 032,060*/ 1, 0x04, + /* RLE: 066 Pixels @ 033,060*/ 66, 0x01, + /* ABS: 015 Pixels @ 099,060*/ 0, 15, 0x15, 0x03, 0x03, 0x00, 0x03, 0x0A, 0x07, 0x12, 0x03, 0x0D, 0x11, 0x03, 0x03, 0x0B, 0x0F, + /* RLE: 005 Pixels @ 114,060*/ 5, 0x03, + /* RLE: 013 Pixels @ 119,060*/ 13, 0x00, + /* ABS: 022 Pixels @ 132,060*/ 0, 22, 0x04, 0x04, 0x03, 0x03, 0x03, 0x00, 0x07, 0x0E, 0x03, 0x03, 0x0B, 0x07, 0x0F, 0x03, 0x06, 0x0F, 0x04, 0x0D, 0x0B, 0x00, 0x03, 0x04, + /* RLE: 029 Pixels @ 154,060*/ 29, 0x00, + /* RLE: 001 Pixels @ 183,060*/ 1, 0x04, + /* RLE: 006 Pixels @ 184,060*/ 6, 0x03, + /* RLE: 001 Pixels @ 190,060*/ 1, 0x04, + /* RLE: 051 Pixels @ 191,060*/ 51, 0x00, + /* ABS: 005 Pixels @ 242,060*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 141 Pixels @ 247,060*/ 141, 0x01, + /* RLE: 025 Pixels @ 000,061*/ 25, 0x02, + /* RLE: 001 Pixels @ 025,061*/ 1, 0x04, + /* RLE: 006 Pixels @ 026,061*/ 6, 0x03, + /* RLE: 001 Pixels @ 032,061*/ 1, 0x04, + /* RLE: 066 Pixels @ 033,061*/ 66, 0x01, + /* ABS: 018 Pixels @ 099,061*/ 0, 18, 0x03, 0x0A, 0x0B, 0x03, 0x03, 0x03, 0x0E, 0x07, 0x0B, 0x00, 0x07, 0x11, 0x06, 0x07, 0x0B, 0x03, 0x04, 0x04, + /* RLE: 016 Pixels @ 117,061*/ 16, 0x00, + /* ABS: 019 Pixels @ 133,061*/ 0, 19, 0x04, 0x04, 0x03, 0x03, 0x03, 0x0E, 0x07, 0x0B, 0x06, 0x0F, 0x0E, 0x07, 0x12, 0x03, 0x11, 0x07, 0x0B, 0x03, 0x03, + /* RLE: 031 Pixels @ 152,061*/ 31, 0x00, + /* RLE: 001 Pixels @ 183,061*/ 1, 0x04, + /* RLE: 006 Pixels @ 184,061*/ 6, 0x03, + /* RLE: 001 Pixels @ 190,061*/ 1, 0x04, + /* RLE: 052 Pixels @ 191,061*/ 52, 0x00, + /* ABS: 005 Pixels @ 243,061*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 140 Pixels @ 248,061*/ 140, 0x01, + /* RLE: 025 Pixels @ 000,062*/ 25, 0x02, + /* RLE: 001 Pixels @ 025,062*/ 1, 0x04, + /* RLE: 007 Pixels @ 026,062*/ 7, 0x03, + /* RLE: 001 Pixels @ 033,062*/ 1, 0x00, + /* RLE: 065 Pixels @ 034,062*/ 65, 0x01, + /* ABS: 017 Pixels @ 099,062*/ 0, 17, 0x03, 0x12, 0x07, 0x0A, 0x03, 0x0A, 0x0F, 0x07, 0x07, 0x00, 0x0A, 0x12, 0x12, 0x0A, 0x03, 0x00, 0x04, + /* RLE: 018 Pixels @ 116,062*/ 18, 0x00, + /* ABS: 016 Pixels @ 134,062*/ 0, 16, 0x04, 0x04, 0x03, 0x03, 0x03, 0x11, 0x07, 0x06, 0x00, 0x03, 0x0B, 0x07, 0x00, 0x03, 0x03, 0x03, + /* RLE: 033 Pixels @ 150,062*/ 33, 0x00, + /* RLE: 001 Pixels @ 183,062*/ 1, 0x0A, + /* RLE: 007 Pixels @ 184,062*/ 7, 0x03, + /* RLE: 001 Pixels @ 191,062*/ 1, 0x04, + /* RLE: 053 Pixels @ 192,062*/ 53, 0x00, + /* ABS: 004 Pixels @ 245,062*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 139 Pixels @ 249,062*/ 139, 0x01, + /* RLE: 024 Pixels @ 000,063*/ 24, 0x02, + /* ABS: 002 Pixels @ 024,063*/ 0, 2, 0x18, 0x00, + /* RLE: 004 Pixels @ 026,063*/ 4, 0x03, + /* ABS: 005 Pixels @ 030,063*/ 0, 5, 0x00, 0x0A, 0x0B, 0x03, 0x15, + /* RLE: 064 Pixels @ 035,063*/ 64, 0x01, + /* ABS: 010 Pixels @ 099,063*/ 0, 10, 0x00, 0x03, 0x0F, 0x0F, 0x0E, 0x07, 0x0E, 0x00, 0x0F, 0x0D, + /* RLE: 004 Pixels @ 109,063*/ 4, 0x03, + /* RLE: 022 Pixels @ 113,063*/ 22, 0x00, + /* RLE: 003 Pixels @ 135,063*/ 3, 0x04, + /* ABS: 011 Pixels @ 138,063*/ 0, 11, 0x03, 0x00, 0x07, 0x0B, 0x03, 0x03, 0x03, 0x11, 0x0B, 0x03, 0x04, + /* RLE: 035 Pixels @ 149,063*/ 35, 0x00, + /* RLE: 001 Pixels @ 184,063*/ 1, 0x04, + /* RLE: 006 Pixels @ 185,063*/ 6, 0x03, + /* RLE: 001 Pixels @ 191,063*/ 1, 0x04, + /* RLE: 054 Pixels @ 192,063*/ 54, 0x00, + /* ABS: 004 Pixels @ 246,063*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 138 Pixels @ 250,063*/ 138, 0x01, + /* RLE: 024 Pixels @ 000,064*/ 24, 0x02, + /* ABS: 005 Pixels @ 024,064*/ 0, 5, 0x03, 0x00, 0x0B, 0x0E, 0x06, + /* RLE: 004 Pixels @ 029,064*/ 4, 0x07, + /* ABS: 002 Pixels @ 033,064*/ 0, 2, 0x0A, 0x15, + /* RLE: 064 Pixels @ 035,064*/ 64, 0x01, + /* ABS: 014 Pixels @ 099,064*/ 0, 14, 0x04, 0x03, 0x0A, 0x07, 0x07, 0x04, 0x03, 0x03, 0x04, 0x07, 0x0E, 0x03, 0x04, 0x04, + /* RLE: 026 Pixels @ 113,064*/ 26, 0x00, + /* ABS: 004 Pixels @ 139,064*/ 0, 4, 0x03, 0x12, 0x07, 0x00, + /* RLE: 004 Pixels @ 143,064*/ 4, 0x03, + /* RLE: 036 Pixels @ 147,064*/ 36, 0x00, + /* ABS: 002 Pixels @ 183,064*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 185,064*/ 6, 0x03, + /* RLE: 001 Pixels @ 191,064*/ 1, 0x04, + /* RLE: 055 Pixels @ 192,064*/ 55, 0x00, + /* ABS: 004 Pixels @ 247,064*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 137 Pixels @ 251,064*/ 137, 0x01, + /* RLE: 024 Pixels @ 000,065*/ 24, 0x02, + /* ABS: 011 Pixels @ 024,065*/ 0, 11, 0x03, 0x06, 0x07, 0x07, 0x0D, 0x07, 0x0E, 0x0A, 0x00, 0x03, 0x15, + /* RLE: 062 Pixels @ 035,065*/ 62, 0x01, + /* ABS: 015 Pixels @ 097,065*/ 0, 15, 0x04, 0x04, 0x03, 0x03, 0x03, 0x0E, 0x07, 0x0B, 0x03, 0x03, 0x03, 0x0B, 0x03, 0x00, 0x04, + /* RLE: 027 Pixels @ 112,065*/ 27, 0x00, + /* ABS: 006 Pixels @ 139,065*/ 0, 6, 0x03, 0x03, 0x0F, 0x06, 0x03, 0x0A, + /* RLE: 040 Pixels @ 145,065*/ 40, 0x00, + /* RLE: 007 Pixels @ 185,065*/ 7, 0x03, + /* RLE: 001 Pixels @ 192,065*/ 1, 0x04, + /* RLE: 055 Pixels @ 193,065*/ 55, 0x00, + /* ABS: 004 Pixels @ 248,065*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 136 Pixels @ 252,065*/ 136, 0x01, + /* RLE: 024 Pixels @ 000,066*/ 24, 0x02, + /* ABS: 010 Pixels @ 024,066*/ 0, 10, 0x03, 0x0A, 0x00, 0x03, 0x03, 0x07, 0x04, 0x03, 0x03, 0x00, + /* RLE: 060 Pixels @ 034,066*/ 60, 0x01, + /* ABS: 004 Pixels @ 094,066*/ 0, 4, 0x15, 0x00, 0x03, 0x00, + /* RLE: 005 Pixels @ 098,066*/ 5, 0x03, + /* ABS: 005 Pixels @ 103,066*/ 0, 5, 0x0D, 0x07, 0x00, 0x03, 0x03, + /* RLE: 032 Pixels @ 108,066*/ 32, 0x00, + /* ABS: 004 Pixels @ 140,066*/ 0, 4, 0x03, 0x0A, 0x00, 0x03, + /* RLE: 041 Pixels @ 144,066*/ 41, 0x00, + /* RLE: 001 Pixels @ 185,066*/ 1, 0x04, + /* RLE: 006 Pixels @ 186,066*/ 6, 0x03, + /* RLE: 001 Pixels @ 192,066*/ 1, 0x04, + /* RLE: 056 Pixels @ 193,066*/ 56, 0x00, + /* ABS: 005 Pixels @ 249,066*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 134 Pixels @ 254,066*/ 134, 0x01, + /* RLE: 024 Pixels @ 000,067*/ 24, 0x02, + /* ABS: 007 Pixels @ 024,067*/ 0, 7, 0x18, 0x03, 0x00, 0x03, 0x03, 0x0D, 0x0E, + /* RLE: 004 Pixels @ 031,067*/ 4, 0x03, + /* RLE: 058 Pixels @ 035,067*/ 58, 0x01, + /* ABS: 005 Pixels @ 093,067*/ 0, 5, 0x15, 0x03, 0x00, 0x04, 0x00, + /* RLE: 005 Pixels @ 098,067*/ 5, 0x03, + /* ABS: 006 Pixels @ 103,067*/ 0, 6, 0x00, 0x0F, 0x12, 0x03, 0x04, 0x04, + /* RLE: 032 Pixels @ 109,067*/ 32, 0x00, + /* ABS: 002 Pixels @ 141,067*/ 0, 2, 0x03, 0x03, + /* RLE: 006 Pixels @ 143,067*/ 6, 0x00, + /* RLE: 001 Pixels @ 149,067*/ 1, 0x07, + /* RLE: 035 Pixels @ 150,067*/ 35, 0x00, + /* RLE: 001 Pixels @ 185,067*/ 1, 0x04, + /* RLE: 006 Pixels @ 186,067*/ 6, 0x03, + /* RLE: 001 Pixels @ 192,067*/ 1, 0x04, + /* RLE: 057 Pixels @ 193,067*/ 57, 0x00, + /* ABS: 005 Pixels @ 250,067*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 133 Pixels @ 255,067*/ 133, 0x01, + /* RLE: 025 Pixels @ 000,068*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,068*/ 0, 10, 0x00, 0x03, 0x03, 0x03, 0x12, 0x0D, 0x0B, 0x12, 0x0D, 0x03, + /* RLE: 057 Pixels @ 035,068*/ 57, 0x01, + /* ABS: 007 Pixels @ 092,068*/ 0, 7, 0x18, 0x03, 0x00, 0x0F, 0x07, 0x0F, 0x00, + /* RLE: 005 Pixels @ 099,068*/ 5, 0x03, + /* ABS: 003 Pixels @ 104,068*/ 0, 3, 0x0A, 0x03, 0x03, + /* RLE: 042 Pixels @ 107,068*/ 42, 0x00, + /* RLE: 001 Pixels @ 149,068*/ 1, 0x07, + /* RLE: 035 Pixels @ 150,068*/ 35, 0x00, + /* RLE: 001 Pixels @ 185,068*/ 1, 0x0A, + /* RLE: 007 Pixels @ 186,068*/ 7, 0x03, + /* RLE: 001 Pixels @ 193,068*/ 1, 0x04, + /* RLE: 057 Pixels @ 194,068*/ 57, 0x00, + /* ABS: 005 Pixels @ 251,068*/ 0, 5, 0x06, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 132 Pixels @ 256,068*/ 132, 0x01, + /* RLE: 025 Pixels @ 000,069*/ 25, 0x02, + /* ABS: 004 Pixels @ 025,069*/ 0, 4, 0x03, 0x0E, 0x06, 0x0F, + /* RLE: 004 Pixels @ 029,069*/ 4, 0x07, + /* ABS: 002 Pixels @ 033,069*/ 0, 2, 0x06, 0x03, + /* RLE: 051 Pixels @ 035,069*/ 51, 0x01, + /* ABS: 013 Pixels @ 086,069*/ 0, 13, 0x15, 0x00, 0x03, 0x18, 0x01, 0x03, 0x03, 0x04, 0x0E, 0x0B, 0x00, 0x0F, 0x0D, + /* RLE: 005 Pixels @ 099,069*/ 5, 0x03, + /* RLE: 046 Pixels @ 104,069*/ 46, 0x00, + /* RLE: 001 Pixels @ 150,069*/ 1, 0x07, + /* RLE: 035 Pixels @ 151,069*/ 35, 0x00, + /* RLE: 001 Pixels @ 186,069*/ 1, 0x04, + /* RLE: 006 Pixels @ 187,069*/ 6, 0x03, + /* RLE: 001 Pixels @ 193,069*/ 1, 0x04, + /* RLE: 059 Pixels @ 194,069*/ 59, 0x00, + /* ABS: 004 Pixels @ 253,069*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 131 Pixels @ 257,069*/ 131, 0x01, + /* RLE: 025 Pixels @ 000,070*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,070*/ 0, 10, 0x03, 0x0D, 0x11, 0x06, 0x0B, 0x0A, 0x00, 0x03, 0x03, 0x00, + /* RLE: 051 Pixels @ 035,070*/ 51, 0x01, + /* ABS: 020 Pixels @ 086,070*/ 0, 20, 0x03, 0x00, 0x0B, 0x03, 0x03, 0x03, 0x0D, 0x07, 0x07, 0x0B, 0x03, 0x0A, 0x07, 0x0E, 0x03, 0x03, 0x04, 0x04, 0x04, 0x0A, + /* RLE: 080 Pixels @ 106,070*/ 80, 0x00, + /* RLE: 001 Pixels @ 186,070*/ 1, 0x04, + /* RLE: 006 Pixels @ 187,070*/ 6, 0x03, + /* RLE: 001 Pixels @ 193,070*/ 1, 0x04, + /* RLE: 060 Pixels @ 194,070*/ 60, 0x00, + /* ABS: 004 Pixels @ 254,070*/ 0, 4, 0x0D, 0x06, 0x03, 0x0D, + /* RLE: 130 Pixels @ 258,070*/ 130, 0x01, + /* RLE: 025 Pixels @ 000,071*/ 25, 0x02, + /* RLE: 004 Pixels @ 025,071*/ 4, 0x03, + /* RLE: 001 Pixels @ 029,071*/ 1, 0x00, + /* RLE: 004 Pixels @ 030,071*/ 4, 0x03, + /* RLE: 001 Pixels @ 034,071*/ 1, 0x04, + /* RLE: 051 Pixels @ 035,071*/ 51, 0x01, + /* ABS: 017 Pixels @ 086,071*/ 0, 17, 0x03, 0x06, 0x07, 0x00, 0x0A, 0x06, 0x12, 0x03, 0x0D, 0x0F, 0x00, 0x03, 0x0E, 0x07, 0x00, 0x00, 0x04, + /* RLE: 083 Pixels @ 103,071*/ 83, 0x00, + /* RLE: 001 Pixels @ 186,071*/ 1, 0x04, + /* RLE: 007 Pixels @ 187,071*/ 7, 0x03, + /* RLE: 061 Pixels @ 194,071*/ 61, 0x00, + /* ABS: 004 Pixels @ 255,071*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 129 Pixels @ 259,071*/ 129, 0x01, + /* RLE: 025 Pixels @ 000,072*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,072*/ 0, 10, 0x00, 0x03, 0x0B, 0x0F, 0x07, 0x0F, 0x04, 0x03, 0x03, 0x04, + /* RLE: 051 Pixels @ 035,072*/ 51, 0x01, + /* ABS: 015 Pixels @ 086,072*/ 0, 15, 0x03, 0x00, 0x0F, 0x11, 0x0B, 0x07, 0x0E, 0x03, 0x00, 0x0F, 0x06, 0x03, 0x03, 0x0A, 0x03, + /* RLE: 085 Pixels @ 101,072*/ 85, 0x00, + /* ABS: 002 Pixels @ 186,072*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 188,072*/ 6, 0x03, + /* RLE: 001 Pixels @ 194,072*/ 1, 0x04, + /* RLE: 061 Pixels @ 195,072*/ 61, 0x00, + /* ABS: 005 Pixels @ 256,072*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 127 Pixels @ 261,072*/ 127, 0x01, + /* RLE: 025 Pixels @ 000,073*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,073*/ 0, 10, 0x03, 0x0A, 0x07, 0x06, 0x0B, 0x12, 0x07, 0x00, 0x03, 0x04, + /* RLE: 051 Pixels @ 035,073*/ 51, 0x01, + /* ABS: 013 Pixels @ 086,073*/ 0, 13, 0x0A, 0x03, 0x0A, 0x07, 0x12, 0x12, 0x07, 0x00, 0x03, 0x04, 0x07, 0x04, 0x03, + /* RLE: 053 Pixels @ 099,073*/ 53, 0x00, + /* RLE: 001 Pixels @ 152,073*/ 1, 0x07, + /* RLE: 034 Pixels @ 153,073*/ 34, 0x00, + /* RLE: 001 Pixels @ 187,073*/ 1, 0x04, + /* RLE: 006 Pixels @ 188,073*/ 6, 0x03, + /* RLE: 001 Pixels @ 194,073*/ 1, 0x04, + /* RLE: 062 Pixels @ 195,073*/ 62, 0x00, + /* RLE: 001 Pixels @ 257,073*/ 1, 0x0D, + /* RLE: 004 Pixels @ 258,073*/ 4, 0x06, + /* RLE: 126 Pixels @ 262,073*/ 126, 0x01, + /* RLE: 025 Pixels @ 000,074*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,074*/ 0, 10, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x0D, 0x0B, 0x03, 0x04, + /* RLE: 050 Pixels @ 035,074*/ 50, 0x01, + /* ABS: 013 Pixels @ 085,074*/ 0, 13, 0x04, 0x04, 0x03, 0x03, 0x0E, 0x07, 0x04, 0x0F, 0x11, 0x03, 0x03, 0x04, 0x03, + /* RLE: 008 Pixels @ 098,074*/ 8, 0x00, + /* RLE: 001 Pixels @ 106,074*/ 1, 0x0A, + /* RLE: 045 Pixels @ 107,074*/ 45, 0x00, + /* RLE: 001 Pixels @ 152,074*/ 1, 0x07, + /* RLE: 034 Pixels @ 153,074*/ 34, 0x00, + /* RLE: 001 Pixels @ 187,074*/ 1, 0x04, + /* RLE: 007 Pixels @ 188,074*/ 7, 0x03, + /* RLE: 063 Pixels @ 195,074*/ 63, 0x00, + /* ABS: 005 Pixels @ 258,074*/ 0, 5, 0x06, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 125 Pixels @ 263,074*/ 125, 0x01, + /* RLE: 025 Pixels @ 000,075*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,075*/ 0, 10, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x0F, 0x0B, 0x03, 0x04, + /* RLE: 048 Pixels @ 035,075*/ 48, 0x01, + /* RLE: 003 Pixels @ 083,075*/ 3, 0x04, + /* RLE: 004 Pixels @ 086,075*/ 4, 0x03, + /* ABS: 006 Pixels @ 090,075*/ 0, 6, 0x0D, 0x0F, 0x00, 0x07, 0x0B, 0x03, + /* RLE: 013 Pixels @ 096,075*/ 13, 0x00, + /* RLE: 001 Pixels @ 109,075*/ 1, 0x0A, + /* RLE: 042 Pixels @ 110,075*/ 42, 0x00, + /* RLE: 001 Pixels @ 152,075*/ 1, 0x07, + /* RLE: 035 Pixels @ 153,075*/ 35, 0x00, + /* RLE: 001 Pixels @ 188,075*/ 1, 0x04, + /* RLE: 006 Pixels @ 189,075*/ 6, 0x03, + /* RLE: 001 Pixels @ 195,075*/ 1, 0x04, + /* RLE: 064 Pixels @ 196,075*/ 64, 0x00, + /* ABS: 004 Pixels @ 260,075*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 124 Pixels @ 264,075*/ 124, 0x01, + /* RLE: 025 Pixels @ 000,076*/ 25, 0x02, + /* ABS: 010 Pixels @ 025,076*/ 0, 10, 0x03, 0x00, 0x0F, 0x11, 0x06, 0x0F, 0x0F, 0x00, 0x03, 0x03, + /* RLE: 047 Pixels @ 035,076*/ 47, 0x01, + /* ABS: 002 Pixels @ 082,076*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 084,076*/ 6, 0x03, + /* ABS: 005 Pixels @ 090,076*/ 0, 5, 0x00, 0x07, 0x12, 0x0A, 0x03, + /* RLE: 013 Pixels @ 095,076*/ 13, 0x00, + /* RLE: 001 Pixels @ 108,076*/ 1, 0x0A, + /* RLE: 076 Pixels @ 109,076*/ 76, 0x00, + /* ABS: 004 Pixels @ 185,076*/ 0, 4, 0x0A, 0x00, 0x0A, 0x04, + /* RLE: 006 Pixels @ 189,076*/ 6, 0x03, + /* RLE: 001 Pixels @ 195,076*/ 1, 0x04, + /* RLE: 065 Pixels @ 196,076*/ 65, 0x00, + /* ABS: 004 Pixels @ 261,076*/ 0, 4, 0x0D, 0x03, 0x03, 0x0D, + /* RLE: 123 Pixels @ 265,076*/ 123, 0x01, + /* RLE: 025 Pixels @ 000,077*/ 25, 0x02, + /* ABS: 011 Pixels @ 025,077*/ 0, 11, 0x0A, 0x03, 0x00, 0x12, 0x06, 0x12, 0x00, 0x03, 0x03, 0x03, 0x04, + /* RLE: 044 Pixels @ 036,077*/ 44, 0x01, + /* RLE: 003 Pixels @ 080,077*/ 3, 0x04, + /* RLE: 008 Pixels @ 083,077*/ 8, 0x03, + /* ABS: 003 Pixels @ 091,077*/ 0, 3, 0x0A, 0x03, 0x03, + /* RLE: 015 Pixels @ 094,077*/ 15, 0x00, + /* RLE: 001 Pixels @ 109,077*/ 1, 0x0A, + /* RLE: 078 Pixels @ 110,077*/ 78, 0x00, + /* RLE: 001 Pixels @ 188,077*/ 1, 0x04, + /* RLE: 007 Pixels @ 189,077*/ 7, 0x03, + /* RLE: 066 Pixels @ 196,077*/ 66, 0x00, + /* ABS: 004 Pixels @ 262,077*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 122 Pixels @ 266,077*/ 122, 0x01, + /* RLE: 026 Pixels @ 000,078*/ 26, 0x02, + /* ABS: 010 Pixels @ 026,078*/ 0, 10, 0x18, 0x03, 0x03, 0x0B, 0x0F, 0x07, 0x07, 0x0B, 0x03, 0x00, + /* RLE: 043 Pixels @ 036,078*/ 43, 0x01, + /* ABS: 002 Pixels @ 079,078*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 081,078*/ 10, 0x03, + /* ABS: 003 Pixels @ 091,078*/ 0, 3, 0x00, 0x00, 0x04, + /* RLE: 095 Pixels @ 094,078*/ 95, 0x00, + /* RLE: 001 Pixels @ 189,078*/ 1, 0x04, + /* RLE: 006 Pixels @ 190,078*/ 6, 0x03, + /* RLE: 001 Pixels @ 196,078*/ 1, 0x04, + /* RLE: 066 Pixels @ 197,078*/ 66, 0x00, + /* RLE: 001 Pixels @ 263,078*/ 1, 0x0D, + /* RLE: 004 Pixels @ 264,078*/ 4, 0x06, + /* RLE: 120 Pixels @ 268,078*/ 120, 0x01, + /* RLE: 027 Pixels @ 000,079*/ 27, 0x02, + /* ABS: 009 Pixels @ 027,079*/ 0, 9, 0x03, 0x04, 0x07, 0x06, 0x0B, 0x0E, 0x07, 0x00, 0x03, + /* RLE: 041 Pixels @ 036,079*/ 41, 0x01, + /* ABS: 002 Pixels @ 077,079*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 079,079*/ 11, 0x03, + /* ABS: 002 Pixels @ 090,079*/ 0, 2, 0x04, 0x04, + /* RLE: 062 Pixels @ 092,079*/ 62, 0x00, + /* RLE: 001 Pixels @ 154,079*/ 1, 0x07, + /* RLE: 034 Pixels @ 155,079*/ 34, 0x00, + /* RLE: 001 Pixels @ 189,079*/ 1, 0x04, + /* RLE: 006 Pixels @ 190,079*/ 6, 0x03, + /* RLE: 001 Pixels @ 196,079*/ 1, 0x04, + /* RLE: 067 Pixels @ 197,079*/ 67, 0x00, + /* RLE: 001 Pixels @ 264,079*/ 1, 0x0D, + /* RLE: 004 Pixels @ 265,079*/ 4, 0x06, + /* RLE: 119 Pixels @ 269,079*/ 119, 0x01, + /* RLE: 027 Pixels @ 000,080*/ 27, 0x02, + /* ABS: 009 Pixels @ 027,080*/ 0, 9, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x06, 0x0B, 0x00, + /* RLE: 039 Pixels @ 036,080*/ 39, 0x01, + /* RLE: 003 Pixels @ 075,080*/ 3, 0x04, + /* RLE: 011 Pixels @ 078,080*/ 11, 0x03, + /* ABS: 002 Pixels @ 089,080*/ 0, 2, 0x04, 0x04, + /* RLE: 017 Pixels @ 091,080*/ 17, 0x00, + /* RLE: 001 Pixels @ 108,080*/ 1, 0x0A, + /* RLE: 046 Pixels @ 109,080*/ 46, 0x00, + /* RLE: 001 Pixels @ 155,080*/ 1, 0x07, + /* RLE: 032 Pixels @ 156,080*/ 32, 0x00, + /* ABS: 002 Pixels @ 188,080*/ 0, 2, 0x0A, 0x04, + /* RLE: 007 Pixels @ 190,080*/ 7, 0x03, + /* RLE: 068 Pixels @ 197,080*/ 68, 0x00, + /* ABS: 005 Pixels @ 265,080*/ 0, 5, 0x06, 0x0D, 0x06, 0x06, 0x0D, + /* RLE: 118 Pixels @ 270,080*/ 118, 0x01, + /* RLE: 027 Pixels @ 000,081*/ 27, 0x02, + /* ABS: 009 Pixels @ 027,081*/ 0, 9, 0x03, 0x0B, 0x11, 0x03, 0x03, 0x00, 0x0F, 0x04, 0x03, + /* RLE: 038 Pixels @ 036,081*/ 38, 0x01, + /* ABS: 002 Pixels @ 074,081*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 076,081*/ 11, 0x03, + /* ABS: 002 Pixels @ 087,081*/ 0, 2, 0x04, 0x04, + /* RLE: 066 Pixels @ 089,081*/ 66, 0x00, + /* RLE: 001 Pixels @ 155,081*/ 1, 0x07, + /* RLE: 034 Pixels @ 156,081*/ 34, 0x00, + /* RLE: 001 Pixels @ 190,081*/ 1, 0x04, + /* RLE: 006 Pixels @ 191,081*/ 6, 0x03, + /* RLE: 001 Pixels @ 197,081*/ 1, 0x04, + /* RLE: 069 Pixels @ 198,081*/ 69, 0x00, + /* ABS: 004 Pixels @ 267,081*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 117 Pixels @ 271,081*/ 117, 0x01, + /* RLE: 027 Pixels @ 000,082*/ 27, 0x02, + /* ABS: 011 Pixels @ 027,082*/ 0, 11, 0x03, 0x00, 0x0F, 0x07, 0x03, 0x00, 0x06, 0x03, 0x03, 0x03, 0x00, + /* RLE: 034 Pixels @ 038,082*/ 34, 0x01, + /* RLE: 003 Pixels @ 072,082*/ 3, 0x04, + /* RLE: 011 Pixels @ 075,082*/ 11, 0x03, + /* ABS: 002 Pixels @ 086,082*/ 0, 2, 0x04, 0x04, + /* RLE: 102 Pixels @ 088,082*/ 102, 0x00, + /* RLE: 001 Pixels @ 190,082*/ 1, 0x04, + /* RLE: 006 Pixels @ 191,082*/ 6, 0x03, + /* RLE: 001 Pixels @ 197,082*/ 1, 0x04, + /* RLE: 070 Pixels @ 198,082*/ 70, 0x00, + /* ABS: 004 Pixels @ 268,082*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 116 Pixels @ 272,082*/ 116, 0x01, + /* RLE: 027 Pixels @ 000,083*/ 27, 0x02, + /* ABS: 012 Pixels @ 027,083*/ 0, 12, 0x0A, 0x03, 0x00, 0x0B, 0x03, 0x03, 0x03, 0x00, 0x0B, 0x0E, 0x03, 0x15, + /* RLE: 032 Pixels @ 039,083*/ 32, 0x01, + /* ABS: 002 Pixels @ 071,083*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 073,083*/ 11, 0x03, + /* ABS: 002 Pixels @ 084,083*/ 0, 2, 0x04, 0x04, + /* RLE: 023 Pixels @ 086,083*/ 23, 0x00, + /* RLE: 001 Pixels @ 109,083*/ 1, 0x0A, + /* RLE: 080 Pixels @ 110,083*/ 80, 0x00, + /* RLE: 001 Pixels @ 190,083*/ 1, 0x04, + /* RLE: 007 Pixels @ 191,083*/ 7, 0x03, + /* RLE: 071 Pixels @ 198,083*/ 71, 0x00, + /* ABS: 004 Pixels @ 269,083*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 115 Pixels @ 273,083*/ 115, 0x01, + /* RLE: 028 Pixels @ 000,084*/ 28, 0x02, + /* ABS: 005 Pixels @ 028,084*/ 0, 5, 0x03, 0x0A, 0x0B, 0x12, 0x11, + /* RLE: 004 Pixels @ 033,084*/ 4, 0x07, + /* ABS: 002 Pixels @ 037,084*/ 0, 2, 0x00, 0x15, + /* RLE: 030 Pixels @ 039,084*/ 30, 0x01, + /* ABS: 002 Pixels @ 069,084*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 071,084*/ 11, 0x03, + /* RLE: 003 Pixels @ 082,084*/ 3, 0x04, + /* RLE: 105 Pixels @ 085,084*/ 105, 0x00, + /* ABS: 002 Pixels @ 190,084*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 192,084*/ 6, 0x03, + /* RLE: 001 Pixels @ 198,084*/ 1, 0x04, + /* RLE: 071 Pixels @ 199,084*/ 71, 0x00, + /* ABS: 004 Pixels @ 270,084*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 114 Pixels @ 274,084*/ 114, 0x01, + /* RLE: 028 Pixels @ 000,085*/ 28, 0x02, + /* ABS: 011 Pixels @ 028,085*/ 0, 11, 0x03, 0x06, 0x07, 0x07, 0x07, 0x12, 0x0A, 0x00, 0x03, 0x03, 0x15, + /* RLE: 028 Pixels @ 039,085*/ 28, 0x01, + /* RLE: 003 Pixels @ 067,085*/ 3, 0x04, + /* RLE: 011 Pixels @ 070,085*/ 11, 0x03, + /* ABS: 002 Pixels @ 081,085*/ 0, 2, 0x04, 0x04, + /* RLE: 074 Pixels @ 083,085*/ 74, 0x00, + /* RLE: 001 Pixels @ 157,085*/ 1, 0x07, + /* RLE: 033 Pixels @ 158,085*/ 33, 0x00, + /* RLE: 001 Pixels @ 191,085*/ 1, 0x04, + /* RLE: 006 Pixels @ 192,085*/ 6, 0x03, + /* RLE: 001 Pixels @ 198,085*/ 1, 0x04, + /* RLE: 072 Pixels @ 199,085*/ 72, 0x00, + /* RLE: 001 Pixels @ 271,085*/ 1, 0x0D, + /* RLE: 004 Pixels @ 272,085*/ 4, 0x06, + /* RLE: 112 Pixels @ 276,085*/ 112, 0x01, + /* RLE: 028 Pixels @ 000,086*/ 28, 0x02, + /* ABS: 009 Pixels @ 028,086*/ 0, 9, 0x03, 0x00, 0x03, 0x00, 0x07, 0x07, 0x0E, 0x03, 0x00, + /* RLE: 030 Pixels @ 037,086*/ 30, 0x01, + /* RLE: 001 Pixels @ 067,086*/ 1, 0x04, + /* RLE: 011 Pixels @ 068,086*/ 11, 0x03, + /* ABS: 002 Pixels @ 079,086*/ 0, 2, 0x04, 0x04, + /* RLE: 027 Pixels @ 081,086*/ 27, 0x00, + /* RLE: 001 Pixels @ 108,086*/ 1, 0x0A, + /* RLE: 048 Pixels @ 109,086*/ 48, 0x00, + /* RLE: 001 Pixels @ 157,086*/ 1, 0x07, + /* RLE: 032 Pixels @ 158,086*/ 32, 0x00, + /* ABS: 002 Pixels @ 190,086*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 192,086*/ 6, 0x03, + /* RLE: 001 Pixels @ 198,086*/ 1, 0x04, + /* RLE: 073 Pixels @ 199,086*/ 73, 0x00, + /* ABS: 005 Pixels @ 272,086*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 111 Pixels @ 277,086*/ 111, 0x01, + /* RLE: 028 Pixels @ 000,087*/ 28, 0x02, + /* ABS: 009 Pixels @ 028,087*/ 0, 9, 0x00, 0x03, 0x00, 0x0F, 0x11, 0x0B, 0x0F, 0x0B, 0x03, + /* RLE: 029 Pixels @ 037,087*/ 29, 0x01, + /* ABS: 002 Pixels @ 066,087*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 068,087*/ 10, 0x03, + /* ABS: 002 Pixels @ 078,087*/ 0, 2, 0x04, 0x04, + /* RLE: 078 Pixels @ 080,087*/ 78, 0x00, + /* RLE: 001 Pixels @ 158,087*/ 1, 0x07, + /* RLE: 033 Pixels @ 159,087*/ 33, 0x00, + /* RLE: 007 Pixels @ 192,087*/ 7, 0x03, + /* RLE: 001 Pixels @ 199,087*/ 1, 0x04, + /* RLE: 073 Pixels @ 200,087*/ 73, 0x00, + /* ABS: 005 Pixels @ 273,087*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 110 Pixels @ 278,087*/ 110, 0x01, + /* RLE: 028 Pixels @ 000,088*/ 28, 0x02, + /* ABS: 010 Pixels @ 028,088*/ 0, 10, 0x18, 0x00, 0x07, 0x0D, 0x03, 0x03, 0x03, 0x04, 0x03, 0x04, + /* RLE: 027 Pixels @ 038,088*/ 27, 0x01, + /* ABS: 002 Pixels @ 065,088*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 067,088*/ 9, 0x03, + /* ABS: 002 Pixels @ 076,088*/ 0, 2, 0x04, 0x04, + /* RLE: 114 Pixels @ 078,088*/ 114, 0x00, + /* RLE: 001 Pixels @ 192,088*/ 1, 0x04, + /* RLE: 006 Pixels @ 193,088*/ 6, 0x03, + /* RLE: 001 Pixels @ 199,088*/ 1, 0x04, + /* RLE: 075 Pixels @ 200,088*/ 75, 0x00, + /* ABS: 004 Pixels @ 275,088*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 109 Pixels @ 279,088*/ 109, 0x01, + /* RLE: 028 Pixels @ 000,089*/ 28, 0x02, + /* ABS: 003 Pixels @ 028,089*/ 0, 3, 0x18, 0x03, 0x0E, + /* RLE: 006 Pixels @ 031,089*/ 6, 0x03, + /* RLE: 001 Pixels @ 037,089*/ 1, 0x04, + /* RLE: 026 Pixels @ 038,089*/ 26, 0x01, + /* ABS: 002 Pixels @ 064,089*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 066,089*/ 8, 0x03, + /* RLE: 003 Pixels @ 074,089*/ 3, 0x04, + /* RLE: 033 Pixels @ 077,089*/ 33, 0x00, + /* RLE: 001 Pixels @ 110,089*/ 1, 0x0A, + /* RLE: 081 Pixels @ 111,089*/ 81, 0x00, + /* RLE: 001 Pixels @ 192,089*/ 1, 0x04, + /* RLE: 006 Pixels @ 193,089*/ 6, 0x03, + /* RLE: 001 Pixels @ 199,089*/ 1, 0x04, + /* RLE: 076 Pixels @ 200,089*/ 76, 0x00, + /* ABS: 004 Pixels @ 276,089*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 108 Pixels @ 280,089*/ 108, 0x01, + /* RLE: 029 Pixels @ 000,090*/ 29, 0x02, + /* ABS: 002 Pixels @ 029,090*/ 0, 2, 0x03, 0x00, + /* RLE: 006 Pixels @ 031,090*/ 6, 0x03, + /* RLE: 001 Pixels @ 037,090*/ 1, 0x04, + /* RLE: 025 Pixels @ 038,090*/ 25, 0x01, + /* ABS: 002 Pixels @ 063,090*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 065,090*/ 8, 0x03, + /* ABS: 002 Pixels @ 073,090*/ 0, 2, 0x04, 0x04, + /* RLE: 117 Pixels @ 075,090*/ 117, 0x00, + /* RLE: 001 Pixels @ 192,090*/ 1, 0x0A, + /* RLE: 007 Pixels @ 193,090*/ 7, 0x03, + /* RLE: 001 Pixels @ 200,090*/ 1, 0x04, + /* RLE: 076 Pixels @ 201,090*/ 76, 0x00, + /* ABS: 004 Pixels @ 277,090*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 107 Pixels @ 281,090*/ 107, 0x01, + /* RLE: 030 Pixels @ 000,091*/ 30, 0x02, + /* RLE: 001 Pixels @ 030,091*/ 1, 0x04, + /* RLE: 006 Pixels @ 031,091*/ 6, 0x03, + /* RLE: 001 Pixels @ 037,091*/ 1, 0x04, + /* RLE: 024 Pixels @ 038,091*/ 24, 0x01, + /* ABS: 002 Pixels @ 062,091*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 064,091*/ 8, 0x03, + /* RLE: 001 Pixels @ 072,091*/ 1, 0x04, + /* RLE: 028 Pixels @ 073,091*/ 28, 0x00, + /* ABS: 006 Pixels @ 101,091*/ 0, 6, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, + /* RLE: 052 Pixels @ 107,091*/ 52, 0x00, + /* RLE: 001 Pixels @ 159,091*/ 1, 0x07, + /* RLE: 033 Pixels @ 160,091*/ 33, 0x00, + /* RLE: 001 Pixels @ 193,091*/ 1, 0x04, + /* RLE: 006 Pixels @ 194,091*/ 6, 0x03, + /* RLE: 001 Pixels @ 200,091*/ 1, 0x04, + /* RLE: 077 Pixels @ 201,091*/ 77, 0x00, + /* ABS: 005 Pixels @ 278,091*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 105 Pixels @ 283,091*/ 105, 0x01, + /* RLE: 030 Pixels @ 000,092*/ 30, 0x02, + /* RLE: 001 Pixels @ 030,092*/ 1, 0x04, + /* RLE: 006 Pixels @ 031,092*/ 6, 0x03, + /* RLE: 001 Pixels @ 037,092*/ 1, 0x04, + /* RLE: 023 Pixels @ 038,092*/ 23, 0x01, + /* ABS: 002 Pixels @ 061,092*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 063,092*/ 8, 0x03, + /* ABS: 002 Pixels @ 071,092*/ 0, 2, 0x04, 0x04, + /* RLE: 027 Pixels @ 073,092*/ 27, 0x00, + /* ABS: 007 Pixels @ 100,092*/ 0, 7, 0x03, 0x04, 0x0A, 0x03, 0x03, 0x12, 0x0A, + /* RLE: 053 Pixels @ 107,092*/ 53, 0x00, + /* RLE: 001 Pixels @ 160,092*/ 1, 0x07, + /* RLE: 032 Pixels @ 161,092*/ 32, 0x00, + /* RLE: 001 Pixels @ 193,092*/ 1, 0x04, + /* RLE: 006 Pixels @ 194,092*/ 6, 0x03, + /* RLE: 001 Pixels @ 200,092*/ 1, 0x04, + /* RLE: 078 Pixels @ 201,092*/ 78, 0x00, + /* ABS: 005 Pixels @ 279,092*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 104 Pixels @ 284,092*/ 104, 0x01, + /* RLE: 031 Pixels @ 000,093*/ 31, 0x02, + /* RLE: 007 Pixels @ 031,093*/ 7, 0x03, + /* RLE: 001 Pixels @ 038,093*/ 1, 0x04, + /* RLE: 021 Pixels @ 039,093*/ 21, 0x01, + /* ABS: 002 Pixels @ 060,093*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 062,093*/ 8, 0x03, + /* ABS: 002 Pixels @ 070,093*/ 0, 2, 0x04, 0x04, + /* RLE: 028 Pixels @ 072,093*/ 28, 0x00, + /* ABS: 008 Pixels @ 100,093*/ 0, 8, 0x03, 0x11, 0x0F, 0x03, 0x0A, 0x07, 0x03, 0x03, + /* RLE: 052 Pixels @ 108,093*/ 52, 0x00, + /* RLE: 001 Pixels @ 160,093*/ 1, 0x07, + /* RLE: 033 Pixels @ 161,093*/ 33, 0x00, + /* RLE: 007 Pixels @ 194,093*/ 7, 0x03, + /* RLE: 001 Pixels @ 201,093*/ 1, 0x04, + /* RLE: 078 Pixels @ 202,093*/ 78, 0x00, + /* ABS: 005 Pixels @ 280,093*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 103 Pixels @ 285,093*/ 103, 0x01, + /* RLE: 031 Pixels @ 000,094*/ 31, 0x02, + /* RLE: 001 Pixels @ 031,094*/ 1, 0x04, + /* RLE: 006 Pixels @ 032,094*/ 6, 0x03, + /* RLE: 001 Pixels @ 038,094*/ 1, 0x04, + /* RLE: 020 Pixels @ 039,094*/ 20, 0x01, + /* ABS: 002 Pixels @ 059,094*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 061,094*/ 8, 0x03, + /* ABS: 002 Pixels @ 069,094*/ 0, 2, 0x04, 0x04, + /* RLE: 029 Pixels @ 071,094*/ 29, 0x00, + /* ABS: 010 Pixels @ 100,094*/ 0, 10, 0x03, 0x00, 0x07, 0x06, 0x00, 0x07, 0x00, 0x03, 0x03, 0x03, + /* RLE: 083 Pixels @ 110,094*/ 83, 0x00, + /* ABS: 002 Pixels @ 193,094*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 195,094*/ 6, 0x03, + /* RLE: 001 Pixels @ 201,094*/ 1, 0x04, + /* RLE: 080 Pixels @ 202,094*/ 80, 0x00, + /* ABS: 004 Pixels @ 282,094*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 102 Pixels @ 286,094*/ 102, 0x01, + /* RLE: 031 Pixels @ 000,095*/ 31, 0x02, + /* RLE: 001 Pixels @ 031,095*/ 1, 0x04, + /* RLE: 006 Pixels @ 032,095*/ 6, 0x03, + /* RLE: 001 Pixels @ 038,095*/ 1, 0x04, + /* RLE: 019 Pixels @ 039,095*/ 19, 0x01, + /* ABS: 002 Pixels @ 058,095*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 060,095*/ 8, 0x03, + /* ABS: 002 Pixels @ 068,095*/ 0, 2, 0x04, 0x04, + /* RLE: 030 Pixels @ 070,095*/ 30, 0x00, + /* ABS: 011 Pixels @ 100,095*/ 0, 11, 0x03, 0x03, 0x0B, 0x07, 0x0F, 0x07, 0x07, 0x06, 0x0A, 0x03, 0x03, + /* RLE: 083 Pixels @ 111,095*/ 83, 0x00, + /* RLE: 001 Pixels @ 194,095*/ 1, 0x04, + /* RLE: 006 Pixels @ 195,095*/ 6, 0x03, + /* RLE: 001 Pixels @ 201,095*/ 1, 0x04, + /* RLE: 081 Pixels @ 202,095*/ 81, 0x00, + /* ABS: 004 Pixels @ 283,095*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 101 Pixels @ 287,095*/ 101, 0x01, + /* RLE: 031 Pixels @ 000,096*/ 31, 0x02, + /* RLE: 001 Pixels @ 031,096*/ 1, 0x04, + /* RLE: 006 Pixels @ 032,096*/ 6, 0x03, + /* RLE: 001 Pixels @ 038,096*/ 1, 0x04, + /* RLE: 018 Pixels @ 039,096*/ 18, 0x01, + /* ABS: 002 Pixels @ 057,096*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 059,096*/ 8, 0x03, + /* ABS: 002 Pixels @ 067,096*/ 0, 2, 0x04, 0x04, + /* RLE: 029 Pixels @ 069,096*/ 29, 0x00, + /* ABS: 013 Pixels @ 098,096*/ 0, 13, 0x03, 0x03, 0x04, 0x00, 0x03, 0x12, 0x07, 0x06, 0x04, 0x11, 0x07, 0x0E, 0x03, + /* RLE: 084 Pixels @ 111,096*/ 84, 0x00, + /* RLE: 007 Pixels @ 195,096*/ 7, 0x03, + /* RLE: 001 Pixels @ 202,096*/ 1, 0x04, + /* RLE: 081 Pixels @ 203,096*/ 81, 0x00, + /* ABS: 004 Pixels @ 284,096*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 100 Pixels @ 288,096*/ 100, 0x01, + /* RLE: 031 Pixels @ 000,097*/ 31, 0x02, + /* RLE: 001 Pixels @ 031,097*/ 1, 0x04, + /* RLE: 006 Pixels @ 032,097*/ 6, 0x03, + /* RLE: 001 Pixels @ 038,097*/ 1, 0x04, + /* RLE: 017 Pixels @ 039,097*/ 17, 0x01, + /* ABS: 002 Pixels @ 056,097*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 058,097*/ 8, 0x03, + /* ABS: 002 Pixels @ 066,097*/ 0, 2, 0x04, 0x04, + /* RLE: 028 Pixels @ 068,097*/ 28, 0x00, + /* ABS: 015 Pixels @ 096,097*/ 0, 15, 0x04, 0x03, 0x00, 0x0F, 0x07, 0x0D, 0x03, 0x03, 0x11, 0x0F, 0x03, 0x03, 0x00, 0x03, 0x03, + /* RLE: 051 Pixels @ 111,097*/ 51, 0x00, + /* ABS: 004 Pixels @ 162,097*/ 0, 4, 0x07, 0x00, 0x00, 0x0A, + /* RLE: 029 Pixels @ 166,097*/ 29, 0x00, + /* RLE: 001 Pixels @ 195,097*/ 1, 0x04, + /* RLE: 006 Pixels @ 196,097*/ 6, 0x03, + /* RLE: 001 Pixels @ 202,097*/ 1, 0x04, + /* RLE: 082 Pixels @ 203,097*/ 82, 0x00, + /* ABS: 005 Pixels @ 285,097*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 098 Pixels @ 290,097*/ 98, 0x01, + /* RLE: 031 Pixels @ 000,098*/ 31, 0x02, + /* RLE: 001 Pixels @ 031,098*/ 1, 0x04, + /* RLE: 007 Pixels @ 032,098*/ 7, 0x03, + /* RLE: 016 Pixels @ 039,098*/ 16, 0x01, + /* ABS: 002 Pixels @ 055,098*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 057,098*/ 8, 0x03, + /* ABS: 002 Pixels @ 065,098*/ 0, 2, 0x04, 0x04, + /* RLE: 028 Pixels @ 067,098*/ 28, 0x00, + /* ABS: 013 Pixels @ 095,098*/ 0, 13, 0x04, 0x04, 0x03, 0x0F, 0x0E, 0x03, 0x00, 0x03, 0x03, 0x00, 0x07, 0x0E, 0x03, + /* RLE: 054 Pixels @ 108,098*/ 54, 0x00, + /* ABS: 003 Pixels @ 162,098*/ 0, 3, 0x07, 0x00, 0x0A, + /* RLE: 029 Pixels @ 165,098*/ 29, 0x00, + /* ABS: 002 Pixels @ 194,098*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 196,098*/ 6, 0x03, + /* RLE: 001 Pixels @ 202,098*/ 1, 0x04, + /* RLE: 083 Pixels @ 203,098*/ 83, 0x00, + /* ABS: 005 Pixels @ 286,098*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x0D, + /* RLE: 097 Pixels @ 291,098*/ 97, 0x01, + /* RLE: 032 Pixels @ 000,099*/ 32, 0x02, + /* RLE: 001 Pixels @ 032,099*/ 1, 0x04, + /* RLE: 006 Pixels @ 033,099*/ 6, 0x03, + /* RLE: 001 Pixels @ 039,099*/ 1, 0x04, + /* RLE: 014 Pixels @ 040,099*/ 14, 0x01, + /* ABS: 002 Pixels @ 054,099*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 056,099*/ 8, 0x03, + /* ABS: 002 Pixels @ 064,099*/ 0, 2, 0x04, 0x04, + /* RLE: 029 Pixels @ 066,099*/ 29, 0x00, + /* RLE: 003 Pixels @ 095,099*/ 3, 0x03, + /* ABS: 010 Pixels @ 098,099*/ 0, 10, 0x07, 0x04, 0x03, 0x03, 0x0B, 0x06, 0x03, 0x0A, 0x03, 0x03, + /* RLE: 055 Pixels @ 108,099*/ 55, 0x00, + /* ABS: 004 Pixels @ 163,099*/ 0, 4, 0x07, 0x00, 0x00, 0x0A, + /* RLE: 028 Pixels @ 167,099*/ 28, 0x00, + /* RLE: 001 Pixels @ 195,099*/ 1, 0x0A, + /* RLE: 007 Pixels @ 196,099*/ 7, 0x03, + /* RLE: 084 Pixels @ 203,099*/ 84, 0x00, + /* RLE: 001 Pixels @ 287,099*/ 1, 0x0D, + /* RLE: 004 Pixels @ 288,099*/ 4, 0x06, + /* RLE: 096 Pixels @ 292,099*/ 96, 0x01, + /* RLE: 032 Pixels @ 000,100*/ 32, 0x02, + /* RLE: 001 Pixels @ 032,100*/ 1, 0x04, + /* RLE: 006 Pixels @ 033,100*/ 6, 0x03, + /* RLE: 001 Pixels @ 039,100*/ 1, 0x04, + /* RLE: 013 Pixels @ 040,100*/ 13, 0x01, + /* ABS: 002 Pixels @ 053,100*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 055,100*/ 8, 0x03, + /* ABS: 002 Pixels @ 063,100*/ 0, 2, 0x04, 0x04, + /* RLE: 024 Pixels @ 065,100*/ 24, 0x00, + /* ABS: 016 Pixels @ 089,100*/ 0, 16, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x04, 0x0B, 0x00, 0x11, 0x11, 0x03, 0x03, 0x0E, 0x0D, 0x03, + /* RLE: 058 Pixels @ 105,100*/ 58, 0x00, + /* ABS: 003 Pixels @ 163,100*/ 0, 3, 0x0A, 0x00, 0x0A, + /* RLE: 027 Pixels @ 166,100*/ 27, 0x00, + /* ABS: 004 Pixels @ 193,100*/ 0, 4, 0x0A, 0x00, 0x0A, 0x04, + /* RLE: 006 Pixels @ 197,100*/ 6, 0x03, + /* RLE: 001 Pixels @ 203,100*/ 1, 0x04, + /* RLE: 085 Pixels @ 204,100*/ 85, 0x00, + /* RLE: 004 Pixels @ 289,100*/ 4, 0x06, + /* RLE: 095 Pixels @ 293,100*/ 95, 0x01, + /* RLE: 032 Pixels @ 000,101*/ 32, 0x02, + /* RLE: 001 Pixels @ 032,101*/ 1, 0x04, + /* RLE: 006 Pixels @ 033,101*/ 6, 0x03, + /* RLE: 001 Pixels @ 039,101*/ 1, 0x04, + /* RLE: 012 Pixels @ 040,101*/ 12, 0x01, + /* ABS: 002 Pixels @ 052,101*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 054,101*/ 8, 0x03, + /* ABS: 002 Pixels @ 062,101*/ 0, 2, 0x04, 0x04, + /* RLE: 024 Pixels @ 064,101*/ 24, 0x00, + /* ABS: 017 Pixels @ 088,101*/ 0, 17, 0x03, 0x0B, 0x00, 0x03, 0x03, 0x00, 0x0F, 0x07, 0x07, 0x0F, 0x00, 0x07, 0x11, 0x06, 0x07, 0x0A, 0x03, + /* RLE: 061 Pixels @ 105,101*/ 61, 0x00, + /* RLE: 001 Pixels @ 166,101*/ 1, 0x0A, + /* RLE: 029 Pixels @ 167,101*/ 29, 0x00, + /* RLE: 001 Pixels @ 196,101*/ 1, 0x04, + /* RLE: 006 Pixels @ 197,101*/ 6, 0x03, + /* RLE: 001 Pixels @ 203,101*/ 1, 0x04, + /* RLE: 086 Pixels @ 204,101*/ 86, 0x00, + /* ABS: 004 Pixels @ 290,101*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 094 Pixels @ 294,101*/ 94, 0x01, + /* RLE: 032 Pixels @ 000,102*/ 32, 0x02, + /* RLE: 001 Pixels @ 032,102*/ 1, 0x04, + /* RLE: 006 Pixels @ 033,102*/ 6, 0x03, + /* RLE: 001 Pixels @ 039,102*/ 1, 0x04, + /* RLE: 011 Pixels @ 040,102*/ 11, 0x01, + /* ABS: 002 Pixels @ 051,102*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 053,102*/ 8, 0x03, + /* ABS: 002 Pixels @ 061,102*/ 0, 2, 0x04, 0x04, + /* RLE: 026 Pixels @ 063,102*/ 26, 0x00, + /* ABS: 015 Pixels @ 089,102*/ 0, 15, 0x0F, 0x11, 0x03, 0x03, 0x11, 0x12, 0x03, 0x00, 0x0F, 0x11, 0x0A, 0x12, 0x12, 0x0A, 0x03, + /* RLE: 058 Pixels @ 104,102*/ 58, 0x00, + /* RLE: 001 Pixels @ 162,102*/ 1, 0x0A, + /* RLE: 033 Pixels @ 163,102*/ 33, 0x00, + /* RLE: 001 Pixels @ 196,102*/ 1, 0x04, + /* RLE: 007 Pixels @ 197,102*/ 7, 0x03, + /* RLE: 087 Pixels @ 204,102*/ 87, 0x00, + /* ABS: 004 Pixels @ 291,102*/ 0, 4, 0x06, 0x06, 0x03, 0x0D, + /* RLE: 093 Pixels @ 295,102*/ 93, 0x01, + /* RLE: 032 Pixels @ 000,103*/ 32, 0x02, + /* RLE: 001 Pixels @ 032,103*/ 1, 0x04, + /* RLE: 006 Pixels @ 033,103*/ 6, 0x03, + /* RLE: 001 Pixels @ 039,103*/ 1, 0x04, + /* RLE: 010 Pixels @ 040,103*/ 10, 0x01, + /* ABS: 002 Pixels @ 050,103*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 052,103*/ 8, 0x03, + /* ABS: 002 Pixels @ 060,103*/ 0, 2, 0x04, 0x04, + /* RLE: 022 Pixels @ 062,103*/ 22, 0x00, + /* RLE: 005 Pixels @ 084,103*/ 5, 0x03, + /* ABS: 010 Pixels @ 089,103*/ 0, 10, 0x0A, 0x07, 0x12, 0x03, 0x07, 0x0B, 0x03, 0x03, 0x0B, 0x07, + /* RLE: 004 Pixels @ 099,103*/ 4, 0x03, + /* RLE: 061 Pixels @ 103,103*/ 61, 0x00, + /* ABS: 004 Pixels @ 164,103*/ 0, 4, 0x07, 0x00, 0x00, 0x0A, + /* RLE: 029 Pixels @ 168,103*/ 29, 0x00, + /* RLE: 001 Pixels @ 197,103*/ 1, 0x04, + /* RLE: 006 Pixels @ 198,103*/ 6, 0x03, + /* RLE: 001 Pixels @ 204,103*/ 1, 0x04, + /* RLE: 087 Pixels @ 205,103*/ 87, 0x00, + /* ABS: 004 Pixels @ 292,103*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 092 Pixels @ 296,103*/ 92, 0x01, + /* RLE: 032 Pixels @ 000,104*/ 32, 0x02, + /* RLE: 001 Pixels @ 032,104*/ 1, 0x04, + /* RLE: 007 Pixels @ 033,104*/ 7, 0x03, + /* RLE: 001 Pixels @ 040,104*/ 1, 0x04, + /* RLE: 007 Pixels @ 041,104*/ 7, 0x01, + /* ABS: 002 Pixels @ 048,104*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 050,104*/ 10, 0x03, + /* ABS: 002 Pixels @ 060,104*/ 0, 2, 0x04, 0x04, + /* RLE: 022 Pixels @ 062,104*/ 22, 0x00, + /* ABS: 017 Pixels @ 084,104*/ 0, 17, 0x03, 0x04, 0x0B, 0x03, 0x03, 0x03, 0x0E, 0x07, 0x0B, 0x11, 0x11, 0x03, 0x03, 0x0E, 0x0F, 0x03, 0x04, + /* RLE: 062 Pixels @ 101,104*/ 62, 0x00, + /* ABS: 004 Pixels @ 163,104*/ 0, 4, 0x0A, 0x00, 0x07, 0x0A, + /* RLE: 029 Pixels @ 167,104*/ 29, 0x00, + /* ABS: 002 Pixels @ 196,104*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 198,104*/ 6, 0x03, + /* RLE: 001 Pixels @ 204,104*/ 1, 0x04, + /* RLE: 088 Pixels @ 205,104*/ 88, 0x00, + /* RLE: 005 Pixels @ 293,104*/ 5, 0x06, + /* RLE: 046 Pixels @ 298,104*/ 46, 0x01, + /* RLE: 010 Pixels @ 344,104*/ 10, 0x09, + /* RLE: 034 Pixels @ 354,104*/ 34, 0x01, + /* RLE: 033 Pixels @ 000,105*/ 33, 0x02, + /* RLE: 001 Pixels @ 033,105*/ 1, 0x04, + /* RLE: 006 Pixels @ 034,105*/ 6, 0x03, + /* RLE: 001 Pixels @ 040,105*/ 1, 0x04, + /* RLE: 005 Pixels @ 041,105*/ 5, 0x01, + /* RLE: 003 Pixels @ 046,105*/ 3, 0x04, + /* RLE: 013 Pixels @ 049,105*/ 13, 0x03, + /* ABS: 002 Pixels @ 062,105*/ 0, 2, 0x04, 0x04, + /* RLE: 020 Pixels @ 064,105*/ 20, 0x00, + /* ABS: 017 Pixels @ 084,105*/ 0, 17, 0x03, 0x0D, 0x07, 0x00, 0x03, 0x0B, 0x07, 0x0F, 0x07, 0x04, 0x07, 0x11, 0x06, 0x07, 0x04, 0x03, 0x0A, + /* RLE: 064 Pixels @ 101,105*/ 64, 0x00, + /* ABS: 003 Pixels @ 165,105*/ 0, 3, 0x07, 0x00, 0x0A, + /* RLE: 029 Pixels @ 168,105*/ 29, 0x00, + /* RLE: 001 Pixels @ 197,105*/ 1, 0x0A, + /* RLE: 007 Pixels @ 198,105*/ 7, 0x03, + /* RLE: 089 Pixels @ 205,105*/ 89, 0x00, + /* RLE: 001 Pixels @ 294,105*/ 1, 0x0D, + /* RLE: 004 Pixels @ 295,105*/ 4, 0x06, + /* RLE: 029 Pixels @ 299,105*/ 29, 0x01, + /* RLE: 016 Pixels @ 328,105*/ 16, 0x09, + /* RLE: 010 Pixels @ 344,105*/ 10, 0x05, + /* RLE: 006 Pixels @ 354,105*/ 6, 0x09, + /* RLE: 028 Pixels @ 360,105*/ 28, 0x01, + /* RLE: 033 Pixels @ 000,106*/ 33, 0x02, + /* RLE: 001 Pixels @ 033,106*/ 1, 0x04, + /* RLE: 007 Pixels @ 034,106*/ 7, 0x03, + /* ABS: 006 Pixels @ 041,106*/ 0, 6, 0x04, 0x01, 0x01, 0x04, 0x04, 0x04, + /* RLE: 018 Pixels @ 047,106*/ 18, 0x03, + /* ABS: 002 Pixels @ 065,106*/ 0, 2, 0x04, 0x04, + /* RLE: 017 Pixels @ 067,106*/ 17, 0x00, + /* ABS: 015 Pixels @ 084,106*/ 0, 15, 0x03, 0x00, 0x0F, 0x11, 0x06, 0x07, 0x0B, 0x00, 0x0F, 0x11, 0x0A, 0x12, 0x0E, 0x0A, 0x03, + /* RLE: 098 Pixels @ 099,106*/ 98, 0x00, + /* ABS: 002 Pixels @ 197,106*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 199,106*/ 6, 0x03, + /* RLE: 001 Pixels @ 205,106*/ 1, 0x04, + /* RLE: 089 Pixels @ 206,106*/ 89, 0x00, + /* ABS: 005 Pixels @ 295,106*/ 0, 5, 0x06, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 011 Pixels @ 300,106*/ 11, 0x01, + /* ABS: 003 Pixels @ 311,106*/ 0, 3, 0x00, 0x00, 0x0A, + /* RLE: 014 Pixels @ 314,106*/ 14, 0x09, + /* ABS: 003 Pixels @ 328,106*/ 0, 3, 0x05, 0x05, 0x1A, + /* RLE: 005 Pixels @ 331,106*/ 5, 0x03, + /* ABS: 002 Pixels @ 336,106*/ 0, 2, 0x15, 0x15, + /* RLE: 004 Pixels @ 338,106*/ 4, 0x03, + /* RLE: 001 Pixels @ 342,106*/ 1, 0x19, + /* RLE: 017 Pixels @ 343,106*/ 17, 0x05, + /* RLE: 006 Pixels @ 360,106*/ 6, 0x09, + /* RLE: 022 Pixels @ 366,106*/ 22, 0x01, + /* RLE: 033 Pixels @ 000,107*/ 33, 0x02, + /* ABS: 002 Pixels @ 033,107*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 035,107*/ 6, 0x03, + /* ABS: 004 Pixels @ 041,107*/ 0, 4, 0x04, 0x01, 0x04, 0x04, + /* RLE: 022 Pixels @ 045,107*/ 22, 0x03, + /* ABS: 002 Pixels @ 067,107*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 069,107*/ 14, 0x00, + /* ABS: 015 Pixels @ 083,107*/ 0, 15, 0x04, 0x0A, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x03, 0x0A, 0x07, 0x0E, 0x03, 0x03, 0x03, + /* RLE: 068 Pixels @ 098,107*/ 68, 0x00, + /* ABS: 004 Pixels @ 166,107*/ 0, 4, 0x0A, 0x00, 0x00, 0x0A, + /* RLE: 028 Pixels @ 170,107*/ 28, 0x00, + /* RLE: 001 Pixels @ 198,107*/ 1, 0x04, + /* RLE: 006 Pixels @ 199,107*/ 6, 0x03, + /* RLE: 001 Pixels @ 205,107*/ 1, 0x04, + /* RLE: 068 Pixels @ 206,107*/ 68, 0x00, + /* ABS: 003 Pixels @ 274,107*/ 0, 3, 0x03, 0x00, 0x00, + /* RLE: 004 Pixels @ 277,107*/ 4, 0x03, + /* RLE: 016 Pixels @ 281,107*/ 16, 0x00, + /* RLE: 001 Pixels @ 297,107*/ 1, 0x0D, + /* RLE: 012 Pixels @ 298,107*/ 12, 0x09, + /* ABS: 005 Pixels @ 310,107*/ 0, 5, 0x04, 0x03, 0x12, 0x03, 0x15, + /* RLE: 009 Pixels @ 315,107*/ 9, 0x03, + /* RLE: 001 Pixels @ 324,107*/ 1, 0x00, + /* RLE: 006 Pixels @ 325,107*/ 6, 0x03, + /* ABS: 013 Pixels @ 331,107*/ 0, 13, 0x00, 0x11, 0x07, 0x07, 0x0E, 0x03, 0x03, 0x06, 0x07, 0x0F, 0x04, 0x03, 0x1A, + /* RLE: 022 Pixels @ 344,107*/ 22, 0x05, + /* RLE: 006 Pixels @ 366,107*/ 6, 0x09, + /* RLE: 016 Pixels @ 372,107*/ 16, 0x01, + /* RLE: 034 Pixels @ 000,108*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,108*/ 1, 0x04, + /* RLE: 006 Pixels @ 035,108*/ 6, 0x03, + /* ABS: 002 Pixels @ 041,108*/ 0, 2, 0x04, 0x04, + /* RLE: 027 Pixels @ 043,108*/ 27, 0x03, + /* ABS: 002 Pixels @ 070,108*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 072,108*/ 10, 0x00, + /* ABS: 013 Pixels @ 082,108*/ 0, 13, 0x04, 0x04, 0x03, 0x03, 0x03, 0x0E, 0x07, 0x0B, 0x03, 0x03, 0x03, 0x04, 0x03, + /* RLE: 073 Pixels @ 095,108*/ 73, 0x00, + /* RLE: 001 Pixels @ 168,108*/ 1, 0x0A, + /* RLE: 029 Pixels @ 169,108*/ 29, 0x00, + /* RLE: 001 Pixels @ 198,108*/ 1, 0x04, + /* RLE: 007 Pixels @ 199,108*/ 7, 0x03, + /* RLE: 061 Pixels @ 206,108*/ 61, 0x00, + /* RLE: 004 Pixels @ 267,108*/ 4, 0x03, + /* ABS: 015 Pixels @ 271,108*/ 0, 15, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x0A, 0x03, 0x00, 0x03, 0x03, 0x00, + /* RLE: 012 Pixels @ 286,108*/ 12, 0x09, + /* RLE: 006 Pixels @ 298,108*/ 6, 0x05, + /* RLE: 001 Pixels @ 304,108*/ 1, 0x1A, + /* RLE: 006 Pixels @ 305,108*/ 6, 0x03, + /* ABS: 033 Pixels @ 311,108*/ 0, 33, 0x0B, 0x07, 0x03, 0x03, 0x0B, 0x0E, 0x0D, 0x0F, 0x00, 0x06, 0x07, 0x07, 0x12, 0x03, 0x00, 0x11, 0x07, 0x07, 0x0E, 0x03, 0x06, 0x06, 0x03, 0x04, 0x0B, 0x03, 0x0E, 0x0F, 0x00, 0x0B, 0x07, 0x00, 0x15, + /* RLE: 028 Pixels @ 344,108*/ 28, 0x05, + /* RLE: 006 Pixels @ 372,108*/ 6, 0x09, + /* RLE: 010 Pixels @ 378,108*/ 10, 0x01, + /* RLE: 034 Pixels @ 000,109*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,109*/ 1, 0x04, + /* RLE: 018 Pixels @ 035,109*/ 18, 0x03, + /* RLE: 003 Pixels @ 053,109*/ 3, 0x04, + /* RLE: 016 Pixels @ 056,109*/ 16, 0x03, + /* ABS: 002 Pixels @ 072,109*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 074,109*/ 6, 0x00, + /* RLE: 008 Pixels @ 080,109*/ 8, 0x03, + /* ABS: 007 Pixels @ 088,109*/ 0, 7, 0x0D, 0x07, 0x00, 0x03, 0x00, 0x00, 0x03, + /* RLE: 071 Pixels @ 095,109*/ 71, 0x00, + /* ABS: 005 Pixels @ 166,109*/ 0, 5, 0x0A, 0x07, 0x00, 0x00, 0x0A, + /* RLE: 028 Pixels @ 171,109*/ 28, 0x00, + /* RLE: 001 Pixels @ 199,109*/ 1, 0x04, + /* RLE: 006 Pixels @ 200,109*/ 6, 0x03, + /* RLE: 001 Pixels @ 206,109*/ 1, 0x04, + /* RLE: 061 Pixels @ 207,109*/ 61, 0x00, + /* ABS: 017 Pixels @ 268,109*/ 0, 17, 0x06, 0x07, 0x03, 0x09, 0x03, 0x07, 0x12, 0x03, 0x0A, 0x0B, 0x0D, 0x00, 0x07, 0x0A, 0x03, 0x06, 0x06, + /* RLE: 006 Pixels @ 285,109*/ 6, 0x03, + /* ABS: 002 Pixels @ 291,109*/ 0, 2, 0x15, 0x15, + /* RLE: 004 Pixels @ 293,109*/ 4, 0x03, + /* ABS: 002 Pixels @ 297,109*/ 0, 2, 0x15, 0x00, + /* RLE: 006 Pixels @ 299,109*/ 6, 0x03, + /* ABS: 039 Pixels @ 305,109*/ 0, 39, 0x00, 0x11, 0x07, 0x07, 0x0E, 0x00, 0x11, 0x07, 0x0F, 0x03, 0x0B, 0x07, 0x0E, 0x0A, 0x0B, 0x06, 0x00, 0x0B, 0x07, 0x00, 0x06, 0x06, 0x03, 0x04, 0x04, 0x03, 0x0E, 0x07, 0x0F, 0x06, 0x04, 0x03, 0x06, 0x11, 0x0B, 0x0B, 0x07, 0x0B, 0x00, + /* RLE: 034 Pixels @ 344,109*/ 34, 0x05, + /* RLE: 006 Pixels @ 378,109*/ 6, 0x09, + /* RLE: 004 Pixels @ 384,109*/ 4, 0x01, + /* RLE: 035 Pixels @ 000,110*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,110*/ 1, 0x04, + /* RLE: 016 Pixels @ 036,110*/ 16, 0x03, + /* ABS: 007 Pixels @ 052,110*/ 0, 7, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, + /* RLE: 016 Pixels @ 059,110*/ 16, 0x03, + /* ABS: 008 Pixels @ 075,110*/ 0, 8, 0x04, 0x04, 0x00, 0x00, 0x03, 0x00, 0x0E, 0x0A, + /* RLE: 005 Pixels @ 083,110*/ 5, 0x03, + /* ABS: 005 Pixels @ 088,110*/ 0, 5, 0x00, 0x0F, 0x06, 0x03, 0x04, + /* RLE: 072 Pixels @ 093,110*/ 72, 0x00, + /* ABS: 005 Pixels @ 165,110*/ 0, 5, 0x0A, 0x00, 0x07, 0x00, 0x0A, + /* RLE: 028 Pixels @ 170,110*/ 28, 0x00, + /* ABS: 002 Pixels @ 198,110*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 200,110*/ 6, 0x03, + /* RLE: 001 Pixels @ 206,110*/ 1, 0x04, + /* RLE: 050 Pixels @ 207,110*/ 50, 0x00, + /* RLE: 010 Pixels @ 257,110*/ 10, 0x09, + /* ABS: 008 Pixels @ 267,110*/ 0, 8, 0x03, 0x0E, 0x07, 0x03, 0x05, 0x03, 0x0F, 0x06, + /* RLE: 008 Pixels @ 275,110*/ 8, 0x03, + /* ABS: 061 Pixels @ 283,110*/ 0, 61, 0x0E, 0x11, 0x03, 0x00, 0x11, 0x07, 0x07, 0x0E, 0x03, 0x03, 0x06, 0x07, 0x0F, 0x04, 0x03, 0x04, 0x0E, 0x0E, 0x07, 0x0F, 0x0A, 0x03, 0x06, 0x06, 0x03, 0x04, 0x0B, 0x00, 0x06, 0x07, 0x00, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x03, 0x0A, 0x0E, 0x11, 0x07, 0x0A, 0x0E, 0x07, 0x0F, 0x06, 0x0B, 0x03, 0x03, 0x0A, 0x0E, 0x0D, 0x07, 0x0B, 0x06, 0x11, 0x0B, 0x00, 0x00, 0x00, 0x03, + /* RLE: 040 Pixels @ 344,110*/ 40, 0x05, + /* RLE: 004 Pixels @ 384,110*/ 4, 0x09, + /* RLE: 035 Pixels @ 000,111*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,111*/ 1, 0x04, + /* RLE: 014 Pixels @ 036,111*/ 14, 0x03, + /* ABS: 003 Pixels @ 050,111*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 006 Pixels @ 053,111*/ 6, 0x00, + /* ABS: 002 Pixels @ 059,111*/ 0, 2, 0x04, 0x04, + /* RLE: 018 Pixels @ 061,111*/ 18, 0x03, + /* ABS: 005 Pixels @ 079,111*/ 0, 5, 0x0A, 0x07, 0x0F, 0x07, 0x00, + /* RLE: 005 Pixels @ 084,111*/ 5, 0x03, + /* ABS: 003 Pixels @ 089,111*/ 0, 3, 0x0A, 0x03, 0x03, + /* RLE: 076 Pixels @ 092,111*/ 76, 0x00, + /* ABS: 004 Pixels @ 168,111*/ 0, 4, 0x07, 0x00, 0x00, 0x0A, + /* RLE: 027 Pixels @ 172,111*/ 27, 0x00, + /* RLE: 001 Pixels @ 199,111*/ 1, 0x04, + /* RLE: 007 Pixels @ 200,111*/ 7, 0x03, + /* RLE: 046 Pixels @ 207,111*/ 46, 0x00, + /* RLE: 004 Pixels @ 253,111*/ 4, 0x09, + /* RLE: 010 Pixels @ 257,111*/ 10, 0x05, + /* ABS: 077 Pixels @ 267,111*/ 0, 77, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x03, 0x0D, 0x06, 0x03, 0x0B, 0x06, 0x03, 0x03, 0x07, 0x0E, 0x03, 0x0B, 0x07, 0x03, 0x06, 0x06, 0x03, 0x04, 0x04, 0x03, 0x0E, 0x0F, 0x00, 0x0B, 0x07, 0x00, 0x0B, 0x07, 0x0B, 0x00, 0x0F, 0x12, 0x03, 0x0E, 0x07, 0x0F, 0x06, 0x04, 0x03, 0x0A, 0x07, 0x0A, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x0B, 0x0F, 0x04, 0x04, 0x07, 0x00, 0x03, 0x04, 0x0E, 0x0D, 0x07, 0x0B, 0x0B, 0x0D, 0x00, 0x04, 0x07, 0x04, 0x0B, 0x07, 0x0A, 0x0B, 0x07, 0x04, 0x15, + /* RLE: 044 Pixels @ 344,111*/ 44, 0x05, + /* RLE: 036 Pixels @ 000,112*/ 36, 0x02, + /* RLE: 001 Pixels @ 036,112*/ 1, 0x04, + /* RLE: 011 Pixels @ 037,112*/ 11, 0x03, + /* ABS: 002 Pixels @ 048,112*/ 0, 2, 0x04, 0x04, + /* RLE: 012 Pixels @ 050,112*/ 12, 0x00, + /* ABS: 002 Pixels @ 062,112*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 064,112*/ 13, 0x03, + /* ABS: 007 Pixels @ 077,112*/ 0, 7, 0x00, 0x0B, 0x06, 0x04, 0x03, 0x11, 0x11, + /* RLE: 004 Pixels @ 084,112*/ 4, 0x03, + /* RLE: 082 Pixels @ 088,112*/ 82, 0x00, + /* RLE: 001 Pixels @ 170,112*/ 1, 0x0A, + /* RLE: 029 Pixels @ 171,112*/ 29, 0x00, + /* RLE: 001 Pixels @ 200,112*/ 1, 0x04, + /* RLE: 006 Pixels @ 201,112*/ 6, 0x03, + /* RLE: 001 Pixels @ 207,112*/ 1, 0x04, + /* RLE: 041 Pixels @ 208,112*/ 41, 0x00, + /* RLE: 004 Pixels @ 249,112*/ 4, 0x09, + /* RLE: 014 Pixels @ 253,112*/ 14, 0x05, + /* ABS: 002 Pixels @ 267,112*/ 0, 2, 0x03, 0x0B, + /* RLE: 005 Pixels @ 269,112*/ 5, 0x07, + /* ABS: 070 Pixels @ 274,112*/ 0, 70, 0x06, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x06, 0x03, 0x0B, 0x07, 0x03, 0x0E, 0x07, 0x0F, 0x06, 0x0B, 0x03, 0x06, 0x11, 0x0B, 0x0B, 0x07, 0x0B, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x06, 0x03, 0x03, 0x0A, 0x0E, 0x0D, 0x07, 0x04, 0x0A, 0x07, 0x00, 0x03, 0x04, 0x07, 0x0A, 0x03, 0x12, 0x11, 0x00, 0x0E, 0x07, 0x0A, 0x0B, 0x0D, 0x00, 0x0A, 0x07, 0x04, 0x00, 0x12, 0x07, 0x11, 0x0B, 0x03, 0x03, 0x0E, 0x0F, 0x11, 0x0B, 0x03, 0x19, + /* RLE: 044 Pixels @ 344,112*/ 44, 0x05, + /* RLE: 035 Pixels @ 000,113*/ 35, 0x02, + /* ABS: 002 Pixels @ 035,113*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 037,113*/ 9, 0x03, + /* RLE: 003 Pixels @ 046,113*/ 3, 0x04, + /* RLE: 001 Pixels @ 049,113*/ 1, 0x0A, + /* RLE: 014 Pixels @ 050,113*/ 14, 0x00, + /* ABS: 002 Pixels @ 064,113*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 066,113*/ 11, 0x03, + /* ABS: 013 Pixels @ 077,113*/ 0, 13, 0x0F, 0x07, 0x07, 0x0B, 0x03, 0x00, 0x07, 0x12, 0x03, 0x03, 0x04, 0x04, 0x0A, + /* RLE: 079 Pixels @ 090,113*/ 79, 0x00, + /* RLE: 001 Pixels @ 169,113*/ 1, 0x0A, + /* RLE: 030 Pixels @ 170,113*/ 30, 0x00, + /* RLE: 001 Pixels @ 200,113*/ 1, 0x04, + /* RLE: 010 Pixels @ 201,113*/ 10, 0x03, + /* RLE: 034 Pixels @ 211,113*/ 34, 0x00, + /* RLE: 004 Pixels @ 245,113*/ 4, 0x09, + /* RLE: 018 Pixels @ 249,113*/ 18, 0x05, + /* ABS: 063 Pixels @ 267,113*/ 0, 63, 0x03, 0x0B, 0x07, 0x0E, 0x0A, 0x0A, 0x0D, 0x0F, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x06, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x0A, 0x0E, 0x0D, 0x07, 0x0B, 0x06, 0x11, 0x0B, 0x00, 0x0A, 0x00, 0x04, 0x07, 0x00, 0x03, 0x06, 0x06, 0x03, 0x0B, 0x0D, 0x00, 0x04, 0x07, 0x04, 0x00, 0x07, 0x0B, 0x00, 0x0A, 0x07, 0x00, 0x03, 0x00, 0x11, 0x0F, 0x0E, 0x12, 0x0B, 0x00, 0x12, 0x07, 0x11, 0x0B, + /* RLE: 006 Pixels @ 330,113*/ 6, 0x03, + /* ABS: 002 Pixels @ 336,113*/ 0, 2, 0x15, 0x15, + /* RLE: 004 Pixels @ 338,113*/ 4, 0x03, + /* RLE: 001 Pixels @ 342,113*/ 1, 0x15, + /* RLE: 045 Pixels @ 343,113*/ 45, 0x05, + /* RLE: 034 Pixels @ 000,114*/ 34, 0x02, + /* ABS: 002 Pixels @ 034,114*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 036,114*/ 9, 0x03, + /* ABS: 002 Pixels @ 045,114*/ 0, 2, 0x04, 0x04, + /* RLE: 020 Pixels @ 047,114*/ 20, 0x00, + /* ABS: 021 Pixels @ 067,114*/ 0, 21, 0x04, 0x04, 0x03, 0x03, 0x03, 0x0B, 0x04, 0x03, 0x0B, 0x06, 0x0E, 0x03, 0x0D, 0x0F, 0x00, 0x03, 0x0B, 0x0F, 0x00, 0x00, 0x04, + /* RLE: 079 Pixels @ 088,114*/ 79, 0x00, + /* ABS: 005 Pixels @ 167,114*/ 0, 5, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 027 Pixels @ 172,114*/ 27, 0x00, + /* ABS: 002 Pixels @ 199,114*/ 0, 2, 0x0A, 0x04, + /* RLE: 005 Pixels @ 201,114*/ 5, 0x03, + /* ABS: 005 Pixels @ 206,114*/ 0, 5, 0x00, 0x0A, 0x0B, 0x06, 0x03, + /* RLE: 029 Pixels @ 211,114*/ 29, 0x00, + /* RLE: 005 Pixels @ 240,114*/ 5, 0x09, + /* RLE: 022 Pixels @ 245,114*/ 22, 0x05, + /* ABS: 052 Pixels @ 267,114*/ 0, 52, 0x03, 0x0A, 0x07, 0x0A, 0x03, 0x03, 0x0E, 0x07, 0x03, 0x0B, 0x07, 0x00, 0x03, 0x06, 0x06, 0x03, 0x0A, 0x07, 0x00, 0x0B, 0x0D, 0x00, 0x0A, 0x07, 0x04, 0x0B, 0x07, 0x0A, 0x0B, 0x07, 0x04, 0x00, 0x07, 0x0A, 0x03, 0x0E, 0x07, 0x03, 0x00, 0x12, 0x07, 0x11, 0x0B, 0x03, 0x03, 0x0D, 0x07, 0x04, 0x03, 0x03, 0x03, 0x15, + /* RLE: 011 Pixels @ 319,114*/ 11, 0x03, + /* RLE: 001 Pixels @ 330,114*/ 1, 0x15, + /* RLE: 013 Pixels @ 331,114*/ 13, 0x05, + /* RLE: 005 Pixels @ 344,114*/ 5, 0x09, + /* RLE: 005 Pixels @ 349,114*/ 5, 0x03, + /* RLE: 034 Pixels @ 354,114*/ 34, 0x05, + /* RLE: 034 Pixels @ 000,115*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,115*/ 1, 0x04, + /* RLE: 008 Pixels @ 035,115*/ 8, 0x03, + /* ABS: 002 Pixels @ 043,115*/ 0, 2, 0x04, 0x04, + /* RLE: 024 Pixels @ 045,115*/ 24, 0x00, + /* ABS: 017 Pixels @ 069,115*/ 0, 17, 0x04, 0x04, 0x03, 0x11, 0x0F, 0x00, 0x0B, 0x07, 0x0E, 0x03, 0x00, 0x0F, 0x0D, 0x03, 0x03, 0x00, 0x03, + /* RLE: 083 Pixels @ 086,115*/ 83, 0x00, + /* RLE: 001 Pixels @ 169,115*/ 1, 0x07, + /* RLE: 031 Pixels @ 170,115*/ 31, 0x00, + /* ABS: 009 Pixels @ 201,115*/ 0, 9, 0x03, 0x00, 0x0B, 0x06, 0x0F, 0x07, 0x07, 0x07, 0x0F, + /* RLE: 026 Pixels @ 210,115*/ 26, 0x00, + /* RLE: 004 Pixels @ 236,115*/ 4, 0x09, + /* RLE: 027 Pixels @ 240,115*/ 27, 0x05, + /* ABS: 039 Pixels @ 267,115*/ 0, 39, 0x00, 0x0A, 0x07, 0x0A, 0x00, 0x03, 0x0B, 0x07, 0x03, 0x0A, 0x07, 0x0B, 0x0A, 0x0F, 0x11, 0x03, 0x0A, 0x07, 0x0A, 0x00, 0x12, 0x07, 0x11, 0x0B, 0x03, 0x03, 0x0E, 0x0F, 0x11, 0x0B, 0x03, 0x0A, 0x0F, 0x00, 0x03, 0x04, 0x12, 0x03, 0x00, + /* RLE: 004 Pixels @ 306,115*/ 4, 0x03, + /* ABS: 006 Pixels @ 310,115*/ 0, 6, 0x15, 0x00, 0x03, 0x03, 0x03, 0x19, + /* RLE: 012 Pixels @ 316,115*/ 12, 0x05, + /* RLE: 016 Pixels @ 328,115*/ 16, 0x09, + /* RLE: 005 Pixels @ 344,115*/ 5, 0x01, + /* RLE: 001 Pixels @ 349,115*/ 1, 0x04, + /* RLE: 008 Pixels @ 350,115*/ 8, 0x03, + /* ABS: 002 Pixels @ 358,115*/ 0, 2, 0x09, 0x09, + /* RLE: 028 Pixels @ 360,115*/ 28, 0x05, + /* RLE: 034 Pixels @ 000,116*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,116*/ 1, 0x04, + /* RLE: 007 Pixels @ 035,116*/ 7, 0x03, + /* RLE: 001 Pixels @ 042,116*/ 1, 0x04, + /* RLE: 027 Pixels @ 043,116*/ 27, 0x00, + /* ABS: 013 Pixels @ 070,116*/ 0, 13, 0x0A, 0x03, 0x00, 0x07, 0x0D, 0x03, 0x06, 0x07, 0x00, 0x03, 0x04, 0x07, 0x04, + /* RLE: 085 Pixels @ 083,116*/ 85, 0x00, + /* ABS: 006 Pixels @ 168,116*/ 0, 6, 0x0A, 0x00, 0x07, 0x0A, 0x00, 0x0A, + /* RLE: 024 Pixels @ 174,116*/ 24, 0x00, + /* ABS: 013 Pixels @ 198,116*/ 0, 13, 0x0A, 0x00, 0x0A, 0x03, 0x12, 0x07, 0x0F, 0x06, 0x0B, 0x0A, 0x00, 0x03, 0x03, + /* RLE: 021 Pixels @ 211,116*/ 21, 0x00, + /* RLE: 004 Pixels @ 232,116*/ 4, 0x09, + /* RLE: 031 Pixels @ 236,116*/ 31, 0x05, + /* ABS: 019 Pixels @ 267,116*/ 0, 19, 0x15, 0x0A, 0x07, 0x0A, 0x15, 0x00, 0x0A, 0x0B, 0x03, 0x03, 0x12, 0x07, 0x06, 0x0B, 0x12, 0x03, 0x0A, 0x0F, 0x00, + /* RLE: 005 Pixels @ 286,116*/ 5, 0x03, + /* ABS: 002 Pixels @ 291,116*/ 0, 2, 0x15, 0x15, + /* RLE: 004 Pixels @ 293,116*/ 4, 0x03, + /* ABS: 008 Pixels @ 297,116*/ 0, 8, 0x15, 0x03, 0x03, 0x03, 0x15, 0x03, 0x00, 0x15, + /* RLE: 008 Pixels @ 305,116*/ 8, 0x05, + /* RLE: 015 Pixels @ 313,116*/ 15, 0x09, + /* RLE: 021 Pixels @ 328,116*/ 21, 0x01, + /* ABS: 002 Pixels @ 349,116*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 351,116*/ 8, 0x03, + /* RLE: 001 Pixels @ 359,116*/ 1, 0x04, + /* RLE: 006 Pixels @ 360,116*/ 6, 0x09, + /* RLE: 022 Pixels @ 366,116*/ 22, 0x05, + /* RLE: 033 Pixels @ 000,117*/ 33, 0x02, + /* ABS: 002 Pixels @ 033,117*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 035,117*/ 6, 0x03, + /* ABS: 003 Pixels @ 041,117*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 028 Pixels @ 044,117*/ 28, 0x00, + /* ABS: 013 Pixels @ 072,117*/ 0, 13, 0x03, 0x04, 0x07, 0x0E, 0x03, 0x0F, 0x11, 0x03, 0x03, 0x0A, 0x03, 0x00, 0x0A, + /* RLE: 085 Pixels @ 085,117*/ 85, 0x00, + /* ABS: 003 Pixels @ 170,117*/ 0, 3, 0x07, 0x00, 0x0A, + /* RLE: 028 Pixels @ 173,117*/ 28, 0x00, + /* ABS: 008 Pixels @ 201,117*/ 0, 8, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x04, 0x03, + /* RLE: 019 Pixels @ 209,117*/ 19, 0x00, + /* RLE: 004 Pixels @ 228,117*/ 4, 0x09, + /* RLE: 035 Pixels @ 232,117*/ 35, 0x05, + /* ABS: 010 Pixels @ 267,117*/ 0, 10, 0x19, 0x03, 0x03, 0x03, 0x19, 0x19, 0x00, 0x00, 0x15, 0x15, + /* RLE: 005 Pixels @ 277,117*/ 5, 0x03, + /* ABS: 005 Pixels @ 282,117*/ 0, 5, 0x00, 0x03, 0x03, 0x03, 0x1A, + /* RLE: 011 Pixels @ 287,117*/ 11, 0x05, + /* RLE: 015 Pixels @ 298,117*/ 15, 0x09, + /* RLE: 036 Pixels @ 313,117*/ 36, 0x01, + /* RLE: 003 Pixels @ 349,117*/ 3, 0x04, + /* RLE: 008 Pixels @ 352,117*/ 8, 0x03, + /* RLE: 003 Pixels @ 360,117*/ 3, 0x04, + /* RLE: 003 Pixels @ 363,117*/ 3, 0x01, + /* RLE: 006 Pixels @ 366,117*/ 6, 0x09, + /* RLE: 016 Pixels @ 372,117*/ 16, 0x05, + /* RLE: 034 Pixels @ 000,118*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,118*/ 1, 0x04, + /* RLE: 006 Pixels @ 035,118*/ 6, 0x03, + /* RLE: 001 Pixels @ 041,118*/ 1, 0x04, + /* RLE: 030 Pixels @ 042,118*/ 30, 0x00, + /* ABS: 012 Pixels @ 072,118*/ 0, 12, 0x03, 0x03, 0x12, 0x07, 0x04, 0x0A, 0x07, 0x0B, 0x03, 0x03, 0x03, 0x04, + /* RLE: 116 Pixels @ 084,118*/ 116, 0x00, + /* ABS: 010 Pixels @ 200,118*/ 0, 10, 0x0A, 0x03, 0x04, 0x0E, 0x0D, 0x07, 0x07, 0x07, 0x03, 0x0A, + /* RLE: 013 Pixels @ 210,118*/ 13, 0x00, + /* RLE: 005 Pixels @ 223,118*/ 5, 0x09, + /* RLE: 054 Pixels @ 228,118*/ 54, 0x05, + /* RLE: 016 Pixels @ 282,118*/ 16, 0x09, + /* RLE: 005 Pixels @ 298,118*/ 5, 0x00, + /* ABS: 011 Pixels @ 303,118*/ 0, 11, 0x0D, 0x03, 0x06, 0x00, 0x00, 0x00, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 314,118*/ 37, 0x01, + /* ABS: 002 Pixels @ 351,118*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 353,118*/ 9, 0x03, + /* ABS: 002 Pixels @ 362,118*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 364,118*/ 8, 0x01, + /* RLE: 006 Pixels @ 372,118*/ 6, 0x09, + /* RLE: 010 Pixels @ 378,118*/ 10, 0x05, + /* RLE: 034 Pixels @ 000,119*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,119*/ 1, 0x04, + /* RLE: 006 Pixels @ 035,119*/ 6, 0x03, + /* ABS: 002 Pixels @ 041,119*/ 0, 2, 0x04, 0x0A, + /* RLE: 030 Pixels @ 043,119*/ 30, 0x00, + /* ABS: 006 Pixels @ 073,119*/ 0, 6, 0x03, 0x03, 0x11, 0x0F, 0x00, 0x0A, + /* RLE: 004 Pixels @ 079,119*/ 4, 0x03, + /* ABS: 002 Pixels @ 083,119*/ 0, 2, 0x04, 0x0A, + /* RLE: 116 Pixels @ 085,119*/ 116, 0x00, + /* ABS: 009 Pixels @ 201,119*/ 0, 9, 0x03, 0x12, 0x07, 0x06, 0x0E, 0x0E, 0x0D, 0x00, 0x03, + /* RLE: 009 Pixels @ 210,119*/ 9, 0x00, + /* RLE: 004 Pixels @ 219,119*/ 4, 0x09, + /* RLE: 044 Pixels @ 223,119*/ 44, 0x05, + /* RLE: 015 Pixels @ 267,119*/ 15, 0x09, + /* RLE: 021 Pixels @ 282,119*/ 21, 0x00, + /* ABS: 004 Pixels @ 303,119*/ 0, 4, 0x0D, 0x0D, 0x06, 0x06, + /* RLE: 004 Pixels @ 307,119*/ 4, 0x00, + /* ABS: 004 Pixels @ 311,119*/ 0, 4, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 315,119*/ 37, 0x01, + /* ABS: 002 Pixels @ 352,119*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 354,119*/ 9, 0x03, + /* ABS: 002 Pixels @ 363,119*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 365,119*/ 13, 0x01, + /* RLE: 006 Pixels @ 378,119*/ 6, 0x09, + /* RLE: 004 Pixels @ 384,119*/ 4, 0x05, + /* RLE: 034 Pixels @ 000,120*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,120*/ 1, 0x04, + /* RLE: 006 Pixels @ 035,120*/ 6, 0x03, + /* RLE: 001 Pixels @ 041,120*/ 1, 0x04, + /* RLE: 032 Pixels @ 042,120*/ 32, 0x00, + /* ABS: 004 Pixels @ 074,120*/ 0, 4, 0x03, 0x00, 0x07, 0x12, + /* RLE: 005 Pixels @ 078,120*/ 5, 0x03, + /* ABS: 003 Pixels @ 083,120*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 084 Pixels @ 086,120*/ 84, 0x00, + /* ABS: 004 Pixels @ 170,120*/ 0, 4, 0x0A, 0x00, 0x00, 0x0A, + /* RLE: 026 Pixels @ 174,120*/ 26, 0x00, + /* RLE: 001 Pixels @ 200,120*/ 1, 0x0A, + /* RLE: 006 Pixels @ 201,120*/ 6, 0x03, + /* ABS: 003 Pixels @ 207,120*/ 0, 3, 0x06, 0x0E, 0x03, + /* RLE: 005 Pixels @ 210,120*/ 5, 0x00, + /* RLE: 004 Pixels @ 215,120*/ 4, 0x09, + /* RLE: 038 Pixels @ 219,120*/ 38, 0x05, + /* RLE: 010 Pixels @ 257,120*/ 10, 0x09, + /* RLE: 037 Pixels @ 267,120*/ 37, 0x00, + /* RLE: 003 Pixels @ 304,120*/ 3, 0x06, + /* RLE: 005 Pixels @ 307,120*/ 5, 0x00, + /* RLE: 004 Pixels @ 312,120*/ 4, 0x06, + /* RLE: 037 Pixels @ 316,120*/ 37, 0x01, + /* ABS: 002 Pixels @ 353,120*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 355,120*/ 9, 0x03, + /* ABS: 002 Pixels @ 364,120*/ 0, 2, 0x04, 0x04, + /* RLE: 018 Pixels @ 366,120*/ 18, 0x01, + /* RLE: 004 Pixels @ 384,120*/ 4, 0x09, + /* RLE: 034 Pixels @ 000,121*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,121*/ 1, 0x04, + /* RLE: 006 Pixels @ 035,121*/ 6, 0x03, + /* ABS: 003 Pixels @ 041,121*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 031 Pixels @ 044,121*/ 31, 0x00, + /* ABS: 002 Pixels @ 075,121*/ 0, 2, 0x03, 0x0A, + /* RLE: 006 Pixels @ 077,121*/ 6, 0x03, + /* ABS: 002 Pixels @ 083,121*/ 0, 2, 0x04, 0x04, + /* RLE: 086 Pixels @ 085,121*/ 86, 0x00, + /* ABS: 004 Pixels @ 171,121*/ 0, 4, 0x0A, 0x07, 0x00, 0x0A, + /* RLE: 026 Pixels @ 175,121*/ 26, 0x00, + /* ABS: 010 Pixels @ 201,121*/ 0, 10, 0x0A, 0x03, 0x03, 0x00, 0x0B, 0x0E, 0x0F, 0x0E, 0x03, 0x04, + /* RLE: 004 Pixels @ 211,121*/ 4, 0x09, + /* RLE: 038 Pixels @ 215,121*/ 38, 0x05, + /* RLE: 004 Pixels @ 253,121*/ 4, 0x09, + /* RLE: 047 Pixels @ 257,121*/ 47, 0x00, + /* ABS: 003 Pixels @ 304,121*/ 0, 3, 0x0D, 0x06, 0x06, + /* RLE: 006 Pixels @ 307,121*/ 6, 0x00, + /* RLE: 005 Pixels @ 313,121*/ 5, 0x06, + /* RLE: 036 Pixels @ 318,121*/ 36, 0x01, + /* ABS: 002 Pixels @ 354,121*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 356,121*/ 9, 0x03, + /* ABS: 002 Pixels @ 365,121*/ 0, 2, 0x04, 0x04, + /* RLE: 021 Pixels @ 367,121*/ 21, 0x01, + /* RLE: 034 Pixels @ 000,122*/ 34, 0x02, + /* RLE: 001 Pixels @ 034,122*/ 1, 0x04, + /* RLE: 006 Pixels @ 035,122*/ 6, 0x03, + /* ABS: 002 Pixels @ 041,122*/ 0, 2, 0x04, 0x0A, + /* RLE: 034 Pixels @ 043,122*/ 34, 0x00, + /* RLE: 007 Pixels @ 077,122*/ 7, 0x03, + /* ABS: 003 Pixels @ 084,122*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 083 Pixels @ 087,122*/ 83, 0x00, + /* ABS: 033 Pixels @ 170,122*/ 0, 33, 0x0A, 0x00, 0x07, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x03, + /* RLE: 005 Pixels @ 203,122*/ 5, 0x07, + /* ABS: 003 Pixels @ 208,122*/ 0, 3, 0x0A, 0x03, 0x06, + /* RLE: 038 Pixels @ 211,122*/ 38, 0x05, + /* RLE: 004 Pixels @ 249,122*/ 4, 0x09, + /* RLE: 051 Pixels @ 253,122*/ 51, 0x00, + /* ABS: 003 Pixels @ 304,122*/ 0, 3, 0x06, 0x03, 0x06, + /* RLE: 007 Pixels @ 307,122*/ 7, 0x00, + /* ABS: 005 Pixels @ 314,122*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 319,122*/ 36, 0x01, + /* ABS: 002 Pixels @ 355,122*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 357,122*/ 9, 0x03, + /* ABS: 002 Pixels @ 366,122*/ 0, 2, 0x04, 0x04, + /* RLE: 020 Pixels @ 368,122*/ 20, 0x01, + /* RLE: 035 Pixels @ 000,123*/ 35, 0x02, + /* RLE: 007 Pixels @ 035,123*/ 7, 0x03, + /* RLE: 001 Pixels @ 042,123*/ 1, 0x04, + /* RLE: 034 Pixels @ 043,123*/ 34, 0x00, + /* RLE: 001 Pixels @ 077,123*/ 1, 0x04, + /* RLE: 007 Pixels @ 078,123*/ 7, 0x03, + /* ABS: 003 Pixels @ 085,123*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 085 Pixels @ 088,123*/ 85, 0x00, + /* ABS: 038 Pixels @ 173,123*/ 0, 38, 0x07, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x03, 0x0E, 0x04, 0x00, 0x03, 0x00, 0x07, 0x00, 0x15, + /* RLE: 034 Pixels @ 211,123*/ 34, 0x05, + /* RLE: 004 Pixels @ 245,123*/ 4, 0x09, + /* RLE: 055 Pixels @ 249,123*/ 55, 0x00, + /* ABS: 003 Pixels @ 304,123*/ 0, 3, 0x0D, 0x03, 0x06, + /* RLE: 008 Pixels @ 307,123*/ 8, 0x00, + /* ABS: 005 Pixels @ 315,123*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 320,123*/ 37, 0x01, + /* ABS: 002 Pixels @ 357,123*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 359,123*/ 9, 0x03, + /* ABS: 002 Pixels @ 368,123*/ 0, 2, 0x04, 0x04, + /* RLE: 018 Pixels @ 370,123*/ 18, 0x01, + /* RLE: 035 Pixels @ 000,124*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,124*/ 1, 0x04, + /* RLE: 006 Pixels @ 036,124*/ 6, 0x03, + /* RLE: 001 Pixels @ 042,124*/ 1, 0x04, + /* RLE: 033 Pixels @ 043,124*/ 33, 0x00, + /* ABS: 002 Pixels @ 076,124*/ 0, 2, 0x0A, 0x04, + /* RLE: 008 Pixels @ 078,124*/ 8, 0x03, + /* ABS: 003 Pixels @ 086,124*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 086 Pixels @ 089,124*/ 86, 0x00, + /* RLE: 001 Pixels @ 175,124*/ 1, 0x0A, + /* RLE: 023 Pixels @ 176,124*/ 23, 0x00, + /* RLE: 003 Pixels @ 199,124*/ 3, 0x09, + /* RLE: 001 Pixels @ 202,124*/ 1, 0x00, + /* RLE: 004 Pixels @ 203,124*/ 4, 0x03, + /* ABS: 004 Pixels @ 207,124*/ 0, 4, 0x0A, 0x07, 0x00, 0x15, + /* RLE: 029 Pixels @ 211,124*/ 29, 0x05, + /* RLE: 005 Pixels @ 240,124*/ 5, 0x09, + /* RLE: 059 Pixels @ 245,124*/ 59, 0x00, + /* ABS: 003 Pixels @ 304,124*/ 0, 3, 0x06, 0x03, 0x06, + /* RLE: 010 Pixels @ 307,124*/ 10, 0x00, + /* ABS: 004 Pixels @ 317,124*/ 0, 4, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 321,124*/ 37, 0x01, + /* ABS: 002 Pixels @ 358,124*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 360,124*/ 9, 0x03, + /* ABS: 002 Pixels @ 369,124*/ 0, 2, 0x04, 0x04, + /* RLE: 017 Pixels @ 371,124*/ 17, 0x01, + /* RLE: 035 Pixels @ 000,125*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,125*/ 1, 0x04, + /* RLE: 006 Pixels @ 036,125*/ 6, 0x03, + /* ABS: 003 Pixels @ 042,125*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 032 Pixels @ 045,125*/ 32, 0x00, + /* ABS: 002 Pixels @ 077,125*/ 0, 2, 0x0A, 0x04, + /* RLE: 008 Pixels @ 079,125*/ 8, 0x03, + /* ABS: 003 Pixels @ 087,125*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 084 Pixels @ 090,125*/ 84, 0x00, + /* RLE: 001 Pixels @ 174,125*/ 1, 0x0A, + /* RLE: 020 Pixels @ 175,125*/ 20, 0x00, + /* RLE: 004 Pixels @ 195,125*/ 4, 0x09, + /* RLE: 003 Pixels @ 199,125*/ 3, 0x05, + /* ABS: 009 Pixels @ 202,125*/ 0, 9, 0x15, 0x00, 0x0E, 0x0D, 0x07, 0x07, 0x0F, 0x00, 0x15, + /* RLE: 025 Pixels @ 211,125*/ 25, 0x05, + /* RLE: 004 Pixels @ 236,125*/ 4, 0x09, + /* RLE: 064 Pixels @ 240,125*/ 64, 0x00, + /* ABS: 004 Pixels @ 304,125*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 010 Pixels @ 308,125*/ 10, 0x00, + /* RLE: 004 Pixels @ 318,125*/ 4, 0x06, + /* RLE: 037 Pixels @ 322,125*/ 37, 0x01, + /* ABS: 002 Pixels @ 359,125*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 361,125*/ 9, 0x03, + /* ABS: 002 Pixels @ 370,125*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 372,125*/ 16, 0x01, + /* RLE: 035 Pixels @ 000,126*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,126*/ 1, 0x04, + /* RLE: 006 Pixels @ 036,126*/ 6, 0x03, + /* ABS: 002 Pixels @ 042,126*/ 0, 2, 0x04, 0x0A, + /* RLE: 033 Pixels @ 044,126*/ 33, 0x00, + /* ABS: 003 Pixels @ 077,126*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 007 Pixels @ 080,126*/ 7, 0x03, + /* ABS: 005 Pixels @ 087,126*/ 0, 5, 0x04, 0x04, 0x00, 0x00, 0x0A, + /* RLE: 048 Pixels @ 092,126*/ 48, 0x00, + /* ABS: 033 Pixels @ 140,126*/ 0, 33, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 019 Pixels @ 173,126*/ 19, 0x00, + /* RLE: 003 Pixels @ 192,126*/ 3, 0x09, + /* RLE: 007 Pixels @ 195,126*/ 7, 0x05, + /* ABS: 009 Pixels @ 202,126*/ 0, 9, 0x15, 0x0A, 0x0F, 0x06, 0x0B, 0x04, 0x03, 0x03, 0x1A, + /* RLE: 021 Pixels @ 211,126*/ 21, 0x05, + /* RLE: 004 Pixels @ 232,126*/ 4, 0x09, + /* RLE: 069 Pixels @ 236,126*/ 69, 0x00, + /* RLE: 003 Pixels @ 305,126*/ 3, 0x06, + /* RLE: 011 Pixels @ 308,126*/ 11, 0x00, + /* RLE: 004 Pixels @ 319,126*/ 4, 0x06, + /* RLE: 037 Pixels @ 323,126*/ 37, 0x01, + /* ABS: 002 Pixels @ 360,126*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 362,126*/ 9, 0x03, + /* ABS: 002 Pixels @ 371,126*/ 0, 2, 0x04, 0x04, + /* RLE: 015 Pixels @ 373,126*/ 15, 0x01, + /* RLE: 035 Pixels @ 000,127*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,127*/ 1, 0x04, + /* RLE: 006 Pixels @ 036,127*/ 6, 0x03, + /* ABS: 003 Pixels @ 042,127*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 034 Pixels @ 045,127*/ 34, 0x00, + /* ABS: 002 Pixels @ 079,127*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 081,127*/ 7, 0x03, + /* ABS: 003 Pixels @ 088,127*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 048 Pixels @ 091,127*/ 48, 0x00, + /* ABS: 037 Pixels @ 139,127*/ 0, 37, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x07, + /* RLE: 012 Pixels @ 176,127*/ 12, 0x00, + /* RLE: 004 Pixels @ 188,127*/ 4, 0x09, + /* RLE: 010 Pixels @ 192,127*/ 10, 0x05, + /* RLE: 001 Pixels @ 202,127*/ 1, 0x19, + /* RLE: 004 Pixels @ 203,127*/ 4, 0x03, + /* ABS: 002 Pixels @ 207,127*/ 0, 2, 0x00, 0x19, + /* RLE: 019 Pixels @ 209,127*/ 19, 0x05, + /* RLE: 004 Pixels @ 228,127*/ 4, 0x09, + /* RLE: 073 Pixels @ 232,127*/ 73, 0x00, + /* ABS: 003 Pixels @ 305,127*/ 0, 3, 0x0D, 0x06, 0x06, + /* RLE: 012 Pixels @ 308,127*/ 12, 0x00, + /* ABS: 005 Pixels @ 320,127*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 325,127*/ 36, 0x01, + /* ABS: 002 Pixels @ 361,127*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 363,127*/ 9, 0x03, + /* ABS: 002 Pixels @ 372,127*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 374,127*/ 14, 0x01, + /* RLE: 035 Pixels @ 000,128*/ 35, 0x02, + /* RLE: 001 Pixels @ 035,128*/ 1, 0x04, + /* RLE: 006 Pixels @ 036,128*/ 6, 0x03, + /* ABS: 002 Pixels @ 042,128*/ 0, 2, 0x04, 0x0A, + /* RLE: 036 Pixels @ 044,128*/ 36, 0x00, + /* ABS: 002 Pixels @ 080,128*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 082,128*/ 7, 0x03, + /* ABS: 002 Pixels @ 089,128*/ 0, 2, 0x04, 0x04, + /* RLE: 043 Pixels @ 091,128*/ 43, 0x00, + /* ABS: 005 Pixels @ 134,128*/ 0, 5, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 036 Pixels @ 139,128*/ 36, 0x00, + /* RLE: 001 Pixels @ 175,128*/ 1, 0x07, + /* RLE: 008 Pixels @ 176,128*/ 8, 0x00, + /* RLE: 004 Pixels @ 184,128*/ 4, 0x09, + /* RLE: 021 Pixels @ 188,128*/ 21, 0x05, + /* ABS: 006 Pixels @ 209,128*/ 0, 6, 0x19, 0x15, 0x03, 0x03, 0x00, 0x1A, + /* RLE: 008 Pixels @ 215,128*/ 8, 0x05, + /* RLE: 005 Pixels @ 223,128*/ 5, 0x09, + /* RLE: 077 Pixels @ 228,128*/ 77, 0x00, + /* ABS: 003 Pixels @ 305,128*/ 0, 3, 0x06, 0x03, 0x06, + /* RLE: 013 Pixels @ 308,128*/ 13, 0x00, + /* ABS: 005 Pixels @ 321,128*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 326,128*/ 36, 0x01, + /* RLE: 003 Pixels @ 362,128*/ 3, 0x04, + /* RLE: 008 Pixels @ 365,128*/ 8, 0x03, + /* RLE: 003 Pixels @ 373,128*/ 3, 0x04, + /* RLE: 012 Pixels @ 376,128*/ 12, 0x01, + /* RLE: 036 Pixels @ 000,129*/ 36, 0x02, + /* RLE: 007 Pixels @ 036,129*/ 7, 0x03, + /* RLE: 001 Pixels @ 043,129*/ 1, 0x04, + /* RLE: 037 Pixels @ 044,129*/ 37, 0x00, + /* RLE: 001 Pixels @ 081,129*/ 1, 0x04, + /* RLE: 008 Pixels @ 082,129*/ 8, 0x03, + /* ABS: 004 Pixels @ 090,129*/ 0, 4, 0x04, 0x00, 0x00, 0x0A, + /* RLE: 041 Pixels @ 094,129*/ 41, 0x00, + /* ABS: 003 Pixels @ 135,129*/ 0, 3, 0x0A, 0x00, 0x0A, + /* RLE: 037 Pixels @ 138,129*/ 37, 0x00, + /* RLE: 001 Pixels @ 175,129*/ 1, 0x07, + /* RLE: 004 Pixels @ 176,129*/ 4, 0x00, + /* RLE: 004 Pixels @ 180,129*/ 4, 0x09, + /* RLE: 020 Pixels @ 184,129*/ 20, 0x05, + /* ABS: 002 Pixels @ 204,129*/ 0, 2, 0x1A, 0x15, + /* RLE: 004 Pixels @ 206,129*/ 4, 0x03, + /* ABS: 005 Pixels @ 210,129*/ 0, 5, 0x00, 0x0B, 0x12, 0x00, 0x19, + /* RLE: 004 Pixels @ 215,129*/ 4, 0x05, + /* RLE: 004 Pixels @ 219,129*/ 4, 0x09, + /* RLE: 082 Pixels @ 223,129*/ 82, 0x00, + /* ABS: 003 Pixels @ 305,129*/ 0, 3, 0x0D, 0x03, 0x06, + /* RLE: 014 Pixels @ 308,129*/ 14, 0x00, + /* ABS: 005 Pixels @ 322,129*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 327,129*/ 37, 0x01, + /* ABS: 002 Pixels @ 364,129*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 366,129*/ 9, 0x03, + /* ABS: 002 Pixels @ 375,129*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 377,129*/ 11, 0x01, + /* RLE: 036 Pixels @ 000,130*/ 36, 0x02, + /* RLE: 001 Pixels @ 036,130*/ 1, 0x04, + /* RLE: 006 Pixels @ 037,130*/ 6, 0x03, + /* RLE: 001 Pixels @ 043,130*/ 1, 0x04, + /* RLE: 036 Pixels @ 044,130*/ 36, 0x00, + /* ABS: 003 Pixels @ 080,130*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 007 Pixels @ 083,130*/ 7, 0x03, + /* ABS: 003 Pixels @ 090,130*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 039 Pixels @ 093,130*/ 39, 0x00, + /* ABS: 003 Pixels @ 132,130*/ 0, 3, 0x0A, 0x00, 0x0A, + /* RLE: 042 Pixels @ 135,130*/ 42, 0x00, + /* RLE: 003 Pixels @ 177,130*/ 3, 0x09, + /* RLE: 024 Pixels @ 180,130*/ 24, 0x05, + /* ABS: 005 Pixels @ 204,130*/ 0, 5, 0x00, 0x00, 0x0B, 0x12, 0x11, + /* RLE: 004 Pixels @ 209,130*/ 4, 0x07, + /* ABS: 002 Pixels @ 213,130*/ 0, 2, 0x00, 0x19, + /* RLE: 004 Pixels @ 215,130*/ 4, 0x09, + /* RLE: 086 Pixels @ 219,130*/ 86, 0x00, + /* ABS: 004 Pixels @ 305,130*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 015 Pixels @ 309,130*/ 15, 0x00, + /* RLE: 004 Pixels @ 324,130*/ 4, 0x06, + /* RLE: 037 Pixels @ 328,130*/ 37, 0x01, + /* ABS: 002 Pixels @ 365,130*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 367,130*/ 9, 0x03, + /* ABS: 002 Pixels @ 376,130*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 378,130*/ 10, 0x01, + /* RLE: 001 Pixels @ 000,131*/ 1, 0x09, + /* RLE: 035 Pixels @ 001,131*/ 35, 0x02, + /* RLE: 001 Pixels @ 036,131*/ 1, 0x04, + /* RLE: 006 Pixels @ 037,131*/ 6, 0x03, + /* ABS: 003 Pixels @ 043,131*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 036 Pixels @ 046,131*/ 36, 0x00, + /* ABS: 002 Pixels @ 082,131*/ 0, 2, 0x0A, 0x04, + /* RLE: 007 Pixels @ 084,131*/ 7, 0x03, + /* ABS: 003 Pixels @ 091,131*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 041 Pixels @ 094,131*/ 41, 0x00, + /* RLE: 001 Pixels @ 135,131*/ 1, 0x0A, + /* RLE: 037 Pixels @ 136,131*/ 37, 0x00, + /* RLE: 004 Pixels @ 173,131*/ 4, 0x09, + /* RLE: 027 Pixels @ 177,131*/ 27, 0x05, + /* ABS: 011 Pixels @ 204,131*/ 0, 11, 0x03, 0x12, 0x07, 0x07, 0x06, 0x07, 0x0B, 0x00, 0x03, 0x03, 0x12, + /* RLE: 091 Pixels @ 215,131*/ 91, 0x00, + /* ABS: 003 Pixels @ 306,131*/ 0, 3, 0x0D, 0x06, 0x06, + /* RLE: 016 Pixels @ 309,131*/ 16, 0x00, + /* RLE: 004 Pixels @ 325,131*/ 4, 0x06, + /* RLE: 037 Pixels @ 329,131*/ 37, 0x01, + /* ABS: 002 Pixels @ 366,131*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 368,131*/ 9, 0x03, + /* ABS: 002 Pixels @ 377,131*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 379,131*/ 9, 0x01, + /* RLE: 003 Pixels @ 000,132*/ 3, 0x09, + /* RLE: 033 Pixels @ 003,132*/ 33, 0x02, + /* RLE: 001 Pixels @ 036,132*/ 1, 0x04, + /* RLE: 006 Pixels @ 037,132*/ 6, 0x03, + /* ABS: 002 Pixels @ 043,132*/ 0, 2, 0x04, 0x0A, + /* RLE: 037 Pixels @ 045,132*/ 37, 0x00, + /* ABS: 003 Pixels @ 082,132*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 007 Pixels @ 085,132*/ 7, 0x03, + /* ABS: 002 Pixels @ 092,132*/ 0, 2, 0x04, 0x04, + /* RLE: 075 Pixels @ 094,132*/ 75, 0x00, + /* RLE: 004 Pixels @ 169,132*/ 4, 0x09, + /* RLE: 031 Pixels @ 173,132*/ 31, 0x05, + /* RLE: 003 Pixels @ 204,132*/ 3, 0x00, + /* ABS: 007 Pixels @ 207,132*/ 0, 7, 0x03, 0x03, 0x0F, 0x0B, 0x03, 0x03, 0x04, + /* RLE: 092 Pixels @ 214,132*/ 92, 0x00, + /* RLE: 003 Pixels @ 306,132*/ 3, 0x06, + /* RLE: 017 Pixels @ 309,132*/ 17, 0x00, + /* ABS: 005 Pixels @ 326,132*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 331,132*/ 36, 0x01, + /* ABS: 002 Pixels @ 367,132*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 369,132*/ 9, 0x03, + /* ABS: 002 Pixels @ 378,132*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 380,132*/ 8, 0x01, + /* ABS: 005 Pixels @ 000,133*/ 0, 5, 0x05, 0x05, 0x09, 0x09, 0x09, + /* RLE: 031 Pixels @ 005,133*/ 31, 0x02, + /* RLE: 001 Pixels @ 036,133*/ 1, 0x04, + /* RLE: 006 Pixels @ 037,133*/ 6, 0x03, + /* ABS: 003 Pixels @ 043,133*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 038 Pixels @ 046,133*/ 38, 0x00, + /* RLE: 001 Pixels @ 084,133*/ 1, 0x0A, + /* RLE: 008 Pixels @ 085,133*/ 8, 0x03, + /* ABS: 002 Pixels @ 093,133*/ 0, 2, 0x04, 0x0A, + /* RLE: 070 Pixels @ 095,133*/ 70, 0x00, + /* RLE: 004 Pixels @ 165,133*/ 4, 0x09, + /* RLE: 034 Pixels @ 169,133*/ 34, 0x05, + /* ABS: 008 Pixels @ 203,133*/ 0, 8, 0x09, 0x12, 0x04, 0x04, 0x03, 0x03, 0x06, 0x12, + /* RLE: 004 Pixels @ 211,133*/ 4, 0x03, + /* RLE: 091 Pixels @ 215,133*/ 91, 0x00, + /* ABS: 004 Pixels @ 306,133*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 017 Pixels @ 310,133*/ 17, 0x00, + /* ABS: 005 Pixels @ 327,133*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 332,133*/ 36, 0x01, + /* ABS: 002 Pixels @ 368,133*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 370,133*/ 9, 0x03, + /* ABS: 002 Pixels @ 379,133*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 381,133*/ 7, 0x01, + /* ABS: 007 Pixels @ 000,134*/ 0, 7, 0x00, 0x00, 0x1A, 0x05, 0x09, 0x09, 0x09, + /* RLE: 029 Pixels @ 007,134*/ 29, 0x02, + /* RLE: 001 Pixels @ 036,134*/ 1, 0x04, + /* RLE: 006 Pixels @ 037,134*/ 6, 0x03, + /* ABS: 002 Pixels @ 043,134*/ 0, 2, 0x04, 0x0A, + /* RLE: 039 Pixels @ 045,134*/ 39, 0x00, + /* ABS: 002 Pixels @ 084,134*/ 0, 2, 0x0A, 0x04, + /* RLE: 008 Pixels @ 086,134*/ 8, 0x03, + /* ABS: 003 Pixels @ 094,134*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 037 Pixels @ 097,134*/ 37, 0x00, + /* ABS: 004 Pixels @ 134,134*/ 0, 4, 0x0A, 0x00, 0x00, 0x00, + /* RLE: 022 Pixels @ 138,134*/ 22, 0x07, + /* RLE: 001 Pixels @ 160,134*/ 1, 0x00, + /* RLE: 004 Pixels @ 161,134*/ 4, 0x09, + /* RLE: 034 Pixels @ 165,134*/ 34, 0x05, + /* RLE: 004 Pixels @ 199,134*/ 4, 0x09, + /* RLE: 003 Pixels @ 203,134*/ 3, 0x00, + /* RLE: 003 Pixels @ 206,134*/ 3, 0x03, + /* ABS: 005 Pixels @ 209,134*/ 0, 5, 0x0E, 0x11, 0x0E, 0x06, 0x07, + /* RLE: 093 Pixels @ 214,134*/ 93, 0x00, + /* ABS: 004 Pixels @ 307,134*/ 0, 4, 0x0D, 0x0D, 0x06, 0x06, + /* RLE: 017 Pixels @ 311,134*/ 17, 0x00, + /* ABS: 005 Pixels @ 328,134*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 333,134*/ 37, 0x01, + /* ABS: 002 Pixels @ 370,134*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 372,134*/ 9, 0x03, + /* ABS: 002 Pixels @ 381,134*/ 0, 2, 0x04, 0x04, + /* RLE: 005 Pixels @ 383,134*/ 5, 0x01, + /* ABS: 009 Pixels @ 000,135*/ 0, 9, 0x12, 0x00, 0x03, 0x03, 0x19, 0x05, 0x09, 0x09, 0x09, + /* RLE: 028 Pixels @ 009,135*/ 28, 0x02, + /* RLE: 007 Pixels @ 037,135*/ 7, 0x03, + /* ABS: 004 Pixels @ 044,135*/ 0, 4, 0x04, 0x0A, 0x00, 0x0A, + /* RLE: 037 Pixels @ 048,135*/ 37, 0x00, + /* ABS: 002 Pixels @ 085,135*/ 0, 2, 0x0A, 0x04, + /* RLE: 007 Pixels @ 087,135*/ 7, 0x03, + /* ABS: 002 Pixels @ 094,135*/ 0, 2, 0x04, 0x04, + /* RLE: 039 Pixels @ 096,135*/ 39, 0x00, + /* ABS: 003 Pixels @ 135,135*/ 0, 3, 0x0A, 0x00, 0x07, + /* RLE: 022 Pixels @ 138,135*/ 22, 0x10, + /* RLE: 001 Pixels @ 160,135*/ 1, 0x07, + /* RLE: 034 Pixels @ 161,135*/ 34, 0x05, + /* RLE: 004 Pixels @ 195,135*/ 4, 0x09, + /* RLE: 006 Pixels @ 199,135*/ 6, 0x00, + /* ABS: 003 Pixels @ 205,135*/ 0, 3, 0x03, 0x0B, 0x06, + /* RLE: 004 Pixels @ 208,135*/ 4, 0x07, + /* ABS: 004 Pixels @ 212,135*/ 0, 4, 0x11, 0x12, 0x00, 0x03, + /* RLE: 092 Pixels @ 216,135*/ 92, 0x00, + /* ABS: 004 Pixels @ 308,135*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 312,135*/ 18, 0x00, + /* RLE: 004 Pixels @ 330,135*/ 4, 0x06, + /* RLE: 037 Pixels @ 334,135*/ 37, 0x01, + /* ABS: 002 Pixels @ 371,135*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 373,135*/ 9, 0x03, + /* ABS: 002 Pixels @ 382,135*/ 0, 2, 0x04, 0x04, + /* RLE: 004 Pixels @ 384,135*/ 4, 0x01, + /* ABS: 011 Pixels @ 000,136*/ 0, 11, 0x07, 0x06, 0x06, 0x0A, 0x03, 0x19, 0x05, 0x05, 0x09, 0x09, 0x09, + /* RLE: 026 Pixels @ 011,136*/ 26, 0x02, + /* RLE: 001 Pixels @ 037,136*/ 1, 0x04, + /* RLE: 006 Pixels @ 038,136*/ 6, 0x03, + /* RLE: 001 Pixels @ 044,136*/ 1, 0x04, + /* RLE: 040 Pixels @ 045,136*/ 40, 0x00, + /* ABS: 003 Pixels @ 085,136*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 007 Pixels @ 088,136*/ 7, 0x03, + /* ABS: 003 Pixels @ 095,136*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 036 Pixels @ 098,136*/ 36, 0x00, + /* ABS: 005 Pixels @ 134,136*/ 0, 5, 0x0A, 0x00, 0x07, 0x10, 0x10, + /* RLE: 020 Pixels @ 139,136*/ 20, 0x07, + /* ABS: 003 Pixels @ 159,136*/ 0, 3, 0x10, 0x10, 0x07, + /* RLE: 030 Pixels @ 162,136*/ 30, 0x05, + /* RLE: 003 Pixels @ 192,136*/ 3, 0x09, + /* RLE: 010 Pixels @ 195,136*/ 10, 0x00, + /* ABS: 006 Pixels @ 205,136*/ 0, 6, 0x03, 0x12, 0x11, 0x12, 0x0B, 0x0A, + /* RLE: 004 Pixels @ 211,136*/ 4, 0x03, + /* RLE: 094 Pixels @ 215,136*/ 94, 0x00, + /* ABS: 004 Pixels @ 309,136*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 018 Pixels @ 313,136*/ 18, 0x00, + /* RLE: 004 Pixels @ 331,136*/ 4, 0x06, + /* RLE: 037 Pixels @ 335,136*/ 37, 0x01, + /* ABS: 002 Pixels @ 372,136*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 374,136*/ 9, 0x03, + /* ABS: 009 Pixels @ 383,136*/ 0, 9, 0x04, 0x04, 0x01, 0x01, 0x01, 0x0D, 0x0A, 0x0B, 0x07, + /* RLE: 004 Pixels @ 004,137*/ 4, 0x00, + /* ABS: 005 Pixels @ 008,137*/ 0, 5, 0x19, 0x05, 0x09, 0x09, 0x09, + /* RLE: 024 Pixels @ 013,137*/ 24, 0x02, + /* RLE: 001 Pixels @ 037,137*/ 1, 0x04, + /* RLE: 006 Pixels @ 038,137*/ 6, 0x03, + /* ABS: 002 Pixels @ 044,137*/ 0, 2, 0x04, 0x0A, + /* RLE: 041 Pixels @ 046,137*/ 41, 0x00, + /* ABS: 002 Pixels @ 087,137*/ 0, 2, 0x0A, 0x04, + /* RLE: 007 Pixels @ 089,137*/ 7, 0x03, + /* ABS: 003 Pixels @ 096,137*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 036 Pixels @ 099,137*/ 36, 0x00, + /* ABS: 004 Pixels @ 135,137*/ 0, 4, 0x0A, 0x07, 0x10, 0x07, + /* RLE: 020 Pixels @ 139,137*/ 20, 0x10, + /* ABS: 003 Pixels @ 159,137*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 026 Pixels @ 162,137*/ 26, 0x05, + /* RLE: 004 Pixels @ 188,137*/ 4, 0x09, + /* RLE: 014 Pixels @ 192,137*/ 14, 0x00, + /* RLE: 004 Pixels @ 206,137*/ 4, 0x03, + /* ABS: 005 Pixels @ 210,137*/ 0, 5, 0x00, 0x0A, 0x03, 0x03, 0x03, + /* RLE: 095 Pixels @ 215,137*/ 95, 0x00, + /* ABS: 004 Pixels @ 310,137*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 314,137*/ 18, 0x00, + /* ABS: 004 Pixels @ 332,137*/ 0, 4, 0x06, 0x06, 0x03, 0x06, + /* RLE: 037 Pixels @ 336,137*/ 37, 0x01, + /* ABS: 002 Pixels @ 373,137*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 375,137*/ 9, 0x03, + /* ABS: 019 Pixels @ 384,137*/ 0, 19, 0x04, 0x04, 0x01, 0x01, 0x0A, 0x03, 0x0A, 0x07, 0x0A, 0x03, 0x0B, 0x0A, 0x03, 0x03, 0x1A, 0x05, 0x09, 0x09, 0x09, + /* RLE: 022 Pixels @ 015,138*/ 22, 0x02, + /* RLE: 001 Pixels @ 037,138*/ 1, 0x04, + /* RLE: 006 Pixels @ 038,138*/ 6, 0x03, + /* RLE: 001 Pixels @ 044,138*/ 1, 0x04, + /* RLE: 042 Pixels @ 045,138*/ 42, 0x00, + /* ABS: 002 Pixels @ 087,138*/ 0, 2, 0x0A, 0x04, + /* RLE: 008 Pixels @ 089,138*/ 8, 0x03, + /* ABS: 004 Pixels @ 097,138*/ 0, 4, 0x04, 0x00, 0x00, 0x0A, + /* RLE: 032 Pixels @ 101,138*/ 32, 0x00, + /* ABS: 006 Pixels @ 133,138*/ 0, 6, 0x0A, 0x00, 0x00, 0x07, 0x10, 0x07, + /* RLE: 020 Pixels @ 139,138*/ 20, 0x10, + /* ABS: 003 Pixels @ 159,138*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 022 Pixels @ 162,138*/ 22, 0x05, + /* RLE: 004 Pixels @ 184,138*/ 4, 0x09, + /* RLE: 017 Pixels @ 188,138*/ 17, 0x00, + /* ABS: 011 Pixels @ 205,138*/ 0, 11, 0x03, 0x03, 0x0B, 0x06, 0x0F, 0x07, 0x07, 0x03, 0x04, 0x0A, 0x03, + /* RLE: 095 Pixels @ 216,138*/ 95, 0x00, + /* ABS: 005 Pixels @ 311,138*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 017 Pixels @ 316,138*/ 17, 0x00, + /* ABS: 005 Pixels @ 333,138*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 338,138*/ 36, 0x01, + /* ABS: 002 Pixels @ 374,138*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 376,138*/ 9, 0x03, + /* ABS: 020 Pixels @ 385,138*/ 0, 20, 0x04, 0x04, 0x01, 0x03, 0x03, 0x06, 0x0F, 0x03, 0x06, 0x11, 0x11, 0x11, 0x00, 0x00, 0x19, 0x03, 0x03, 0x03, 0x0B, 0x09, + /* RLE: 020 Pixels @ 017,139*/ 20, 0x02, + /* RLE: 001 Pixels @ 037,139*/ 1, 0x04, + /* RLE: 006 Pixels @ 038,139*/ 6, 0x03, + /* ABS: 003 Pixels @ 044,139*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 041 Pixels @ 047,139*/ 41, 0x00, + /* ABS: 002 Pixels @ 088,139*/ 0, 2, 0x0A, 0x04, + /* RLE: 007 Pixels @ 090,139*/ 7, 0x03, + /* ABS: 003 Pixels @ 097,139*/ 0, 3, 0x04, 0x04, 0x0A, + /* RLE: 034 Pixels @ 100,139*/ 34, 0x00, + /* ABS: 008 Pixels @ 134,139*/ 0, 8, 0x0A, 0x00, 0x07, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 005 Pixels @ 142,139*/ 5, 0x10, + /* RLE: 003 Pixels @ 147,139*/ 3, 0x07, + /* RLE: 003 Pixels @ 150,139*/ 3, 0x10, + /* RLE: 004 Pixels @ 153,139*/ 4, 0x07, + /* ABS: 005 Pixels @ 157,139*/ 0, 5, 0x10, 0x10, 0x07, 0x10, 0x07, + /* RLE: 018 Pixels @ 162,139*/ 18, 0x05, + /* RLE: 004 Pixels @ 180,139*/ 4, 0x09, + /* RLE: 022 Pixels @ 184,139*/ 22, 0x00, + /* ABS: 010 Pixels @ 206,139*/ 0, 10, 0x04, 0x07, 0x11, 0x0E, 0x0B, 0x00, 0x03, 0x12, 0x0B, 0x03, + /* RLE: 096 Pixels @ 216,139*/ 96, 0x00, + /* ABS: 005 Pixels @ 312,139*/ 0, 5, 0x0D, 0x06, 0x06, 0x0D, 0x06, + /* RLE: 017 Pixels @ 317,139*/ 17, 0x00, + /* ABS: 005 Pixels @ 334,139*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 339,139*/ 36, 0x01, + /* RLE: 003 Pixels @ 375,139*/ 3, 0x04, + /* RLE: 008 Pixels @ 378,139*/ 8, 0x03, + /* ABS: 021 Pixels @ 386,139*/ 0, 21, 0x04, 0x04, 0x03, 0x00, 0x07, 0x0B, 0x03, 0x11, 0x0D, 0x03, 0x12, 0x12, 0x03, 0x03, 0x0A, 0x0F, 0x04, 0x19, 0x09, 0x09, 0x09, + /* RLE: 018 Pixels @ 019,140*/ 18, 0x02, + /* RLE: 001 Pixels @ 037,140*/ 1, 0x04, + /* RLE: 007 Pixels @ 038,140*/ 7, 0x03, + /* RLE: 001 Pixels @ 045,140*/ 1, 0x0A, + /* RLE: 042 Pixels @ 046,140*/ 42, 0x00, + /* ABS: 003 Pixels @ 088,140*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 007 Pixels @ 091,140*/ 7, 0x03, + /* ABS: 002 Pixels @ 098,140*/ 0, 2, 0x04, 0x04, + /* RLE: 033 Pixels @ 100,140*/ 33, 0x00, + /* ABS: 009 Pixels @ 133,140*/ 0, 9, 0x0A, 0x00, 0x00, 0x07, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 004 Pixels @ 142,140*/ 4, 0x10, + /* ABS: 008 Pixels @ 146,140*/ 0, 8, 0x07, 0x10, 0x10, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 005 Pixels @ 154,140*/ 5, 0x10, + /* ABS: 003 Pixels @ 159,140*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 015 Pixels @ 162,140*/ 15, 0x05, + /* RLE: 003 Pixels @ 177,140*/ 3, 0x09, + /* RLE: 025 Pixels @ 180,140*/ 25, 0x00, + /* ABS: 003 Pixels @ 205,140*/ 0, 3, 0x03, 0x0E, 0x0D, + /* RLE: 006 Pixels @ 208,140*/ 6, 0x03, + /* ABS: 002 Pixels @ 214,140*/ 0, 2, 0x00, 0x03, + /* RLE: 097 Pixels @ 216,140*/ 97, 0x00, + /* ABS: 005 Pixels @ 313,140*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 017 Pixels @ 318,140*/ 17, 0x00, + /* RLE: 005 Pixels @ 335,140*/ 5, 0x06, + /* RLE: 037 Pixels @ 340,140*/ 37, 0x01, + /* ABS: 002 Pixels @ 377,140*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 379,140*/ 10, 0x03, + /* ABS: 020 Pixels @ 001,141*/ 0, 20, 0x06, 0x0F, 0x03, 0x00, 0x0A, 0x07, 0x0D, 0x0A, 0x0A, 0x03, 0x0E, 0x07, 0x11, 0x03, 0x03, 0x00, 0x1A, 0x09, 0x09, 0x09, + /* RLE: 017 Pixels @ 021,141*/ 17, 0x02, + /* RLE: 001 Pixels @ 038,141*/ 1, 0x04, + /* RLE: 006 Pixels @ 039,141*/ 6, 0x03, + /* ABS: 002 Pixels @ 045,141*/ 0, 2, 0x04, 0x0A, + /* RLE: 043 Pixels @ 047,141*/ 43, 0x00, + /* ABS: 002 Pixels @ 090,141*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 092,141*/ 7, 0x03, + /* ABS: 004 Pixels @ 099,141*/ 0, 4, 0x04, 0x04, 0x00, 0x0A, + /* RLE: 026 Pixels @ 103,141*/ 26, 0x00, + /* ABS: 013 Pixels @ 129,141*/ 0, 13, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x09, 0x07, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 004 Pixels @ 142,141*/ 4, 0x10, + /* ABS: 006 Pixels @ 146,141*/ 0, 6, 0x07, 0x10, 0x10, 0x10, 0x07, 0x10, + /* RLE: 004 Pixels @ 152,141*/ 4, 0x07, + /* RLE: 003 Pixels @ 156,141*/ 3, 0x10, + /* ABS: 003 Pixels @ 159,141*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 011 Pixels @ 162,141*/ 11, 0x05, + /* RLE: 004 Pixels @ 173,141*/ 4, 0x09, + /* RLE: 028 Pixels @ 177,141*/ 28, 0x00, + /* ABS: 011 Pixels @ 205,141*/ 0, 11, 0x03, 0x0A, 0x11, 0x03, 0x03, 0x00, 0x0B, 0x0B, 0x04, 0x07, 0x03, + /* RLE: 099 Pixels @ 216,141*/ 99, 0x00, + /* ABS: 004 Pixels @ 315,141*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 319,141*/ 18, 0x00, + /* RLE: 004 Pixels @ 337,141*/ 4, 0x06, + /* RLE: 037 Pixels @ 341,141*/ 37, 0x01, + /* ABS: 002 Pixels @ 378,141*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 380,141*/ 8, 0x03, + /* ABS: 023 Pixels @ 000,142*/ 0, 23, 0x00, 0x00, 0x04, 0x03, 0x07, 0x0B, 0x00, 0x0F, 0x0D, 0x03, 0x03, 0x0B, 0x07, 0x07, 0x04, 0x06, 0x00, 0x03, 0x03, 0x1A, 0x09, 0x09, 0x09, + /* RLE: 015 Pixels @ 023,142*/ 15, 0x02, + /* RLE: 001 Pixels @ 038,142*/ 1, 0x04, + /* RLE: 006 Pixels @ 039,142*/ 6, 0x03, + /* RLE: 001 Pixels @ 045,142*/ 1, 0x04, + /* RLE: 045 Pixels @ 046,142*/ 45, 0x00, + /* RLE: 001 Pixels @ 091,142*/ 1, 0x04, + /* RLE: 008 Pixels @ 092,142*/ 8, 0x03, + /* ABS: 002 Pixels @ 100,142*/ 0, 2, 0x04, 0x0A, + /* RLE: 018 Pixels @ 102,142*/ 18, 0x00, + /* RLE: 001 Pixels @ 120,142*/ 1, 0x0A, + /* RLE: 004 Pixels @ 121,142*/ 4, 0x00, + /* ABS: 006 Pixels @ 125,142*/ 0, 6, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 131,142*/ 4, 0x09, + /* ABS: 007 Pixels @ 135,142*/ 0, 7, 0x05, 0x07, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 005 Pixels @ 142,142*/ 5, 0x10, + /* RLE: 003 Pixels @ 147,142*/ 3, 0x07, + /* ABS: 012 Pixels @ 150,142*/ 0, 12, 0x10, 0x10, 0x07, 0x10, 0x10, 0x10, 0x07, 0x10, 0x10, 0x07, 0x10, 0x07, + /* RLE: 007 Pixels @ 162,142*/ 7, 0x05, + /* RLE: 004 Pixels @ 169,142*/ 4, 0x09, + /* RLE: 033 Pixels @ 173,142*/ 33, 0x00, + /* ABS: 002 Pixels @ 206,142*/ 0, 2, 0x03, 0x06, + /* RLE: 004 Pixels @ 208,142*/ 4, 0x07, + /* ABS: 004 Pixels @ 212,142*/ 0, 4, 0x06, 0x03, 0x00, 0x03, + /* RLE: 100 Pixels @ 216,142*/ 100, 0x00, + /* ABS: 004 Pixels @ 316,142*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 320,142*/ 18, 0x00, + /* ABS: 004 Pixels @ 338,142*/ 0, 4, 0x06, 0x06, 0x03, 0x06, + /* RLE: 037 Pixels @ 342,142*/ 37, 0x01, + /* ABS: 002 Pixels @ 379,142*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 381,142*/ 7, 0x03, + /* ABS: 022 Pixels @ 000,143*/ 0, 22, 0x0A, 0x0A, 0x04, 0x03, 0x0E, 0x0F, 0x0B, 0x06, 0x0F, 0x03, 0x03, 0x11, 0x11, 0x00, 0x0B, 0x07, 0x11, 0x11, 0x00, 0x00, 0x15, 0x19, + /* RLE: 004 Pixels @ 022,143*/ 4, 0x09, + /* RLE: 012 Pixels @ 026,143*/ 12, 0x02, + /* RLE: 001 Pixels @ 038,143*/ 1, 0x04, + /* RLE: 006 Pixels @ 039,143*/ 6, 0x03, + /* ABS: 002 Pixels @ 045,143*/ 0, 2, 0x04, 0x0A, + /* RLE: 045 Pixels @ 047,143*/ 45, 0x00, + /* RLE: 001 Pixels @ 092,143*/ 1, 0x04, + /* RLE: 008 Pixels @ 093,143*/ 8, 0x03, + /* RLE: 001 Pixels @ 101,143*/ 1, 0x04, + /* RLE: 017 Pixels @ 102,143*/ 17, 0x00, + /* ABS: 008 Pixels @ 119,143*/ 0, 8, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 127,143*/ 4, 0x09, + /* RLE: 005 Pixels @ 131,143*/ 5, 0x05, + /* ABS: 006 Pixels @ 136,143*/ 0, 6, 0x07, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 004 Pixels @ 142,143*/ 4, 0x10, + /* ABS: 005 Pixels @ 146,143*/ 0, 5, 0x07, 0x10, 0x10, 0x10, 0x07, + /* RLE: 005 Pixels @ 151,143*/ 5, 0x10, + /* ABS: 009 Pixels @ 156,143*/ 0, 9, 0x07, 0x10, 0x10, 0x07, 0x10, 0x07, 0x05, 0x05, 0x05, + /* RLE: 004 Pixels @ 165,143*/ 4, 0x09, + /* RLE: 037 Pixels @ 169,143*/ 37, 0x00, + /* ABS: 005 Pixels @ 206,143*/ 0, 5, 0x03, 0x06, 0x12, 0x0B, 0x0A, + /* RLE: 005 Pixels @ 211,143*/ 5, 0x03, + /* RLE: 101 Pixels @ 216,143*/ 101, 0x00, + /* ABS: 004 Pixels @ 317,143*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 321,143*/ 18, 0x00, + /* ABS: 005 Pixels @ 339,143*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 344,143*/ 36, 0x01, + /* ABS: 002 Pixels @ 380,143*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 382,143*/ 6, 0x03, + /* RLE: 003 Pixels @ 000,144*/ 3, 0x02, + /* ABS: 025 Pixels @ 003,144*/ 0, 25, 0x04, 0x03, 0x0A, 0x12, 0x06, 0x04, 0x03, 0x04, 0x07, 0x04, 0x03, 0x0F, 0x0D, 0x04, 0x12, 0x03, 0x0A, 0x00, 0x03, 0x03, 0x1A, 0x05, 0x09, 0x09, 0x09, + /* RLE: 010 Pixels @ 028,144*/ 10, 0x02, + /* RLE: 001 Pixels @ 038,144*/ 1, 0x04, + /* RLE: 006 Pixels @ 039,144*/ 6, 0x03, + /* RLE: 001 Pixels @ 045,144*/ 1, 0x04, + /* RLE: 045 Pixels @ 046,144*/ 45, 0x00, + /* ABS: 003 Pixels @ 091,144*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 007 Pixels @ 094,144*/ 7, 0x03, + /* RLE: 001 Pixels @ 101,144*/ 1, 0x04, + /* RLE: 016 Pixels @ 102,144*/ 16, 0x00, + /* ABS: 005 Pixels @ 118,144*/ 0, 5, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 004 Pixels @ 123,144*/ 4, 0x09, + /* RLE: 009 Pixels @ 127,144*/ 9, 0x05, + /* ABS: 006 Pixels @ 136,144*/ 0, 6, 0x07, 0x10, 0x07, 0x10, 0x10, 0x07, + /* RLE: 004 Pixels @ 142,144*/ 4, 0x10, + /* ABS: 019 Pixels @ 146,144*/ 0, 19, 0x07, 0x10, 0x10, 0x10, 0x07, 0x10, 0x07, 0x10, 0x10, 0x10, 0x07, 0x10, 0x10, 0x07, 0x10, 0x07, 0x09, 0x09, 0x09, + /* RLE: 042 Pixels @ 165,144*/ 42, 0x00, + /* RLE: 006 Pixels @ 207,144*/ 6, 0x03, + /* ABS: 004 Pixels @ 213,144*/ 0, 4, 0x00, 0x0B, 0x12, 0x03, + /* RLE: 101 Pixels @ 217,144*/ 101, 0x00, + /* ABS: 005 Pixels @ 318,144*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 017 Pixels @ 323,144*/ 17, 0x00, + /* ABS: 005 Pixels @ 340,144*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 036 Pixels @ 345,144*/ 36, 0x01, + /* ABS: 002 Pixels @ 381,144*/ 0, 2, 0x04, 0x04, + /* RLE: 005 Pixels @ 383,144*/ 5, 0x03, + /* RLE: 004 Pixels @ 000,145*/ 4, 0x02, + /* ABS: 002 Pixels @ 004,145*/ 0, 2, 0x00, 0x00, + /* RLE: 004 Pixels @ 006,145*/ 4, 0x03, + /* ABS: 020 Pixels @ 010,145*/ 0, 20, 0x12, 0x11, 0x03, 0x0B, 0x07, 0x0A, 0x03, 0x03, 0x04, 0x07, 0x07, 0x11, 0x00, 0x03, 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, + /* RLE: 008 Pixels @ 030,145*/ 8, 0x02, + /* RLE: 001 Pixels @ 038,145*/ 1, 0x04, + /* RLE: 006 Pixels @ 039,145*/ 6, 0x03, + /* ABS: 003 Pixels @ 045,145*/ 0, 3, 0x04, 0x00, 0x0A, + /* RLE: 045 Pixels @ 048,145*/ 45, 0x00, + /* ABS: 002 Pixels @ 093,145*/ 0, 2, 0x0A, 0x04, + /* RLE: 006 Pixels @ 095,145*/ 6, 0x03, + /* RLE: 001 Pixels @ 101,145*/ 1, 0x04, + /* RLE: 012 Pixels @ 102,145*/ 12, 0x00, + /* ABS: 009 Pixels @ 114,145*/ 0, 9, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x09, 0x09, 0x09, + /* RLE: 013 Pixels @ 123,145*/ 13, 0x05, + /* ABS: 005 Pixels @ 136,145*/ 0, 5, 0x07, 0x10, 0x07, 0x10, 0x10, + /* RLE: 005 Pixels @ 141,145*/ 5, 0x07, + /* ABS: 016 Pixels @ 146,145*/ 0, 16, 0x10, 0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x07, 0x10, 0x07, + /* RLE: 045 Pixels @ 162,145*/ 45, 0x00, + /* ABS: 009 Pixels @ 207,145*/ 0, 9, 0x03, 0x00, 0x0B, 0x12, 0x11, 0x07, 0x07, 0x07, 0x11, + /* RLE: 103 Pixels @ 216,145*/ 103, 0x00, + /* ABS: 005 Pixels @ 319,145*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 017 Pixels @ 324,145*/ 17, 0x00, + /* RLE: 005 Pixels @ 341,145*/ 5, 0x06, + /* RLE: 036 Pixels @ 346,145*/ 36, 0x01, + /* RLE: 003 Pixels @ 382,145*/ 3, 0x04, + /* RLE: 003 Pixels @ 385,145*/ 3, 0x03, + /* RLE: 007 Pixels @ 000,146*/ 7, 0x02, + /* ABS: 025 Pixels @ 007,146*/ 0, 25, 0x09, 0x09, 0x03, 0x0E, 0x07, 0x0B, 0x0F, 0x06, 0x03, 0x03, 0x03, 0x00, 0x03, 0x03, 0x12, 0x11, 0x03, 0x19, 0x00, 0x00, 0x19, 0x05, 0x09, 0x09, 0x09, + /* RLE: 006 Pixels @ 032,146*/ 6, 0x02, + /* RLE: 001 Pixels @ 038,146*/ 1, 0x04, + /* RLE: 007 Pixels @ 039,146*/ 7, 0x03, + /* RLE: 001 Pixels @ 046,146*/ 1, 0x0A, + /* RLE: 046 Pixels @ 047,146*/ 46, 0x00, + /* ABS: 003 Pixels @ 093,146*/ 0, 3, 0x0A, 0x04, 0x04, + /* RLE: 005 Pixels @ 096,146*/ 5, 0x03, + /* RLE: 001 Pixels @ 101,146*/ 1, 0x04, + /* RLE: 008 Pixels @ 102,146*/ 8, 0x00, + /* ABS: 006 Pixels @ 110,146*/ 0, 6, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 116,146*/ 4, 0x09, + /* RLE: 016 Pixels @ 120,146*/ 16, 0x05, + /* ABS: 003 Pixels @ 136,146*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 020 Pixels @ 139,146*/ 20, 0x10, + /* ABS: 003 Pixels @ 159,146*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 045 Pixels @ 162,146*/ 45, 0x00, + /* ABS: 010 Pixels @ 207,146*/ 0, 10, 0x03, 0x12, 0x07, 0x11, 0x12, 0x0B, 0x00, 0x03, 0x03, 0x03, + /* RLE: 103 Pixels @ 217,146*/ 103, 0x00, + /* ABS: 005 Pixels @ 320,146*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 325,146*/ 18, 0x00, + /* RLE: 004 Pixels @ 343,146*/ 4, 0x06, + /* RLE: 038 Pixels @ 347,146*/ 38, 0x01, + /* RLE: 003 Pixels @ 385,146*/ 3, 0x04, + /* RLE: 009 Pixels @ 000,147*/ 9, 0x02, + /* ABS: 025 Pixels @ 009,147*/ 0, 25, 0x04, 0x03, 0x0A, 0x00, 0x06, 0x0A, 0x03, 0x03, 0x0D, 0x07, 0x07, 0x06, 0x0F, 0x06, 0x03, 0x03, 0x0B, 0x0A, 0x03, 0x03, 0x1A, 0x05, 0x09, 0x09, 0x09, + /* RLE: 005 Pixels @ 034,147*/ 5, 0x02, + /* RLE: 001 Pixels @ 039,147*/ 1, 0x04, + /* RLE: 006 Pixels @ 040,147*/ 6, 0x03, + /* ABS: 002 Pixels @ 046,147*/ 0, 2, 0x04, 0x0A, + /* RLE: 047 Pixels @ 048,147*/ 47, 0x00, + /* ABS: 017 Pixels @ 095,147*/ 0, 17, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 112,147*/ 4, 0x09, + /* RLE: 020 Pixels @ 116,147*/ 20, 0x05, + /* ABS: 003 Pixels @ 136,147*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 020 Pixels @ 139,147*/ 20, 0x10, + /* ABS: 003 Pixels @ 159,147*/ 0, 3, 0x07, 0x10, 0x07, + /* RLE: 045 Pixels @ 162,147*/ 45, 0x00, + /* ABS: 010 Pixels @ 207,147*/ 0, 10, 0x03, 0x00, 0x03, 0x03, 0x00, 0x04, 0x00, 0x03, 0x03, 0x04, + /* RLE: 105 Pixels @ 217,147*/ 105, 0x00, + /* ABS: 004 Pixels @ 322,147*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 326,147*/ 18, 0x00, + /* ABS: 004 Pixels @ 344,147*/ 0, 4, 0x06, 0x06, 0x03, 0x06, + /* RLE: 040 Pixels @ 348,147*/ 40, 0x01, + /* RLE: 010 Pixels @ 000,148*/ 10, 0x02, + /* ABS: 030 Pixels @ 010,148*/ 0, 30, 0x00, 0x04, 0x03, 0x00, 0x00, 0x15, 0x00, 0x07, 0x0B, 0x03, 0x0B, 0x07, 0x0A, 0x03, 0x06, 0x11, 0x11, 0x11, 0x00, 0x00, 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x02, 0x02, 0x02, 0x04, + /* RLE: 006 Pixels @ 040,148*/ 6, 0x03, + /* RLE: 001 Pixels @ 046,148*/ 1, 0x04, + /* RLE: 048 Pixels @ 047,148*/ 48, 0x00, + /* ABS: 013 Pixels @ 095,148*/ 0, 13, 0x04, 0x0A, 0x04, 0x0A, 0x04, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 108,148*/ 4, 0x09, + /* RLE: 024 Pixels @ 112,148*/ 24, 0x05, + /* ABS: 003 Pixels @ 136,148*/ 0, 3, 0x07, 0x10, 0x10, + /* RLE: 020 Pixels @ 139,148*/ 20, 0x07, + /* ABS: 003 Pixels @ 159,148*/ 0, 3, 0x10, 0x10, 0x07, + /* RLE: 045 Pixels @ 162,148*/ 45, 0x00, + /* ABS: 010 Pixels @ 207,148*/ 0, 10, 0x03, 0x00, 0x0D, 0x03, 0x11, 0x07, 0x0F, 0x03, 0x03, 0x04, + /* RLE: 106 Pixels @ 217,148*/ 106, 0x00, + /* ABS: 004 Pixels @ 323,148*/ 0, 4, 0x0D, 0x0D, 0x06, 0x06, + /* RLE: 018 Pixels @ 327,148*/ 18, 0x00, + /* ABS: 004 Pixels @ 345,148*/ 0, 4, 0x06, 0x06, 0x03, 0x06, + /* RLE: 039 Pixels @ 349,148*/ 39, 0x01, + /* RLE: 013 Pixels @ 000,149*/ 13, 0x02, + /* ABS: 027 Pixels @ 013,149*/ 0, 27, 0x09, 0x09, 0x06, 0x03, 0x06, 0x11, 0x0B, 0x0F, 0x11, 0x03, 0x03, 0x11, 0x0D, 0x03, 0x12, 0x12, 0x03, 0x15, 0x00, 0x19, 0x05, 0x05, 0x09, 0x09, 0x09, 0x02, 0x04, + /* RLE: 006 Pixels @ 040,149*/ 6, 0x03, + /* ABS: 002 Pixels @ 046,149*/ 0, 2, 0x04, 0x0A, + /* RLE: 048 Pixels @ 048,149*/ 48, 0x00, + /* ABS: 008 Pixels @ 096,149*/ 0, 8, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 104,149*/ 4, 0x09, + /* RLE: 029 Pixels @ 108,149*/ 29, 0x05, + /* RLE: 001 Pixels @ 137,149*/ 1, 0x07, + /* RLE: 022 Pixels @ 138,149*/ 22, 0x10, + /* RLE: 001 Pixels @ 160,149*/ 1, 0x07, + /* RLE: 047 Pixels @ 161,149*/ 47, 0x00, + /* ABS: 009 Pixels @ 208,149*/ 0, 9, 0x0B, 0x11, 0x00, 0x07, 0x04, 0x0D, 0x04, 0x03, 0x04, + /* RLE: 107 Pixels @ 217,149*/ 107, 0x00, + /* ABS: 004 Pixels @ 324,149*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 328,149*/ 18, 0x00, + /* ABS: 005 Pixels @ 346,149*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 037 Pixels @ 351,149*/ 37, 0x01, + /* RLE: 015 Pixels @ 000,150*/ 15, 0x02, + /* ABS: 025 Pixels @ 015,150*/ 0, 25, 0x09, 0x00, 0x03, 0x0A, 0x0A, 0x07, 0x04, 0x03, 0x00, 0x0A, 0x07, 0x0D, 0x0A, 0x0A, 0x03, 0x0B, 0x0A, 0x03, 0x03, 0x1A, 0x05, 0x05, 0x09, 0x09, 0x09, + /* RLE: 006 Pixels @ 040,150*/ 6, 0x03, + /* RLE: 001 Pixels @ 046,150*/ 1, 0x04, + /* RLE: 048 Pixels @ 047,150*/ 48, 0x00, + /* ABS: 005 Pixels @ 095,150*/ 0, 5, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 004 Pixels @ 100,150*/ 4, 0x09, + /* RLE: 034 Pixels @ 104,150*/ 34, 0x05, + /* RLE: 022 Pixels @ 138,150*/ 22, 0x07, + /* RLE: 047 Pixels @ 160,150*/ 47, 0x00, + /* ABS: 010 Pixels @ 207,150*/ 0, 10, 0x03, 0x0B, 0x0B, 0x0A, 0x07, 0x00, 0x12, 0x0B, 0x03, 0x04, + /* RLE: 108 Pixels @ 217,150*/ 108, 0x00, + /* ABS: 004 Pixels @ 325,150*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 018 Pixels @ 329,150*/ 18, 0x00, + /* RLE: 005 Pixels @ 347,150*/ 5, 0x06, + /* RLE: 036 Pixels @ 352,150*/ 36, 0x01, + /* RLE: 017 Pixels @ 000,151*/ 17, 0x02, + /* ABS: 023 Pixels @ 017,151*/ 0, 23, 0x18, 0x0A, 0x03, 0x00, 0x00, 0x03, 0x07, 0x0B, 0x00, 0x0F, 0x0D, 0x03, 0x06, 0x11, 0x11, 0x11, 0x00, 0x00, 0x1A, 0x15, 0x15, 0x19, 0x09, + /* RLE: 006 Pixels @ 040,151*/ 6, 0x03, + /* ABS: 004 Pixels @ 046,151*/ 0, 4, 0x04, 0x00, 0x00, 0x0A, + /* RLE: 041 Pixels @ 050,151*/ 41, 0x00, + /* ABS: 009 Pixels @ 091,151*/ 0, 9, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x09, 0x09, 0x09, + /* RLE: 035 Pixels @ 100,151*/ 35, 0x05, + /* RLE: 004 Pixels @ 135,151*/ 4, 0x09, + /* RLE: 068 Pixels @ 139,151*/ 68, 0x00, + /* ABS: 010 Pixels @ 207,151*/ 0, 10, 0x03, 0x04, 0x11, 0x04, 0x07, 0x0A, 0x0F, 0x04, 0x03, 0x03, + /* RLE: 109 Pixels @ 217,151*/ 109, 0x00, + /* ABS: 005 Pixels @ 326,151*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 017 Pixels @ 331,151*/ 17, 0x00, + /* RLE: 005 Pixels @ 348,151*/ 5, 0x06, + /* RLE: 035 Pixels @ 353,151*/ 35, 0x01, + /* RLE: 019 Pixels @ 000,152*/ 19, 0x02, + /* ABS: 022 Pixels @ 019,152*/ 0, 22, 0x18, 0x0E, 0x0B, 0x03, 0x0E, 0x0F, 0x04, 0x06, 0x0F, 0x03, 0x11, 0x0D, 0x03, 0x12, 0x12, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x1A, + /* RLE: 006 Pixels @ 041,152*/ 6, 0x03, + /* ABS: 013 Pixels @ 047,152*/ 0, 13, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 027 Pixels @ 060,152*/ 27, 0x00, + /* ABS: 006 Pixels @ 087,152*/ 0, 6, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 093,152*/ 4, 0x09, + /* RLE: 034 Pixels @ 097,152*/ 34, 0x05, + /* RLE: 004 Pixels @ 131,152*/ 4, 0x09, + /* RLE: 073 Pixels @ 135,152*/ 73, 0x00, + /* ABS: 010 Pixels @ 208,152*/ 0, 10, 0x03, 0x0D, 0x07, 0x0F, 0x03, 0x04, 0x03, 0x03, 0x03, 0x04, + /* RLE: 109 Pixels @ 218,152*/ 109, 0x00, + /* ABS: 005 Pixels @ 327,152*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 332,152*/ 18, 0x00, + /* RLE: 004 Pixels @ 350,152*/ 4, 0x06, + /* RLE: 034 Pixels @ 354,152*/ 34, 0x01, + /* RLE: 022 Pixels @ 000,153*/ 22, 0x02, + /* ABS: 021 Pixels @ 022,153*/ 0, 21, 0x04, 0x03, 0x04, 0x12, 0x06, 0x04, 0x00, 0x0A, 0x07, 0x0D, 0x0A, 0x0A, 0x03, 0x0E, 0x07, 0x07, 0x0D, 0x00, 0x00, 0x05, 0x05, + /* RLE: 004 Pixels @ 043,153*/ 4, 0x03, + /* RLE: 003 Pixels @ 047,153*/ 3, 0x09, + /* ABS: 022 Pixels @ 050,153*/ 0, 22, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, + /* RLE: 011 Pixels @ 072,153*/ 11, 0x00, + /* ABS: 006 Pixels @ 083,153*/ 0, 6, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 089,153*/ 4, 0x09, + /* RLE: 034 Pixels @ 093,153*/ 34, 0x05, + /* RLE: 004 Pixels @ 127,153*/ 4, 0x09, + /* RLE: 001 Pixels @ 131,153*/ 1, 0x0A, + /* RLE: 077 Pixels @ 132,153*/ 77, 0x00, + /* ABS: 009 Pixels @ 209,153*/ 0, 9, 0x03, 0x0A, 0x03, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x04, + /* RLE: 110 Pixels @ 218,153*/ 110, 0x00, + /* ABS: 005 Pixels @ 328,153*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 333,153*/ 18, 0x00, + /* ABS: 004 Pixels @ 351,153*/ 0, 4, 0x06, 0x03, 0x03, 0x06, + /* RLE: 033 Pixels @ 355,153*/ 33, 0x01, + /* RLE: 023 Pixels @ 000,154*/ 23, 0x02, + /* RLE: 003 Pixels @ 023,154*/ 3, 0x00, + /* ABS: 015 Pixels @ 026,154*/ 0, 15, 0x03, 0x03, 0x07, 0x0B, 0x00, 0x0F, 0x0D, 0x03, 0x04, 0x07, 0x0B, 0x03, 0x06, 0x12, 0x03, + /* RLE: 009 Pixels @ 041,154*/ 9, 0x05, + /* RLE: 012 Pixels @ 050,154*/ 12, 0x09, + /* ABS: 023 Pixels @ 062,154*/ 0, 23, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 085,154*/ 4, 0x09, + /* RLE: 034 Pixels @ 089,154*/ 34, 0x05, + /* RLE: 004 Pixels @ 123,154*/ 4, 0x09, + /* RLE: 082 Pixels @ 127,154*/ 82, 0x00, + /* ABS: 008 Pixels @ 209,154*/ 0, 8, 0x03, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x06, 0x03, + /* RLE: 113 Pixels @ 217,154*/ 113, 0x00, + /* ABS: 004 Pixels @ 330,154*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 334,154*/ 18, 0x00, + /* ABS: 004 Pixels @ 352,154*/ 0, 4, 0x06, 0x06, 0x03, 0x06, + /* RLE: 032 Pixels @ 356,154*/ 32, 0x01, + /* RLE: 026 Pixels @ 000,155*/ 26, 0x02, + /* ABS: 015 Pixels @ 026,155*/ 0, 15, 0x09, 0x03, 0x0E, 0x0F, 0x0B, 0x06, 0x0F, 0x03, 0x06, 0x0F, 0x11, 0x0E, 0x12, 0x06, 0x03, + /* RLE: 021 Pixels @ 041,155*/ 21, 0x05, + /* RLE: 012 Pixels @ 062,155*/ 12, 0x09, + /* ABS: 007 Pixels @ 074,155*/ 0, 7, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, + /* RLE: 004 Pixels @ 081,155*/ 4, 0x09, + /* RLE: 035 Pixels @ 085,155*/ 35, 0x05, + /* RLE: 003 Pixels @ 120,155*/ 3, 0x09, + /* RLE: 087 Pixels @ 123,155*/ 87, 0x00, + /* ABS: 007 Pixels @ 210,155*/ 0, 7, 0x04, 0x07, 0x0E, 0x0D, 0x0A, 0x0F, 0x04, + /* RLE: 114 Pixels @ 217,155*/ 114, 0x00, + /* ABS: 004 Pixels @ 331,155*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 018 Pixels @ 335,155*/ 18, 0x00, + /* RLE: 005 Pixels @ 353,155*/ 5, 0x06, + /* RLE: 030 Pixels @ 358,155*/ 30, 0x01, + /* RLE: 027 Pixels @ 000,156*/ 27, 0x02, + /* ABS: 014 Pixels @ 027,156*/ 0, 14, 0x00, 0x03, 0x04, 0x12, 0x06, 0x0A, 0x03, 0x06, 0x0E, 0x03, 0x0B, 0x11, 0x0E, 0x03, + /* RLE: 033 Pixels @ 041,156*/ 33, 0x05, + /* RLE: 007 Pixels @ 074,156*/ 7, 0x09, + /* RLE: 035 Pixels @ 081,156*/ 35, 0x05, + /* RLE: 004 Pixels @ 116,156*/ 4, 0x09, + /* RLE: 089 Pixels @ 120,156*/ 89, 0x00, + /* ABS: 009 Pixels @ 209,156*/ 0, 9, 0x03, 0x0B, 0x12, 0x03, 0x07, 0x03, 0x06, 0x0B, 0x03, + /* RLE: 114 Pixels @ 218,156*/ 114, 0x00, + /* ABS: 004 Pixels @ 332,156*/ 0, 4, 0x0D, 0x0D, 0x03, 0x06, + /* RLE: 018 Pixels @ 336,156*/ 18, 0x00, + /* RLE: 005 Pixels @ 354,156*/ 5, 0x06, + /* RLE: 029 Pixels @ 359,156*/ 29, 0x01, + /* RLE: 028 Pixels @ 000,157*/ 28, 0x02, + /* ABS: 013 Pixels @ 028,157*/ 0, 13, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x04, 0x0F, 0x0B, 0x0E, 0x00, 0x03, 0x15, + /* RLE: 071 Pixels @ 041,157*/ 71, 0x05, + /* RLE: 004 Pixels @ 112,157*/ 4, 0x09, + /* RLE: 001 Pixels @ 116,157*/ 1, 0x0A, + /* RLE: 092 Pixels @ 117,157*/ 92, 0x00, + /* ABS: 010 Pixels @ 209,157*/ 0, 10, 0x03, 0x04, 0x11, 0x0A, 0x06, 0x12, 0x07, 0x00, 0x03, 0x04, + /* RLE: 114 Pixels @ 219,157*/ 114, 0x00, + /* ABS: 005 Pixels @ 333,157*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 017 Pixels @ 338,157*/ 17, 0x00, + /* RLE: 005 Pixels @ 355,157*/ 5, 0x06, + /* RLE: 028 Pixels @ 360,157*/ 28, 0x01, + /* RLE: 032 Pixels @ 000,158*/ 32, 0x02, + /* ABS: 008 Pixels @ 032,158*/ 0, 8, 0x09, 0x0B, 0x03, 0x04, 0x12, 0x06, 0x0A, 0x15, + /* RLE: 068 Pixels @ 040,158*/ 68, 0x05, + /* RLE: 004 Pixels @ 108,158*/ 4, 0x09, + /* RLE: 098 Pixels @ 112,158*/ 98, 0x00, + /* ABS: 009 Pixels @ 210,158*/ 0, 9, 0x03, 0x0D, 0x06, 0x0E, 0x0F, 0x04, 0x03, 0x03, 0x04, + /* RLE: 115 Pixels @ 219,158*/ 115, 0x00, + /* RLE: 001 Pixels @ 334,158*/ 1, 0x0D, + /* RLE: 004 Pixels @ 335,158*/ 4, 0x06, + /* RLE: 018 Pixels @ 339,158*/ 18, 0x00, + /* ABS: 004 Pixels @ 357,158*/ 0, 4, 0x06, 0x03, 0x03, 0x06, + /* RLE: 027 Pixels @ 361,158*/ 27, 0x01, + /* RLE: 034 Pixels @ 000,159*/ 34, 0x02, + /* ABS: 006 Pixels @ 034,159*/ 0, 6, 0x0E, 0x00, 0x03, 0x03, 0x03, 0x19, + /* RLE: 064 Pixels @ 040,159*/ 64, 0x05, + /* RLE: 004 Pixels @ 104,159*/ 4, 0x09, + /* RLE: 103 Pixels @ 108,159*/ 103, 0x00, + /* ABS: 008 Pixels @ 211,159*/ 0, 8, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x04, + /* RLE: 116 Pixels @ 219,159*/ 116, 0x00, + /* ABS: 005 Pixels @ 335,159*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 340,159*/ 18, 0x00, + /* ABS: 004 Pixels @ 358,159*/ 0, 4, 0x06, 0x06, 0x03, 0x06, + /* RLE: 026 Pixels @ 362,159*/ 26, 0x01, + /* RLE: 036 Pixels @ 000,160*/ 36, 0x02, + /* RLE: 003 Pixels @ 036,160*/ 3, 0x09, + /* RLE: 061 Pixels @ 039,160*/ 61, 0x05, + /* RLE: 004 Pixels @ 100,160*/ 4, 0x09, + /* RLE: 106 Pixels @ 104,160*/ 106, 0x00, + /* ABS: 008 Pixels @ 210,160*/ 0, 8, 0x03, 0x00, 0x0B, 0x12, 0x11, 0x07, 0x07, 0x03, + /* RLE: 119 Pixels @ 218,160*/ 119, 0x00, + /* ABS: 004 Pixels @ 337,160*/ 0, 4, 0x0D, 0x0D, 0x06, 0x06, + /* RLE: 018 Pixels @ 341,160*/ 18, 0x00, + /* RLE: 005 Pixels @ 359,160*/ 5, 0x06, + /* RLE: 024 Pixels @ 364,160*/ 24, 0x01, + /* RLE: 038 Pixels @ 000,161*/ 38, 0x02, + /* RLE: 003 Pixels @ 038,161*/ 3, 0x09, + /* RLE: 056 Pixels @ 041,161*/ 56, 0x05, + /* RLE: 003 Pixels @ 097,161*/ 3, 0x09, + /* RLE: 110 Pixels @ 100,161*/ 110, 0x00, + /* ABS: 009 Pixels @ 210,161*/ 0, 9, 0x03, 0x12, 0x07, 0x11, 0x12, 0x0E, 0x0D, 0x00, 0x03, + /* RLE: 119 Pixels @ 219,161*/ 119, 0x00, + /* ABS: 004 Pixels @ 338,161*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 018 Pixels @ 342,161*/ 18, 0x00, + /* RLE: 005 Pixels @ 360,161*/ 5, 0x06, + /* RLE: 023 Pixels @ 365,161*/ 23, 0x01, + /* RLE: 040 Pixels @ 000,162*/ 40, 0x02, + /* RLE: 003 Pixels @ 040,162*/ 3, 0x09, + /* RLE: 050 Pixels @ 043,162*/ 50, 0x05, + /* RLE: 004 Pixels @ 093,162*/ 4, 0x09, + /* RLE: 113 Pixels @ 097,162*/ 113, 0x00, + /* ABS: 002 Pixels @ 210,162*/ 0, 2, 0x03, 0x00, + /* RLE: 004 Pixels @ 212,162*/ 4, 0x03, + /* ABS: 004 Pixels @ 216,162*/ 0, 4, 0x0E, 0x0B, 0x03, 0x04, + /* RLE: 119 Pixels @ 220,162*/ 119, 0x00, + /* ABS: 004 Pixels @ 339,162*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 018 Pixels @ 343,162*/ 18, 0x00, + /* RLE: 005 Pixels @ 361,162*/ 5, 0x06, + /* RLE: 022 Pixels @ 366,162*/ 22, 0x01, + /* RLE: 043 Pixels @ 000,163*/ 43, 0x02, + /* RLE: 007 Pixels @ 043,163*/ 7, 0x09, + /* RLE: 039 Pixels @ 050,163*/ 39, 0x05, + /* RLE: 004 Pixels @ 089,163*/ 4, 0x09, + /* RLE: 118 Pixels @ 093,163*/ 118, 0x00, + /* RLE: 004 Pixels @ 211,163*/ 4, 0x03, + /* ABS: 005 Pixels @ 215,163*/ 0, 5, 0x0A, 0x11, 0x06, 0x03, 0x04, + /* RLE: 120 Pixels @ 220,163*/ 120, 0x00, + /* RLE: 001 Pixels @ 340,163*/ 1, 0x0D, + /* RLE: 004 Pixels @ 341,163*/ 4, 0x06, + /* RLE: 018 Pixels @ 345,163*/ 18, 0x00, + /* ABS: 004 Pixels @ 363,163*/ 0, 4, 0x06, 0x03, 0x06, 0x06, + /* RLE: 021 Pixels @ 367,163*/ 21, 0x01, + /* RLE: 044 Pixels @ 000,164*/ 44, 0x02, + /* ABS: 002 Pixels @ 044,164*/ 0, 2, 0x01, 0x04, + /* RLE: 004 Pixels @ 046,164*/ 4, 0x00, + /* RLE: 012 Pixels @ 050,164*/ 12, 0x09, + /* RLE: 023 Pixels @ 062,164*/ 23, 0x05, + /* RLE: 004 Pixels @ 085,164*/ 4, 0x09, + /* RLE: 122 Pixels @ 089,164*/ 122, 0x00, + /* ABS: 009 Pixels @ 211,164*/ 0, 9, 0x03, 0x12, 0x11, 0x07, 0x07, 0x07, 0x0A, 0x03, 0x03, + /* RLE: 121 Pixels @ 220,164*/ 121, 0x00, + /* ABS: 005 Pixels @ 341,164*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 346,164*/ 18, 0x00, + /* ABS: 004 Pixels @ 364,164*/ 0, 4, 0x06, 0x03, 0x03, 0x06, + /* RLE: 020 Pixels @ 368,164*/ 20, 0x01, + /* RLE: 043 Pixels @ 000,165*/ 43, 0x02, + /* RLE: 005 Pixels @ 043,165*/ 5, 0x04, + /* RLE: 014 Pixels @ 048,165*/ 14, 0x00, + /* RLE: 012 Pixels @ 062,165*/ 12, 0x09, + /* RLE: 007 Pixels @ 074,165*/ 7, 0x05, + /* RLE: 005 Pixels @ 081,165*/ 5, 0x08, + /* RLE: 001 Pixels @ 086,165*/ 1, 0x0B, + /* RLE: 124 Pixels @ 087,165*/ 124, 0x00, + /* ABS: 010 Pixels @ 211,165*/ 0, 10, 0x03, 0x0D, 0x06, 0x0B, 0x04, 0x00, 0x0D, 0x00, 0x0A, 0x03, + /* RLE: 121 Pixels @ 221,165*/ 121, 0x00, + /* ABS: 005 Pixels @ 342,165*/ 0, 5, 0x0D, 0x0D, 0x06, 0x0D, 0x06, + /* RLE: 018 Pixels @ 347,165*/ 18, 0x00, + /* RLE: 004 Pixels @ 365,165*/ 4, 0x06, + /* RLE: 019 Pixels @ 369,165*/ 19, 0x01, + /* RLE: 042 Pixels @ 000,166*/ 42, 0x02, + /* ABS: 007 Pixels @ 042,166*/ 0, 7, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, + /* RLE: 025 Pixels @ 049,166*/ 25, 0x00, + /* RLE: 003 Pixels @ 074,166*/ 3, 0x09, + /* RLE: 009 Pixels @ 077,166*/ 9, 0x08, + /* RLE: 001 Pixels @ 086,166*/ 1, 0x0B, + /* RLE: 124 Pixels @ 087,166*/ 124, 0x00, + /* ABS: 011 Pixels @ 211,166*/ 0, 11, 0x03, 0x03, 0x00, 0x0B, 0x06, 0x0F, 0x07, 0x07, 0x07, 0x04, 0x03, + /* RLE: 122 Pixels @ 222,166*/ 122, 0x00, + /* ABS: 004 Pixels @ 344,166*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 348,166*/ 18, 0x00, + /* RLE: 005 Pixels @ 366,166*/ 5, 0x06, + /* RLE: 017 Pixels @ 371,166*/ 17, 0x01, + /* RLE: 042 Pixels @ 000,167*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,167*/ 1, 0x04, + /* RLE: 005 Pixels @ 043,167*/ 5, 0x03, + /* RLE: 001 Pixels @ 048,167*/ 1, 0x04, + /* RLE: 028 Pixels @ 049,167*/ 28, 0x00, + /* RLE: 001 Pixels @ 077,167*/ 1, 0x0B, + /* RLE: 009 Pixels @ 078,167*/ 9, 0x08, + /* RLE: 001 Pixels @ 087,167*/ 1, 0x0B, + /* RLE: 123 Pixels @ 088,167*/ 123, 0x00, + /* ABS: 011 Pixels @ 211,167*/ 0, 11, 0x03, 0x12, 0x07, 0x07, 0x11, 0x12, 0x07, 0x0B, 0x12, 0x0E, 0x03, + /* RLE: 034 Pixels @ 222,167*/ 34, 0x00, + /* RLE: 005 Pixels @ 256,167*/ 5, 0x04, + /* RLE: 084 Pixels @ 261,167*/ 84, 0x00, + /* ABS: 004 Pixels @ 345,167*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 018 Pixels @ 349,167*/ 18, 0x00, + /* RLE: 005 Pixels @ 367,167*/ 5, 0x06, + /* RLE: 016 Pixels @ 372,167*/ 16, 0x01, + /* RLE: 041 Pixels @ 000,168*/ 41, 0x02, + /* ABS: 002 Pixels @ 041,168*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 043,168*/ 6, 0x03, + /* RLE: 029 Pixels @ 049,168*/ 29, 0x00, + /* RLE: 009 Pixels @ 078,168*/ 9, 0x08, + /* RLE: 001 Pixels @ 087,168*/ 1, 0x0B, + /* RLE: 123 Pixels @ 088,168*/ 123, 0x00, + /* ABS: 011 Pixels @ 211,168*/ 0, 11, 0x03, 0x0A, 0x00, 0x03, 0x03, 0x03, 0x04, 0x00, 0x0A, 0x04, 0x03, + /* RLE: 033 Pixels @ 222,168*/ 33, 0x00, + /* ABS: 007 Pixels @ 255,168*/ 0, 7, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, + /* RLE: 084 Pixels @ 262,168*/ 84, 0x00, + /* ABS: 004 Pixels @ 346,168*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 350,168*/ 18, 0x00, + /* ABS: 005 Pixels @ 368,168*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 015 Pixels @ 373,168*/ 15, 0x01, + /* RLE: 042 Pixels @ 000,169*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,169*/ 1, 0x04, + /* RLE: 006 Pixels @ 043,169*/ 6, 0x03, + /* RLE: 001 Pixels @ 049,169*/ 1, 0x04, + /* RLE: 028 Pixels @ 050,169*/ 28, 0x00, + /* RLE: 001 Pixels @ 078,169*/ 1, 0x0B, + /* RLE: 009 Pixels @ 079,169*/ 9, 0x08, + /* RLE: 001 Pixels @ 088,169*/ 1, 0x0B, + /* RLE: 121 Pixels @ 089,169*/ 121, 0x00, + /* ABS: 011 Pixels @ 210,169*/ 0, 11, 0x04, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x03, + /* RLE: 034 Pixels @ 221,169*/ 34, 0x00, + /* RLE: 001 Pixels @ 255,169*/ 1, 0x04, + /* RLE: 005 Pixels @ 256,169*/ 5, 0x03, + /* RLE: 001 Pixels @ 261,169*/ 1, 0x04, + /* RLE: 085 Pixels @ 262,169*/ 85, 0x00, + /* RLE: 001 Pixels @ 347,169*/ 1, 0x0D, + /* RLE: 004 Pixels @ 348,169*/ 4, 0x06, + /* RLE: 018 Pixels @ 352,169*/ 18, 0x00, + /* ABS: 004 Pixels @ 370,169*/ 0, 4, 0x06, 0x03, 0x03, 0x06, + /* RLE: 014 Pixels @ 374,169*/ 14, 0x01, + /* RLE: 042 Pixels @ 000,170*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,170*/ 1, 0x04, + /* RLE: 006 Pixels @ 043,170*/ 6, 0x03, + /* RLE: 001 Pixels @ 049,170*/ 1, 0x04, + /* RLE: 029 Pixels @ 050,170*/ 29, 0x00, + /* RLE: 009 Pixels @ 079,170*/ 9, 0x08, + /* RLE: 001 Pixels @ 088,170*/ 1, 0x0B, + /* RLE: 117 Pixels @ 089,170*/ 117, 0x00, + /* RLE: 003 Pixels @ 206,170*/ 3, 0x04, + /* RLE: 005 Pixels @ 209,170*/ 5, 0x03, + /* ABS: 006 Pixels @ 214,170*/ 0, 6, 0x0E, 0x07, 0x07, 0x07, 0x06, 0x03, + /* RLE: 034 Pixels @ 220,170*/ 34, 0x00, + /* RLE: 001 Pixels @ 254,170*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,170*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,170*/ 1, 0x04, + /* RLE: 086 Pixels @ 262,170*/ 86, 0x00, + /* ABS: 005 Pixels @ 348,170*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 353,170*/ 18, 0x00, + /* RLE: 004 Pixels @ 371,170*/ 4, 0x06, + /* RLE: 013 Pixels @ 375,170*/ 13, 0x01, + /* RLE: 042 Pixels @ 000,171*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,171*/ 1, 0x04, + /* RLE: 006 Pixels @ 043,171*/ 6, 0x03, + /* RLE: 001 Pixels @ 049,171*/ 1, 0x04, + /* RLE: 029 Pixels @ 050,171*/ 29, 0x00, + /* RLE: 001 Pixels @ 079,171*/ 1, 0x0B, + /* RLE: 009 Pixels @ 080,171*/ 9, 0x08, + /* RLE: 001 Pixels @ 089,171*/ 1, 0x0B, + /* RLE: 112 Pixels @ 090,171*/ 112, 0x00, + /* RLE: 003 Pixels @ 202,171*/ 3, 0x04, + /* RLE: 008 Pixels @ 205,171*/ 8, 0x03, + /* ABS: 008 Pixels @ 213,171*/ 0, 8, 0x0B, 0x07, 0x0E, 0x0D, 0x0A, 0x0F, 0x04, 0x03, + /* RLE: 033 Pixels @ 221,171*/ 33, 0x00, + /* RLE: 001 Pixels @ 254,171*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,171*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,171*/ 1, 0x04, + /* RLE: 087 Pixels @ 262,171*/ 87, 0x00, + /* ABS: 005 Pixels @ 349,171*/ 0, 5, 0x0D, 0x0D, 0x03, 0x0D, 0x06, + /* RLE: 018 Pixels @ 354,171*/ 18, 0x00, + /* RLE: 005 Pixels @ 372,171*/ 5, 0x06, + /* RLE: 011 Pixels @ 377,171*/ 11, 0x01, + /* RLE: 042 Pixels @ 000,172*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,172*/ 1, 0x04, + /* RLE: 006 Pixels @ 043,172*/ 6, 0x03, + /* RLE: 001 Pixels @ 049,172*/ 1, 0x04, + /* RLE: 030 Pixels @ 050,172*/ 30, 0x00, + /* RLE: 009 Pixels @ 080,172*/ 9, 0x08, + /* RLE: 001 Pixels @ 089,172*/ 1, 0x0B, + /* RLE: 108 Pixels @ 090,172*/ 108, 0x00, + /* RLE: 003 Pixels @ 198,172*/ 3, 0x04, + /* RLE: 012 Pixels @ 201,172*/ 12, 0x03, + /* ABS: 009 Pixels @ 213,172*/ 0, 9, 0x0B, 0x12, 0x03, 0x07, 0x03, 0x06, 0x0B, 0x03, 0x04, + /* RLE: 032 Pixels @ 222,172*/ 32, 0x00, + /* RLE: 001 Pixels @ 254,172*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,172*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,172*/ 1, 0x04, + /* RLE: 089 Pixels @ 262,172*/ 89, 0x00, + /* ABS: 004 Pixels @ 351,172*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 355,172*/ 18, 0x00, + /* RLE: 005 Pixels @ 373,172*/ 5, 0x06, + /* RLE: 010 Pixels @ 378,172*/ 10, 0x01, + /* RLE: 042 Pixels @ 000,173*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,173*/ 1, 0x04, + /* RLE: 006 Pixels @ 043,173*/ 6, 0x03, + /* RLE: 001 Pixels @ 049,173*/ 1, 0x04, + /* RLE: 030 Pixels @ 050,173*/ 30, 0x00, + /* RLE: 001 Pixels @ 080,173*/ 1, 0x0B, + /* RLE: 009 Pixels @ 081,173*/ 9, 0x08, + /* RLE: 104 Pixels @ 090,173*/ 104, 0x00, + /* RLE: 003 Pixels @ 194,173*/ 3, 0x04, + /* RLE: 016 Pixels @ 197,173*/ 16, 0x03, + /* ABS: 009 Pixels @ 213,173*/ 0, 9, 0x04, 0x11, 0x0A, 0x06, 0x12, 0x07, 0x0A, 0x03, 0x04, + /* RLE: 032 Pixels @ 222,173*/ 32, 0x00, + /* RLE: 001 Pixels @ 254,173*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,173*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,173*/ 1, 0x04, + /* RLE: 090 Pixels @ 262,173*/ 90, 0x00, + /* ABS: 004 Pixels @ 352,173*/ 0, 4, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 356,173*/ 18, 0x00, + /* ABS: 005 Pixels @ 374,173*/ 0, 5, 0x06, 0x06, 0x03, 0x06, 0x06, + /* RLE: 009 Pixels @ 379,173*/ 9, 0x01, + /* RLE: 042 Pixels @ 000,174*/ 42, 0x02, + /* RLE: 001 Pixels @ 042,174*/ 1, 0x04, + /* RLE: 007 Pixels @ 043,174*/ 7, 0x03, + /* RLE: 031 Pixels @ 050,174*/ 31, 0x00, + /* RLE: 009 Pixels @ 081,174*/ 9, 0x08, + /* RLE: 001 Pixels @ 090,174*/ 1, 0x0B, + /* RLE: 099 Pixels @ 091,174*/ 99, 0x00, + /* RLE: 003 Pixels @ 190,174*/ 3, 0x04, + /* RLE: 021 Pixels @ 193,174*/ 21, 0x03, + /* ABS: 005 Pixels @ 214,174*/ 0, 5, 0x0D, 0x06, 0x0E, 0x0F, 0x04, + /* RLE: 004 Pixels @ 219,174*/ 4, 0x03, + /* RLE: 031 Pixels @ 223,174*/ 31, 0x00, + /* RLE: 001 Pixels @ 254,174*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,174*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,174*/ 1, 0x04, + /* RLE: 091 Pixels @ 262,174*/ 91, 0x00, + /* ABS: 004 Pixels @ 353,174*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 019 Pixels @ 357,174*/ 19, 0x00, + /* ABS: 004 Pixels @ 376,174*/ 0, 4, 0x06, 0x03, 0x06, 0x06, + /* RLE: 008 Pixels @ 380,174*/ 8, 0x01, + /* RLE: 043 Pixels @ 000,175*/ 43, 0x02, + /* RLE: 001 Pixels @ 043,175*/ 1, 0x04, + /* RLE: 006 Pixels @ 044,175*/ 6, 0x03, + /* RLE: 001 Pixels @ 050,175*/ 1, 0x04, + /* RLE: 030 Pixels @ 051,175*/ 30, 0x00, + /* RLE: 001 Pixels @ 081,175*/ 1, 0x0B, + /* RLE: 009 Pixels @ 082,175*/ 9, 0x08, + /* RLE: 095 Pixels @ 091,175*/ 95, 0x00, + /* RLE: 004 Pixels @ 186,175*/ 4, 0x04, + /* RLE: 025 Pixels @ 190,175*/ 25, 0x03, + /* ABS: 008 Pixels @ 215,175*/ 0, 8, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0B, 0x12, 0x03, + /* RLE: 031 Pixels @ 223,175*/ 31, 0x00, + /* RLE: 001 Pixels @ 254,175*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,175*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,175*/ 1, 0x04, + /* RLE: 092 Pixels @ 262,175*/ 92, 0x00, + /* ABS: 004 Pixels @ 354,175*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 019 Pixels @ 358,175*/ 19, 0x00, + /* ABS: 004 Pixels @ 377,175*/ 0, 4, 0x06, 0x03, 0x06, 0x06, + /* RLE: 007 Pixels @ 381,175*/ 7, 0x01, + /* RLE: 043 Pixels @ 000,176*/ 43, 0x02, + /* RLE: 001 Pixels @ 043,176*/ 1, 0x04, + /* RLE: 006 Pixels @ 044,176*/ 6, 0x03, + /* RLE: 001 Pixels @ 050,176*/ 1, 0x04, + /* RLE: 031 Pixels @ 051,176*/ 31, 0x00, + /* RLE: 009 Pixels @ 082,176*/ 9, 0x08, + /* RLE: 001 Pixels @ 091,176*/ 1, 0x0B, + /* RLE: 090 Pixels @ 092,176*/ 90, 0x00, + /* RLE: 004 Pixels @ 182,176*/ 4, 0x04, + /* RLE: 024 Pixels @ 186,176*/ 24, 0x03, + /* RLE: 003 Pixels @ 210,176*/ 3, 0x04, + /* ABS: 009 Pixels @ 213,176*/ 0, 9, 0x03, 0x00, 0x0B, 0x12, 0x11, 0x07, 0x07, 0x07, 0x11, + /* RLE: 032 Pixels @ 222,176*/ 32, 0x00, + /* RLE: 001 Pixels @ 254,176*/ 1, 0x04, + /* RLE: 006 Pixels @ 255,176*/ 6, 0x03, + /* RLE: 001 Pixels @ 261,176*/ 1, 0x04, + /* RLE: 093 Pixels @ 262,176*/ 93, 0x00, + /* ABS: 005 Pixels @ 355,176*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 360,176*/ 18, 0x00, + /* RLE: 004 Pixels @ 378,176*/ 4, 0x06, + /* RLE: 006 Pixels @ 382,176*/ 6, 0x01, + /* RLE: 043 Pixels @ 000,177*/ 43, 0x02, + /* RLE: 001 Pixels @ 043,177*/ 1, 0x04, + /* RLE: 006 Pixels @ 044,177*/ 6, 0x03, + /* RLE: 001 Pixels @ 050,177*/ 1, 0x04, + /* RLE: 031 Pixels @ 051,177*/ 31, 0x00, + /* RLE: 001 Pixels @ 082,177*/ 1, 0x0B, + /* RLE: 009 Pixels @ 083,177*/ 9, 0x08, + /* RLE: 086 Pixels @ 092,177*/ 86, 0x00, + /* RLE: 004 Pixels @ 178,177*/ 4, 0x04, + /* RLE: 024 Pixels @ 182,177*/ 24, 0x03, + /* RLE: 004 Pixels @ 206,177*/ 4, 0x04, + /* RLE: 003 Pixels @ 210,177*/ 3, 0x00, + /* ABS: 010 Pixels @ 213,177*/ 0, 10, 0x03, 0x12, 0x07, 0x11, 0x12, 0x0B, 0x0A, 0x03, 0x03, 0x03, + /* RLE: 030 Pixels @ 223,177*/ 30, 0x00, + /* RLE: 001 Pixels @ 253,177*/ 1, 0x04, + /* RLE: 007 Pixels @ 254,177*/ 7, 0x03, + /* RLE: 095 Pixels @ 261,177*/ 95, 0x00, + /* ABS: 005 Pixels @ 356,177*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 361,177*/ 18, 0x00, + /* RLE: 005 Pixels @ 379,177*/ 5, 0x06, + /* RLE: 004 Pixels @ 384,177*/ 4, 0x01, + /* RLE: 043 Pixels @ 000,178*/ 43, 0x02, + /* RLE: 001 Pixels @ 043,178*/ 1, 0x04, + /* RLE: 006 Pixels @ 044,178*/ 6, 0x03, + /* RLE: 001 Pixels @ 050,178*/ 1, 0x04, + /* RLE: 032 Pixels @ 051,178*/ 32, 0x00, + /* RLE: 009 Pixels @ 083,178*/ 9, 0x08, + /* RLE: 001 Pixels @ 092,178*/ 1, 0x0B, + /* RLE: 081 Pixels @ 093,178*/ 81, 0x00, + /* RLE: 004 Pixels @ 174,178*/ 4, 0x04, + /* RLE: 024 Pixels @ 178,178*/ 24, 0x03, + /* RLE: 004 Pixels @ 202,178*/ 4, 0x04, + /* RLE: 007 Pixels @ 206,178*/ 7, 0x00, + /* ABS: 011 Pixels @ 213,178*/ 0, 11, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x04, + /* RLE: 029 Pixels @ 224,178*/ 29, 0x00, + /* RLE: 001 Pixels @ 253,178*/ 1, 0x04, + /* RLE: 006 Pixels @ 254,178*/ 6, 0x03, + /* RLE: 001 Pixels @ 260,178*/ 1, 0x04, + /* RLE: 096 Pixels @ 261,178*/ 96, 0x00, + /* ABS: 005 Pixels @ 357,178*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 362,178*/ 18, 0x00, + /* ABS: 008 Pixels @ 380,178*/ 0, 8, 0x06, 0x06, 0x03, 0x06, 0x06, 0x01, 0x01, 0x01, + /* RLE: 043 Pixels @ 000,179*/ 43, 0x02, + /* RLE: 001 Pixels @ 043,179*/ 1, 0x04, + /* RLE: 006 Pixels @ 044,179*/ 6, 0x03, + /* RLE: 001 Pixels @ 050,179*/ 1, 0x04, + /* RLE: 032 Pixels @ 051,179*/ 32, 0x00, + /* RLE: 001 Pixels @ 083,179*/ 1, 0x0B, + /* RLE: 009 Pixels @ 084,179*/ 9, 0x08, + /* RLE: 077 Pixels @ 093,179*/ 77, 0x00, + /* RLE: 004 Pixels @ 170,179*/ 4, 0x04, + /* RLE: 024 Pixels @ 174,179*/ 24, 0x03, + /* RLE: 004 Pixels @ 198,179*/ 4, 0x04, + /* RLE: 013 Pixels @ 202,179*/ 13, 0x00, + /* ABS: 009 Pixels @ 215,179*/ 0, 9, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x06, 0x03, 0x03, 0x04, + /* RLE: 029 Pixels @ 224,179*/ 29, 0x00, + /* RLE: 001 Pixels @ 253,179*/ 1, 0x04, + /* RLE: 006 Pixels @ 254,179*/ 6, 0x03, + /* RLE: 001 Pixels @ 260,179*/ 1, 0x04, + /* RLE: 098 Pixels @ 261,179*/ 98, 0x00, + /* ABS: 004 Pixels @ 359,179*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 363,179*/ 18, 0x00, + /* ABS: 007 Pixels @ 381,179*/ 0, 7, 0x06, 0x06, 0x03, 0x06, 0x06, 0x01, 0x01, + /* RLE: 043 Pixels @ 000,180*/ 43, 0x02, + /* RLE: 001 Pixels @ 043,180*/ 1, 0x04, + /* RLE: 007 Pixels @ 044,180*/ 7, 0x03, + /* RLE: 032 Pixels @ 051,180*/ 32, 0x00, + /* RLE: 001 Pixels @ 083,180*/ 1, 0x0B, + /* RLE: 009 Pixels @ 084,180*/ 9, 0x08, + /* RLE: 001 Pixels @ 093,180*/ 1, 0x0B, + /* RLE: 072 Pixels @ 094,180*/ 72, 0x00, + /* RLE: 004 Pixels @ 166,180*/ 4, 0x04, + /* RLE: 024 Pixels @ 170,180*/ 24, 0x03, + /* RLE: 004 Pixels @ 194,180*/ 4, 0x04, + /* RLE: 016 Pixels @ 198,180*/ 16, 0x00, + /* ABS: 010 Pixels @ 214,180*/ 0, 10, 0x03, 0x04, 0x07, 0x12, 0x04, 0x04, 0x0F, 0x04, 0x03, 0x04, + /* RLE: 029 Pixels @ 224,180*/ 29, 0x00, + /* RLE: 001 Pixels @ 253,180*/ 1, 0x04, + /* RLE: 006 Pixels @ 254,180*/ 6, 0x03, + /* RLE: 001 Pixels @ 260,180*/ 1, 0x04, + /* RLE: 099 Pixels @ 261,180*/ 99, 0x00, + /* ABS: 004 Pixels @ 360,180*/ 0, 4, 0x0D, 0x0D, 0x06, 0x06, + /* RLE: 019 Pixels @ 364,180*/ 19, 0x00, + /* ABS: 005 Pixels @ 383,180*/ 0, 5, 0x06, 0x03, 0x06, 0x06, 0x01, + /* RLE: 044 Pixels @ 000,181*/ 44, 0x02, + /* RLE: 001 Pixels @ 044,181*/ 1, 0x04, + /* RLE: 006 Pixels @ 045,181*/ 6, 0x03, + /* RLE: 001 Pixels @ 051,181*/ 1, 0x04, + /* RLE: 032 Pixels @ 052,181*/ 32, 0x00, + /* RLE: 001 Pixels @ 084,181*/ 1, 0x0B, + /* RLE: 009 Pixels @ 085,181*/ 9, 0x08, + /* RLE: 069 Pixels @ 094,181*/ 69, 0x00, + /* RLE: 003 Pixels @ 163,181*/ 3, 0x04, + /* RLE: 025 Pixels @ 166,181*/ 25, 0x03, + /* RLE: 003 Pixels @ 191,181*/ 3, 0x04, + /* RLE: 020 Pixels @ 194,181*/ 20, 0x00, + /* ABS: 011 Pixels @ 214,181*/ 0, 11, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x06, 0x0B, 0x03, 0x03, 0x03, + /* RLE: 028 Pixels @ 225,181*/ 28, 0x00, + /* RLE: 001 Pixels @ 253,181*/ 1, 0x04, + /* RLE: 006 Pixels @ 254,181*/ 6, 0x03, + /* RLE: 001 Pixels @ 260,181*/ 1, 0x04, + /* RLE: 100 Pixels @ 261,181*/ 100, 0x00, + /* ABS: 004 Pixels @ 361,181*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 019 Pixels @ 365,181*/ 19, 0x00, + /* RLE: 004 Pixels @ 384,181*/ 4, 0x06, + /* RLE: 044 Pixels @ 000,182*/ 44, 0x02, + /* RLE: 001 Pixels @ 044,182*/ 1, 0x04, + /* RLE: 006 Pixels @ 045,182*/ 6, 0x03, + /* RLE: 001 Pixels @ 051,182*/ 1, 0x04, + /* RLE: 032 Pixels @ 052,182*/ 32, 0x00, + /* RLE: 001 Pixels @ 084,182*/ 1, 0x0B, + /* RLE: 009 Pixels @ 085,182*/ 9, 0x08, + /* RLE: 001 Pixels @ 094,182*/ 1, 0x0B, + /* RLE: 067 Pixels @ 095,182*/ 67, 0x00, + /* ABS: 002 Pixels @ 162,182*/ 0, 2, 0x04, 0x04, + /* RLE: 023 Pixels @ 164,182*/ 23, 0x03, + /* RLE: 003 Pixels @ 187,182*/ 3, 0x04, + /* RLE: 024 Pixels @ 190,182*/ 24, 0x00, + /* ABS: 011 Pixels @ 214,182*/ 0, 11, 0x03, 0x0A, 0x11, 0x00, 0x03, 0x0A, 0x0F, 0x12, 0x0D, 0x0F, 0x03, + /* RLE: 028 Pixels @ 225,182*/ 28, 0x00, + /* RLE: 001 Pixels @ 253,182*/ 1, 0x04, + /* RLE: 006 Pixels @ 254,182*/ 6, 0x03, + /* RLE: 001 Pixels @ 260,182*/ 1, 0x04, + /* RLE: 101 Pixels @ 261,182*/ 101, 0x00, + /* ABS: 005 Pixels @ 362,182*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 367,182*/ 18, 0x00, + /* RLE: 003 Pixels @ 385,182*/ 3, 0x06, + /* RLE: 044 Pixels @ 000,183*/ 44, 0x02, + /* RLE: 001 Pixels @ 044,183*/ 1, 0x04, + /* RLE: 006 Pixels @ 045,183*/ 6, 0x03, + /* RLE: 001 Pixels @ 051,183*/ 1, 0x04, + /* RLE: 033 Pixels @ 052,183*/ 33, 0x00, + /* RLE: 001 Pixels @ 085,183*/ 1, 0x0B, + /* RLE: 009 Pixels @ 086,183*/ 9, 0x08, + /* RLE: 065 Pixels @ 095,183*/ 65, 0x00, + /* RLE: 003 Pixels @ 160,183*/ 3, 0x04, + /* RLE: 020 Pixels @ 163,183*/ 20, 0x03, + /* RLE: 003 Pixels @ 183,183*/ 3, 0x04, + /* RLE: 029 Pixels @ 186,183*/ 29, 0x00, + /* ABS: 002 Pixels @ 215,183*/ 0, 2, 0x03, 0x0D, + /* RLE: 004 Pixels @ 217,183*/ 4, 0x07, + /* ABS: 004 Pixels @ 221,183*/ 0, 4, 0x0F, 0x06, 0x0B, 0x03, + /* RLE: 028 Pixels @ 225,183*/ 28, 0x00, + /* RLE: 001 Pixels @ 253,183*/ 1, 0x04, + /* RLE: 006 Pixels @ 254,183*/ 6, 0x03, + /* RLE: 001 Pixels @ 260,183*/ 1, 0x04, + /* RLE: 102 Pixels @ 261,183*/ 102, 0x00, + /* ABS: 005 Pixels @ 363,183*/ 0, 5, 0x0D, 0x06, 0x03, 0x06, 0x06, + /* RLE: 018 Pixels @ 368,183*/ 18, 0x00, + /* ABS: 002 Pixels @ 386,183*/ 0, 2, 0x06, 0x06, + /* RLE: 044 Pixels @ 000,184*/ 44, 0x02, + /* RLE: 001 Pixels @ 044,184*/ 1, 0x04, + /* RLE: 006 Pixels @ 045,184*/ 6, 0x03, + /* RLE: 001 Pixels @ 051,184*/ 1, 0x04, + /* RLE: 033 Pixels @ 052,184*/ 33, 0x00, + /* RLE: 001 Pixels @ 085,184*/ 1, 0x0B, + /* RLE: 009 Pixels @ 086,184*/ 9, 0x08, + /* RLE: 001 Pixels @ 095,184*/ 1, 0x0B, + /* RLE: 063 Pixels @ 096,184*/ 63, 0x00, + /* ABS: 002 Pixels @ 159,184*/ 0, 2, 0x04, 0x04, + /* RLE: 018 Pixels @ 161,184*/ 18, 0x03, + /* RLE: 003 Pixels @ 179,184*/ 3, 0x04, + /* RLE: 033 Pixels @ 182,184*/ 33, 0x00, + /* ABS: 009 Pixels @ 215,184*/ 0, 9, 0x03, 0x11, 0x06, 0x0E, 0x04, 0x00, 0x03, 0x03, 0x03, + /* RLE: 028 Pixels @ 224,184*/ 28, 0x00, + /* RLE: 001 Pixels @ 252,184*/ 1, 0x04, + /* RLE: 007 Pixels @ 253,184*/ 7, 0x03, + /* RLE: 104 Pixels @ 260,184*/ 104, 0x00, + /* RLE: 003 Pixels @ 364,184*/ 3, 0x0D, + /* ABS: 002 Pixels @ 367,184*/ 0, 2, 0x06, 0x06, + /* RLE: 018 Pixels @ 369,184*/ 18, 0x00, + /* RLE: 001 Pixels @ 387,184*/ 1, 0x06, + /* RLE: 044 Pixels @ 000,185*/ 44, 0x02, + /* RLE: 001 Pixels @ 044,185*/ 1, 0x04, + /* RLE: 006 Pixels @ 045,185*/ 6, 0x03, + /* RLE: 001 Pixels @ 051,185*/ 1, 0x04, + /* RLE: 034 Pixels @ 052,185*/ 34, 0x00, + /* RLE: 001 Pixels @ 086,185*/ 1, 0x0B, + /* RLE: 009 Pixels @ 087,185*/ 9, 0x08, + /* RLE: 061 Pixels @ 096,185*/ 61, 0x00, + /* ABS: 002 Pixels @ 157,185*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 159,185*/ 16, 0x03, + /* RLE: 003 Pixels @ 175,185*/ 3, 0x04, + /* RLE: 037 Pixels @ 178,185*/ 37, 0x00, + /* RLE: 010 Pixels @ 215,185*/ 10, 0x03, + /* RLE: 001 Pixels @ 225,185*/ 1, 0x04, + /* RLE: 026 Pixels @ 226,185*/ 26, 0x00, + /* RLE: 001 Pixels @ 252,185*/ 1, 0x04, + /* RLE: 006 Pixels @ 253,185*/ 6, 0x03, + /* RLE: 001 Pixels @ 259,185*/ 1, 0x04, + /* RLE: 106 Pixels @ 260,185*/ 106, 0x00, + /* ABS: 004 Pixels @ 366,185*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 018 Pixels @ 370,185*/ 18, 0x00, + /* RLE: 044 Pixels @ 000,186*/ 44, 0x02, + /* RLE: 001 Pixels @ 044,186*/ 1, 0x04, + /* RLE: 007 Pixels @ 045,186*/ 7, 0x03, + /* RLE: 034 Pixels @ 052,186*/ 34, 0x00, + /* RLE: 001 Pixels @ 086,186*/ 1, 0x0B, + /* RLE: 009 Pixels @ 087,186*/ 9, 0x08, + /* RLE: 001 Pixels @ 096,186*/ 1, 0x0B, + /* RLE: 059 Pixels @ 097,186*/ 59, 0x00, + /* ABS: 002 Pixels @ 156,186*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 158,186*/ 13, 0x03, + /* RLE: 003 Pixels @ 171,186*/ 3, 0x04, + /* RLE: 044 Pixels @ 174,186*/ 44, 0x00, + /* RLE: 001 Pixels @ 218,186*/ 1, 0x04, + /* RLE: 006 Pixels @ 219,186*/ 6, 0x03, + /* RLE: 001 Pixels @ 225,186*/ 1, 0x04, + /* RLE: 026 Pixels @ 226,186*/ 26, 0x00, + /* RLE: 001 Pixels @ 252,186*/ 1, 0x04, + /* RLE: 006 Pixels @ 253,186*/ 6, 0x03, + /* RLE: 001 Pixels @ 259,186*/ 1, 0x04, + /* RLE: 107 Pixels @ 260,186*/ 107, 0x00, + /* ABS: 004 Pixels @ 367,186*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 017 Pixels @ 371,186*/ 17, 0x00, + /* RLE: 045 Pixels @ 000,187*/ 45, 0x02, + /* RLE: 001 Pixels @ 045,187*/ 1, 0x04, + /* RLE: 006 Pixels @ 046,187*/ 6, 0x03, + /* RLE: 001 Pixels @ 052,187*/ 1, 0x04, + /* RLE: 034 Pixels @ 053,187*/ 34, 0x00, + /* RLE: 001 Pixels @ 087,187*/ 1, 0x0B, + /* RLE: 009 Pixels @ 088,187*/ 9, 0x08, + /* RLE: 057 Pixels @ 097,187*/ 57, 0x00, + /* ABS: 002 Pixels @ 154,187*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 156,187*/ 11, 0x03, + /* RLE: 003 Pixels @ 167,187*/ 3, 0x04, + /* RLE: 048 Pixels @ 170,187*/ 48, 0x00, + /* RLE: 001 Pixels @ 218,187*/ 1, 0x04, + /* RLE: 006 Pixels @ 219,187*/ 6, 0x03, + /* RLE: 001 Pixels @ 225,187*/ 1, 0x04, + /* RLE: 026 Pixels @ 226,187*/ 26, 0x00, + /* RLE: 001 Pixels @ 252,187*/ 1, 0x04, + /* RLE: 006 Pixels @ 253,187*/ 6, 0x03, + /* RLE: 001 Pixels @ 259,187*/ 1, 0x04, + /* RLE: 108 Pixels @ 260,187*/ 108, 0x00, + /* ABS: 004 Pixels @ 368,187*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 016 Pixels @ 372,187*/ 16, 0x00, + /* RLE: 045 Pixels @ 000,188*/ 45, 0x02, + /* RLE: 001 Pixels @ 045,188*/ 1, 0x04, + /* RLE: 006 Pixels @ 046,188*/ 6, 0x03, + /* RLE: 001 Pixels @ 052,188*/ 1, 0x04, + /* RLE: 034 Pixels @ 053,188*/ 34, 0x00, + /* RLE: 001 Pixels @ 087,188*/ 1, 0x0B, + /* RLE: 009 Pixels @ 088,188*/ 9, 0x08, + /* RLE: 001 Pixels @ 097,188*/ 1, 0x0B, + /* RLE: 054 Pixels @ 098,188*/ 54, 0x00, + /* RLE: 003 Pixels @ 152,188*/ 3, 0x04, + /* RLE: 011 Pixels @ 155,188*/ 11, 0x03, + /* ABS: 002 Pixels @ 166,188*/ 0, 2, 0x04, 0x04, + /* RLE: 050 Pixels @ 168,188*/ 50, 0x00, + /* RLE: 001 Pixels @ 218,188*/ 1, 0x04, + /* RLE: 007 Pixels @ 219,188*/ 7, 0x03, + /* RLE: 026 Pixels @ 226,188*/ 26, 0x00, + /* RLE: 001 Pixels @ 252,188*/ 1, 0x04, + /* RLE: 006 Pixels @ 253,188*/ 6, 0x03, + /* RLE: 001 Pixels @ 259,188*/ 1, 0x04, + /* RLE: 109 Pixels @ 260,188*/ 109, 0x00, + /* ABS: 005 Pixels @ 369,188*/ 0, 5, 0x0D, 0x0D, 0x03, 0x06, 0x06, + /* RLE: 014 Pixels @ 374,188*/ 14, 0x00, + /* RLE: 045 Pixels @ 000,189*/ 45, 0x02, + /* RLE: 001 Pixels @ 045,189*/ 1, 0x04, + /* RLE: 006 Pixels @ 046,189*/ 6, 0x03, + /* RLE: 001 Pixels @ 052,189*/ 1, 0x04, + /* RLE: 035 Pixels @ 053,189*/ 35, 0x00, + /* RLE: 001 Pixels @ 088,189*/ 1, 0x0B, + /* RLE: 008 Pixels @ 089,189*/ 8, 0x08, + /* RLE: 001 Pixels @ 097,189*/ 1, 0x0B, + /* RLE: 054 Pixels @ 098,189*/ 54, 0x00, + /* ABS: 002 Pixels @ 152,189*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 154,189*/ 10, 0x03, + /* ABS: 002 Pixels @ 164,189*/ 0, 2, 0x04, 0x04, + /* RLE: 053 Pixels @ 166,189*/ 53, 0x00, + /* RLE: 001 Pixels @ 219,189*/ 1, 0x04, + /* RLE: 006 Pixels @ 220,189*/ 6, 0x03, + /* RLE: 001 Pixels @ 226,189*/ 1, 0x04, + /* RLE: 025 Pixels @ 227,189*/ 25, 0x00, + /* RLE: 001 Pixels @ 252,189*/ 1, 0x04, + /* RLE: 006 Pixels @ 253,189*/ 6, 0x03, + /* RLE: 001 Pixels @ 259,189*/ 1, 0x04, + /* RLE: 110 Pixels @ 260,189*/ 110, 0x00, + /* RLE: 001 Pixels @ 370,189*/ 1, 0x0D, + /* RLE: 004 Pixels @ 371,189*/ 4, 0x06, + /* RLE: 013 Pixels @ 375,189*/ 13, 0x00, + /* RLE: 045 Pixels @ 000,190*/ 45, 0x02, + /* RLE: 001 Pixels @ 045,190*/ 1, 0x04, + /* RLE: 006 Pixels @ 046,190*/ 6, 0x03, + /* RLE: 001 Pixels @ 052,190*/ 1, 0x04, + /* RLE: 035 Pixels @ 053,190*/ 35, 0x00, + /* RLE: 001 Pixels @ 088,190*/ 1, 0x0B, + /* RLE: 009 Pixels @ 089,190*/ 9, 0x08, + /* RLE: 001 Pixels @ 098,190*/ 1, 0x0B, + /* RLE: 053 Pixels @ 099,190*/ 53, 0x00, + /* RLE: 001 Pixels @ 152,190*/ 1, 0x04, + /* RLE: 009 Pixels @ 153,190*/ 9, 0x03, + /* RLE: 003 Pixels @ 162,190*/ 3, 0x04, + /* RLE: 054 Pixels @ 165,190*/ 54, 0x00, + /* RLE: 001 Pixels @ 219,190*/ 1, 0x04, + /* RLE: 006 Pixels @ 220,190*/ 6, 0x03, + /* RLE: 001 Pixels @ 226,190*/ 1, 0x04, + /* RLE: 024 Pixels @ 227,190*/ 24, 0x00, + /* ABS: 002 Pixels @ 251,190*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 253,190*/ 6, 0x03, + /* RLE: 001 Pixels @ 259,190*/ 1, 0x04, + /* RLE: 111 Pixels @ 260,190*/ 111, 0x00, + /* ABS: 005 Pixels @ 371,190*/ 0, 5, 0x0D, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 012 Pixels @ 376,190*/ 12, 0x00, + /* RLE: 045 Pixels @ 000,191*/ 45, 0x02, + /* RLE: 001 Pixels @ 045,191*/ 1, 0x04, + /* RLE: 006 Pixels @ 046,191*/ 6, 0x03, + /* RLE: 001 Pixels @ 052,191*/ 1, 0x04, + /* RLE: 036 Pixels @ 053,191*/ 36, 0x00, + /* RLE: 001 Pixels @ 089,191*/ 1, 0x0B, + /* RLE: 008 Pixels @ 090,191*/ 8, 0x08, + /* RLE: 001 Pixels @ 098,191*/ 1, 0x0B, + /* RLE: 051 Pixels @ 099,191*/ 51, 0x00, + /* RLE: 011 Pixels @ 150,191*/ 11, 0x03, + /* ABS: 002 Pixels @ 161,191*/ 0, 2, 0x04, 0x04, + /* RLE: 056 Pixels @ 163,191*/ 56, 0x00, + /* RLE: 001 Pixels @ 219,191*/ 1, 0x04, + /* RLE: 006 Pixels @ 220,191*/ 6, 0x03, + /* RLE: 001 Pixels @ 226,191*/ 1, 0x04, + /* RLE: 024 Pixels @ 227,191*/ 24, 0x00, + /* RLE: 001 Pixels @ 251,191*/ 1, 0x04, + /* RLE: 007 Pixels @ 252,191*/ 7, 0x03, + /* RLE: 114 Pixels @ 259,191*/ 114, 0x00, + /* ABS: 004 Pixels @ 373,191*/ 0, 4, 0x0D, 0x0D, 0x06, 0x06, + /* RLE: 011 Pixels @ 377,191*/ 11, 0x00, + /* RLE: 045 Pixels @ 000,192*/ 45, 0x02, + /* RLE: 001 Pixels @ 045,192*/ 1, 0x04, + /* RLE: 007 Pixels @ 046,192*/ 7, 0x03, + /* RLE: 036 Pixels @ 053,192*/ 36, 0x00, + /* RLE: 001 Pixels @ 089,192*/ 1, 0x0B, + /* RLE: 009 Pixels @ 090,192*/ 9, 0x08, + /* RLE: 050 Pixels @ 099,192*/ 50, 0x00, + /* ABS: 006 Pixels @ 149,192*/ 0, 6, 0x03, 0x00, 0x0B, 0x0B, 0x04, 0x00, + /* RLE: 004 Pixels @ 155,192*/ 4, 0x03, + /* RLE: 003 Pixels @ 159,192*/ 3, 0x04, + /* RLE: 058 Pixels @ 162,192*/ 58, 0x00, + /* RLE: 007 Pixels @ 220,192*/ 7, 0x03, + /* RLE: 001 Pixels @ 227,192*/ 1, 0x04, + /* RLE: 022 Pixels @ 228,192*/ 22, 0x00, + /* ABS: 002 Pixels @ 250,192*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 252,192*/ 6, 0x03, + /* RLE: 001 Pixels @ 258,192*/ 1, 0x04, + /* RLE: 115 Pixels @ 259,192*/ 115, 0x00, + /* ABS: 004 Pixels @ 374,192*/ 0, 4, 0x0D, 0x03, 0x03, 0x06, + /* RLE: 010 Pixels @ 378,192*/ 10, 0x00, + /* RLE: 046 Pixels @ 000,193*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,193*/ 1, 0x04, + /* RLE: 006 Pixels @ 047,193*/ 6, 0x03, + /* RLE: 001 Pixels @ 053,193*/ 1, 0x04, + /* RLE: 036 Pixels @ 054,193*/ 36, 0x00, + /* RLE: 001 Pixels @ 090,193*/ 1, 0x0B, + /* RLE: 008 Pixels @ 091,193*/ 8, 0x08, + /* RLE: 001 Pixels @ 099,193*/ 1, 0x0B, + /* RLE: 048 Pixels @ 100,193*/ 48, 0x00, + /* ABS: 003 Pixels @ 148,193*/ 0, 3, 0x03, 0x00, 0x0F, + /* RLE: 004 Pixels @ 151,193*/ 4, 0x07, + /* ABS: 005 Pixels @ 155,193*/ 0, 5, 0x06, 0x03, 0x03, 0x04, 0x04, + /* RLE: 060 Pixels @ 160,193*/ 60, 0x00, + /* RLE: 001 Pixels @ 220,193*/ 1, 0x04, + /* RLE: 006 Pixels @ 221,193*/ 6, 0x03, + /* RLE: 001 Pixels @ 227,193*/ 1, 0x04, + /* RLE: 022 Pixels @ 228,193*/ 22, 0x00, + /* RLE: 001 Pixels @ 250,193*/ 1, 0x04, + /* RLE: 007 Pixels @ 251,193*/ 7, 0x03, + /* RLE: 001 Pixels @ 258,193*/ 1, 0x04, + /* RLE: 116 Pixels @ 259,193*/ 116, 0x00, + /* ABS: 004 Pixels @ 375,193*/ 0, 4, 0x0D, 0x06, 0x03, 0x06, + /* RLE: 009 Pixels @ 379,193*/ 9, 0x00, + /* RLE: 046 Pixels @ 000,194*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,194*/ 1, 0x04, + /* RLE: 006 Pixels @ 047,194*/ 6, 0x03, + /* RLE: 001 Pixels @ 053,194*/ 1, 0x04, + /* RLE: 036 Pixels @ 054,194*/ 36, 0x00, + /* RLE: 001 Pixels @ 090,194*/ 1, 0x0B, + /* RLE: 008 Pixels @ 091,194*/ 8, 0x08, + /* RLE: 001 Pixels @ 099,194*/ 1, 0x0B, + /* RLE: 050 Pixels @ 100,194*/ 50, 0x00, + /* ABS: 008 Pixels @ 150,194*/ 0, 8, 0x11, 0x03, 0x03, 0x00, 0x04, 0x04, 0x03, 0x03, + /* RLE: 062 Pixels @ 158,194*/ 62, 0x00, + /* RLE: 001 Pixels @ 220,194*/ 1, 0x04, + /* RLE: 006 Pixels @ 221,194*/ 6, 0x03, + /* ABS: 002 Pixels @ 227,194*/ 0, 2, 0x04, 0x04, + /* RLE: 020 Pixels @ 229,194*/ 20, 0x00, + /* RLE: 001 Pixels @ 249,194*/ 1, 0x04, + /* RLE: 007 Pixels @ 250,194*/ 7, 0x03, + /* RLE: 001 Pixels @ 257,194*/ 1, 0x04, + /* RLE: 118 Pixels @ 258,194*/ 118, 0x00, + /* RLE: 001 Pixels @ 376,194*/ 1, 0x0D, + /* RLE: 004 Pixels @ 377,194*/ 4, 0x06, + /* RLE: 007 Pixels @ 381,194*/ 7, 0x00, + /* RLE: 046 Pixels @ 000,195*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,195*/ 1, 0x04, + /* RLE: 006 Pixels @ 047,195*/ 6, 0x03, + /* RLE: 001 Pixels @ 053,195*/ 1, 0x04, + /* RLE: 037 Pixels @ 054,195*/ 37, 0x00, + /* RLE: 009 Pixels @ 091,195*/ 9, 0x08, + /* RLE: 001 Pixels @ 100,195*/ 1, 0x0B, + /* RLE: 048 Pixels @ 101,195*/ 48, 0x00, + /* ABS: 002 Pixels @ 149,195*/ 0, 2, 0x03, 0x11, + /* RLE: 006 Pixels @ 151,195*/ 6, 0x03, + /* RLE: 001 Pixels @ 157,195*/ 1, 0x04, + /* RLE: 062 Pixels @ 158,195*/ 62, 0x00, + /* RLE: 001 Pixels @ 220,195*/ 1, 0x04, + /* RLE: 007 Pixels @ 221,195*/ 7, 0x03, + /* RLE: 001 Pixels @ 228,195*/ 1, 0x04, + /* RLE: 019 Pixels @ 229,195*/ 19, 0x00, + /* ABS: 002 Pixels @ 248,195*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 250,195*/ 7, 0x03, + /* RLE: 001 Pixels @ 257,195*/ 1, 0x04, + /* RLE: 119 Pixels @ 258,195*/ 119, 0x00, + /* RLE: 001 Pixels @ 377,195*/ 1, 0x0D, + /* RLE: 004 Pixels @ 378,195*/ 4, 0x06, + /* RLE: 006 Pixels @ 382,195*/ 6, 0x00, + /* RLE: 046 Pixels @ 000,196*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,196*/ 1, 0x04, + /* RLE: 006 Pixels @ 047,196*/ 6, 0x03, + /* RLE: 001 Pixels @ 053,196*/ 1, 0x04, + /* RLE: 037 Pixels @ 054,196*/ 37, 0x00, + /* RLE: 001 Pixels @ 091,196*/ 1, 0x0B, + /* RLE: 008 Pixels @ 092,196*/ 8, 0x08, + /* RLE: 001 Pixels @ 100,196*/ 1, 0x0B, + /* RLE: 047 Pixels @ 101,196*/ 47, 0x00, + /* ABS: 010 Pixels @ 148,196*/ 0, 10, 0x03, 0x0B, 0x07, 0x0F, 0x06, 0x0B, 0x0B, 0x03, 0x03, 0x04, + /* RLE: 063 Pixels @ 158,196*/ 63, 0x00, + /* RLE: 001 Pixels @ 221,196*/ 1, 0x04, + /* RLE: 006 Pixels @ 222,196*/ 6, 0x03, + /* ABS: 002 Pixels @ 228,196*/ 0, 2, 0x04, 0x04, + /* RLE: 018 Pixels @ 230,196*/ 18, 0x00, + /* RLE: 001 Pixels @ 248,196*/ 1, 0x04, + /* RLE: 007 Pixels @ 249,196*/ 7, 0x03, + /* RLE: 001 Pixels @ 256,196*/ 1, 0x04, + /* RLE: 121 Pixels @ 257,196*/ 121, 0x00, + /* RLE: 003 Pixels @ 378,196*/ 3, 0x0D, + /* ABS: 002 Pixels @ 381,196*/ 0, 2, 0x06, 0x06, + /* RLE: 005 Pixels @ 383,196*/ 5, 0x00, + /* RLE: 046 Pixels @ 000,197*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,197*/ 1, 0x04, + /* RLE: 006 Pixels @ 047,197*/ 6, 0x03, + /* RLE: 001 Pixels @ 053,197*/ 1, 0x04, + /* RLE: 037 Pixels @ 054,197*/ 37, 0x00, + /* RLE: 001 Pixels @ 091,197*/ 1, 0x0B, + /* RLE: 009 Pixels @ 092,197*/ 9, 0x08, + /* RLE: 049 Pixels @ 101,197*/ 49, 0x00, + /* ABS: 005 Pixels @ 150,197*/ 0, 5, 0x0B, 0x06, 0x0D, 0x07, 0x07, + /* RLE: 066 Pixels @ 155,197*/ 66, 0x00, + /* RLE: 001 Pixels @ 221,197*/ 1, 0x04, + /* RLE: 007 Pixels @ 222,197*/ 7, 0x03, + /* RLE: 001 Pixels @ 229,197*/ 1, 0x04, + /* RLE: 017 Pixels @ 230,197*/ 17, 0x00, + /* ABS: 002 Pixels @ 247,197*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 249,197*/ 6, 0x03, + /* ABS: 002 Pixels @ 255,197*/ 0, 2, 0x04, 0x04, + /* RLE: 123 Pixels @ 257,197*/ 123, 0x00, + /* ABS: 004 Pixels @ 380,197*/ 0, 4, 0x0D, 0x03, 0x0D, 0x06, + /* RLE: 004 Pixels @ 384,197*/ 4, 0x00, + /* RLE: 046 Pixels @ 000,198*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,198*/ 1, 0x04, + /* RLE: 006 Pixels @ 047,198*/ 6, 0x03, + /* RLE: 001 Pixels @ 053,198*/ 1, 0x04, + /* RLE: 038 Pixels @ 054,198*/ 38, 0x00, + /* RLE: 001 Pixels @ 092,198*/ 1, 0x0B, + /* RLE: 008 Pixels @ 093,198*/ 8, 0x08, + /* RLE: 001 Pixels @ 101,198*/ 1, 0x0B, + /* RLE: 046 Pixels @ 102,198*/ 46, 0x00, + /* RLE: 006 Pixels @ 148,198*/ 6, 0x03, + /* ABS: 002 Pixels @ 154,198*/ 0, 2, 0x00, 0x03, + /* RLE: 065 Pixels @ 156,198*/ 65, 0x00, + /* ABS: 002 Pixels @ 221,198*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 223,198*/ 7, 0x03, + /* RLE: 001 Pixels @ 230,198*/ 1, 0x04, + /* RLE: 016 Pixels @ 231,198*/ 16, 0x00, + /* RLE: 001 Pixels @ 247,198*/ 1, 0x04, + /* RLE: 007 Pixels @ 248,198*/ 7, 0x03, + /* RLE: 001 Pixels @ 255,198*/ 1, 0x04, + /* RLE: 125 Pixels @ 256,198*/ 125, 0x00, + /* ABS: 007 Pixels @ 381,198*/ 0, 7, 0x0D, 0x03, 0x03, 0x06, 0x00, 0x00, 0x00, + /* RLE: 047 Pixels @ 000,199*/ 47, 0x02, + /* RLE: 007 Pixels @ 047,199*/ 7, 0x03, + /* RLE: 038 Pixels @ 054,199*/ 38, 0x00, + /* RLE: 001 Pixels @ 092,199*/ 1, 0x0B, + /* RLE: 008 Pixels @ 093,199*/ 8, 0x08, + /* RLE: 001 Pixels @ 101,199*/ 1, 0x0B, + /* RLE: 046 Pixels @ 102,199*/ 46, 0x00, + /* ABS: 008 Pixels @ 148,199*/ 0, 8, 0x03, 0x0B, 0x07, 0x07, 0x0A, 0x0E, 0x03, 0x03, + /* RLE: 066 Pixels @ 156,199*/ 66, 0x00, + /* RLE: 001 Pixels @ 222,199*/ 1, 0x04, + /* RLE: 007 Pixels @ 223,199*/ 7, 0x03, + /* ABS: 002 Pixels @ 230,199*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 232,199*/ 14, 0x00, + /* RLE: 001 Pixels @ 246,199*/ 1, 0x04, + /* RLE: 007 Pixels @ 247,199*/ 7, 0x03, + /* ABS: 002 Pixels @ 254,199*/ 0, 2, 0x04, 0x04, + /* RLE: 126 Pixels @ 256,199*/ 126, 0x00, + /* ABS: 006 Pixels @ 382,199*/ 0, 6, 0x0D, 0x06, 0x06, 0x06, 0x00, 0x00, + /* RLE: 046 Pixels @ 000,200*/ 46, 0x02, + /* RLE: 001 Pixels @ 046,200*/ 1, 0x00, + /* RLE: 006 Pixels @ 047,200*/ 6, 0x03, + /* ABS: 003 Pixels @ 053,200*/ 0, 3, 0x00, 0x04, 0x03, + /* RLE: 037 Pixels @ 056,200*/ 37, 0x00, + /* RLE: 009 Pixels @ 093,200*/ 9, 0x08, + /* RLE: 001 Pixels @ 102,200*/ 1, 0x0B, + /* RLE: 044 Pixels @ 103,200*/ 44, 0x00, + /* ABS: 008 Pixels @ 147,200*/ 0, 8, 0x03, 0x00, 0x07, 0x04, 0x0D, 0x04, 0x0F, 0x04, + /* RLE: 068 Pixels @ 155,200*/ 68, 0x00, + /* RLE: 001 Pixels @ 223,200*/ 1, 0x04, + /* RLE: 007 Pixels @ 224,200*/ 7, 0x03, + /* RLE: 001 Pixels @ 231,200*/ 1, 0x04, + /* RLE: 013 Pixels @ 232,200*/ 13, 0x00, + /* ABS: 002 Pixels @ 245,200*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 247,200*/ 7, 0x03, + /* RLE: 001 Pixels @ 254,200*/ 1, 0x04, + /* RLE: 128 Pixels @ 255,200*/ 128, 0x00, + /* ABS: 005 Pixels @ 383,200*/ 0, 5, 0x0D, 0x06, 0x06, 0x06, 0x00, + /* RLE: 046 Pixels @ 000,201*/ 46, 0x02, + /* ABS: 009 Pixels @ 046,201*/ 0, 9, 0x03, 0x0A, 0x0B, 0x0E, 0x06, 0x11, 0x07, 0x07, 0x07, + /* RLE: 038 Pixels @ 055,201*/ 38, 0x00, + /* RLE: 001 Pixels @ 093,201*/ 1, 0x0B, + /* RLE: 008 Pixels @ 094,201*/ 8, 0x08, + /* RLE: 001 Pixels @ 102,201*/ 1, 0x0B, + /* RLE: 045 Pixels @ 103,201*/ 45, 0x00, + /* ABS: 008 Pixels @ 148,201*/ 0, 8, 0x0B, 0x06, 0x03, 0x0F, 0x03, 0x0E, 0x0B, 0x03, + /* RLE: 067 Pixels @ 156,201*/ 67, 0x00, + /* ABS: 002 Pixels @ 223,201*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 225,201*/ 6, 0x03, + /* ABS: 002 Pixels @ 231,201*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 233,201*/ 11, 0x00, + /* ABS: 002 Pixels @ 244,201*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 246,201*/ 7, 0x03, + /* RLE: 001 Pixels @ 253,201*/ 1, 0x04, + /* RLE: 130 Pixels @ 254,201*/ 130, 0x00, + /* ABS: 004 Pixels @ 384,201*/ 0, 4, 0x0D, 0x06, 0x06, 0x06, + /* RLE: 046 Pixels @ 000,202*/ 46, 0x02, + /* ABS: 002 Pixels @ 046,202*/ 0, 2, 0x03, 0x06, + /* RLE: 004 Pixels @ 048,202*/ 4, 0x07, + /* ABS: 005 Pixels @ 052,202*/ 0, 5, 0x0E, 0x0B, 0x07, 0x04, 0x03, + /* RLE: 036 Pixels @ 057,202*/ 36, 0x00, + /* RLE: 001 Pixels @ 093,202*/ 1, 0x0B, + /* RLE: 009 Pixels @ 094,202*/ 9, 0x08, + /* RLE: 044 Pixels @ 103,202*/ 44, 0x00, + /* ABS: 009 Pixels @ 147,202*/ 0, 9, 0x03, 0x00, 0x07, 0x0E, 0x0F, 0x0A, 0x11, 0x0B, 0x03, + /* RLE: 068 Pixels @ 156,202*/ 68, 0x00, + /* RLE: 001 Pixels @ 224,202*/ 1, 0x04, + /* RLE: 007 Pixels @ 225,202*/ 7, 0x03, + /* RLE: 001 Pixels @ 232,202*/ 1, 0x04, + /* RLE: 010 Pixels @ 233,202*/ 10, 0x00, + /* ABS: 002 Pixels @ 243,202*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 245,202*/ 7, 0x03, + /* ABS: 002 Pixels @ 252,202*/ 0, 2, 0x04, 0x04, + /* RLE: 131 Pixels @ 254,202*/ 131, 0x00, + /* ABS: 003 Pixels @ 385,202*/ 0, 3, 0x0D, 0x06, 0x03, + /* RLE: 046 Pixels @ 000,203*/ 46, 0x02, + /* ABS: 011 Pixels @ 046,203*/ 0, 11, 0x03, 0x00, 0x0A, 0x03, 0x00, 0x07, 0x00, 0x03, 0x11, 0x0B, 0x03, + /* RLE: 037 Pixels @ 057,203*/ 37, 0x00, + /* RLE: 001 Pixels @ 094,203*/ 1, 0x0B, + /* RLE: 008 Pixels @ 095,203*/ 8, 0x08, + /* RLE: 001 Pixels @ 103,203*/ 1, 0x0B, + /* RLE: 044 Pixels @ 104,203*/ 44, 0x00, + /* ABS: 007 Pixels @ 148,203*/ 0, 7, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x0D, 0x03, + /* RLE: 069 Pixels @ 155,203*/ 69, 0x00, + /* ABS: 002 Pixels @ 224,203*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 226,203*/ 7, 0x03, + /* RLE: 001 Pixels @ 233,203*/ 1, 0x04, + /* RLE: 008 Pixels @ 234,203*/ 8, 0x00, + /* ABS: 002 Pixels @ 242,203*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 244,203*/ 8, 0x03, + /* RLE: 001 Pixels @ 252,203*/ 1, 0x04, + /* RLE: 133 Pixels @ 253,203*/ 133, 0x00, + /* ABS: 002 Pixels @ 386,203*/ 0, 2, 0x0D, 0x06, + /* RLE: 046 Pixels @ 000,204*/ 46, 0x02, + /* ABS: 011 Pixels @ 046,204*/ 0, 11, 0x00, 0x00, 0x03, 0x03, 0x03, 0x07, 0x04, 0x03, 0x06, 0x0E, 0x03, + /* RLE: 037 Pixels @ 057,204*/ 37, 0x00, + /* RLE: 001 Pixels @ 094,204*/ 1, 0x0B, + /* RLE: 008 Pixels @ 095,204*/ 8, 0x08, + /* RLE: 001 Pixels @ 103,204*/ 1, 0x0B, + /* RLE: 044 Pixels @ 104,204*/ 44, 0x00, + /* RLE: 003 Pixels @ 148,204*/ 3, 0x03, + /* ABS: 005 Pixels @ 151,204*/ 0, 5, 0x00, 0x0A, 0x03, 0x03, 0x04, + /* RLE: 069 Pixels @ 156,204*/ 69, 0x00, + /* RLE: 001 Pixels @ 225,204*/ 1, 0x04, + /* RLE: 007 Pixels @ 226,204*/ 7, 0x03, + /* ABS: 002 Pixels @ 233,204*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 235,204*/ 6, 0x00, + /* ABS: 002 Pixels @ 241,204*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 243,204*/ 8, 0x03, + /* ABS: 002 Pixels @ 251,204*/ 0, 2, 0x04, 0x04, + /* RLE: 135 Pixels @ 253,204*/ 135, 0x00, + /* RLE: 048 Pixels @ 000,205*/ 48, 0x02, + /* RLE: 003 Pixels @ 048,205*/ 3, 0x03, + /* ABS: 006 Pixels @ 051,205*/ 0, 6, 0x0D, 0x0B, 0x03, 0x0B, 0x06, 0x03, + /* RLE: 038 Pixels @ 057,205*/ 38, 0x00, + /* RLE: 009 Pixels @ 095,205*/ 9, 0x08, + /* RLE: 001 Pixels @ 104,205*/ 1, 0x0B, + /* RLE: 042 Pixels @ 105,205*/ 42, 0x00, + /* ABS: 009 Pixels @ 147,205*/ 0, 9, 0x03, 0x0E, 0x0B, 0x00, 0x06, 0x12, 0x03, 0x03, 0x04, + /* RLE: 070 Pixels @ 156,205*/ 70, 0x00, + /* RLE: 001 Pixels @ 226,205*/ 1, 0x04, + /* RLE: 007 Pixels @ 227,205*/ 7, 0x03, + /* RLE: 001 Pixels @ 234,205*/ 1, 0x04, + /* RLE: 005 Pixels @ 235,205*/ 5, 0x00, + /* ABS: 002 Pixels @ 240,205*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 242,205*/ 8, 0x03, + /* ABS: 002 Pixels @ 250,205*/ 0, 2, 0x04, 0x04, + /* RLE: 136 Pixels @ 252,205*/ 136, 0x00, + /* RLE: 048 Pixels @ 000,206*/ 48, 0x02, + /* RLE: 001 Pixels @ 048,206*/ 1, 0x04, + /* RLE: 008 Pixels @ 049,206*/ 8, 0x03, + /* RLE: 038 Pixels @ 057,206*/ 38, 0x00, + /* RLE: 001 Pixels @ 095,206*/ 1, 0x0B, + /* RLE: 008 Pixels @ 096,206*/ 8, 0x08, + /* RLE: 001 Pixels @ 104,206*/ 1, 0x0B, + /* RLE: 041 Pixels @ 105,206*/ 41, 0x00, + /* ABS: 009 Pixels @ 146,206*/ 0, 9, 0x03, 0x00, 0x0F, 0x00, 0x11, 0x11, 0x0F, 0x0B, 0x03, + /* RLE: 071 Pixels @ 155,206*/ 71, 0x00, + /* ABS: 002 Pixels @ 226,206*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 228,206*/ 6, 0x03, + /* ABS: 007 Pixels @ 234,206*/ 0, 7, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, + /* RLE: 008 Pixels @ 241,206*/ 8, 0x03, + /* ABS: 002 Pixels @ 249,206*/ 0, 2, 0x04, 0x04, + /* RLE: 137 Pixels @ 251,206*/ 137, 0x00, + /* RLE: 048 Pixels @ 000,207*/ 48, 0x02, + /* RLE: 001 Pixels @ 048,207*/ 1, 0x00, + /* RLE: 006 Pixels @ 049,207*/ 6, 0x03, + /* RLE: 001 Pixels @ 055,207*/ 1, 0x04, + /* RLE: 039 Pixels @ 056,207*/ 39, 0x00, + /* RLE: 001 Pixels @ 095,207*/ 1, 0x0B, + /* RLE: 009 Pixels @ 096,207*/ 9, 0x08, + /* RLE: 041 Pixels @ 105,207*/ 41, 0x00, + /* ABS: 009 Pixels @ 146,207*/ 0, 9, 0x03, 0x0B, 0x06, 0x0A, 0x07, 0x04, 0x0B, 0x0B, 0x03, + /* RLE: 072 Pixels @ 155,207*/ 72, 0x00, + /* RLE: 001 Pixels @ 227,207*/ 1, 0x04, + /* RLE: 007 Pixels @ 228,207*/ 7, 0x03, + /* ABS: 005 Pixels @ 235,207*/ 0, 5, 0x04, 0x00, 0x00, 0x04, 0x04, + /* RLE: 008 Pixels @ 240,207*/ 8, 0x03, + /* ABS: 002 Pixels @ 248,207*/ 0, 2, 0x04, 0x04, + /* RLE: 138 Pixels @ 250,207*/ 138, 0x00, + /* RLE: 047 Pixels @ 000,208*/ 47, 0x02, + /* ABS: 008 Pixels @ 047,208*/ 0, 8, 0x00, 0x03, 0x0B, 0x0F, 0x07, 0x11, 0x0A, 0x03, + /* RLE: 041 Pixels @ 055,208*/ 41, 0x00, + /* RLE: 001 Pixels @ 096,208*/ 1, 0x0B, + /* RLE: 008 Pixels @ 097,208*/ 8, 0x08, + /* RLE: 001 Pixels @ 105,208*/ 1, 0x0B, + /* RLE: 040 Pixels @ 106,208*/ 40, 0x00, + /* ABS: 009 Pixels @ 146,208*/ 0, 9, 0x03, 0x0B, 0x11, 0x0D, 0x11, 0x03, 0x06, 0x04, 0x03, + /* RLE: 072 Pixels @ 155,208*/ 72, 0x00, + /* ABS: 002 Pixels @ 227,208*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 229,208*/ 7, 0x03, + /* RLE: 003 Pixels @ 236,208*/ 3, 0x04, + /* RLE: 008 Pixels @ 239,208*/ 8, 0x03, + /* ABS: 002 Pixels @ 247,208*/ 0, 2, 0x04, 0x04, + /* RLE: 139 Pixels @ 249,208*/ 139, 0x00, + /* RLE: 047 Pixels @ 000,209*/ 47, 0x02, + /* ABS: 007 Pixels @ 047,209*/ 0, 7, 0x03, 0x04, 0x07, 0x06, 0x0B, 0x06, 0x0F, + /* RLE: 042 Pixels @ 054,209*/ 42, 0x00, + /* RLE: 001 Pixels @ 096,209*/ 1, 0x0B, + /* RLE: 008 Pixels @ 097,209*/ 8, 0x08, + /* RLE: 001 Pixels @ 105,209*/ 1, 0x0B, + /* RLE: 038 Pixels @ 106,209*/ 38, 0x00, + /* ABS: 009 Pixels @ 144,209*/ 0, 9, 0x03, 0x00, 0x03, 0x03, 0x06, 0x0F, 0x04, 0x0B, 0x0F, + /* RLE: 075 Pixels @ 153,209*/ 75, 0x00, + /* RLE: 001 Pixels @ 228,209*/ 1, 0x04, + /* RLE: 007 Pixels @ 229,209*/ 7, 0x03, + /* ABS: 002 Pixels @ 236,209*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 238,209*/ 8, 0x03, + /* ABS: 002 Pixels @ 246,209*/ 0, 2, 0x04, 0x04, + /* RLE: 140 Pixels @ 248,209*/ 140, 0x00, + /* RLE: 047 Pixels @ 000,210*/ 47, 0x02, + /* ABS: 009 Pixels @ 047,210*/ 0, 9, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x11, 0x04, 0x03, + /* RLE: 041 Pixels @ 056,210*/ 41, 0x00, + /* RLE: 009 Pixels @ 097,210*/ 9, 0x08, + /* RLE: 001 Pixels @ 106,210*/ 1, 0x0B, + /* RLE: 036 Pixels @ 107,210*/ 36, 0x00, + /* ABS: 004 Pixels @ 143,210*/ 0, 4, 0x03, 0x00, 0x00, 0x00, + /* RLE: 004 Pixels @ 147,210*/ 4, 0x03, + /* ABS: 003 Pixels @ 151,210*/ 0, 3, 0x00, 0x00, 0x03, + /* RLE: 075 Pixels @ 154,210*/ 75, 0x00, + /* RLE: 001 Pixels @ 229,210*/ 1, 0x04, + /* RLE: 015 Pixels @ 230,210*/ 15, 0x03, + /* ABS: 002 Pixels @ 245,210*/ 0, 2, 0x04, 0x04, + /* RLE: 141 Pixels @ 247,210*/ 141, 0x00, + /* RLE: 047 Pixels @ 000,211*/ 47, 0x02, + /* ABS: 010 Pixels @ 047,211*/ 0, 10, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x0F, 0x04, 0x03, 0x04, + /* RLE: 040 Pixels @ 057,211*/ 40, 0x00, + /* RLE: 001 Pixels @ 097,211*/ 1, 0x0B, + /* RLE: 008 Pixels @ 098,211*/ 8, 0x08, + /* RLE: 001 Pixels @ 106,211*/ 1, 0x0B, + /* RLE: 036 Pixels @ 107,211*/ 36, 0x00, + /* ABS: 012 Pixels @ 143,211*/ 0, 12, 0x03, 0x06, 0x07, 0x07, 0x07, 0x0D, 0x06, 0x0B, 0x0B, 0x03, 0x03, 0x04, + /* RLE: 074 Pixels @ 155,211*/ 74, 0x00, + /* ABS: 002 Pixels @ 229,211*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 231,211*/ 13, 0x03, + /* ABS: 002 Pixels @ 244,211*/ 0, 2, 0x04, 0x04, + /* RLE: 142 Pixels @ 246,211*/ 142, 0x00, + /* RLE: 047 Pixels @ 000,212*/ 47, 0x02, + /* ABS: 009 Pixels @ 047,212*/ 0, 9, 0x03, 0x00, 0x07, 0x0D, 0x06, 0x0F, 0x0F, 0x03, 0x03, + /* RLE: 041 Pixels @ 056,212*/ 41, 0x00, + /* RLE: 001 Pixels @ 097,212*/ 1, 0x0B, + /* RLE: 004 Pixels @ 098,212*/ 4, 0x08, + /* ABS: 002 Pixels @ 102,212*/ 0, 2, 0x1B, 0x18, + /* RLE: 004 Pixels @ 104,212*/ 4, 0x03, + /* RLE: 035 Pixels @ 108,212*/ 35, 0x00, + /* ABS: 012 Pixels @ 143,212*/ 0, 12, 0x03, 0x00, 0x0A, 0x0B, 0x0B, 0x06, 0x0D, 0x07, 0x07, 0x00, 0x03, 0x04, + /* RLE: 075 Pixels @ 155,212*/ 75, 0x00, + /* RLE: 001 Pixels @ 230,212*/ 1, 0x04, + /* RLE: 012 Pixels @ 231,212*/ 12, 0x03, + /* ABS: 002 Pixels @ 243,212*/ 0, 2, 0x04, 0x04, + /* RLE: 143 Pixels @ 245,212*/ 143, 0x00, + /* RLE: 047 Pixels @ 000,213*/ 47, 0x02, + /* ABS: 010 Pixels @ 047,213*/ 0, 10, 0x18, 0x03, 0x0A, 0x0D, 0x0F, 0x12, 0x00, 0x03, 0x00, 0x03, + /* RLE: 041 Pixels @ 057,213*/ 41, 0x00, + /* ABS: 009 Pixels @ 098,213*/ 0, 9, 0x0A, 0x18, 0x03, 0x03, 0x03, 0x00, 0x04, 0x0E, 0x0D, + /* RLE: 036 Pixels @ 107,213*/ 36, 0x00, + /* RLE: 008 Pixels @ 143,213*/ 8, 0x03, + /* ABS: 003 Pixels @ 151,213*/ 0, 3, 0x00, 0x03, 0x03, + /* RLE: 076 Pixels @ 154,213*/ 76, 0x00, + /* ABS: 002 Pixels @ 230,213*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 232,213*/ 10, 0x03, + /* ABS: 002 Pixels @ 242,213*/ 0, 2, 0x04, 0x04, + /* RLE: 144 Pixels @ 244,213*/ 144, 0x00, + /* RLE: 048 Pixels @ 000,214*/ 48, 0x02, + /* ABS: 009 Pixels @ 048,214*/ 0, 9, 0x00, 0x03, 0x0A, 0x0B, 0x12, 0x0D, 0x07, 0x0F, 0x03, + /* RLE: 041 Pixels @ 057,214*/ 41, 0x00, + /* ABS: 005 Pixels @ 098,214*/ 0, 5, 0x03, 0x00, 0x0B, 0x12, 0x0F, + /* RLE: 004 Pixels @ 103,214*/ 4, 0x07, + /* ABS: 002 Pixels @ 107,214*/ 0, 2, 0x04, 0x03, + /* RLE: 033 Pixels @ 109,214*/ 33, 0x00, + /* ABS: 012 Pixels @ 142,214*/ 0, 12, 0x03, 0x00, 0x06, 0x03, 0x12, 0x0E, 0x0B, 0x00, 0x00, 0x03, 0x03, 0x04, + /* RLE: 077 Pixels @ 154,214*/ 77, 0x00, + /* RLE: 001 Pixels @ 231,214*/ 1, 0x04, + /* RLE: 009 Pixels @ 232,214*/ 9, 0x03, + /* ABS: 002 Pixels @ 241,214*/ 0, 2, 0x04, 0x04, + /* RLE: 145 Pixels @ 243,214*/ 145, 0x00, + /* RLE: 049 Pixels @ 000,215*/ 49, 0x02, + /* ABS: 008 Pixels @ 049,215*/ 0, 8, 0x00, 0x06, 0x07, 0x0F, 0x06, 0x11, 0x06, 0x03, + /* RLE: 042 Pixels @ 057,215*/ 42, 0x00, + /* ABS: 009 Pixels @ 099,215*/ 0, 9, 0x12, 0x07, 0x11, 0x0E, 0x0B, 0x0D, 0x07, 0x0B, 0x03, + /* RLE: 036 Pixels @ 108,215*/ 36, 0x00, + /* ABS: 003 Pixels @ 144,215*/ 0, 3, 0x0E, 0x03, 0x0D, + /* RLE: 004 Pixels @ 147,215*/ 4, 0x07, + /* ABS: 003 Pixels @ 151,215*/ 0, 3, 0x06, 0x03, 0x04, + /* RLE: 078 Pixels @ 154,215*/ 78, 0x00, + /* RLE: 001 Pixels @ 232,215*/ 1, 0x04, + /* RLE: 007 Pixels @ 233,215*/ 7, 0x03, + /* ABS: 002 Pixels @ 240,215*/ 0, 2, 0x04, 0x04, + /* RLE: 146 Pixels @ 242,215*/ 146, 0x00, + /* RLE: 049 Pixels @ 000,216*/ 49, 0x02, + /* ABS: 002 Pixels @ 049,216*/ 0, 2, 0x03, 0x00, + /* RLE: 004 Pixels @ 051,216*/ 4, 0x03, + /* ABS: 003 Pixels @ 055,216*/ 0, 3, 0x07, 0x04, 0x03, + /* RLE: 040 Pixels @ 058,216*/ 40, 0x00, + /* ABS: 009 Pixels @ 098,216*/ 0, 9, 0x03, 0x00, 0x03, 0x03, 0x03, 0x0E, 0x07, 0x04, 0x03, + /* RLE: 035 Pixels @ 107,216*/ 35, 0x00, + /* ABS: 012 Pixels @ 142,216*/ 0, 12, 0x03, 0x00, 0x0A, 0x03, 0x03, 0x03, 0x00, 0x04, 0x0D, 0x04, 0x03, 0x04, + /* RLE: 078 Pixels @ 154,216*/ 78, 0x00, + /* ABS: 002 Pixels @ 232,216*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 234,216*/ 6, 0x03, + /* ABS: 002 Pixels @ 240,216*/ 0, 2, 0x04, 0x04, + /* RLE: 146 Pixels @ 242,216*/ 146, 0x00, + /* RLE: 049 Pixels @ 000,217*/ 49, 0x02, + /* RLE: 001 Pixels @ 049,217*/ 1, 0x18, + /* RLE: 005 Pixels @ 050,217*/ 5, 0x03, + /* RLE: 001 Pixels @ 055,217*/ 1, 0x04, + /* RLE: 043 Pixels @ 056,217*/ 43, 0x00, + /* ABS: 006 Pixels @ 099,217*/ 0, 6, 0x0A, 0x03, 0x03, 0x0D, 0x07, 0x04, + /* RLE: 004 Pixels @ 105,217*/ 4, 0x03, + /* RLE: 033 Pixels @ 109,217*/ 33, 0x00, + /* ABS: 003 Pixels @ 142,217*/ 0, 3, 0x03, 0x0E, 0x12, + /* RLE: 005 Pixels @ 145,217*/ 5, 0x03, + /* ABS: 004 Pixels @ 150,217*/ 0, 4, 0x0B, 0x0B, 0x03, 0x04, + /* RLE: 079 Pixels @ 154,217*/ 79, 0x00, + /* RLE: 001 Pixels @ 233,217*/ 1, 0x04, + /* RLE: 007 Pixels @ 234,217*/ 7, 0x03, + /* RLE: 001 Pixels @ 241,217*/ 1, 0x04, + /* RLE: 091 Pixels @ 242,217*/ 91, 0x00, + /* RLE: 006 Pixels @ 333,217*/ 6, 0x04, + /* RLE: 049 Pixels @ 339,217*/ 49, 0x00, + /* RLE: 049 Pixels @ 000,218*/ 49, 0x02, + /* RLE: 001 Pixels @ 049,218*/ 1, 0x18, + /* RLE: 004 Pixels @ 050,218*/ 4, 0x03, + /* ABS: 003 Pixels @ 054,218*/ 0, 3, 0x00, 0x03, 0x03, + /* RLE: 043 Pixels @ 057,218*/ 43, 0x00, + /* ABS: 008 Pixels @ 100,218*/ 0, 8, 0x03, 0x0D, 0x07, 0x0B, 0x0A, 0x0E, 0x06, 0x07, + /* RLE: 035 Pixels @ 108,218*/ 35, 0x00, + /* ABS: 011 Pixels @ 143,218*/ 0, 11, 0x03, 0x03, 0x0B, 0x07, 0x06, 0x12, 0x0B, 0x0F, 0x0B, 0x03, 0x04, + /* RLE: 079 Pixels @ 154,218*/ 79, 0x00, + /* ABS: 002 Pixels @ 233,218*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 235,218*/ 7, 0x03, + /* RLE: 001 Pixels @ 242,218*/ 1, 0x04, + /* RLE: 090 Pixels @ 243,218*/ 90, 0x00, + /* ABS: 007 Pixels @ 333,218*/ 0, 7, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, + /* RLE: 048 Pixels @ 340,218*/ 48, 0x00, + /* RLE: 049 Pixels @ 000,219*/ 49, 0x02, + /* ABS: 008 Pixels @ 049,219*/ 0, 8, 0x03, 0x00, 0x12, 0x03, 0x0D, 0x07, 0x06, 0x03, + /* RLE: 042 Pixels @ 057,219*/ 42, 0x00, + /* ABS: 002 Pixels @ 099,219*/ 0, 2, 0x03, 0x12, + /* RLE: 005 Pixels @ 101,219*/ 5, 0x07, + /* ABS: 004 Pixels @ 106,219*/ 0, 4, 0x06, 0x0E, 0x00, 0x03, + /* RLE: 034 Pixels @ 110,219*/ 34, 0x00, + /* ABS: 010 Pixels @ 144,219*/ 0, 10, 0x03, 0x0A, 0x0E, 0x06, 0x11, 0x07, 0x0D, 0x03, 0x03, 0x04, + /* RLE: 080 Pixels @ 154,219*/ 80, 0x00, + /* RLE: 001 Pixels @ 234,219*/ 1, 0x04, + /* RLE: 007 Pixels @ 235,219*/ 7, 0x03, + /* ABS: 002 Pixels @ 242,219*/ 0, 2, 0x04, 0x04, + /* RLE: 088 Pixels @ 244,219*/ 88, 0x00, + /* ABS: 002 Pixels @ 332,219*/ 0, 2, 0x04, 0x04, + /* RLE: 005 Pixels @ 334,219*/ 5, 0x03, + /* RLE: 001 Pixels @ 339,219*/ 1, 0x04, + /* RLE: 048 Pixels @ 340,219*/ 48, 0x00, + /* RLE: 049 Pixels @ 000,220*/ 49, 0x02, + /* ABS: 007 Pixels @ 049,220*/ 0, 7, 0x03, 0x0E, 0x0D, 0x0A, 0x07, 0x04, 0x0F, + /* RLE: 043 Pixels @ 056,220*/ 43, 0x00, + /* ABS: 010 Pixels @ 099,220*/ 0, 10, 0x03, 0x0E, 0x11, 0x0E, 0x0B, 0x00, 0x00, 0x04, 0x00, 0x0D, + /* RLE: 036 Pixels @ 109,220*/ 36, 0x00, + /* RLE: 008 Pixels @ 145,220*/ 8, 0x03, + /* RLE: 082 Pixels @ 153,220*/ 82, 0x00, + /* RLE: 001 Pixels @ 235,220*/ 1, 0x04, + /* RLE: 007 Pixels @ 236,220*/ 7, 0x03, + /* RLE: 001 Pixels @ 243,220*/ 1, 0x04, + /* RLE: 088 Pixels @ 244,220*/ 88, 0x00, + /* RLE: 001 Pixels @ 332,220*/ 1, 0x04, + /* RLE: 006 Pixels @ 333,220*/ 6, 0x03, + /* RLE: 001 Pixels @ 339,220*/ 1, 0x04, + /* RLE: 048 Pixels @ 340,220*/ 48, 0x00, + /* RLE: 049 Pixels @ 000,221*/ 49, 0x02, + /* ABS: 007 Pixels @ 049,221*/ 0, 7, 0x03, 0x06, 0x0B, 0x0A, 0x07, 0x00, 0x06, + /* RLE: 044 Pixels @ 056,221*/ 44, 0x00, + /* ABS: 011 Pixels @ 100,221*/ 0, 11, 0x03, 0x00, 0x0B, 0x06, 0x0F, 0x07, 0x07, 0x0A, 0x06, 0x0A, 0x03, + /* RLE: 033 Pixels @ 111,221*/ 33, 0x00, + /* ABS: 009 Pixels @ 144,221*/ 0, 9, 0x03, 0x00, 0x0B, 0x0B, 0x0A, 0x00, 0x03, 0x03, 0x04, + /* RLE: 082 Pixels @ 153,221*/ 82, 0x00, + /* ABS: 002 Pixels @ 235,221*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 237,221*/ 6, 0x03, + /* ABS: 002 Pixels @ 243,221*/ 0, 2, 0x04, 0x04, + /* RLE: 086 Pixels @ 245,221*/ 86, 0x00, + /* ABS: 002 Pixels @ 331,221*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 333,221*/ 6, 0x03, + /* RLE: 001 Pixels @ 339,221*/ 1, 0x04, + /* RLE: 048 Pixels @ 340,221*/ 48, 0x00, + /* RLE: 049 Pixels @ 000,222*/ 49, 0x02, + /* ABS: 007 Pixels @ 049,222*/ 0, 7, 0x03, 0x0B, 0x12, 0x0E, 0x07, 0x00, 0x07, + /* RLE: 044 Pixels @ 056,222*/ 44, 0x00, + /* ABS: 010 Pixels @ 100,222*/ 0, 10, 0x03, 0x12, 0x07, 0x11, 0x0E, 0x0B, 0x00, 0x03, 0x03, 0x03, + /* RLE: 033 Pixels @ 110,222*/ 33, 0x00, + /* ABS: 003 Pixels @ 143,222*/ 0, 3, 0x03, 0x00, 0x0F, + /* RLE: 004 Pixels @ 146,222*/ 4, 0x07, + /* ABS: 003 Pixels @ 150,222*/ 0, 3, 0x06, 0x03, 0x04, + /* RLE: 083 Pixels @ 153,222*/ 83, 0x00, + /* RLE: 001 Pixels @ 236,222*/ 1, 0x04, + /* RLE: 007 Pixels @ 237,222*/ 7, 0x03, + /* RLE: 001 Pixels @ 244,222*/ 1, 0x04, + /* RLE: 086 Pixels @ 245,222*/ 86, 0x00, + /* RLE: 001 Pixels @ 331,222*/ 1, 0x04, + /* RLE: 007 Pixels @ 332,222*/ 7, 0x03, + /* RLE: 001 Pixels @ 339,222*/ 1, 0x04, + /* RLE: 048 Pixels @ 340,222*/ 48, 0x00, + /* RLE: 049 Pixels @ 000,223*/ 49, 0x02, + /* ABS: 009 Pixels @ 049,223*/ 0, 9, 0x03, 0x00, 0x0F, 0x07, 0x06, 0x03, 0x0B, 0x03, 0x03, + /* RLE: 044 Pixels @ 058,223*/ 44, 0x00, + /* ABS: 008 Pixels @ 102,223*/ 0, 8, 0x03, 0x03, 0x00, 0x0A, 0x00, 0x03, 0x03, 0x0B, + /* RLE: 032 Pixels @ 110,223*/ 32, 0x00, + /* ABS: 011 Pixels @ 142,223*/ 0, 11, 0x03, 0x00, 0x00, 0x11, 0x03, 0x03, 0x00, 0x04, 0x04, 0x03, 0x04, + /* RLE: 083 Pixels @ 153,223*/ 83, 0x00, + /* ABS: 002 Pixels @ 236,223*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 238,223*/ 7, 0x03, + /* RLE: 001 Pixels @ 245,223*/ 1, 0x04, + /* RLE: 084 Pixels @ 246,223*/ 84, 0x00, + /* ABS: 002 Pixels @ 330,223*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 332,223*/ 6, 0x03, + /* RLE: 001 Pixels @ 338,223*/ 1, 0x04, + /* RLE: 049 Pixels @ 339,223*/ 49, 0x00, + /* RLE: 049 Pixels @ 000,224*/ 49, 0x02, + /* ABS: 010 Pixels @ 049,224*/ 0, 10, 0x18, 0x03, 0x00, 0x0A, 0x03, 0x03, 0x00, 0x0E, 0x00, 0x03, + /* RLE: 041 Pixels @ 059,224*/ 41, 0x00, + /* ABS: 009 Pixels @ 100,224*/ 0, 9, 0x0A, 0x18, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x0D, 0x03, + /* RLE: 032 Pixels @ 109,224*/ 32, 0x00, + /* ABS: 005 Pixels @ 141,224*/ 0, 5, 0x03, 0x00, 0x00, 0x00, 0x11, + /* RLE: 006 Pixels @ 146,224*/ 6, 0x03, + /* RLE: 001 Pixels @ 152,224*/ 1, 0x04, + /* RLE: 084 Pixels @ 153,224*/ 84, 0x00, + /* RLE: 001 Pixels @ 237,224*/ 1, 0x04, + /* RLE: 007 Pixels @ 238,224*/ 7, 0x03, + /* RLE: 001 Pixels @ 245,224*/ 1, 0x04, + /* RLE: 084 Pixels @ 246,224*/ 84, 0x00, + /* RLE: 001 Pixels @ 330,224*/ 1, 0x04, + /* RLE: 007 Pixels @ 331,224*/ 7, 0x03, + /* RLE: 001 Pixels @ 338,224*/ 1, 0x04, + /* RLE: 049 Pixels @ 339,224*/ 49, 0x00, + /* RLE: 050 Pixels @ 000,225*/ 50, 0x02, + /* ABS: 010 Pixels @ 050,225*/ 0, 10, 0x03, 0x03, 0x04, 0x0B, 0x12, 0x0D, 0x07, 0x07, 0x0E, 0x03, + /* RLE: 040 Pixels @ 060,225*/ 40, 0x00, + /* ABS: 010 Pixels @ 100,225*/ 0, 10, 0x0B, 0x03, 0x04, 0x07, 0x0E, 0x11, 0x0A, 0x11, 0x0B, 0x03, + /* RLE: 031 Pixels @ 110,225*/ 31, 0x00, + /* ABS: 012 Pixels @ 141,225*/ 0, 12, 0x03, 0x06, 0x07, 0x07, 0x07, 0x0F, 0x06, 0x0B, 0x0B, 0x03, 0x03, 0x04, + /* RLE: 085 Pixels @ 153,225*/ 85, 0x00, + /* RLE: 001 Pixels @ 238,225*/ 1, 0x04, + /* RLE: 007 Pixels @ 239,225*/ 7, 0x03, + /* RLE: 001 Pixels @ 246,225*/ 1, 0x04, + /* RLE: 082 Pixels @ 247,225*/ 82, 0x00, + /* ABS: 002 Pixels @ 329,225*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 331,225*/ 6, 0x03, + /* RLE: 001 Pixels @ 337,225*/ 1, 0x04, + /* RLE: 050 Pixels @ 338,225*/ 50, 0x00, + /* RLE: 050 Pixels @ 000,226*/ 50, 0x02, + /* ABS: 010 Pixels @ 050,226*/ 0, 10, 0x03, 0x12, 0x07, 0x07, 0x11, 0x06, 0x07, 0x04, 0x0A, 0x03, + /* RLE: 041 Pixels @ 060,226*/ 41, 0x00, + /* ABS: 010 Pixels @ 101,226*/ 0, 10, 0x03, 0x0B, 0x06, 0x03, 0x0F, 0x03, 0x06, 0x0B, 0x03, 0x0B, + /* RLE: 030 Pixels @ 111,226*/ 30, 0x00, + /* ABS: 012 Pixels @ 141,226*/ 0, 12, 0x03, 0x00, 0x00, 0x0B, 0x0B, 0x06, 0x0D, 0x07, 0x07, 0x0A, 0x03, 0x04, + /* RLE: 085 Pixels @ 153,226*/ 85, 0x00, + /* ABS: 002 Pixels @ 238,226*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 240,226*/ 6, 0x03, + /* RLE: 001 Pixels @ 246,226*/ 1, 0x04, + /* RLE: 081 Pixels @ 247,226*/ 81, 0x00, + /* ABS: 002 Pixels @ 328,226*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 330,226*/ 7, 0x03, + /* RLE: 001 Pixels @ 337,226*/ 1, 0x04, + /* RLE: 050 Pixels @ 338,226*/ 50, 0x00, + /* RLE: 050 Pixels @ 000,227*/ 50, 0x02, + /* ABS: 009 Pixels @ 050,227*/ 0, 9, 0x03, 0x06, 0x12, 0x03, 0x03, 0x03, 0x06, 0x00, 0x03, + /* RLE: 043 Pixels @ 059,227*/ 43, 0x00, + /* ABS: 009 Pixels @ 102,227*/ 0, 9, 0x04, 0x0F, 0x0A, 0x12, 0x06, 0x07, 0x00, 0x18, 0x0B, + /* RLE: 031 Pixels @ 111,227*/ 31, 0x00, + /* RLE: 003 Pixels @ 142,227*/ 3, 0x03, + /* ABS: 007 Pixels @ 145,227*/ 0, 7, 0x00, 0x0B, 0x0B, 0x0A, 0x00, 0x03, 0x03, + /* RLE: 087 Pixels @ 152,227*/ 87, 0x00, + /* RLE: 001 Pixels @ 239,227*/ 1, 0x04, + /* RLE: 007 Pixels @ 240,227*/ 7, 0x03, + /* RLE: 001 Pixels @ 247,227*/ 1, 0x04, + /* RLE: 078 Pixels @ 248,227*/ 78, 0x00, + /* ABS: 002 Pixels @ 326,227*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 328,227*/ 8, 0x03, + /* RLE: 001 Pixels @ 336,227*/ 1, 0x04, + /* RLE: 051 Pixels @ 337,227*/ 51, 0x00, + /* RLE: 050 Pixels @ 000,228*/ 50, 0x02, + /* ABS: 009 Pixels @ 050,228*/ 0, 9, 0x03, 0x0A, 0x0A, 0x12, 0x03, 0x0D, 0x07, 0x06, 0x03, + /* RLE: 043 Pixels @ 059,228*/ 43, 0x00, + /* ABS: 009 Pixels @ 102,228*/ 0, 9, 0x03, 0x06, 0x06, 0x0B, 0x0F, 0x04, 0x03, 0x1B, 0x0B, + /* RLE: 034 Pixels @ 111,228*/ 34, 0x00, + /* RLE: 001 Pixels @ 145,228*/ 1, 0x0F, + /* RLE: 004 Pixels @ 146,228*/ 4, 0x07, + /* ABS: 002 Pixels @ 150,228*/ 0, 2, 0x06, 0x03, + /* RLE: 087 Pixels @ 152,228*/ 87, 0x00, + /* ABS: 002 Pixels @ 239,228*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 241,228*/ 6, 0x03, + /* RLE: 001 Pixels @ 247,228*/ 1, 0x04, + /* RLE: 076 Pixels @ 248,228*/ 76, 0x00, + /* ABS: 002 Pixels @ 324,228*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 326,228*/ 10, 0x03, + /* RLE: 001 Pixels @ 336,228*/ 1, 0x04, + /* RLE: 051 Pixels @ 337,228*/ 51, 0x00, + /* RLE: 050 Pixels @ 000,229*/ 50, 0x02, + /* ABS: 010 Pixels @ 050,229*/ 0, 10, 0x18, 0x03, 0x0E, 0x0D, 0x0A, 0x07, 0x0B, 0x0F, 0x00, 0x03, + /* RLE: 041 Pixels @ 060,229*/ 41, 0x00, + /* ABS: 010 Pixels @ 101,229*/ 0, 10, 0x0B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x0A, 0x03, 0x03, 0x0B, + /* RLE: 033 Pixels @ 111,229*/ 33, 0x00, + /* ABS: 008 Pixels @ 144,229*/ 0, 8, 0x0A, 0x11, 0x03, 0x03, 0x0A, 0x04, 0x04, 0x03, + /* RLE: 088 Pixels @ 152,229*/ 88, 0x00, + /* RLE: 001 Pixels @ 240,229*/ 1, 0x04, + /* RLE: 007 Pixels @ 241,229*/ 7, 0x03, + /* RLE: 001 Pixels @ 248,229*/ 1, 0x04, + /* RLE: 073 Pixels @ 249,229*/ 73, 0x00, + /* RLE: 003 Pixels @ 322,229*/ 3, 0x04, + /* RLE: 010 Pixels @ 325,229*/ 10, 0x03, + /* RLE: 001 Pixels @ 335,229*/ 1, 0x04, + /* RLE: 052 Pixels @ 336,229*/ 52, 0x00, + /* RLE: 051 Pixels @ 000,230*/ 51, 0x02, + /* ABS: 007 Pixels @ 051,230*/ 0, 7, 0x03, 0x06, 0x0B, 0x00, 0x07, 0x00, 0x06, + /* RLE: 043 Pixels @ 058,230*/ 43, 0x00, + /* ABS: 009 Pixels @ 101,230*/ 0, 9, 0x0B, 0x18, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x0D, 0x03, + /* RLE: 033 Pixels @ 110,230*/ 33, 0x00, + /* ABS: 003 Pixels @ 143,230*/ 0, 3, 0x03, 0x03, 0x11, + /* RLE: 005 Pixels @ 146,230*/ 5, 0x03, + /* RLE: 089 Pixels @ 151,230*/ 89, 0x00, + /* ABS: 002 Pixels @ 240,230*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 242,230*/ 6, 0x03, + /* RLE: 001 Pixels @ 248,230*/ 1, 0x04, + /* RLE: 054 Pixels @ 249,230*/ 54, 0x00, + /* ABS: 007 Pixels @ 303,230*/ 0, 7, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, + /* RLE: 010 Pixels @ 310,230*/ 10, 0x00, + /* RLE: 003 Pixels @ 320,230*/ 3, 0x04, + /* RLE: 011 Pixels @ 323,230*/ 11, 0x03, + /* ABS: 002 Pixels @ 334,230*/ 0, 2, 0x04, 0x04, + /* RLE: 052 Pixels @ 336,230*/ 52, 0x00, + /* RLE: 051 Pixels @ 000,231*/ 51, 0x02, + /* ABS: 007 Pixels @ 051,231*/ 0, 7, 0x03, 0x0B, 0x12, 0x0E, 0x07, 0x00, 0x07, + /* RLE: 045 Pixels @ 058,231*/ 45, 0x00, + /* ABS: 009 Pixels @ 103,231*/ 0, 9, 0x04, 0x07, 0x12, 0x04, 0x0A, 0x0F, 0x04, 0x03, 0x0A, + /* RLE: 031 Pixels @ 112,231*/ 31, 0x00, + /* ABS: 008 Pixels @ 143,231*/ 0, 8, 0x03, 0x0B, 0x07, 0x0F, 0x06, 0x0B, 0x04, 0x03, + /* RLE: 090 Pixels @ 151,231*/ 90, 0x00, + /* RLE: 001 Pixels @ 241,231*/ 1, 0x04, + /* RLE: 007 Pixels @ 242,231*/ 7, 0x03, + /* RLE: 001 Pixels @ 249,231*/ 1, 0x04, + /* RLE: 051 Pixels @ 250,231*/ 51, 0x00, + /* ABS: 009 Pixels @ 301,231*/ 0, 9, 0x03, 0x00, 0x04, 0x03, 0x03, 0x03, 0x04, 0x06, 0x03, + /* RLE: 009 Pixels @ 310,231*/ 9, 0x00, + /* ABS: 002 Pixels @ 319,231*/ 0, 2, 0x04, 0x04, + /* RLE: 012 Pixels @ 321,231*/ 12, 0x03, + /* ABS: 002 Pixels @ 333,231*/ 0, 2, 0x04, 0x04, + /* RLE: 053 Pixels @ 335,231*/ 53, 0x00, + /* RLE: 051 Pixels @ 000,232*/ 51, 0x02, + /* ABS: 009 Pixels @ 051,232*/ 0, 9, 0x03, 0x00, 0x0F, 0x07, 0x06, 0x03, 0x0B, 0x03, 0x03, + /* RLE: 042 Pixels @ 060,232*/ 42, 0x00, + /* ABS: 011 Pixels @ 102,232*/ 0, 11, 0x03, 0x0B, 0x0D, 0x03, 0x03, 0x03, 0x0E, 0x0B, 0x03, 0x00, 0x03, + /* RLE: 028 Pixels @ 113,232*/ 28, 0x00, + /* ABS: 010 Pixels @ 141,232*/ 0, 10, 0x03, 0x00, 0x03, 0x0A, 0x0B, 0x06, 0x0D, 0x07, 0x07, 0x0A, + /* RLE: 090 Pixels @ 151,232*/ 90, 0x00, + /* ABS: 002 Pixels @ 241,232*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 243,232*/ 6, 0x03, + /* RLE: 001 Pixels @ 249,232*/ 1, 0x04, + /* RLE: 046 Pixels @ 250,232*/ 46, 0x00, + /* RLE: 006 Pixels @ 296,232*/ 6, 0x03, + /* ABS: 008 Pixels @ 302,232*/ 0, 8, 0x0E, 0x11, 0x0A, 0x00, 0x0D, 0x11, 0x06, 0x03, + /* RLE: 007 Pixels @ 310,232*/ 7, 0x00, + /* ABS: 002 Pixels @ 317,232*/ 0, 2, 0x04, 0x04, + /* RLE: 012 Pixels @ 319,232*/ 12, 0x03, + /* RLE: 003 Pixels @ 331,232*/ 3, 0x04, + /* RLE: 054 Pixels @ 334,232*/ 54, 0x00, + /* RLE: 051 Pixels @ 000,233*/ 51, 0x02, + /* ABS: 010 Pixels @ 051,233*/ 0, 10, 0x18, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0A, 0x0E, 0x00, 0x03, + /* RLE: 042 Pixels @ 061,233*/ 42, 0x00, + /* ABS: 010 Pixels @ 103,233*/ 0, 10, 0x0A, 0x0F, 0x00, 0x03, 0x0A, 0x0F, 0x06, 0x0F, 0x07, 0x03, + /* RLE: 027 Pixels @ 113,233*/ 27, 0x00, + /* ABS: 003 Pixels @ 140,233*/ 0, 3, 0x03, 0x00, 0x00, + /* RLE: 006 Pixels @ 143,233*/ 6, 0x03, + /* ABS: 002 Pixels @ 149,233*/ 0, 2, 0x00, 0x03, + /* RLE: 091 Pixels @ 151,233*/ 91, 0x00, + /* RLE: 001 Pixels @ 242,233*/ 1, 0x04, + /* RLE: 007 Pixels @ 243,233*/ 7, 0x03, + /* RLE: 001 Pixels @ 250,233*/ 1, 0x04, + /* RLE: 044 Pixels @ 251,233*/ 44, 0x00, + /* ABS: 022 Pixels @ 295,233*/ 0, 22, 0x03, 0x00, 0x12, 0x07, 0x11, 0x00, 0x03, 0x12, 0x07, 0x0F, 0x00, 0x07, 0x06, 0x03, 0x03, 0x00, 0x03, 0x03, 0x03, 0x00, 0x04, 0x04, + /* RLE: 012 Pixels @ 317,233*/ 12, 0x03, + /* RLE: 003 Pixels @ 329,233*/ 3, 0x04, + /* RLE: 056 Pixels @ 332,233*/ 56, 0x00, + /* RLE: 052 Pixels @ 000,234*/ 52, 0x02, + /* ABS: 010 Pixels @ 052,234*/ 0, 10, 0x00, 0x03, 0x04, 0x0B, 0x12, 0x0D, 0x07, 0x07, 0x0E, 0x03, + /* RLE: 040 Pixels @ 062,234*/ 40, 0x00, + /* ABS: 003 Pixels @ 102,234*/ 0, 3, 0x0A, 0x03, 0x06, + /* RLE: 004 Pixels @ 105,234*/ 4, 0x07, + /* ABS: 004 Pixels @ 109,234*/ 0, 4, 0x11, 0x12, 0x0B, 0x03, + /* RLE: 027 Pixels @ 113,234*/ 27, 0x00, + /* ABS: 011 Pixels @ 140,234*/ 0, 11, 0x03, 0x06, 0x06, 0x0B, 0x07, 0x0D, 0x06, 0x0B, 0x0B, 0x03, 0x03, + /* RLE: 091 Pixels @ 151,234*/ 91, 0x00, + /* ABS: 002 Pixels @ 242,234*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 244,234*/ 6, 0x03, + /* RLE: 001 Pixels @ 250,234*/ 1, 0x04, + /* RLE: 043 Pixels @ 251,234*/ 43, 0x00, + /* ABS: 022 Pixels @ 294,234*/ 0, 22, 0x03, 0x0A, 0x07, 0x12, 0x0B, 0x11, 0x0B, 0x03, 0x0E, 0x0F, 0x0E, 0x03, 0x12, 0x0F, 0x03, 0x00, 0x03, 0x12, 0x11, 0x03, 0x04, 0x04, + /* RLE: 012 Pixels @ 316,234*/ 12, 0x03, + /* ABS: 002 Pixels @ 328,234*/ 0, 2, 0x04, 0x04, + /* RLE: 058 Pixels @ 330,234*/ 58, 0x00, + /* RLE: 052 Pixels @ 000,235*/ 52, 0x02, + /* ABS: 010 Pixels @ 052,235*/ 0, 10, 0x03, 0x12, 0x07, 0x07, 0x11, 0x06, 0x07, 0x04, 0x0A, 0x03, + /* RLE: 041 Pixels @ 062,235*/ 41, 0x00, + /* ABS: 009 Pixels @ 103,235*/ 0, 9, 0x03, 0x0D, 0x06, 0x0B, 0x0A, 0x00, 0x03, 0x03, 0x03, + /* RLE: 028 Pixels @ 112,235*/ 28, 0x00, + /* ABS: 009 Pixels @ 140,235*/ 0, 9, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x06, 0x0D, 0x07, 0x07, + /* RLE: 094 Pixels @ 149,235*/ 94, 0x00, + /* RLE: 001 Pixels @ 243,235*/ 1, 0x04, + /* RLE: 007 Pixels @ 244,235*/ 7, 0x03, + /* RLE: 001 Pixels @ 251,235*/ 1, 0x04, + /* RLE: 042 Pixels @ 252,235*/ 42, 0x00, + /* ABS: 003 Pixels @ 294,235*/ 0, 3, 0x03, 0x06, 0x0D, + /* RLE: 006 Pixels @ 297,235*/ 6, 0x03, + /* ABS: 010 Pixels @ 303,235*/ 0, 10, 0x0E, 0x07, 0x00, 0x00, 0x07, 0x04, 0x03, 0x03, 0x04, 0x04, + /* RLE: 013 Pixels @ 313,235*/ 13, 0x03, + /* ABS: 002 Pixels @ 326,235*/ 0, 2, 0x04, 0x04, + /* RLE: 060 Pixels @ 328,235*/ 60, 0x00, + /* RLE: 052 Pixels @ 000,236*/ 52, 0x02, + /* ABS: 009 Pixels @ 052,236*/ 0, 9, 0x03, 0x06, 0x12, 0x03, 0x03, 0x03, 0x0E, 0x00, 0x03, + /* RLE: 042 Pixels @ 061,236*/ 42, 0x00, + /* RLE: 003 Pixels @ 103,236*/ 3, 0x03, + /* ABS: 007 Pixels @ 106,236*/ 0, 7, 0x00, 0x04, 0x00, 0x03, 0x03, 0x08, 0x0B, + /* RLE: 028 Pixels @ 113,236*/ 28, 0x00, + /* RLE: 007 Pixels @ 141,236*/ 7, 0x03, + /* ABS: 002 Pixels @ 148,236*/ 0, 2, 0x00, 0x03, + /* RLE: 093 Pixels @ 150,236*/ 93, 0x00, + /* ABS: 002 Pixels @ 243,236*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 245,236*/ 6, 0x03, + /* RLE: 001 Pixels @ 251,236*/ 1, 0x04, + /* RLE: 042 Pixels @ 252,236*/ 42, 0x00, + /* ABS: 015 Pixels @ 294,236*/ 0, 15, 0x03, 0x0B, 0x07, 0x0D, 0x0F, 0x07, 0x07, 0x12, 0x03, 0x00, 0x07, 0x0B, 0x00, 0x11, 0x06, + /* RLE: 015 Pixels @ 309,236*/ 15, 0x03, + /* ABS: 002 Pixels @ 324,236*/ 0, 2, 0x04, 0x04, + /* RLE: 062 Pixels @ 326,236*/ 62, 0x00, + /* RLE: 052 Pixels @ 000,237*/ 52, 0x02, + /* ABS: 008 Pixels @ 052,237*/ 0, 8, 0x03, 0x0A, 0x00, 0x03, 0x03, 0x03, 0x00, 0x03, + /* RLE: 044 Pixels @ 060,237*/ 44, 0x00, + /* ABS: 009 Pixels @ 104,237*/ 0, 9, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x0D, 0x03, 0x18, 0x0B, + /* RLE: 029 Pixels @ 113,237*/ 29, 0x00, + /* ABS: 009 Pixels @ 142,237*/ 0, 9, 0x03, 0x0B, 0x07, 0x07, 0x0A, 0x0E, 0x03, 0x03, 0x04, + /* RLE: 093 Pixels @ 151,237*/ 93, 0x00, + /* RLE: 001 Pixels @ 244,237*/ 1, 0x04, + /* RLE: 007 Pixels @ 245,237*/ 7, 0x03, + /* RLE: 001 Pixels @ 252,237*/ 1, 0x04, + /* RLE: 039 Pixels @ 253,237*/ 39, 0x00, + /* ABS: 017 Pixels @ 292,237*/ 0, 17, 0x04, 0x04, 0x03, 0x03, 0x0B, 0x06, 0x12, 0x0B, 0x12, 0x07, 0x04, 0x03, 0x0E, 0x07, 0x0F, 0x04, 0x04, + /* RLE: 013 Pixels @ 309,237*/ 13, 0x03, + /* RLE: 003 Pixels @ 322,237*/ 3, 0x04, + /* RLE: 063 Pixels @ 325,237*/ 63, 0x00, + /* RLE: 052 Pixels @ 000,238*/ 52, 0x02, + /* ABS: 009 Pixels @ 052,238*/ 0, 9, 0x03, 0x0A, 0x0B, 0x12, 0x0D, 0x07, 0x0F, 0x03, 0x04, + /* RLE: 042 Pixels @ 061,238*/ 42, 0x00, + /* ABS: 010 Pixels @ 103,238*/ 0, 10, 0x03, 0x04, 0x07, 0x0E, 0x11, 0x00, 0x11, 0x0B, 0x03, 0x0B, + /* RLE: 028 Pixels @ 113,238*/ 28, 0x00, + /* ABS: 010 Pixels @ 141,238*/ 0, 10, 0x03, 0x00, 0x07, 0x04, 0x0D, 0x0A, 0x0F, 0x0B, 0x03, 0x04, + /* RLE: 093 Pixels @ 151,238*/ 93, 0x00, + /* ABS: 002 Pixels @ 244,238*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 246,238*/ 6, 0x03, + /* RLE: 001 Pixels @ 252,238*/ 1, 0x04, + /* RLE: 035 Pixels @ 253,238*/ 35, 0x00, + /* RLE: 007 Pixels @ 288,238*/ 7, 0x03, + /* RLE: 001 Pixels @ 295,238*/ 1, 0x0A, + /* RLE: 005 Pixels @ 296,238*/ 5, 0x03, + /* ABS: 006 Pixels @ 301,238*/ 0, 6, 0x07, 0x0B, 0x03, 0x03, 0x0A, 0x00, + /* RLE: 013 Pixels @ 307,238*/ 13, 0x03, + /* RLE: 003 Pixels @ 320,238*/ 3, 0x04, + /* RLE: 065 Pixels @ 323,238*/ 65, 0x00, + /* RLE: 052 Pixels @ 000,239*/ 52, 0x02, + /* ABS: 008 Pixels @ 052,239*/ 0, 8, 0x03, 0x06, 0x07, 0x0F, 0x06, 0x11, 0x06, 0x03, + /* RLE: 043 Pixels @ 060,239*/ 43, 0x00, + /* ABS: 010 Pixels @ 103,239*/ 0, 10, 0x03, 0x0B, 0x06, 0x03, 0x0F, 0x03, 0x06, 0x0B, 0x03, 0x0B, + /* RLE: 029 Pixels @ 113,239*/ 29, 0x00, + /* ABS: 009 Pixels @ 142,239*/ 0, 9, 0x0B, 0x06, 0x03, 0x0F, 0x03, 0x0E, 0x0B, 0x03, 0x04, + /* RLE: 094 Pixels @ 151,239*/ 94, 0x00, + /* RLE: 001 Pixels @ 245,239*/ 1, 0x04, + /* RLE: 006 Pixels @ 246,239*/ 6, 0x03, + /* ABS: 002 Pixels @ 252,239*/ 0, 2, 0x04, 0x04, + /* RLE: 024 Pixels @ 254,239*/ 24, 0x00, + /* RLE: 003 Pixels @ 278,239*/ 3, 0x03, + /* RLE: 005 Pixels @ 281,239*/ 5, 0x00, + /* ABS: 017 Pixels @ 286,239*/ 0, 17, 0x03, 0x03, 0x00, 0x11, 0x07, 0x0B, 0x03, 0x0E, 0x07, 0x07, 0x04, 0x07, 0x0B, 0x04, 0x0D, 0x0F, 0x00, + /* RLE: 016 Pixels @ 303,239*/ 16, 0x03, + /* ABS: 002 Pixels @ 319,239*/ 0, 2, 0x04, 0x04, + /* RLE: 067 Pixels @ 321,239*/ 67, 0x00, + /* RLE: 052 Pixels @ 000,240*/ 52, 0x02, + /* ABS: 002 Pixels @ 052,240*/ 0, 2, 0x03, 0x00, + /* RLE: 004 Pixels @ 054,240*/ 4, 0x03, + /* ABS: 002 Pixels @ 058,240*/ 0, 2, 0x07, 0x04, + /* RLE: 043 Pixels @ 060,240*/ 43, 0x00, + /* ABS: 011 Pixels @ 103,240*/ 0, 11, 0x03, 0x04, 0x0F, 0x0A, 0x12, 0x06, 0x07, 0x0A, 0x18, 0x08, 0x0B, + /* RLE: 027 Pixels @ 114,240*/ 27, 0x00, + /* ABS: 010 Pixels @ 141,240*/ 0, 10, 0x03, 0x00, 0x07, 0x0E, 0x0F, 0x0A, 0x11, 0x0B, 0x03, 0x04, + /* RLE: 094 Pixels @ 151,240*/ 94, 0x00, + /* RLE: 001 Pixels @ 245,240*/ 1, 0x04, + /* RLE: 007 Pixels @ 246,240*/ 7, 0x03, + /* RLE: 001 Pixels @ 253,240*/ 1, 0x04, + /* RLE: 024 Pixels @ 254,240*/ 24, 0x00, + /* ABS: 003 Pixels @ 278,240*/ 0, 3, 0x03, 0x06, 0x04, + /* RLE: 004 Pixels @ 281,240*/ 4, 0x03, + /* ABS: 017 Pixels @ 285,240*/ 0, 17, 0x00, 0x00, 0x11, 0x06, 0x04, 0x06, 0x07, 0x00, 0x0E, 0x0E, 0x00, 0x03, 0x06, 0x07, 0x07, 0x12, 0x00, + /* RLE: 015 Pixels @ 302,240*/ 15, 0x03, + /* ABS: 002 Pixels @ 317,240*/ 0, 2, 0x04, 0x04, + /* RLE: 069 Pixels @ 319,240*/ 69, 0x00, + /* RLE: 052 Pixels @ 000,241*/ 52, 0x02, + /* ABS: 002 Pixels @ 052,241*/ 0, 2, 0x18, 0x00, + /* RLE: 004 Pixels @ 054,241*/ 4, 0x03, + /* ABS: 003 Pixels @ 058,241*/ 0, 3, 0x04, 0x00, 0x03, + /* RLE: 037 Pixels @ 061,241*/ 37, 0x00, + /* RLE: 005 Pixels @ 098,241*/ 5, 0x03, + /* ABS: 011 Pixels @ 103,241*/ 0, 11, 0x00, 0x03, 0x06, 0x06, 0x0B, 0x0F, 0x04, 0x03, 0x03, 0x18, 0x0B, + /* RLE: 026 Pixels @ 114,241*/ 26, 0x00, + /* ABS: 010 Pixels @ 140,241*/ 0, 10, 0x03, 0x00, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x0D, 0x03, 0x03, + /* RLE: 096 Pixels @ 150,241*/ 96, 0x00, + /* RLE: 001 Pixels @ 246,241*/ 1, 0x04, + /* RLE: 006 Pixels @ 247,241*/ 6, 0x03, + /* ABS: 002 Pixels @ 253,241*/ 0, 2, 0x04, 0x04, + /* RLE: 023 Pixels @ 255,241*/ 23, 0x00, + /* ABS: 015 Pixels @ 278,241*/ 0, 15, 0x03, 0x11, 0x06, 0x00, 0x11, 0x07, 0x0B, 0x03, 0x03, 0x07, 0x06, 0x03, 0x00, 0x07, 0x0B, + /* RLE: 025 Pixels @ 293,241*/ 25, 0x03, + /* ABS: 002 Pixels @ 318,241*/ 0, 2, 0x04, 0x04, + /* RLE: 068 Pixels @ 320,241*/ 68, 0x00, + /* RLE: 053 Pixels @ 000,242*/ 53, 0x02, + /* ABS: 003 Pixels @ 053,242*/ 0, 3, 0x03, 0x0A, 0x0A, + /* RLE: 005 Pixels @ 056,242*/ 5, 0x03, + /* RLE: 001 Pixels @ 061,242*/ 1, 0x04, + /* RLE: 033 Pixels @ 062,242*/ 33, 0x00, + /* RLE: 003 Pixels @ 095,242*/ 3, 0x03, + /* RLE: 005 Pixels @ 098,242*/ 5, 0x13, + /* RLE: 003 Pixels @ 103,242*/ 3, 0x03, + /* ABS: 008 Pixels @ 106,242*/ 0, 8, 0x00, 0x03, 0x03, 0x03, 0x00, 0x04, 0x03, 0x0B, + /* RLE: 025 Pixels @ 114,242*/ 25, 0x00, + /* ABS: 011 Pixels @ 139,242*/ 0, 11, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0A, 0x00, 0x03, 0x03, 0x04, + /* RLE: 096 Pixels @ 150,242*/ 96, 0x00, + /* RLE: 001 Pixels @ 246,242*/ 1, 0x04, + /* RLE: 007 Pixels @ 247,242*/ 7, 0x03, + /* RLE: 001 Pixels @ 254,242*/ 1, 0x04, + /* RLE: 023 Pixels @ 255,242*/ 23, 0x00, + /* ABS: 015 Pixels @ 278,242*/ 0, 15, 0x03, 0x0B, 0x07, 0x0D, 0x04, 0x12, 0x07, 0x00, 0x03, 0x0E, 0x0F, 0x03, 0x03, 0x12, 0x11, + /* RLE: 004 Pixels @ 293,242*/ 4, 0x03, + /* RLE: 014 Pixels @ 297,242*/ 14, 0x04, + /* RLE: 008 Pixels @ 311,242*/ 8, 0x03, + /* ABS: 002 Pixels @ 319,242*/ 0, 2, 0x04, 0x04, + /* RLE: 067 Pixels @ 321,242*/ 67, 0x00, + /* RLE: 053 Pixels @ 000,243*/ 53, 0x02, + /* ABS: 003 Pixels @ 053,243*/ 0, 3, 0x03, 0x06, 0x06, + /* RLE: 005 Pixels @ 056,243*/ 5, 0x03, + /* RLE: 001 Pixels @ 061,243*/ 1, 0x04, + /* RLE: 032 Pixels @ 062,243*/ 32, 0x00, + /* ABS: 004 Pixels @ 094,243*/ 0, 4, 0x03, 0x03, 0x13, 0x13, + /* RLE: 005 Pixels @ 098,243*/ 5, 0x16, + /* ABS: 011 Pixels @ 103,243*/ 0, 11, 0x13, 0x13, 0x03, 0x03, 0x0B, 0x06, 0x0F, 0x07, 0x07, 0x03, 0x0B, + /* RLE: 025 Pixels @ 114,243*/ 25, 0x00, + /* ABS: 010 Pixels @ 139,243*/ 0, 10, 0x03, 0x06, 0x07, 0x07, 0x07, 0x0D, 0x06, 0x0B, 0x0B, 0x03, + /* RLE: 098 Pixels @ 149,243*/ 98, 0x00, + /* RLE: 001 Pixels @ 247,243*/ 1, 0x04, + /* RLE: 006 Pixels @ 248,243*/ 6, 0x03, + /* ABS: 002 Pixels @ 254,243*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 256,243*/ 14, 0x00, + /* ABS: 002 Pixels @ 270,243*/ 0, 2, 0x03, 0x03, + /* RLE: 004 Pixels @ 272,243*/ 4, 0x00, + /* RLE: 004 Pixels @ 276,243*/ 4, 0x03, + /* ABS: 016 Pixels @ 280,243*/ 0, 16, 0x0F, 0x06, 0x03, 0x00, 0x07, 0x0B, 0x03, 0x00, 0x07, 0x04, 0x03, 0x0A, 0x07, 0x00, 0x03, 0x04, + /* RLE: 014 Pixels @ 296,243*/ 14, 0x00, + /* ABS: 002 Pixels @ 310,243*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 312,243*/ 8, 0x03, + /* ABS: 002 Pixels @ 320,243*/ 0, 2, 0x04, 0x04, + /* RLE: 066 Pixels @ 322,243*/ 66, 0x00, + /* RLE: 053 Pixels @ 000,244*/ 53, 0x02, + /* ABS: 003 Pixels @ 053,244*/ 0, 3, 0x03, 0x00, 0x00, + /* RLE: 005 Pixels @ 056,244*/ 5, 0x03, + /* RLE: 001 Pixels @ 061,244*/ 1, 0x04, + /* RLE: 031 Pixels @ 062,244*/ 31, 0x00, + /* ABS: 003 Pixels @ 093,244*/ 0, 3, 0x03, 0x03, 0x13, + /* RLE: 007 Pixels @ 096,244*/ 7, 0x16, + /* ABS: 010 Pixels @ 103,244*/ 0, 10, 0x17, 0x17, 0x13, 0x03, 0x03, 0x0D, 0x0E, 0x0E, 0x06, 0x03, + /* RLE: 026 Pixels @ 113,244*/ 26, 0x00, + /* ABS: 009 Pixels @ 139,244*/ 0, 9, 0x03, 0x00, 0x00, 0x0B, 0x0B, 0x06, 0x0D, 0x07, 0x07, + /* RLE: 099 Pixels @ 148,244*/ 99, 0x00, + /* RLE: 001 Pixels @ 247,244*/ 1, 0x04, + /* RLE: 007 Pixels @ 248,244*/ 7, 0x03, + /* RLE: 001 Pixels @ 255,244*/ 1, 0x04, + /* RLE: 013 Pixels @ 256,244*/ 13, 0x00, + /* ABS: 025 Pixels @ 269,244*/ 0, 25, 0x03, 0x04, 0x0B, 0x03, 0x00, 0x03, 0x03, 0x04, 0x06, 0x12, 0x03, 0x0E, 0x0F, 0x03, 0x03, 0x12, 0x11, 0x03, 0x03, 0x0D, 0x0D, 0x03, 0x03, 0x00, 0x03, + /* RLE: 017 Pixels @ 294,244*/ 17, 0x00, + /* ABS: 002 Pixels @ 311,244*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 313,244*/ 8, 0x03, + /* ABS: 002 Pixels @ 321,244*/ 0, 2, 0x04, 0x04, + /* RLE: 065 Pixels @ 323,244*/ 65, 0x00, + /* RLE: 053 Pixels @ 000,245*/ 53, 0x02, + /* ABS: 002 Pixels @ 053,245*/ 0, 2, 0x18, 0x00, + /* RLE: 006 Pixels @ 055,245*/ 6, 0x03, + /* RLE: 001 Pixels @ 061,245*/ 1, 0x04, + /* RLE: 030 Pixels @ 062,245*/ 30, 0x00, + /* ABS: 008 Pixels @ 092,245*/ 0, 8, 0x03, 0x03, 0x13, 0x16, 0x16, 0x16, 0x03, 0x03, + /* RLE: 004 Pixels @ 100,245*/ 4, 0x16, + /* ABS: 003 Pixels @ 104,245*/ 0, 3, 0x17, 0x17, 0x13, + /* RLE: 004 Pixels @ 107,245*/ 4, 0x03, + /* ABS: 004 Pixels @ 111,245*/ 0, 4, 0x0E, 0x0E, 0x03, 0x0B, + /* RLE: 024 Pixels @ 115,245*/ 24, 0x00, + /* ABS: 002 Pixels @ 139,245*/ 0, 2, 0x03, 0x04, + /* RLE: 006 Pixels @ 141,245*/ 6, 0x03, + /* ABS: 002 Pixels @ 147,245*/ 0, 2, 0x00, 0x03, + /* RLE: 099 Pixels @ 149,245*/ 99, 0x00, + /* RLE: 001 Pixels @ 248,245*/ 1, 0x04, + /* RLE: 006 Pixels @ 249,245*/ 6, 0x03, + /* ABS: 002 Pixels @ 255,245*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 257,245*/ 8, 0x00, + /* RLE: 003 Pixels @ 265,245*/ 3, 0x03, + /* ABS: 024 Pixels @ 268,245*/ 0, 24, 0x00, 0x03, 0x0E, 0x07, 0x03, 0x00, 0x03, 0x0D, 0x11, 0x0B, 0x07, 0x0B, 0x00, 0x07, 0x04, 0x03, 0x0A, 0x07, 0x00, 0x03, 0x0A, 0x04, 0x03, 0x0A, + /* RLE: 020 Pixels @ 292,245*/ 20, 0x00, + /* ABS: 002 Pixels @ 312,245*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 314,245*/ 8, 0x03, + /* ABS: 002 Pixels @ 322,245*/ 0, 2, 0x04, 0x04, + /* RLE: 064 Pixels @ 324,245*/ 64, 0x00, + /* RLE: 054 Pixels @ 000,246*/ 54, 0x02, + /* RLE: 001 Pixels @ 054,246*/ 1, 0x04, + /* RLE: 006 Pixels @ 055,246*/ 6, 0x03, + /* RLE: 001 Pixels @ 061,246*/ 1, 0x04, + /* RLE: 030 Pixels @ 062,246*/ 30, 0x00, + /* ABS: 005 Pixels @ 092,246*/ 0, 5, 0x03, 0x13, 0x17, 0x16, 0x16, + /* RLE: 004 Pixels @ 097,246*/ 4, 0x03, + /* RLE: 003 Pixels @ 101,246*/ 3, 0x16, + /* RLE: 003 Pixels @ 104,246*/ 3, 0x17, + /* ABS: 008 Pixels @ 107,246*/ 0, 8, 0x13, 0x03, 0x03, 0x0A, 0x0D, 0x06, 0x03, 0x0B, + /* RLE: 024 Pixels @ 115,246*/ 24, 0x00, + /* ABS: 003 Pixels @ 139,246*/ 0, 3, 0x03, 0x07, 0x0A, + /* RLE: 004 Pixels @ 142,246*/ 4, 0x03, + /* ABS: 004 Pixels @ 146,246*/ 0, 4, 0x00, 0x0E, 0x03, 0x04, + /* RLE: 098 Pixels @ 150,246*/ 98, 0x00, + /* RLE: 001 Pixels @ 248,246*/ 1, 0x04, + /* RLE: 007 Pixels @ 249,246*/ 7, 0x03, + /* RLE: 001 Pixels @ 256,246*/ 1, 0x04, + /* RLE: 008 Pixels @ 257,246*/ 8, 0x00, + /* ABS: 025 Pixels @ 265,246*/ 0, 25, 0x03, 0x06, 0x0B, 0x03, 0x03, 0x00, 0x07, 0x0B, 0x03, 0x03, 0x0D, 0x00, 0x0A, 0x0F, 0x11, 0x03, 0x06, 0x0D, 0x03, 0x03, 0x00, 0x03, 0x00, 0x00, 0x03, + /* RLE: 023 Pixels @ 290,246*/ 23, 0x00, + /* ABS: 002 Pixels @ 313,246*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 315,246*/ 8, 0x03, + /* ABS: 002 Pixels @ 323,246*/ 0, 2, 0x04, 0x04, + /* RLE: 063 Pixels @ 325,246*/ 63, 0x00, + /* RLE: 054 Pixels @ 000,247*/ 54, 0x02, + /* RLE: 001 Pixels @ 054,247*/ 1, 0x04, + /* RLE: 007 Pixels @ 055,247*/ 7, 0x03, + /* RLE: 030 Pixels @ 062,247*/ 30, 0x00, + /* ABS: 005 Pixels @ 092,247*/ 0, 5, 0x03, 0x13, 0x17, 0x16, 0x16, + /* RLE: 004 Pixels @ 097,247*/ 4, 0x03, + /* RLE: 004 Pixels @ 101,247*/ 4, 0x16, + /* ABS: 010 Pixels @ 105,247*/ 0, 10, 0x17, 0x17, 0x13, 0x03, 0x07, 0x07, 0x07, 0x0A, 0x03, 0x0B, + /* RLE: 024 Pixels @ 115,247*/ 24, 0x00, + /* ABS: 011 Pixels @ 139,247*/ 0, 11, 0x03, 0x0D, 0x0F, 0x00, 0x03, 0x00, 0x12, 0x07, 0x07, 0x03, 0x04, + /* RLE: 099 Pixels @ 150,247*/ 99, 0x00, + /* RLE: 001 Pixels @ 249,247*/ 1, 0x04, + /* RLE: 006 Pixels @ 250,247*/ 6, 0x03, + /* ABS: 002 Pixels @ 256,247*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 258,247*/ 7, 0x00, + /* ABS: 021 Pixels @ 265,247*/ 0, 21, 0x03, 0x11, 0x11, 0x03, 0x03, 0x00, 0x0F, 0x11, 0x03, 0x03, 0x03, 0x0E, 0x0D, 0x0B, 0x07, 0x0A, 0x0A, 0x04, 0x03, 0x03, 0x0A, + /* RLE: 028 Pixels @ 286,247*/ 28, 0x00, + /* ABS: 002 Pixels @ 314,247*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 316,247*/ 8, 0x03, + /* ABS: 002 Pixels @ 324,247*/ 0, 2, 0x04, 0x04, + /* RLE: 062 Pixels @ 326,247*/ 62, 0x00, + /* RLE: 055 Pixels @ 000,248*/ 55, 0x02, + /* RLE: 001 Pixels @ 055,248*/ 1, 0x04, + /* RLE: 006 Pixels @ 056,248*/ 6, 0x03, + /* RLE: 001 Pixels @ 062,248*/ 1, 0x04, + /* RLE: 029 Pixels @ 063,248*/ 29, 0x00, + /* ABS: 008 Pixels @ 092,248*/ 0, 8, 0x03, 0x13, 0x17, 0x16, 0x16, 0x16, 0x03, 0x03, + /* RLE: 005 Pixels @ 100,248*/ 5, 0x16, + /* ABS: 010 Pixels @ 105,248*/ 0, 10, 0x17, 0x17, 0x13, 0x03, 0x0B, 0x0A, 0x03, 0x03, 0x18, 0x0B, + /* RLE: 024 Pixels @ 115,248*/ 24, 0x00, + /* ABS: 010 Pixels @ 139,248*/ 0, 10, 0x03, 0x00, 0x0F, 0x0D, 0x06, 0x07, 0x07, 0x12, 0x0A, 0x03, + /* RLE: 100 Pixels @ 149,248*/ 100, 0x00, + /* RLE: 001 Pixels @ 249,248*/ 1, 0x04, + /* RLE: 007 Pixels @ 250,248*/ 7, 0x03, + /* RLE: 001 Pixels @ 257,248*/ 1, 0x0B, + /* RLE: 007 Pixels @ 258,248*/ 7, 0x00, + /* ABS: 018 Pixels @ 265,248*/ 0, 18, 0x03, 0x04, 0x07, 0x04, 0x12, 0x07, 0x0F, 0x07, 0x0A, 0x03, 0x00, 0x07, 0x00, 0x00, 0x07, 0x0D, 0x03, 0x03, + /* RLE: 032 Pixels @ 283,248*/ 32, 0x00, + /* ABS: 002 Pixels @ 315,248*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 317,248*/ 8, 0x03, + /* RLE: 001 Pixels @ 325,248*/ 1, 0x04, + /* RLE: 062 Pixels @ 326,248*/ 62, 0x00, + /* RLE: 055 Pixels @ 000,249*/ 55, 0x02, + /* RLE: 001 Pixels @ 055,249*/ 1, 0x04, + /* RLE: 006 Pixels @ 056,249*/ 6, 0x03, + /* RLE: 001 Pixels @ 062,249*/ 1, 0x04, + /* RLE: 029 Pixels @ 063,249*/ 29, 0x00, + /* ABS: 003 Pixels @ 092,249*/ 0, 3, 0x03, 0x13, 0x17, + /* RLE: 009 Pixels @ 095,249*/ 9, 0x16, + /* RLE: 003 Pixels @ 104,249*/ 3, 0x17, + /* ABS: 009 Pixels @ 107,249*/ 0, 9, 0x13, 0x03, 0x03, 0x00, 0x0B, 0x00, 0x03, 0x1B, 0x0B, + /* RLE: 023 Pixels @ 116,249*/ 23, 0x00, + /* ABS: 009 Pixels @ 139,249*/ 0, 9, 0x03, 0x03, 0x0A, 0x07, 0x07, 0x0B, 0x00, 0x03, 0x03, + /* RLE: 102 Pixels @ 148,249*/ 102, 0x00, + /* ABS: 002 Pixels @ 250,249*/ 0, 2, 0x04, 0x03, + /* RLE: 006 Pixels @ 252,249*/ 6, 0x08, + /* ABS: 024 Pixels @ 258,249*/ 0, 24, 0x0B, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x03, 0x0F, 0x07, 0x12, 0x0A, 0x03, 0x0F, 0x12, 0x03, 0x00, 0x07, 0x11, 0x11, 0x00, 0x00, 0x03, + /* RLE: 034 Pixels @ 282,249*/ 34, 0x00, + /* ABS: 002 Pixels @ 316,249*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 318,249*/ 8, 0x03, + /* RLE: 062 Pixels @ 326,249*/ 62, 0x00, + /* RLE: 055 Pixels @ 000,250*/ 55, 0x02, + /* RLE: 001 Pixels @ 055,250*/ 1, 0x04, + /* RLE: 006 Pixels @ 056,250*/ 6, 0x03, + /* RLE: 001 Pixels @ 062,250*/ 1, 0x04, + /* RLE: 029 Pixels @ 063,250*/ 29, 0x00, + /* ABS: 004 Pixels @ 092,250*/ 0, 4, 0x03, 0x13, 0x17, 0x17, + /* RLE: 007 Pixels @ 096,250*/ 7, 0x16, + /* RLE: 004 Pixels @ 103,250*/ 4, 0x17, + /* ABS: 009 Pixels @ 107,250*/ 0, 9, 0x13, 0x03, 0x03, 0x0F, 0x07, 0x0F, 0x00, 0x18, 0x0B, + /* RLE: 022 Pixels @ 116,250*/ 22, 0x00, + /* ABS: 011 Pixels @ 138,250*/ 0, 11, 0x03, 0x00, 0x04, 0x00, 0x0B, 0x07, 0x04, 0x03, 0x03, 0x03, 0x0A, + /* RLE: 101 Pixels @ 149,250*/ 101, 0x00, + /* ABS: 009 Pixels @ 250,250*/ 0, 9, 0x04, 0x03, 0x1B, 0x18, 0x18, 0x18, 0x08, 0x08, 0x1B, + /* RLE: 007 Pixels @ 259,250*/ 7, 0x03, + /* ABS: 015 Pixels @ 266,250*/ 0, 15, 0x0A, 0x0E, 0x07, 0x00, 0x03, 0x03, 0x0E, 0x07, 0x00, 0x03, 0x00, 0x0B, 0x00, 0x03, 0x03, + /* RLE: 036 Pixels @ 281,250*/ 36, 0x00, + /* ABS: 002 Pixels @ 317,250*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 319,250*/ 7, 0x03, + /* RLE: 001 Pixels @ 326,250*/ 1, 0x04, + /* RLE: 061 Pixels @ 327,250*/ 61, 0x00, + /* RLE: 055 Pixels @ 000,251*/ 55, 0x02, + /* RLE: 001 Pixels @ 055,251*/ 1, 0x04, + /* RLE: 006 Pixels @ 056,251*/ 6, 0x03, + /* RLE: 001 Pixels @ 062,251*/ 1, 0x04, + /* RLE: 029 Pixels @ 063,251*/ 29, 0x00, + /* ABS: 002 Pixels @ 092,251*/ 0, 2, 0x03, 0x13, + /* RLE: 004 Pixels @ 094,251*/ 4, 0x17, + /* RLE: 004 Pixels @ 098,251*/ 4, 0x16, + /* RLE: 005 Pixels @ 102,251*/ 5, 0x17, + /* ABS: 009 Pixels @ 107,251*/ 0, 9, 0x13, 0x03, 0x0A, 0x07, 0x04, 0x06, 0x0B, 0x03, 0x0B, + /* RLE: 022 Pixels @ 116,251*/ 22, 0x00, + /* ABS: 002 Pixels @ 138,251*/ 0, 2, 0x03, 0x12, + /* RLE: 004 Pixels @ 140,251*/ 4, 0x07, + /* ABS: 005 Pixels @ 144,251*/ 0, 5, 0x0F, 0x12, 0x0B, 0x00, 0x03, + /* RLE: 102 Pixels @ 149,251*/ 102, 0x00, + /* ABS: 027 Pixels @ 251,251*/ 0, 27, 0x08, 0x18, 0x00, 0x04, 0x03, 0x1B, 0x18, 0x03, 0x04, 0x06, 0x06, 0x04, 0x03, 0x0E, 0x07, 0x07, 0x00, 0x07, 0x0B, 0x03, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, + /* RLE: 040 Pixels @ 278,251*/ 40, 0x00, + /* ABS: 002 Pixels @ 318,251*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 320,251*/ 6, 0x03, + /* RLE: 001 Pixels @ 326,251*/ 1, 0x04, + /* RLE: 061 Pixels @ 327,251*/ 61, 0x00, + /* RLE: 055 Pixels @ 000,252*/ 55, 0x02, + /* RLE: 001 Pixels @ 055,252*/ 1, 0x04, + /* RLE: 006 Pixels @ 056,252*/ 6, 0x03, + /* RLE: 001 Pixels @ 062,252*/ 1, 0x04, + /* RLE: 029 Pixels @ 063,252*/ 29, 0x00, + /* ABS: 003 Pixels @ 092,252*/ 0, 3, 0x03, 0x03, 0x13, + /* RLE: 011 Pixels @ 095,252*/ 11, 0x17, + /* ABS: 010 Pixels @ 106,252*/ 0, 10, 0x13, 0x03, 0x03, 0x00, 0x07, 0x0A, 0x0E, 0x0B, 0x03, 0x0B, + /* RLE: 023 Pixels @ 116,252*/ 23, 0x00, + /* ABS: 010 Pixels @ 139,252*/ 0, 10, 0x03, 0x0A, 0x04, 0x0B, 0x12, 0x06, 0x07, 0x07, 0x0A, 0x03, + /* RLE: 102 Pixels @ 149,252*/ 102, 0x00, + /* ABS: 019 Pixels @ 251,252*/ 0, 19, 0x18, 0x03, 0x0E, 0x11, 0x0A, 0x03, 0x03, 0x0B, 0x0F, 0x0E, 0x12, 0x07, 0x04, 0x0E, 0x0E, 0x00, 0x03, 0x06, 0x11, + /* RLE: 005 Pixels @ 270,252*/ 5, 0x03, + /* RLE: 045 Pixels @ 275,252*/ 45, 0x00, + /* RLE: 007 Pixels @ 320,252*/ 7, 0x03, + /* RLE: 001 Pixels @ 327,252*/ 1, 0x04, + /* RLE: 060 Pixels @ 328,252*/ 60, 0x00, + /* RLE: 055 Pixels @ 000,253*/ 55, 0x02, + /* RLE: 001 Pixels @ 055,253*/ 1, 0x04, + /* RLE: 006 Pixels @ 056,253*/ 6, 0x03, + /* RLE: 001 Pixels @ 062,253*/ 1, 0x04, + /* RLE: 030 Pixels @ 063,253*/ 30, 0x00, + /* ABS: 003 Pixels @ 093,253*/ 0, 3, 0x03, 0x03, 0x13, + /* RLE: 009 Pixels @ 096,253*/ 9, 0x17, + /* ABS: 011 Pixels @ 105,253*/ 0, 11, 0x13, 0x03, 0x03, 0x11, 0x0B, 0x07, 0x00, 0x11, 0x04, 0x03, 0x0B, + /* RLE: 021 Pixels @ 116,253*/ 21, 0x00, + /* ABS: 002 Pixels @ 137,253*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 139,253*/ 9, 0x03, + /* RLE: 097 Pixels @ 148,253*/ 97, 0x00, + /* ABS: 019 Pixels @ 245,253*/ 0, 19, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x03, 0x12, 0x07, 0x0F, 0x0A, 0x03, 0x11, 0x0E, 0x03, 0x03, 0x0D, 0x0D, + /* RLE: 004 Pixels @ 264,253*/ 4, 0x03, + /* ABS: 004 Pixels @ 268,253*/ 0, 4, 0x0A, 0x04, 0x03, 0x04, + /* RLE: 048 Pixels @ 272,253*/ 48, 0x00, + /* RLE: 001 Pixels @ 320,253*/ 1, 0x04, + /* RLE: 006 Pixels @ 321,253*/ 6, 0x03, + /* RLE: 001 Pixels @ 327,253*/ 1, 0x04, + /* RLE: 060 Pixels @ 328,253*/ 60, 0x00, + /* RLE: 056 Pixels @ 000,254*/ 56, 0x02, + /* RLE: 007 Pixels @ 056,254*/ 7, 0x03, + /* RLE: 001 Pixels @ 063,254*/ 1, 0x04, + /* RLE: 030 Pixels @ 064,254*/ 30, 0x00, + /* ABS: 004 Pixels @ 094,254*/ 0, 4, 0x03, 0x03, 0x13, 0x13, + /* RLE: 005 Pixels @ 098,254*/ 5, 0x17, + /* ABS: 014 Pixels @ 103,254*/ 0, 14, 0x13, 0x13, 0x03, 0x03, 0x03, 0x0D, 0x07, 0x0F, 0x03, 0x0A, 0x03, 0x03, 0x18, 0x0A, + /* RLE: 018 Pixels @ 117,254*/ 18, 0x00, + /* RLE: 003 Pixels @ 135,254*/ 3, 0x04, + /* RLE: 007 Pixels @ 138,254*/ 7, 0x03, + /* ABS: 002 Pixels @ 145,254*/ 0, 2, 0x04, 0x04, + /* RLE: 096 Pixels @ 147,254*/ 96, 0x00, + /* ABS: 021 Pixels @ 243,254*/ 0, 21, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x03, 0x0E, 0x11, 0x0A, 0x0E, 0x0F, 0x0E, 0x03, 0x03, 0x11, 0x12, 0x03, 0x03, 0x0B, 0x0F, + /* RLE: 005 Pixels @ 264,254*/ 5, 0x03, + /* RLE: 051 Pixels @ 269,254*/ 51, 0x00, + /* RLE: 001 Pixels @ 320,254*/ 1, 0x04, + /* RLE: 007 Pixels @ 321,254*/ 7, 0x03, + /* RLE: 060 Pixels @ 328,254*/ 60, 0x00, + /* RLE: 056 Pixels @ 000,255*/ 56, 0x02, + /* RLE: 001 Pixels @ 056,255*/ 1, 0x04, + /* RLE: 006 Pixels @ 057,255*/ 6, 0x03, + /* RLE: 001 Pixels @ 063,255*/ 1, 0x04, + /* RLE: 028 Pixels @ 064,255*/ 28, 0x00, + /* ABS: 006 Pixels @ 092,255*/ 0, 6, 0x0A, 0x00, 0x00, 0x03, 0x13, 0x00, + /* RLE: 005 Pixels @ 098,255*/ 5, 0x13, + /* RLE: 003 Pixels @ 103,255*/ 3, 0x03, + /* ABS: 011 Pixels @ 106,255*/ 0, 11, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x03, 0x0A, 0x11, 0x0E, 0x00, 0x03, + /* RLE: 016 Pixels @ 117,255*/ 16, 0x00, + /* ABS: 002 Pixels @ 133,255*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 135,255*/ 10, 0x03, + /* RLE: 001 Pixels @ 145,255*/ 1, 0x04, + /* RLE: 096 Pixels @ 146,255*/ 96, 0x00, + /* ABS: 026 Pixels @ 242,255*/ 0, 26, 0x03, 0x00, 0x06, 0x07, 0x07, 0x07, 0x0E, 0x03, 0x12, 0x07, 0x0F, 0x0A, 0x0E, 0x07, 0x00, 0x03, 0x0B, 0x07, 0x0B, 0x0A, 0x11, 0x0E, 0x03, 0x03, 0x04, 0x04, + /* RLE: 053 Pixels @ 268,255*/ 53, 0x00, + /* RLE: 001 Pixels @ 321,255*/ 1, 0x04, + /* RLE: 006 Pixels @ 322,255*/ 6, 0x03, + /* RLE: 001 Pixels @ 328,255*/ 1, 0x04, + /* RLE: 059 Pixels @ 329,255*/ 59, 0x00, + /* RLE: 056 Pixels @ 000,256*/ 56, 0x02, + /* RLE: 001 Pixels @ 056,256*/ 1, 0x04, + /* RLE: 006 Pixels @ 057,256*/ 6, 0x03, + /* RLE: 001 Pixels @ 063,256*/ 1, 0x04, + /* RLE: 029 Pixels @ 064,256*/ 29, 0x00, + /* ABS: 006 Pixels @ 093,256*/ 0, 6, 0x0A, 0x03, 0x13, 0x00, 0x13, 0x13, + /* RLE: 005 Pixels @ 099,256*/ 5, 0x03, + /* RLE: 004 Pixels @ 104,256*/ 4, 0x00, + /* ABS: 009 Pixels @ 108,256*/ 0, 9, 0x03, 0x04, 0x0E, 0x11, 0x07, 0x07, 0x07, 0x06, 0x03, + /* RLE: 013 Pixels @ 117,256*/ 13, 0x00, + /* RLE: 003 Pixels @ 130,256*/ 3, 0x04, + /* RLE: 011 Pixels @ 133,256*/ 11, 0x03, + /* RLE: 001 Pixels @ 144,256*/ 1, 0x04, + /* RLE: 096 Pixels @ 145,256*/ 96, 0x00, + /* ABS: 023 Pixels @ 241,256*/ 0, 23, 0x03, 0x03, 0x11, 0x0D, 0x04, 0x00, 0x0E, 0x07, 0x0B, 0x0E, 0x0F, 0x0E, 0x03, 0x00, 0x07, 0x0B, 0x00, 0x03, 0x12, 0x07, 0x07, 0x0E, 0x03, + /* RLE: 057 Pixels @ 264,256*/ 57, 0x00, + /* RLE: 001 Pixels @ 321,256*/ 1, 0x04, + /* RLE: 006 Pixels @ 322,256*/ 6, 0x03, + /* RLE: 001 Pixels @ 328,256*/ 1, 0x04, + /* RLE: 059 Pixels @ 329,256*/ 59, 0x00, + /* RLE: 056 Pixels @ 000,257*/ 56, 0x02, + /* RLE: 001 Pixels @ 056,257*/ 1, 0x04, + /* RLE: 006 Pixels @ 057,257*/ 6, 0x03, + /* RLE: 001 Pixels @ 063,257*/ 1, 0x04, + /* RLE: 029 Pixels @ 064,257*/ 29, 0x00, + /* ABS: 007 Pixels @ 093,257*/ 0, 7, 0x03, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, + /* RLE: 007 Pixels @ 100,257*/ 7, 0x00, + /* ABS: 009 Pixels @ 107,257*/ 0, 9, 0x03, 0x0E, 0x07, 0x0F, 0x06, 0x0B, 0x0F, 0x04, 0x03, + /* RLE: 012 Pixels @ 116,257*/ 12, 0x00, + /* RLE: 003 Pixels @ 128,257*/ 3, 0x04, + /* RLE: 012 Pixels @ 131,257*/ 12, 0x03, + /* ABS: 002 Pixels @ 143,257*/ 0, 2, 0x04, 0x04, + /* RLE: 096 Pixels @ 145,257*/ 96, 0x00, + /* ABS: 017 Pixels @ 241,257*/ 0, 17, 0x03, 0x04, 0x07, 0x0A, 0x03, 0x03, 0x03, 0x11, 0x0F, 0x03, 0x0E, 0x07, 0x00, 0x03, 0x0E, 0x07, 0x0F, + /* RLE: 005 Pixels @ 258,257*/ 5, 0x03, + /* RLE: 059 Pixels @ 263,257*/ 59, 0x00, + /* RLE: 007 Pixels @ 322,257*/ 7, 0x03, + /* RLE: 001 Pixels @ 329,257*/ 1, 0x04, + /* RLE: 058 Pixels @ 330,257*/ 58, 0x00, + /* RLE: 056 Pixels @ 000,258*/ 56, 0x02, + /* RLE: 001 Pixels @ 056,258*/ 1, 0x04, + /* RLE: 006 Pixels @ 057,258*/ 6, 0x03, + /* RLE: 001 Pixels @ 063,258*/ 1, 0x04, + /* RLE: 029 Pixels @ 064,258*/ 29, 0x00, + /* ABS: 007 Pixels @ 093,258*/ 0, 7, 0x03, 0x13, 0x0A, 0x13, 0x13, 0x03, 0x03, + /* RLE: 007 Pixels @ 100,258*/ 7, 0x00, + /* ABS: 011 Pixels @ 107,258*/ 0, 11, 0x03, 0x0E, 0x06, 0x03, 0x03, 0x03, 0x00, 0x0B, 0x03, 0x08, 0x0B, + /* RLE: 008 Pixels @ 118,258*/ 8, 0x00, + /* ABS: 002 Pixels @ 126,258*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 128,258*/ 14, 0x03, + /* ABS: 002 Pixels @ 142,258*/ 0, 2, 0x04, 0x04, + /* RLE: 094 Pixels @ 144,258*/ 94, 0x00, + /* ABS: 021 Pixels @ 238,258*/ 0, 21, 0x04, 0x04, 0x03, 0x03, 0x0B, 0x07, 0x00, 0x03, 0x03, 0x03, 0x0B, 0x07, 0x00, 0x00, 0x07, 0x0B, 0x00, 0x03, 0x0A, 0x00, 0x03, + /* RLE: 004 Pixels @ 259,258*/ 4, 0x08, + /* RLE: 001 Pixels @ 263,258*/ 1, 0x0B, + /* RLE: 058 Pixels @ 264,258*/ 58, 0x00, + /* RLE: 001 Pixels @ 322,258*/ 1, 0x04, + /* RLE: 006 Pixels @ 323,258*/ 6, 0x03, + /* RLE: 001 Pixels @ 329,258*/ 1, 0x04, + /* RLE: 058 Pixels @ 330,258*/ 58, 0x00, + /* RLE: 056 Pixels @ 000,259*/ 56, 0x02, + /* RLE: 001 Pixels @ 056,259*/ 1, 0x04, + /* RLE: 006 Pixels @ 057,259*/ 6, 0x03, + /* RLE: 001 Pixels @ 063,259*/ 1, 0x04, + /* RLE: 029 Pixels @ 064,259*/ 29, 0x00, + /* ABS: 006 Pixels @ 093,259*/ 0, 6, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, + /* RLE: 008 Pixels @ 099,259*/ 8, 0x00, + /* ABS: 011 Pixels @ 107,259*/ 0, 11, 0x03, 0x00, 0x0A, 0x0E, 0x0D, 0x07, 0x07, 0x07, 0x03, 0x1B, 0x0B, + /* RLE: 005 Pixels @ 118,259*/ 5, 0x00, + /* RLE: 003 Pixels @ 123,259*/ 3, 0x04, + /* RLE: 015 Pixels @ 126,259*/ 15, 0x03, + /* ABS: 002 Pixels @ 141,259*/ 0, 2, 0x04, 0x04, + /* RLE: 093 Pixels @ 143,259*/ 93, 0x00, + /* ABS: 002 Pixels @ 236,259*/ 0, 2, 0x04, 0x04, + /* RLE: 004 Pixels @ 238,259*/ 4, 0x03, + /* ABS: 021 Pixels @ 242,259*/ 0, 21, 0x04, 0x07, 0x04, 0x03, 0x03, 0x03, 0x00, 0x07, 0x00, 0x03, 0x0E, 0x07, 0x0F, 0x03, 0x18, 0x18, 0x1B, 0x08, 0x08, 0x08, 0x0B, + /* RLE: 059 Pixels @ 263,259*/ 59, 0x00, + /* RLE: 001 Pixels @ 322,259*/ 1, 0x04, + /* RLE: 007 Pixels @ 323,259*/ 7, 0x03, + /* RLE: 058 Pixels @ 330,259*/ 58, 0x00, + /* RLE: 057 Pixels @ 000,260*/ 57, 0x02, + /* RLE: 007 Pixels @ 057,260*/ 7, 0x03, + /* RLE: 001 Pixels @ 064,260*/ 1, 0x04, + /* RLE: 027 Pixels @ 065,260*/ 27, 0x00, + /* ABS: 011 Pixels @ 092,260*/ 0, 11, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, 0x03, 0x00, 0x0A, 0x00, 0x00, + /* RLE: 007 Pixels @ 103,260*/ 7, 0x03, + /* ABS: 013 Pixels @ 110,260*/ 0, 13, 0x07, 0x06, 0x0E, 0x0E, 0x11, 0x00, 0x18, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x04, + /* RLE: 016 Pixels @ 123,260*/ 16, 0x03, + /* ABS: 002 Pixels @ 139,260*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 141,260*/ 92, 0x00, + /* ABS: 002 Pixels @ 233,260*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 235,260*/ 8, 0x03, + /* ABS: 013 Pixels @ 243,260*/ 0, 13, 0x0F, 0x11, 0x03, 0x03, 0x03, 0x12, 0x07, 0x03, 0x03, 0x03, 0x0A, 0x00, 0x03, + /* RLE: 006 Pixels @ 256,260*/ 6, 0x08, + /* RLE: 001 Pixels @ 262,260*/ 1, 0x0B, + /* RLE: 060 Pixels @ 263,260*/ 60, 0x00, + /* RLE: 001 Pixels @ 323,260*/ 1, 0x04, + /* RLE: 006 Pixels @ 324,260*/ 6, 0x03, + /* RLE: 001 Pixels @ 330,260*/ 1, 0x04, + /* RLE: 057 Pixels @ 331,260*/ 57, 0x00, + /* RLE: 057 Pixels @ 000,261*/ 57, 0x02, + /* RLE: 001 Pixels @ 057,261*/ 1, 0x04, + /* RLE: 006 Pixels @ 058,261*/ 6, 0x03, + /* RLE: 001 Pixels @ 064,261*/ 1, 0x04, + /* RLE: 026 Pixels @ 065,261*/ 26, 0x00, + /* ABS: 007 Pixels @ 091,261*/ 0, 7, 0x03, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, + /* RLE: 004 Pixels @ 098,261*/ 4, 0x00, + /* ABS: 002 Pixels @ 102,261*/ 0, 2, 0x03, 0x03, + /* RLE: 005 Pixels @ 104,261*/ 5, 0x13, + /* RLE: 005 Pixels @ 109,261*/ 5, 0x03, + /* ABS: 007 Pixels @ 114,261*/ 0, 7, 0x06, 0x0B, 0x03, 0x0B, 0x00, 0x04, 0x04, + /* RLE: 015 Pixels @ 121,261*/ 15, 0x03, + /* RLE: 003 Pixels @ 136,261*/ 3, 0x04, + /* RLE: 092 Pixels @ 139,261*/ 92, 0x00, + /* ABS: 002 Pixels @ 231,261*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 233,261*/ 10, 0x03, + /* ABS: 013 Pixels @ 243,261*/ 0, 13, 0x0A, 0x07, 0x11, 0x0E, 0x06, 0x07, 0x04, 0x03, 0x00, 0x00, 0x00, 0x18, 0x1B, + /* RLE: 006 Pixels @ 256,261*/ 6, 0x08, + /* RLE: 001 Pixels @ 262,261*/ 1, 0x0B, + /* RLE: 060 Pixels @ 263,261*/ 60, 0x00, + /* RLE: 001 Pixels @ 323,261*/ 1, 0x04, + /* RLE: 006 Pixels @ 324,261*/ 6, 0x03, + /* RLE: 001 Pixels @ 330,261*/ 1, 0x04, + /* RLE: 057 Pixels @ 331,261*/ 57, 0x00, + /* RLE: 057 Pixels @ 000,262*/ 57, 0x02, + /* RLE: 001 Pixels @ 057,262*/ 1, 0x04, + /* RLE: 006 Pixels @ 058,262*/ 6, 0x03, + /* RLE: 001 Pixels @ 064,262*/ 1, 0x04, + /* RLE: 026 Pixels @ 065,262*/ 26, 0x00, + /* ABS: 011 Pixels @ 091,262*/ 0, 11, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, 0x03, 0x00, 0x00, 0x0A, 0x03, + /* RLE: 009 Pixels @ 102,262*/ 9, 0x13, + /* ABS: 008 Pixels @ 111,262*/ 0, 8, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x18, 0x0B, 0x04, + /* RLE: 015 Pixels @ 119,262*/ 15, 0x03, + /* ABS: 002 Pixels @ 134,262*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 136,262*/ 92, 0x00, + /* ABS: 002 Pixels @ 228,262*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 230,262*/ 14, 0x03, + /* ABS: 006 Pixels @ 244,262*/ 0, 6, 0x0A, 0x12, 0x06, 0x12, 0x0A, 0x03, + /* RLE: 004 Pixels @ 250,262*/ 4, 0x00, + /* RLE: 001 Pixels @ 254,262*/ 1, 0x0B, + /* RLE: 006 Pixels @ 255,262*/ 6, 0x08, + /* ABS: 003 Pixels @ 261,262*/ 0, 3, 0x03, 0x03, 0x04, + /* RLE: 060 Pixels @ 264,262*/ 60, 0x00, + /* RLE: 007 Pixels @ 324,262*/ 7, 0x03, + /* RLE: 001 Pixels @ 331,262*/ 1, 0x04, + /* RLE: 056 Pixels @ 332,262*/ 56, 0x00, + /* RLE: 057 Pixels @ 000,263*/ 57, 0x02, + /* RLE: 001 Pixels @ 057,263*/ 1, 0x04, + /* RLE: 006 Pixels @ 058,263*/ 6, 0x03, + /* RLE: 001 Pixels @ 064,263*/ 1, 0x04, + /* RLE: 025 Pixels @ 065,263*/ 25, 0x00, + /* ABS: 011 Pixels @ 090,263*/ 0, 11, 0x03, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, 0x00, 0x00, 0x00, 0x03, + /* RLE: 011 Pixels @ 101,263*/ 11, 0x13, + /* RLE: 001 Pixels @ 112,263*/ 1, 0x03, + /* RLE: 004 Pixels @ 113,263*/ 4, 0x1B, + /* RLE: 001 Pixels @ 117,263*/ 1, 0x08, + /* RLE: 014 Pixels @ 118,263*/ 14, 0x03, + /* ABS: 002 Pixels @ 132,263*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 134,263*/ 92, 0x00, + /* ABS: 002 Pixels @ 226,263*/ 0, 2, 0x04, 0x04, + /* RLE: 021 Pixels @ 228,263*/ 21, 0x03, + /* RLE: 007 Pixels @ 249,263*/ 7, 0x00, + /* RLE: 001 Pixels @ 256,263*/ 1, 0x0B, + /* RLE: 006 Pixels @ 257,263*/ 6, 0x03, + /* RLE: 001 Pixels @ 263,263*/ 1, 0x04, + /* RLE: 060 Pixels @ 264,263*/ 60, 0x00, + /* RLE: 001 Pixels @ 324,263*/ 1, 0x04, + /* RLE: 006 Pixels @ 325,263*/ 6, 0x03, + /* RLE: 001 Pixels @ 331,263*/ 1, 0x04, + /* RLE: 056 Pixels @ 332,263*/ 56, 0x00, + /* RLE: 057 Pixels @ 000,264*/ 57, 0x02, + /* RLE: 001 Pixels @ 057,264*/ 1, 0x04, + /* RLE: 006 Pixels @ 058,264*/ 6, 0x03, + /* RLE: 001 Pixels @ 064,264*/ 1, 0x04, + /* RLE: 024 Pixels @ 065,264*/ 24, 0x00, + /* ABS: 012 Pixels @ 089,264*/ 0, 12, 0x0A, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, + /* RLE: 011 Pixels @ 101,264*/ 11, 0x13, + /* RLE: 001 Pixels @ 112,264*/ 1, 0x03, + /* RLE: 005 Pixels @ 113,264*/ 5, 0x08, + /* RLE: 011 Pixels @ 118,264*/ 11, 0x03, + /* RLE: 003 Pixels @ 129,264*/ 3, 0x04, + /* RLE: 091 Pixels @ 132,264*/ 91, 0x00, + /* ABS: 002 Pixels @ 223,264*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 225,264*/ 16, 0x03, + /* ABS: 002 Pixels @ 241,264*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 243,264*/ 13, 0x00, + /* RLE: 001 Pixels @ 256,264*/ 1, 0x04, + /* RLE: 007 Pixels @ 257,264*/ 7, 0x03, + /* RLE: 060 Pixels @ 264,264*/ 60, 0x00, + /* RLE: 001 Pixels @ 324,264*/ 1, 0x04, + /* RLE: 007 Pixels @ 325,264*/ 7, 0x03, + /* RLE: 056 Pixels @ 332,264*/ 56, 0x00, + /* RLE: 057 Pixels @ 000,265*/ 57, 0x02, + /* RLE: 001 Pixels @ 057,265*/ 1, 0x04, + /* RLE: 006 Pixels @ 058,265*/ 6, 0x03, + /* RLE: 001 Pixels @ 064,265*/ 1, 0x04, + /* RLE: 024 Pixels @ 065,265*/ 24, 0x00, + /* ABS: 007 Pixels @ 089,265*/ 0, 7, 0x03, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, + /* RLE: 004 Pixels @ 096,265*/ 4, 0x00, + /* RLE: 001 Pixels @ 100,265*/ 1, 0x03, + /* RLE: 011 Pixels @ 101,265*/ 11, 0x13, + /* RLE: 001 Pixels @ 112,265*/ 1, 0x03, + /* RLE: 005 Pixels @ 113,265*/ 5, 0x08, + /* RLE: 009 Pixels @ 118,265*/ 9, 0x03, + /* ABS: 002 Pixels @ 127,265*/ 0, 2, 0x04, 0x04, + /* RLE: 092 Pixels @ 129,265*/ 92, 0x00, + /* ABS: 002 Pixels @ 221,265*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 223,265*/ 16, 0x03, + /* ABS: 002 Pixels @ 239,265*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 241,265*/ 16, 0x00, + /* RLE: 001 Pixels @ 257,265*/ 1, 0x04, + /* RLE: 006 Pixels @ 258,265*/ 6, 0x03, + /* RLE: 001 Pixels @ 264,265*/ 1, 0x04, + /* RLE: 060 Pixels @ 265,265*/ 60, 0x00, + /* RLE: 001 Pixels @ 325,265*/ 1, 0x04, + /* RLE: 006 Pixels @ 326,265*/ 6, 0x03, + /* RLE: 001 Pixels @ 332,265*/ 1, 0x04, + /* RLE: 055 Pixels @ 333,265*/ 55, 0x00, + /* RLE: 058 Pixels @ 000,266*/ 58, 0x02, + /* RLE: 007 Pixels @ 058,266*/ 7, 0x03, + /* RLE: 001 Pixels @ 065,266*/ 1, 0x04, + /* RLE: 023 Pixels @ 066,266*/ 23, 0x00, + /* ABS: 007 Pixels @ 089,266*/ 0, 7, 0x03, 0x13, 0x0A, 0x13, 0x13, 0x03, 0x03, + /* RLE: 004 Pixels @ 096,266*/ 4, 0x00, + /* RLE: 001 Pixels @ 100,266*/ 1, 0x03, + /* RLE: 011 Pixels @ 101,266*/ 11, 0x13, + /* RLE: 001 Pixels @ 112,266*/ 1, 0x03, + /* RLE: 005 Pixels @ 113,266*/ 5, 0x08, + /* RLE: 006 Pixels @ 118,266*/ 6, 0x03, + /* RLE: 003 Pixels @ 124,266*/ 3, 0x04, + /* RLE: 091 Pixels @ 127,266*/ 91, 0x00, + /* ABS: 002 Pixels @ 218,266*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 220,266*/ 16, 0x03, + /* ABS: 002 Pixels @ 236,266*/ 0, 2, 0x04, 0x04, + /* RLE: 019 Pixels @ 238,266*/ 19, 0x00, + /* RLE: 001 Pixels @ 257,266*/ 1, 0x04, + /* RLE: 006 Pixels @ 258,266*/ 6, 0x03, + /* RLE: 001 Pixels @ 264,266*/ 1, 0x04, + /* RLE: 060 Pixels @ 265,266*/ 60, 0x00, + /* RLE: 001 Pixels @ 325,266*/ 1, 0x04, + /* RLE: 006 Pixels @ 326,266*/ 6, 0x03, + /* RLE: 001 Pixels @ 332,266*/ 1, 0x04, + /* RLE: 055 Pixels @ 333,266*/ 55, 0x00, + /* RLE: 058 Pixels @ 000,267*/ 58, 0x02, + /* RLE: 001 Pixels @ 058,267*/ 1, 0x04, + /* RLE: 006 Pixels @ 059,267*/ 6, 0x03, + /* RLE: 001 Pixels @ 065,267*/ 1, 0x04, + /* RLE: 022 Pixels @ 066,267*/ 22, 0x00, + /* ABS: 012 Pixels @ 088,267*/ 0, 12, 0x03, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, 0x00, 0x04, 0x04, 0x03, 0x03, + /* RLE: 011 Pixels @ 100,267*/ 11, 0x13, + /* ABS: 002 Pixels @ 111,267*/ 0, 2, 0x03, 0x03, + /* RLE: 005 Pixels @ 113,267*/ 5, 0x08, + /* RLE: 004 Pixels @ 118,267*/ 4, 0x03, + /* RLE: 003 Pixels @ 122,267*/ 3, 0x04, + /* RLE: 090 Pixels @ 125,267*/ 90, 0x00, + /* RLE: 003 Pixels @ 215,267*/ 3, 0x04, + /* RLE: 016 Pixels @ 218,267*/ 16, 0x03, + /* ABS: 002 Pixels @ 234,267*/ 0, 2, 0x04, 0x04, + /* RLE: 021 Pixels @ 236,267*/ 21, 0x00, + /* RLE: 001 Pixels @ 257,267*/ 1, 0x04, + /* RLE: 007 Pixels @ 258,267*/ 7, 0x03, + /* RLE: 061 Pixels @ 265,267*/ 61, 0x00, + /* RLE: 007 Pixels @ 326,267*/ 7, 0x03, + /* RLE: 001 Pixels @ 333,267*/ 1, 0x04, + /* RLE: 054 Pixels @ 334,267*/ 54, 0x00, + /* RLE: 058 Pixels @ 000,268*/ 58, 0x02, + /* RLE: 001 Pixels @ 058,268*/ 1, 0x04, + /* RLE: 006 Pixels @ 059,268*/ 6, 0x03, + /* RLE: 001 Pixels @ 065,268*/ 1, 0x04, + /* RLE: 021 Pixels @ 066,268*/ 21, 0x00, + /* ABS: 013 Pixels @ 087,268*/ 0, 13, 0x03, 0x03, 0x13, 0x00, 0x13, 0x13, 0x03, 0x04, 0x03, 0x03, 0x03, 0x13, 0x13, + /* RLE: 004 Pixels @ 100,268*/ 4, 0x03, + /* RLE: 005 Pixels @ 104,268*/ 5, 0x13, + /* RLE: 003 Pixels @ 109,268*/ 3, 0x03, + /* RLE: 007 Pixels @ 112,268*/ 7, 0x08, + /* ABS: 003 Pixels @ 119,268*/ 0, 3, 0x03, 0x04, 0x04, + /* RLE: 090 Pixels @ 122,268*/ 90, 0x00, + /* RLE: 003 Pixels @ 212,268*/ 3, 0x04, + /* RLE: 016 Pixels @ 215,268*/ 16, 0x03, + /* ABS: 002 Pixels @ 231,268*/ 0, 2, 0x04, 0x04, + /* RLE: 025 Pixels @ 233,268*/ 25, 0x00, + /* RLE: 001 Pixels @ 258,268*/ 1, 0x04, + /* RLE: 006 Pixels @ 259,268*/ 6, 0x03, + /* RLE: 001 Pixels @ 265,268*/ 1, 0x04, + /* RLE: 060 Pixels @ 266,268*/ 60, 0x00, + /* RLE: 001 Pixels @ 326,268*/ 1, 0x04, + /* RLE: 006 Pixels @ 327,268*/ 6, 0x03, + /* RLE: 001 Pixels @ 333,268*/ 1, 0x04, + /* RLE: 054 Pixels @ 334,268*/ 54, 0x00, + /* RLE: 058 Pixels @ 000,269*/ 58, 0x02, + /* RLE: 001 Pixels @ 058,269*/ 1, 0x04, + /* RLE: 006 Pixels @ 059,269*/ 6, 0x03, + /* RLE: 001 Pixels @ 065,269*/ 1, 0x04, + /* RLE: 021 Pixels @ 066,269*/ 21, 0x00, + /* ABS: 011 Pixels @ 087,269*/ 0, 11, 0x03, 0x03, 0x13, 0x04, 0x13, 0x13, 0x03, 0x03, 0x03, 0x13, 0x13, + /* RLE: 013 Pixels @ 098,269*/ 13, 0x03, + /* RLE: 008 Pixels @ 111,269*/ 8, 0x08, + /* RLE: 001 Pixels @ 119,269*/ 1, 0x0B, + /* RLE: 091 Pixels @ 120,269*/ 91, 0x00, + /* ABS: 002 Pixels @ 211,269*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 213,269*/ 16, 0x03, + /* ABS: 002 Pixels @ 229,269*/ 0, 2, 0x04, 0x04, + /* RLE: 027 Pixels @ 231,269*/ 27, 0x00, + /* RLE: 001 Pixels @ 258,269*/ 1, 0x04, + /* RLE: 006 Pixels @ 259,269*/ 6, 0x03, + /* RLE: 001 Pixels @ 265,269*/ 1, 0x04, + /* RLE: 060 Pixels @ 266,269*/ 60, 0x00, + /* RLE: 001 Pixels @ 326,269*/ 1, 0x04, + /* RLE: 007 Pixels @ 327,269*/ 7, 0x03, + /* RLE: 054 Pixels @ 334,269*/ 54, 0x00, + /* RLE: 058 Pixels @ 000,270*/ 58, 0x02, + /* RLE: 001 Pixels @ 058,270*/ 1, 0x04, + /* RLE: 006 Pixels @ 059,270*/ 6, 0x03, + /* RLE: 001 Pixels @ 065,270*/ 1, 0x04, + /* RLE: 016 Pixels @ 066,270*/ 16, 0x00, + /* RLE: 004 Pixels @ 082,270*/ 4, 0x04, + /* ABS: 010 Pixels @ 086,270*/ 0, 10, 0x03, 0x03, 0x13, 0x03, 0x13, 0x13, 0x13, 0x03, 0x13, 0x13, + /* RLE: 015 Pixels @ 096,270*/ 15, 0x03, + /* RLE: 008 Pixels @ 111,270*/ 8, 0x08, + /* RLE: 001 Pixels @ 119,270*/ 1, 0x0B, + /* RLE: 090 Pixels @ 120,270*/ 90, 0x00, + /* ABS: 002 Pixels @ 210,270*/ 0, 2, 0x04, 0x04, + /* RLE: 014 Pixels @ 212,270*/ 14, 0x03, + /* ABS: 002 Pixels @ 226,270*/ 0, 2, 0x04, 0x04, + /* RLE: 031 Pixels @ 228,270*/ 31, 0x00, + /* RLE: 007 Pixels @ 259,270*/ 7, 0x03, + /* RLE: 001 Pixels @ 266,270*/ 1, 0x04, + /* RLE: 060 Pixels @ 267,270*/ 60, 0x00, + /* RLE: 001 Pixels @ 327,270*/ 1, 0x04, + /* RLE: 006 Pixels @ 328,270*/ 6, 0x03, + /* RLE: 001 Pixels @ 334,270*/ 1, 0x04, + /* RLE: 053 Pixels @ 335,270*/ 53, 0x00, + /* RLE: 058 Pixels @ 000,271*/ 58, 0x02, + /* RLE: 001 Pixels @ 058,271*/ 1, 0x04, + /* RLE: 006 Pixels @ 059,271*/ 6, 0x03, + /* RLE: 001 Pixels @ 065,271*/ 1, 0x04, + /* RLE: 011 Pixels @ 066,271*/ 11, 0x00, + /* RLE: 005 Pixels @ 077,271*/ 5, 0x04, + /* RLE: 006 Pixels @ 082,271*/ 6, 0x03, + /* ABS: 002 Pixels @ 088,271*/ 0, 2, 0x13, 0x03, + /* RLE: 004 Pixels @ 090,271*/ 4, 0x13, + /* RLE: 016 Pixels @ 094,271*/ 16, 0x03, + /* RLE: 001 Pixels @ 110,271*/ 1, 0x0B, + /* RLE: 008 Pixels @ 111,271*/ 8, 0x08, + /* RLE: 001 Pixels @ 119,271*/ 1, 0x0B, + /* RLE: 089 Pixels @ 120,271*/ 89, 0x00, + /* ABS: 002 Pixels @ 209,271*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 211,271*/ 13, 0x03, + /* ABS: 002 Pixels @ 224,271*/ 0, 2, 0x04, 0x04, + /* RLE: 033 Pixels @ 226,271*/ 33, 0x00, + /* RLE: 001 Pixels @ 259,271*/ 1, 0x04, + /* RLE: 006 Pixels @ 260,271*/ 6, 0x03, + /* RLE: 001 Pixels @ 266,271*/ 1, 0x04, + /* RLE: 060 Pixels @ 267,271*/ 60, 0x00, + /* RLE: 001 Pixels @ 327,271*/ 1, 0x04, + /* RLE: 006 Pixels @ 328,271*/ 6, 0x03, + /* RLE: 001 Pixels @ 334,271*/ 1, 0x04, + /* RLE: 053 Pixels @ 335,271*/ 53, 0x00, + /* RLE: 059 Pixels @ 000,272*/ 59, 0x02, + /* RLE: 007 Pixels @ 059,272*/ 7, 0x03, + /* RLE: 001 Pixels @ 066,272*/ 1, 0x04, + /* RLE: 006 Pixels @ 067,272*/ 6, 0x00, + /* RLE: 004 Pixels @ 073,272*/ 4, 0x04, + /* RLE: 011 Pixels @ 077,272*/ 11, 0x03, + /* RLE: 004 Pixels @ 088,272*/ 4, 0x13, + /* RLE: 014 Pixels @ 092,272*/ 14, 0x03, + /* RLE: 004 Pixels @ 106,272*/ 4, 0x04, + /* ABS: 002 Pixels @ 110,272*/ 0, 2, 0x00, 0x0B, + /* RLE: 008 Pixels @ 112,272*/ 8, 0x08, + /* RLE: 001 Pixels @ 120,272*/ 1, 0x0B, + /* RLE: 087 Pixels @ 121,272*/ 87, 0x00, + /* ABS: 002 Pixels @ 208,272*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 210,272*/ 11, 0x03, + /* ABS: 002 Pixels @ 221,272*/ 0, 2, 0x04, 0x04, + /* RLE: 036 Pixels @ 223,272*/ 36, 0x00, + /* RLE: 001 Pixels @ 259,272*/ 1, 0x04, + /* RLE: 007 Pixels @ 260,272*/ 7, 0x03, + /* RLE: 061 Pixels @ 267,272*/ 61, 0x00, + /* RLE: 007 Pixels @ 328,272*/ 7, 0x03, + /* RLE: 001 Pixels @ 335,272*/ 1, 0x04, + /* RLE: 052 Pixels @ 336,272*/ 52, 0x00, + /* RLE: 059 Pixels @ 000,273*/ 59, 0x02, + /* RLE: 001 Pixels @ 059,273*/ 1, 0x04, + /* RLE: 006 Pixels @ 060,273*/ 6, 0x03, + /* ABS: 002 Pixels @ 066,273*/ 0, 2, 0x04, 0x00, + /* RLE: 004 Pixels @ 068,273*/ 4, 0x04, + /* RLE: 029 Pixels @ 072,273*/ 29, 0x03, + /* RLE: 004 Pixels @ 101,273*/ 4, 0x04, + /* RLE: 006 Pixels @ 105,273*/ 6, 0x00, + /* RLE: 001 Pixels @ 111,273*/ 1, 0x0B, + /* RLE: 008 Pixels @ 112,273*/ 8, 0x08, + /* RLE: 001 Pixels @ 120,273*/ 1, 0x0B, + /* RLE: 086 Pixels @ 121,273*/ 86, 0x00, + /* ABS: 002 Pixels @ 207,273*/ 0, 2, 0x04, 0x04, + /* RLE: 010 Pixels @ 209,273*/ 10, 0x03, + /* ABS: 002 Pixels @ 219,273*/ 0, 2, 0x04, 0x04, + /* RLE: 039 Pixels @ 221,273*/ 39, 0x00, + /* RLE: 001 Pixels @ 260,273*/ 1, 0x04, + /* RLE: 006 Pixels @ 261,273*/ 6, 0x03, + /* RLE: 001 Pixels @ 267,273*/ 1, 0x04, + /* RLE: 060 Pixels @ 268,273*/ 60, 0x00, + /* RLE: 001 Pixels @ 328,273*/ 1, 0x04, + /* RLE: 006 Pixels @ 329,273*/ 6, 0x03, + /* RLE: 053 Pixels @ 335,273*/ 53, 0x00, + /* RLE: 057 Pixels @ 000,274*/ 57, 0x02, + /* RLE: 001 Pixels @ 057,274*/ 1, 0x18, + /* RLE: 008 Pixels @ 058,274*/ 8, 0x03, + /* ABS: 002 Pixels @ 066,274*/ 0, 2, 0x04, 0x04, + /* RLE: 028 Pixels @ 068,274*/ 28, 0x03, + /* RLE: 005 Pixels @ 096,274*/ 5, 0x04, + /* RLE: 010 Pixels @ 101,274*/ 10, 0x00, + /* RLE: 001 Pixels @ 111,274*/ 1, 0x0B, + /* RLE: 008 Pixels @ 112,274*/ 8, 0x08, + /* RLE: 001 Pixels @ 120,274*/ 1, 0x0B, + /* RLE: 085 Pixels @ 121,274*/ 85, 0x00, + /* ABS: 002 Pixels @ 206,274*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 208,274*/ 8, 0x03, + /* ABS: 002 Pixels @ 216,274*/ 0, 2, 0x04, 0x04, + /* RLE: 042 Pixels @ 218,274*/ 42, 0x00, + /* RLE: 001 Pixels @ 260,274*/ 1, 0x04, + /* RLE: 006 Pixels @ 261,274*/ 6, 0x03, + /* RLE: 001 Pixels @ 267,274*/ 1, 0x04, + /* RLE: 060 Pixels @ 268,274*/ 60, 0x00, + /* RLE: 001 Pixels @ 328,274*/ 1, 0x04, + /* RLE: 004 Pixels @ 329,274*/ 4, 0x03, + /* RLE: 003 Pixels @ 333,274*/ 3, 0x00, + /* ABS: 002 Pixels @ 336,274*/ 0, 2, 0x03, 0x03, + /* RLE: 050 Pixels @ 338,274*/ 50, 0x00, + /* RLE: 034 Pixels @ 000,275*/ 34, 0x02, + /* ABS: 002 Pixels @ 034,275*/ 0, 2, 0x00, 0x00, + /* RLE: 006 Pixels @ 036,275*/ 6, 0x03, + /* ABS: 019 Pixels @ 042,275*/ 0, 19, 0x00, 0x18, 0x00, 0x03, 0x00, 0x18, 0x02, 0x02, 0x00, 0x00, 0x00, 0x18, 0x02, 0x03, 0x03, 0x03, 0x00, 0x0B, 0x00, + /* RLE: 031 Pixels @ 061,275*/ 31, 0x03, + /* RLE: 004 Pixels @ 092,275*/ 4, 0x04, + /* RLE: 015 Pixels @ 096,275*/ 15, 0x00, + /* RLE: 001 Pixels @ 111,275*/ 1, 0x0B, + /* RLE: 008 Pixels @ 112,275*/ 8, 0x08, + /* RLE: 001 Pixels @ 120,275*/ 1, 0x0B, + /* RLE: 084 Pixels @ 121,275*/ 84, 0x00, + /* ABS: 002 Pixels @ 205,275*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 207,275*/ 8, 0x03, + /* ABS: 002 Pixels @ 215,275*/ 0, 2, 0x04, 0x04, + /* RLE: 043 Pixels @ 217,275*/ 43, 0x00, + /* RLE: 001 Pixels @ 260,275*/ 1, 0x04, + /* RLE: 007 Pixels @ 261,275*/ 7, 0x03, + /* RLE: 062 Pixels @ 268,275*/ 62, 0x00, + /* ABS: 008 Pixels @ 330,275*/ 0, 8, 0x03, 0x0A, 0x11, 0x07, 0x07, 0x07, 0x06, 0x03, + /* RLE: 050 Pixels @ 338,275*/ 50, 0x00, + /* RLE: 034 Pixels @ 000,276*/ 34, 0x02, + /* ABS: 013 Pixels @ 034,276*/ 0, 13, 0x03, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x07, 0x00, 0x03, 0x03, 0x00, 0x0A, 0x00, + /* RLE: 004 Pixels @ 047,276*/ 4, 0x03, + /* ABS: 011 Pixels @ 051,276*/ 0, 11, 0x0A, 0x00, 0x03, 0x00, 0x03, 0x11, 0x06, 0x0F, 0x0F, 0x07, 0x00, + /* RLE: 025 Pixels @ 062,276*/ 25, 0x03, + /* RLE: 004 Pixels @ 087,276*/ 4, 0x04, + /* RLE: 020 Pixels @ 091,276*/ 20, 0x00, + /* RLE: 001 Pixels @ 111,276*/ 1, 0x0B, + /* RLE: 008 Pixels @ 112,276*/ 8, 0x08, + /* RLE: 001 Pixels @ 120,276*/ 1, 0x0B, + /* RLE: 083 Pixels @ 121,276*/ 83, 0x00, + /* ABS: 002 Pixels @ 204,276*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 206,276*/ 8, 0x03, + /* ABS: 002 Pixels @ 214,276*/ 0, 2, 0x04, 0x04, + /* RLE: 045 Pixels @ 216,276*/ 45, 0x00, + /* RLE: 001 Pixels @ 261,276*/ 1, 0x04, + /* RLE: 006 Pixels @ 262,276*/ 6, 0x03, + /* RLE: 001 Pixels @ 268,276*/ 1, 0x04, + /* RLE: 060 Pixels @ 269,276*/ 60, 0x00, + /* ABS: 010 Pixels @ 329,276*/ 0, 10, 0x03, 0x0A, 0x07, 0x11, 0x0B, 0x0A, 0x04, 0x0F, 0x0B, 0x03, + /* RLE: 049 Pixels @ 339,276*/ 49, 0x00, + /* RLE: 025 Pixels @ 000,277*/ 25, 0x02, + /* ABS: 005 Pixels @ 025,277*/ 0, 5, 0x18, 0x03, 0x03, 0x03, 0x18, + /* RLE: 004 Pixels @ 030,277*/ 4, 0x02, + /* ABS: 028 Pixels @ 034,277*/ 0, 28, 0x03, 0x07, 0x00, 0x0B, 0x04, 0x03, 0x07, 0x0B, 0x03, 0x0E, 0x07, 0x0D, 0x07, 0x0B, 0x03, 0x04, 0x07, 0x07, 0x07, 0x04, 0x03, 0x03, 0x0D, 0x0F, 0x03, 0x00, 0x07, 0x0B, + /* RLE: 021 Pixels @ 062,277*/ 21, 0x03, + /* RLE: 004 Pixels @ 083,277*/ 4, 0x04, + /* RLE: 025 Pixels @ 087,277*/ 25, 0x00, + /* RLE: 001 Pixels @ 112,277*/ 1, 0x0B, + /* RLE: 008 Pixels @ 113,277*/ 8, 0x08, + /* RLE: 001 Pixels @ 121,277*/ 1, 0x0B, + /* RLE: 082 Pixels @ 122,277*/ 82, 0x00, + /* ABS: 002 Pixels @ 204,277*/ 0, 2, 0x04, 0x04, + /* RLE: 007 Pixels @ 206,277*/ 7, 0x03, + /* ABS: 002 Pixels @ 213,277*/ 0, 2, 0x04, 0x04, + /* RLE: 046 Pixels @ 215,277*/ 46, 0x00, + /* RLE: 001 Pixels @ 261,277*/ 1, 0x04, + /* RLE: 006 Pixels @ 262,277*/ 6, 0x03, + /* RLE: 001 Pixels @ 268,277*/ 1, 0x04, + /* RLE: 060 Pixels @ 269,277*/ 60, 0x00, + /* ABS: 003 Pixels @ 329,277*/ 0, 3, 0x03, 0x06, 0x11, + /* RLE: 004 Pixels @ 332,277*/ 4, 0x03, + /* ABS: 003 Pixels @ 336,277*/ 0, 3, 0x0B, 0x0F, 0x03, + /* RLE: 049 Pixels @ 339,277*/ 49, 0x00, + /* RLE: 015 Pixels @ 000,278*/ 15, 0x02, + /* ABS: 005 Pixels @ 015,278*/ 0, 5, 0x00, 0x03, 0x03, 0x03, 0x00, + /* RLE: 005 Pixels @ 020,278*/ 5, 0x02, + /* ABS: 008 Pixels @ 025,278*/ 0, 8, 0x03, 0x0A, 0x07, 0x00, 0x03, 0x03, 0x03, 0x18, + /* RLE: 005 Pixels @ 033,278*/ 5, 0x03, + /* ABS: 024 Pixels @ 038,278*/ 0, 24, 0x0B, 0x00, 0x07, 0x0B, 0x03, 0x07, 0x0B, 0x03, 0x00, 0x03, 0x03, 0x0F, 0x0E, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x0D, 0x03, 0x03, 0x07, 0x0E, + /* RLE: 016 Pixels @ 062,278*/ 16, 0x03, + /* RLE: 004 Pixels @ 078,278*/ 4, 0x04, + /* RLE: 030 Pixels @ 082,278*/ 30, 0x00, + /* RLE: 001 Pixels @ 112,278*/ 1, 0x0B, + /* RLE: 008 Pixels @ 113,278*/ 8, 0x08, + /* RLE: 001 Pixels @ 121,278*/ 1, 0x0B, + /* RLE: 082 Pixels @ 122,278*/ 82, 0x00, + /* RLE: 001 Pixels @ 204,278*/ 1, 0x04, + /* RLE: 007 Pixels @ 205,278*/ 7, 0x03, + /* ABS: 002 Pixels @ 212,278*/ 0, 2, 0x04, 0x04, + /* RLE: 048 Pixels @ 214,278*/ 48, 0x00, + /* RLE: 007 Pixels @ 262,278*/ 7, 0x03, + /* RLE: 001 Pixels @ 269,278*/ 1, 0x04, + /* RLE: 059 Pixels @ 270,278*/ 59, 0x00, + /* ABS: 003 Pixels @ 329,278*/ 0, 3, 0x03, 0x07, 0x0B, + /* RLE: 004 Pixels @ 332,278*/ 4, 0x03, + /* ABS: 003 Pixels @ 336,278*/ 0, 3, 0x00, 0x07, 0x03, + /* RLE: 049 Pixels @ 339,278*/ 49, 0x00, + /* RLE: 003 Pixels @ 000,279*/ 3, 0x02, + /* RLE: 001 Pixels @ 003,279*/ 1, 0x00, + /* RLE: 006 Pixels @ 004,279*/ 6, 0x03, + /* RLE: 001 Pixels @ 010,279*/ 1, 0x00, + /* RLE: 004 Pixels @ 011,279*/ 4, 0x02, + /* ABS: 007 Pixels @ 015,279*/ 0, 7, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x18, + /* RLE: 004 Pixels @ 022,279*/ 4, 0x03, + /* ABS: 036 Pixels @ 026,279*/ 0, 36, 0x00, 0x07, 0x0B, 0x00, 0x0B, 0x00, 0x03, 0x03, 0x11, 0x0B, 0x03, 0x0A, 0x07, 0x0A, 0x06, 0x06, 0x03, 0x0D, 0x07, 0x07, 0x07, 0x12, 0x03, 0x07, 0x11, 0x06, 0x0F, 0x0F, 0x00, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x06, + /* RLE: 011 Pixels @ 062,279*/ 11, 0x03, + /* RLE: 004 Pixels @ 073,279*/ 4, 0x04, + /* RLE: 035 Pixels @ 077,279*/ 35, 0x00, + /* RLE: 001 Pixels @ 112,279*/ 1, 0x0B, + /* RLE: 008 Pixels @ 113,279*/ 8, 0x08, + /* RLE: 001 Pixels @ 121,279*/ 1, 0x0B, + /* RLE: 081 Pixels @ 122,279*/ 81, 0x00, + /* RLE: 001 Pixels @ 203,279*/ 1, 0x04, + /* RLE: 007 Pixels @ 204,279*/ 7, 0x03, + /* ABS: 002 Pixels @ 211,279*/ 0, 2, 0x04, 0x04, + /* RLE: 049 Pixels @ 213,279*/ 49, 0x00, + /* RLE: 001 Pixels @ 262,279*/ 1, 0x04, + /* RLE: 006 Pixels @ 263,279*/ 6, 0x03, + /* RLE: 001 Pixels @ 269,279*/ 1, 0x04, + /* RLE: 059 Pixels @ 270,279*/ 59, 0x00, + /* ABS: 003 Pixels @ 329,279*/ 0, 3, 0x03, 0x06, 0x0E, + /* RLE: 004 Pixels @ 332,279*/ 4, 0x03, + /* ABS: 003 Pixels @ 336,279*/ 0, 3, 0x12, 0x0F, 0x03, + /* RLE: 049 Pixels @ 339,279*/ 49, 0x00, + /* RLE: 004 Pixels @ 000,280*/ 4, 0x03, + /* ABS: 058 Pixels @ 004,280*/ 0, 58, 0x0B, 0x06, 0x04, 0x0A, 0x07, 0x00, 0x03, 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x0B, 0x00, 0x03, 0x03, 0x07, 0x06, 0x0F, 0x11, 0x07, 0x00, 0x03, 0x11, 0x12, 0x03, 0x00, 0x07, 0x0B, 0x06, 0x0D, 0x03, 0x03, 0x0A, 0x04, 0x0E, 0x07, 0x00, 0x07, 0x12, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x04, 0x07, 0x00, 0x03, 0x12, 0x11, + /* RLE: 007 Pixels @ 062,280*/ 7, 0x03, + /* RLE: 004 Pixels @ 069,280*/ 4, 0x04, + /* RLE: 039 Pixels @ 073,280*/ 39, 0x00, + /* RLE: 001 Pixels @ 112,280*/ 1, 0x0B, + /* RLE: 008 Pixels @ 113,280*/ 8, 0x08, + /* RLE: 001 Pixels @ 121,280*/ 1, 0x0B, + /* RLE: 081 Pixels @ 122,280*/ 81, 0x00, + /* RLE: 001 Pixels @ 203,280*/ 1, 0x04, + /* RLE: 006 Pixels @ 204,280*/ 6, 0x03, + /* ABS: 002 Pixels @ 210,280*/ 0, 2, 0x04, 0x04, + /* RLE: 050 Pixels @ 212,280*/ 50, 0x00, + /* RLE: 001 Pixels @ 262,280*/ 1, 0x04, + /* RLE: 007 Pixels @ 263,280*/ 7, 0x03, + /* RLE: 059 Pixels @ 270,280*/ 59, 0x00, + /* ABS: 010 Pixels @ 329,280*/ 0, 10, 0x03, 0x04, 0x07, 0x0B, 0x00, 0x04, 0x06, 0x07, 0x0B, 0x03, + /* RLE: 049 Pixels @ 339,280*/ 49, 0x00, + /* ABS: 062 Pixels @ 000,281*/ 0, 62, 0x07, 0x0B, 0x03, 0x0A, 0x07, 0x0E, 0x03, 0x03, 0x07, 0x0B, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x11, 0x0E, 0x03, 0x11, 0x06, 0x0F, 0x0F, 0x07, 0x00, 0x03, 0x0D, 0x0F, 0x03, 0x00, 0x07, 0x0B, 0x03, 0x06, 0x06, 0x03, 0x03, 0x07, 0x0E, 0x0B, 0x07, 0x03, 0x12, 0x0D, 0x0B, 0x12, 0x07, 0x00, 0x0E, 0x07, 0x0E, 0x12, 0x0F, 0x00, 0x03, 0x0A, 0x06, 0x00, 0x03, 0x00, 0x0A, + /* RLE: 005 Pixels @ 062,281*/ 5, 0x03, + /* RLE: 001 Pixels @ 067,281*/ 1, 0x04, + /* RLE: 044 Pixels @ 068,281*/ 44, 0x00, + /* RLE: 001 Pixels @ 112,281*/ 1, 0x0B, + /* RLE: 008 Pixels @ 113,281*/ 8, 0x08, + /* RLE: 001 Pixels @ 121,281*/ 1, 0x0B, + /* RLE: 081 Pixels @ 122,281*/ 81, 0x00, + /* RLE: 001 Pixels @ 203,281*/ 1, 0x04, + /* RLE: 006 Pixels @ 204,281*/ 6, 0x03, + /* RLE: 001 Pixels @ 210,281*/ 1, 0x04, + /* RLE: 052 Pixels @ 211,281*/ 52, 0x00, + /* RLE: 001 Pixels @ 263,281*/ 1, 0x04, + /* RLE: 006 Pixels @ 264,281*/ 6, 0x03, + /* RLE: 001 Pixels @ 270,281*/ 1, 0x04, + /* RLE: 059 Pixels @ 271,281*/ 59, 0x00, + /* ABS: 009 Pixels @ 330,281*/ 0, 9, 0x03, 0x0E, 0x07, 0x07, 0x07, 0x0F, 0x0B, 0x03, 0x03, + /* RLE: 049 Pixels @ 339,281*/ 49, 0x00, + /* ABS: 054 Pixels @ 000,282*/ 0, 54, 0x07, 0x0B, 0x03, 0x0F, 0x0D, 0x03, 0x00, 0x03, 0x07, 0x0B, 0x03, 0x04, 0x07, 0x07, 0x07, 0x04, 0x03, 0x06, 0x06, 0x03, 0x0D, 0x0F, 0x03, 0x00, 0x07, 0x0B, 0x03, 0x06, 0x0D, 0x03, 0x03, 0x07, 0x0E, 0x03, 0x0E, 0x07, 0x03, 0x03, 0x07, 0x06, 0x04, 0x07, 0x00, 0x00, 0x0E, 0x06, 0x0E, 0x00, 0x03, 0x03, 0x0B, 0x06, 0x0E, 0x00, + /* RLE: 005 Pixels @ 054,282*/ 5, 0x03, + /* ABS: 002 Pixels @ 059,282*/ 0, 2, 0x00, 0x00, + /* RLE: 006 Pixels @ 061,282*/ 6, 0x03, + /* RLE: 001 Pixels @ 067,282*/ 1, 0x04, + /* RLE: 045 Pixels @ 068,282*/ 45, 0x00, + /* RLE: 001 Pixels @ 113,282*/ 1, 0x0B, + /* RLE: 008 Pixels @ 114,282*/ 8, 0x08, + /* RLE: 001 Pixels @ 122,282*/ 1, 0x0B, + /* RLE: 080 Pixels @ 123,282*/ 80, 0x00, + /* RLE: 001 Pixels @ 203,282*/ 1, 0x04, + /* RLE: 006 Pixels @ 204,282*/ 6, 0x03, + /* RLE: 001 Pixels @ 210,282*/ 1, 0x04, + /* RLE: 052 Pixels @ 211,282*/ 52, 0x00, + /* RLE: 001 Pixels @ 263,282*/ 1, 0x04, + /* RLE: 006 Pixels @ 264,282*/ 6, 0x03, + /* RLE: 001 Pixels @ 270,282*/ 1, 0x04, + /* RLE: 060 Pixels @ 271,282*/ 60, 0x00, + /* ABS: 010 Pixels @ 331,282*/ 0, 10, 0x03, 0x00, 0x0A, 0x00, 0x03, 0x0B, 0x0E, 0x0B, 0x03, 0x03, + /* RLE: 047 Pixels @ 341,282*/ 47, 0x00, + /* ABS: 043 Pixels @ 000,283*/ 0, 43, 0x07, 0x06, 0x12, 0x07, 0x04, 0x03, 0x03, 0x03, 0x06, 0x06, 0x03, 0x0F, 0x0E, 0x03, 0x0B, 0x07, 0x03, 0x12, 0x0D, 0x03, 0x06, 0x0D, 0x03, 0x03, 0x07, 0x0E, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x06, 0x03, 0x04, 0x07, 0x12, 0x12, 0x11, 0x11, 0x0A, 0x06, 0x00, + /* RLE: 007 Pixels @ 043,283*/ 7, 0x03, + /* ABS: 006 Pixels @ 050,283*/ 0, 6, 0x00, 0x03, 0x03, 0x00, 0x00, 0x04, + /* RLE: 004 Pixels @ 056,283*/ 4, 0x02, + /* RLE: 001 Pixels @ 060,283*/ 1, 0x04, + /* RLE: 006 Pixels @ 061,283*/ 6, 0x03, + /* RLE: 001 Pixels @ 067,283*/ 1, 0x04, + /* RLE: 045 Pixels @ 068,283*/ 45, 0x00, + /* RLE: 001 Pixels @ 113,283*/ 1, 0x0B, + /* RLE: 008 Pixels @ 114,283*/ 8, 0x08, + /* RLE: 001 Pixels @ 122,283*/ 1, 0x0B, + /* RLE: 079 Pixels @ 123,283*/ 79, 0x00, + /* RLE: 001 Pixels @ 202,283*/ 1, 0x04, + /* RLE: 007 Pixels @ 203,283*/ 7, 0x03, + /* RLE: 053 Pixels @ 210,283*/ 53, 0x00, + /* RLE: 001 Pixels @ 263,283*/ 1, 0x04, + /* RLE: 007 Pixels @ 264,283*/ 7, 0x03, + /* RLE: 061 Pixels @ 271,283*/ 61, 0x00, + /* RLE: 003 Pixels @ 332,283*/ 3, 0x03, + /* ABS: 006 Pixels @ 335,283*/ 0, 6, 0x0B, 0x11, 0x07, 0x0F, 0x04, 0x03, + /* RLE: 047 Pixels @ 341,283*/ 47, 0x00, + /* ABS: 044 Pixels @ 000,284*/ 0, 44, 0x06, 0x0F, 0x07, 0x0F, 0x11, 0x03, 0x03, 0x03, 0x06, 0x0D, 0x03, 0x07, 0x11, 0x06, 0x0F, 0x0F, 0x00, 0x0B, 0x07, 0x03, 0x0B, 0x07, 0x03, 0x03, 0x06, 0x06, 0x03, 0x04, 0x07, 0x00, 0x03, 0x12, 0x11, 0x03, 0x03, 0x0E, 0x06, 0x0B, 0x00, 0x0A, 0x03, 0x03, 0x03, 0x00, + /* RLE: 005 Pixels @ 044,284*/ 5, 0x04, + /* RLE: 012 Pixels @ 049,284*/ 12, 0x02, + /* RLE: 007 Pixels @ 061,284*/ 7, 0x03, + /* RLE: 001 Pixels @ 068,284*/ 1, 0x04, + /* RLE: 044 Pixels @ 069,284*/ 44, 0x00, + /* RLE: 001 Pixels @ 113,284*/ 1, 0x0B, + /* RLE: 008 Pixels @ 114,284*/ 8, 0x08, + /* RLE: 001 Pixels @ 122,284*/ 1, 0x0B, + /* RLE: 079 Pixels @ 123,284*/ 79, 0x00, + /* RLE: 001 Pixels @ 202,284*/ 1, 0x04, + /* RLE: 006 Pixels @ 203,284*/ 6, 0x03, + /* RLE: 001 Pixels @ 209,284*/ 1, 0x04, + /* RLE: 054 Pixels @ 210,284*/ 54, 0x00, + /* RLE: 001 Pixels @ 264,284*/ 1, 0x04, + /* RLE: 006 Pixels @ 265,284*/ 6, 0x03, + /* RLE: 001 Pixels @ 271,284*/ 1, 0x04, + /* RLE: 059 Pixels @ 272,284*/ 59, 0x00, + /* ABS: 010 Pixels @ 331,284*/ 0, 10, 0x03, 0x03, 0x0E, 0x07, 0x07, 0x06, 0x07, 0x00, 0x03, 0x03, + /* RLE: 047 Pixels @ 341,284*/ 47, 0x00, + /* ABS: 033 Pixels @ 000,285*/ 0, 33, 0x12, 0x07, 0x12, 0x00, 0x07, 0x0D, 0x03, 0x03, 0x0B, 0x07, 0x03, 0x07, 0x12, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x07, 0x00, 0x04, 0x07, 0x00, 0x03, 0x12, 0x11, 0x03, 0x0A, 0x06, 0x00, 0x03, 0x00, 0x0A, + /* RLE: 006 Pixels @ 033,285*/ 6, 0x03, + /* ABS: 003 Pixels @ 039,285*/ 0, 3, 0x00, 0x00, 0x04, + /* RLE: 019 Pixels @ 042,285*/ 19, 0x02, + /* RLE: 001 Pixels @ 061,285*/ 1, 0x04, + /* RLE: 006 Pixels @ 062,285*/ 6, 0x03, + /* RLE: 001 Pixels @ 068,285*/ 1, 0x04, + /* RLE: 044 Pixels @ 069,285*/ 44, 0x00, + /* RLE: 001 Pixels @ 113,285*/ 1, 0x0B, + /* RLE: 008 Pixels @ 114,285*/ 8, 0x08, + /* RLE: 001 Pixels @ 122,285*/ 1, 0x0B, + /* RLE: 079 Pixels @ 123,285*/ 79, 0x00, + /* RLE: 001 Pixels @ 202,285*/ 1, 0x04, + /* RLE: 006 Pixels @ 203,285*/ 6, 0x03, + /* RLE: 001 Pixels @ 209,285*/ 1, 0x04, + /* RLE: 054 Pixels @ 210,285*/ 54, 0x00, + /* RLE: 001 Pixels @ 264,285*/ 1, 0x04, + /* RLE: 006 Pixels @ 265,285*/ 6, 0x03, + /* RLE: 001 Pixels @ 271,285*/ 1, 0x04, + /* RLE: 060 Pixels @ 272,285*/ 60, 0x00, + /* ABS: 010 Pixels @ 332,285*/ 0, 10, 0x0B, 0x07, 0x0B, 0x00, 0x03, 0x0B, 0x0E, 0x0B, 0x03, 0x03, + /* RLE: 046 Pixels @ 342,285*/ 46, 0x00, + /* ABS: 026 Pixels @ 000,286*/ 0, 26, 0x0B, 0x07, 0x00, 0x03, 0x0B, 0x07, 0x12, 0x03, 0x04, 0x07, 0x00, 0x0E, 0x07, 0x0E, 0x12, 0x0F, 0x00, 0x0A, 0x06, 0x00, 0x0A, 0x06, 0x00, 0x03, 0x00, 0x0A, + /* RLE: 004 Pixels @ 026,286*/ 4, 0x03, + /* RLE: 004 Pixels @ 030,286*/ 4, 0x00, + /* RLE: 001 Pixels @ 034,286*/ 1, 0x04, + /* RLE: 026 Pixels @ 035,286*/ 26, 0x02, + /* RLE: 001 Pixels @ 061,286*/ 1, 0x04, + /* RLE: 006 Pixels @ 062,286*/ 6, 0x03, + /* RLE: 001 Pixels @ 068,286*/ 1, 0x04, + /* RLE: 044 Pixels @ 069,286*/ 44, 0x00, + /* RLE: 001 Pixels @ 113,286*/ 1, 0x0B, + /* RLE: 008 Pixels @ 114,286*/ 8, 0x08, + /* RLE: 001 Pixels @ 122,286*/ 1, 0x0B, + /* RLE: 079 Pixels @ 123,286*/ 79, 0x00, + /* RLE: 001 Pixels @ 202,286*/ 1, 0x04, + /* RLE: 006 Pixels @ 203,286*/ 6, 0x03, + /* RLE: 001 Pixels @ 209,286*/ 1, 0x04, + /* RLE: 055 Pixels @ 210,286*/ 55, 0x00, + /* RLE: 007 Pixels @ 265,286*/ 7, 0x03, + /* RLE: 001 Pixels @ 272,286*/ 1, 0x04, + /* RLE: 057 Pixels @ 273,286*/ 57, 0x00, + /* ABS: 012 Pixels @ 330,286*/ 0, 12, 0x0A, 0x03, 0x00, 0x07, 0x00, 0x03, 0x04, 0x11, 0x07, 0x0F, 0x04, 0x03, + /* RLE: 046 Pixels @ 342,286*/ 46, 0x00, + /* ABS: 016 Pixels @ 000,287*/ 0, 16, 0x04, 0x07, 0x00, 0x03, 0x03, 0x0E, 0x07, 0x0E, 0x0A, 0x06, 0x00, 0x03, 0x0B, 0x06, 0x0E, 0x00, + /* RLE: 007 Pixels @ 016,287*/ 7, 0x03, + /* RLE: 004 Pixels @ 023,287*/ 4, 0x00, + /* RLE: 001 Pixels @ 027,287*/ 1, 0x04, + /* RLE: 033 Pixels @ 028,287*/ 33, 0x02, + /* RLE: 001 Pixels @ 061,287*/ 1, 0x04, + /* RLE: 006 Pixels @ 062,287*/ 6, 0x03, + /* RLE: 001 Pixels @ 068,287*/ 1, 0x04, + /* RLE: 045 Pixels @ 069,287*/ 45, 0x00, + /* RLE: 001 Pixels @ 114,287*/ 1, 0x0B, + /* RLE: 008 Pixels @ 115,287*/ 8, 0x08, + /* RLE: 001 Pixels @ 123,287*/ 1, 0x0B, + /* RLE: 077 Pixels @ 124,287*/ 77, 0x00, + /* ABS: 002 Pixels @ 201,287*/ 0, 2, 0x04, 0x04, + /* RLE: 006 Pixels @ 203,287*/ 6, 0x03, + /* RLE: 056 Pixels @ 209,287*/ 56, 0x00, + /* RLE: 001 Pixels @ 265,287*/ 1, 0x04, + /* RLE: 006 Pixels @ 266,287*/ 6, 0x03, + /* RLE: 001 Pixels @ 272,287*/ 1, 0x04, + /* RLE: 059 Pixels @ 273,287*/ 59, 0x00, + /* ABS: 009 Pixels @ 332,287*/ 0, 9, 0x03, 0x03, 0x0E, 0x07, 0x07, 0x06, 0x07, 0x00, 0x03, + /* RLE: 047 Pixels @ 341,287*/ 47, 0x00, + /* ABS: 003 Pixels @ 000,288*/ 0, 3, 0x0A, 0x06, 0x0A, + /* RLE: 012 Pixels @ 003,288*/ 12, 0x03, + /* ABS: 002 Pixels @ 015,288*/ 0, 2, 0x00, 0x00, + /* RLE: 004 Pixels @ 017,288*/ 4, 0x04, + /* RLE: 040 Pixels @ 021,288*/ 40, 0x02, + /* RLE: 001 Pixels @ 061,288*/ 1, 0x04, + /* RLE: 006 Pixels @ 062,288*/ 6, 0x03, + /* RLE: 001 Pixels @ 068,288*/ 1, 0x04, + /* RLE: 045 Pixels @ 069,288*/ 45, 0x00, + /* RLE: 001 Pixels @ 114,288*/ 1, 0x0B, + /* RLE: 008 Pixels @ 115,288*/ 8, 0x08, + /* RLE: 001 Pixels @ 123,288*/ 1, 0x0B, + /* RLE: 078 Pixels @ 124,288*/ 78, 0x00, + /* RLE: 001 Pixels @ 202,288*/ 1, 0x04, + /* RLE: 006 Pixels @ 203,288*/ 6, 0x03, + /* RLE: 001 Pixels @ 209,288*/ 1, 0x04, + /* RLE: 055 Pixels @ 210,288*/ 55, 0x00, + /* RLE: 001 Pixels @ 265,288*/ 1, 0x04, + /* RLE: 007 Pixels @ 266,288*/ 7, 0x03, + /* RLE: 059 Pixels @ 273,288*/ 59, 0x00, + /* ABS: 010 Pixels @ 332,288*/ 0, 10, 0x03, 0x0B, 0x07, 0x0B, 0x00, 0x03, 0x00, 0x00, 0x03, 0x04, + /* RLE: 046 Pixels @ 342,288*/ 46, 0x00, + /* RLE: 007 Pixels @ 000,289*/ 7, 0x03, + /* RLE: 007 Pixels @ 007,289*/ 7, 0x04, + /* RLE: 047 Pixels @ 014,289*/ 47, 0x02, + /* RLE: 001 Pixels @ 061,289*/ 1, 0x04, + /* RLE: 006 Pixels @ 062,289*/ 6, 0x03, + /* RLE: 001 Pixels @ 068,289*/ 1, 0x04, + /* RLE: 045 Pixels @ 069,289*/ 45, 0x00, + /* RLE: 001 Pixels @ 114,289*/ 1, 0x0B, + /* RLE: 008 Pixels @ 115,289*/ 8, 0x08, + /* RLE: 001 Pixels @ 123,289*/ 1, 0x0B, + /* RLE: 078 Pixels @ 124,289*/ 78, 0x00, + /* RLE: 001 Pixels @ 202,289*/ 1, 0x04, + /* RLE: 006 Pixels @ 203,289*/ 6, 0x03, + /* RLE: 001 Pixels @ 209,289*/ 1, 0x04, + /* RLE: 056 Pixels @ 210,289*/ 56, 0x00, + /* RLE: 001 Pixels @ 266,289*/ 1, 0x04, + /* RLE: 006 Pixels @ 267,289*/ 6, 0x03, + /* RLE: 001 Pixels @ 273,289*/ 1, 0x04, + /* RLE: 058 Pixels @ 274,289*/ 58, 0x00, + /* ABS: 004 Pixels @ 332,289*/ 0, 4, 0x03, 0x00, 0x07, 0x00, + /* RLE: 005 Pixels @ 336,289*/ 5, 0x03, + /* RLE: 047 Pixels @ 341,289*/ 47, 0x00, + /* RLE: 007 Pixels @ 000,290*/ 7, 0x04, + /* RLE: 055 Pixels @ 007,290*/ 55, 0x02, + /* RLE: 007 Pixels @ 062,290*/ 7, 0x03, + /* RLE: 001 Pixels @ 069,290*/ 1, 0x04, + /* RLE: 044 Pixels @ 070,290*/ 44, 0x00, + /* RLE: 001 Pixels @ 114,290*/ 1, 0x0B, + /* RLE: 008 Pixels @ 115,290*/ 8, 0x08, + /* RLE: 001 Pixels @ 123,290*/ 1, 0x0B, + /* RLE: 078 Pixels @ 124,290*/ 78, 0x00, + /* RLE: 001 Pixels @ 202,290*/ 1, 0x04, + /* RLE: 006 Pixels @ 203,290*/ 6, 0x03, + /* RLE: 001 Pixels @ 209,290*/ 1, 0x04, + /* RLE: 056 Pixels @ 210,290*/ 56, 0x00, + /* RLE: 001 Pixels @ 266,290*/ 1, 0x04, + /* RLE: 006 Pixels @ 267,290*/ 6, 0x03, + /* RLE: 001 Pixels @ 273,290*/ 1, 0x04, + /* RLE: 059 Pixels @ 274,290*/ 59, 0x00, + /* RLE: 004 Pixels @ 333,290*/ 4, 0x03, + /* ABS: 005 Pixels @ 337,290*/ 0, 5, 0x0B, 0x06, 0x06, 0x0A, 0x03, + /* RLE: 046 Pixels @ 342,290*/ 46, 0x00, + /* RLE: 062 Pixels @ 000,291*/ 62, 0x02, + /* RLE: 001 Pixels @ 062,291*/ 1, 0x04, + /* RLE: 006 Pixels @ 063,291*/ 6, 0x03, + /* RLE: 001 Pixels @ 069,291*/ 1, 0x04, + /* RLE: 044 Pixels @ 070,291*/ 44, 0x00, + /* RLE: 001 Pixels @ 114,291*/ 1, 0x0B, + /* RLE: 008 Pixels @ 115,291*/ 8, 0x08, + /* RLE: 001 Pixels @ 123,291*/ 1, 0x0B, + /* RLE: 079 Pixels @ 124,291*/ 79, 0x00, + /* RLE: 007 Pixels @ 203,291*/ 7, 0x03, + /* RLE: 001 Pixels @ 210,291*/ 1, 0x04, + /* RLE: 055 Pixels @ 211,291*/ 55, 0x00, + /* RLE: 001 Pixels @ 266,291*/ 1, 0x04, + /* RLE: 007 Pixels @ 267,291*/ 7, 0x03, + /* RLE: 061 Pixels @ 274,291*/ 61, 0x00, + /* ABS: 006 Pixels @ 335,291*/ 0, 6, 0x03, 0x06, 0x07, 0x06, 0x12, 0x07, + /* RLE: 047 Pixels @ 341,291*/ 47, 0x00, + /* RLE: 062 Pixels @ 000,292*/ 62, 0x02, + /* RLE: 001 Pixels @ 062,292*/ 1, 0x04, + /* RLE: 006 Pixels @ 063,292*/ 6, 0x03, + /* RLE: 001 Pixels @ 069,292*/ 1, 0x04, + /* RLE: 045 Pixels @ 070,292*/ 45, 0x00, + /* RLE: 001 Pixels @ 115,292*/ 1, 0x0B, + /* RLE: 008 Pixels @ 116,292*/ 8, 0x08, + /* RLE: 001 Pixels @ 124,292*/ 1, 0x0B, + /* RLE: 078 Pixels @ 125,292*/ 78, 0x00, + /* RLE: 001 Pixels @ 203,292*/ 1, 0x04, + /* RLE: 006 Pixels @ 204,292*/ 6, 0x03, + /* RLE: 001 Pixels @ 210,292*/ 1, 0x04, + /* RLE: 056 Pixels @ 211,292*/ 56, 0x00, + /* RLE: 001 Pixels @ 267,292*/ 1, 0x04, + /* RLE: 006 Pixels @ 268,292*/ 6, 0x03, + /* RLE: 001 Pixels @ 274,292*/ 1, 0x04, + /* RLE: 060 Pixels @ 275,292*/ 60, 0x00, + /* ABS: 008 Pixels @ 335,292*/ 0, 8, 0x03, 0x07, 0x0B, 0x03, 0x03, 0x0E, 0x0E, 0x03, + /* RLE: 045 Pixels @ 343,292*/ 45, 0x00, + /* RLE: 062 Pixels @ 000,293*/ 62, 0x02, + /* RLE: 001 Pixels @ 062,293*/ 1, 0x04, + /* RLE: 006 Pixels @ 063,293*/ 6, 0x03, + /* RLE: 001 Pixels @ 069,293*/ 1, 0x04, + /* RLE: 045 Pixels @ 070,293*/ 45, 0x00, + /* RLE: 001 Pixels @ 115,293*/ 1, 0x0B, + /* RLE: 008 Pixels @ 116,293*/ 8, 0x08, + /* RLE: 001 Pixels @ 124,293*/ 1, 0x0B, + /* RLE: 078 Pixels @ 125,293*/ 78, 0x00, + /* RLE: 001 Pixels @ 203,293*/ 1, 0x04, + /* RLE: 006 Pixels @ 204,293*/ 6, 0x03, + /* RLE: 001 Pixels @ 210,293*/ 1, 0x04, + /* RLE: 056 Pixels @ 211,293*/ 56, 0x00, + /* RLE: 001 Pixels @ 267,293*/ 1, 0x04, + /* RLE: 006 Pixels @ 268,293*/ 6, 0x03, + /* RLE: 001 Pixels @ 274,293*/ 1, 0x04, + /* RLE: 060 Pixels @ 275,293*/ 60, 0x00, + /* ABS: 009 Pixels @ 335,293*/ 0, 9, 0x03, 0x07, 0x00, 0x03, 0x03, 0x12, 0x12, 0x03, 0x04, + /* RLE: 044 Pixels @ 344,293*/ 44, 0x00, + /* RLE: 062 Pixels @ 000,294*/ 62, 0x02, + /* RLE: 001 Pixels @ 062,294*/ 1, 0x04, + /* RLE: 006 Pixels @ 063,294*/ 6, 0x03, + /* RLE: 001 Pixels @ 069,294*/ 1, 0x04, + /* RLE: 045 Pixels @ 070,294*/ 45, 0x00, + /* RLE: 001 Pixels @ 115,294*/ 1, 0x0B, + /* RLE: 008 Pixels @ 116,294*/ 8, 0x08, + /* RLE: 001 Pixels @ 124,294*/ 1, 0x0B, + /* RLE: 078 Pixels @ 125,294*/ 78, 0x00, + /* RLE: 001 Pixels @ 203,294*/ 1, 0x04, + /* RLE: 006 Pixels @ 204,294*/ 6, 0x03, + /* RLE: 001 Pixels @ 210,294*/ 1, 0x04, + /* RLE: 057 Pixels @ 211,294*/ 57, 0x00, + /* RLE: 007 Pixels @ 268,294*/ 7, 0x03, + /* RLE: 001 Pixels @ 275,294*/ 1, 0x04, + /* RLE: 059 Pixels @ 276,294*/ 59, 0x00, + /* ABS: 009 Pixels @ 335,294*/ 0, 9, 0x03, 0x06, 0x0D, 0x0B, 0x06, 0x07, 0x04, 0x03, 0x04, + /* RLE: 044 Pixels @ 344,294*/ 44, 0x00, + /* RLE: 062 Pixels @ 000,295*/ 62, 0x02, + /* RLE: 001 Pixels @ 062,295*/ 1, 0x04, + /* RLE: 006 Pixels @ 063,295*/ 6, 0x03, + /* RLE: 001 Pixels @ 069,295*/ 1, 0x04, + /* RLE: 045 Pixels @ 070,295*/ 45, 0x00, + /* RLE: 001 Pixels @ 115,295*/ 1, 0x0B, + /* RLE: 008 Pixels @ 116,295*/ 8, 0x08, + /* RLE: 001 Pixels @ 124,295*/ 1, 0x0B, + /* RLE: 079 Pixels @ 125,295*/ 79, 0x00, + /* RLE: 007 Pixels @ 204,295*/ 7, 0x03, + /* RLE: 001 Pixels @ 211,295*/ 1, 0x04, + /* RLE: 056 Pixels @ 212,295*/ 56, 0x00, + /* RLE: 001 Pixels @ 268,295*/ 1, 0x04, + /* RLE: 008 Pixels @ 269,295*/ 8, 0x03, + /* RLE: 058 Pixels @ 277,295*/ 58, 0x00, + /* ABS: 010 Pixels @ 335,295*/ 0, 10, 0x03, 0x03, 0x0E, 0x07, 0x11, 0x0A, 0x03, 0x03, 0x03, 0x04, + /* RLE: 043 Pixels @ 345,295*/ 43, 0x00, + /* RLE: 063 Pixels @ 000,296*/ 63, 0x02, + /* RLE: 007 Pixels @ 063,296*/ 7, 0x03, + /* RLE: 001 Pixels @ 070,296*/ 1, 0x04, + /* RLE: 045 Pixels @ 071,296*/ 45, 0x00, + /* RLE: 001 Pixels @ 116,296*/ 1, 0x0B, + /* RLE: 008 Pixels @ 117,296*/ 8, 0x08, + /* RLE: 001 Pixels @ 125,296*/ 1, 0x0B, + /* RLE: 078 Pixels @ 126,296*/ 78, 0x00, + /* RLE: 001 Pixels @ 204,296*/ 1, 0x04, + /* RLE: 006 Pixels @ 205,296*/ 6, 0x03, + /* RLE: 001 Pixels @ 211,296*/ 1, 0x04, + /* RLE: 056 Pixels @ 212,296*/ 56, 0x00, + /* RLE: 001 Pixels @ 268,296*/ 1, 0x04, + /* RLE: 004 Pixels @ 269,296*/ 4, 0x03, + /* ABS: 004 Pixels @ 273,296*/ 0, 4, 0x04, 0x0D, 0x12, 0x03, + /* RLE: 059 Pixels @ 277,296*/ 59, 0x00, + /* RLE: 003 Pixels @ 336,296*/ 3, 0x03, + /* ABS: 006 Pixels @ 339,296*/ 0, 6, 0x0E, 0x0E, 0x03, 0x03, 0x03, 0x04, + /* RLE: 043 Pixels @ 345,296*/ 43, 0x00, + /* RLE: 063 Pixels @ 000,297*/ 63, 0x02, + /* RLE: 001 Pixels @ 063,297*/ 1, 0x04, + /* RLE: 006 Pixels @ 064,297*/ 6, 0x03, + /* RLE: 001 Pixels @ 070,297*/ 1, 0x04, + /* RLE: 045 Pixels @ 071,297*/ 45, 0x00, + /* RLE: 001 Pixels @ 116,297*/ 1, 0x0B, + /* RLE: 008 Pixels @ 117,297*/ 8, 0x08, + /* RLE: 001 Pixels @ 125,297*/ 1, 0x0B, + /* RLE: 078 Pixels @ 126,297*/ 78, 0x00, + /* RLE: 001 Pixels @ 204,297*/ 1, 0x04, + /* RLE: 006 Pixels @ 205,297*/ 6, 0x03, + /* RLE: 001 Pixels @ 211,297*/ 1, 0x04, + /* RLE: 056 Pixels @ 212,297*/ 56, 0x00, + /* ABS: 009 Pixels @ 268,297*/ 0, 9, 0x03, 0x03, 0x00, 0x0E, 0x0F, 0x07, 0x11, 0x0B, 0x03, + /* RLE: 060 Pixels @ 277,297*/ 60, 0x00, + /* ABS: 004 Pixels @ 337,297*/ 0, 4, 0x04, 0x03, 0x0E, 0x0F, + /* RLE: 005 Pixels @ 341,297*/ 5, 0x03, + /* RLE: 042 Pixels @ 346,297*/ 42, 0x00, + /* RLE: 063 Pixels @ 000,298*/ 63, 0x02, + /* RLE: 001 Pixels @ 063,298*/ 1, 0x04, + /* RLE: 006 Pixels @ 064,298*/ 6, 0x03, + /* RLE: 001 Pixels @ 070,298*/ 1, 0x04, + /* RLE: 045 Pixels @ 071,298*/ 45, 0x00, + /* RLE: 001 Pixels @ 116,298*/ 1, 0x0B, + /* RLE: 008 Pixels @ 117,298*/ 8, 0x08, + /* RLE: 001 Pixels @ 125,298*/ 1, 0x0B, + /* RLE: 078 Pixels @ 126,298*/ 78, 0x00, + /* RLE: 001 Pixels @ 204,298*/ 1, 0x04, + /* RLE: 007 Pixels @ 205,298*/ 7, 0x03, + /* RLE: 054 Pixels @ 212,298*/ 54, 0x00, + /* ABS: 010 Pixels @ 266,298*/ 0, 10, 0x04, 0x00, 0x0A, 0x0D, 0x07, 0x07, 0x0E, 0x00, 0x03, 0x03, + /* RLE: 062 Pixels @ 276,298*/ 62, 0x00, + /* ABS: 009 Pixels @ 338,298*/ 0, 9, 0x03, 0x00, 0x07, 0x00, 0x03, 0x04, 0x12, 0x0E, 0x03, + /* RLE: 041 Pixels @ 347,298*/ 41, 0x00, + /* RLE: 063 Pixels @ 000,299*/ 63, 0x02, + /* RLE: 001 Pixels @ 063,299*/ 1, 0x04, + /* RLE: 006 Pixels @ 064,299*/ 6, 0x03, + /* RLE: 001 Pixels @ 070,299*/ 1, 0x04, + /* RLE: 045 Pixels @ 071,299*/ 45, 0x00, + /* RLE: 001 Pixels @ 116,299*/ 1, 0x0B, + /* RLE: 008 Pixels @ 117,299*/ 8, 0x08, + /* RLE: 001 Pixels @ 125,299*/ 1, 0x0B, + /* RLE: 079 Pixels @ 126,299*/ 79, 0x00, + /* RLE: 001 Pixels @ 205,299*/ 1, 0x04, + /* RLE: 006 Pixels @ 206,299*/ 6, 0x03, + /* RLE: 001 Pixels @ 212,299*/ 1, 0x04, + /* RLE: 050 Pixels @ 213,299*/ 50, 0x00, + /* ABS: 015 Pixels @ 263,299*/ 0, 15, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x11, 0x0B, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x04, + /* RLE: 060 Pixels @ 278,299*/ 60, 0x00, + /* ABS: 009 Pixels @ 338,299*/ 0, 9, 0x03, 0x03, 0x00, 0x0E, 0x11, 0x07, 0x0F, 0x0E, 0x03, + /* RLE: 041 Pixels @ 347,299*/ 41, 0x00, + /* RLE: 063 Pixels @ 000,300*/ 63, 0x02, + /* RLE: 001 Pixels @ 063,300*/ 1, 0x04, + /* RLE: 006 Pixels @ 064,300*/ 6, 0x03, + /* RLE: 001 Pixels @ 070,300*/ 1, 0x04, + /* RLE: 045 Pixels @ 071,300*/ 45, 0x00, + /* RLE: 001 Pixels @ 116,300*/ 1, 0x0B, + /* RLE: 008 Pixels @ 117,300*/ 8, 0x08, + /* RLE: 001 Pixels @ 125,300*/ 1, 0x0B, + /* RLE: 027 Pixels @ 126,300*/ 27, 0x00, + /* RLE: 005 Pixels @ 153,300*/ 5, 0x04, + /* RLE: 047 Pixels @ 158,300*/ 47, 0x00, + /* RLE: 001 Pixels @ 205,300*/ 1, 0x04, + /* RLE: 006 Pixels @ 206,300*/ 6, 0x03, + /* RLE: 001 Pixels @ 212,300*/ 1, 0x04, + /* RLE: 048 Pixels @ 213,300*/ 48, 0x00, + /* ABS: 002 Pixels @ 261,300*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 263,300*/ 8, 0x03, + /* ABS: 007 Pixels @ 271,300*/ 0, 7, 0x0A, 0x12, 0x07, 0x0D, 0x03, 0x03, 0x04, + /* RLE: 059 Pixels @ 278,300*/ 59, 0x00, + /* ABS: 009 Pixels @ 337,300*/ 0, 9, 0x03, 0x0A, 0x06, 0x07, 0x07, 0x07, 0x0B, 0x03, 0x03, + /* RLE: 042 Pixels @ 346,300*/ 42, 0x00, + /* RLE: 063 Pixels @ 000,301*/ 63, 0x02, + /* RLE: 001 Pixels @ 063,301*/ 1, 0x04, + /* RLE: 006 Pixels @ 064,301*/ 6, 0x03, + /* RLE: 001 Pixels @ 070,301*/ 1, 0x04, + /* RLE: 046 Pixels @ 071,301*/ 46, 0x00, + /* RLE: 001 Pixels @ 117,301*/ 1, 0x0B, + /* RLE: 008 Pixels @ 118,301*/ 8, 0x08, + /* RLE: 001 Pixels @ 126,301*/ 1, 0x0B, + /* RLE: 023 Pixels @ 127,301*/ 23, 0x00, + /* ABS: 002 Pixels @ 150,301*/ 0, 2, 0x04, 0x04, + /* RLE: 005 Pixels @ 152,301*/ 5, 0x03, + /* ABS: 002 Pixels @ 157,301*/ 0, 2, 0x04, 0x04, + /* RLE: 046 Pixels @ 159,301*/ 46, 0x00, + /* RLE: 001 Pixels @ 205,301*/ 1, 0x04, + /* RLE: 006 Pixels @ 206,301*/ 6, 0x03, + /* RLE: 001 Pixels @ 212,301*/ 1, 0x04, + /* RLE: 045 Pixels @ 213,301*/ 45, 0x00, + /* ABS: 002 Pixels @ 258,301*/ 0, 2, 0x04, 0x04, + /* RLE: 009 Pixels @ 260,301*/ 9, 0x03, + /* ABS: 010 Pixels @ 269,301*/ 0, 10, 0x0B, 0x11, 0x07, 0x11, 0x06, 0x12, 0x00, 0x03, 0x03, 0x04, + /* RLE: 058 Pixels @ 279,301*/ 58, 0x00, + /* ABS: 007 Pixels @ 337,301*/ 0, 7, 0x03, 0x04, 0x11, 0x0E, 0x00, 0x06, 0x0E, + /* RLE: 004 Pixels @ 344,301*/ 4, 0x03, + /* RLE: 040 Pixels @ 348,301*/ 40, 0x00, + /* RLE: 064 Pixels @ 000,302*/ 64, 0x02, + /* RLE: 007 Pixels @ 064,302*/ 7, 0x03, + /* RLE: 001 Pixels @ 071,302*/ 1, 0x04, + /* RLE: 045 Pixels @ 072,302*/ 45, 0x00, + /* RLE: 001 Pixels @ 117,302*/ 1, 0x0B, + /* RLE: 008 Pixels @ 118,302*/ 8, 0x08, + /* RLE: 001 Pixels @ 126,302*/ 1, 0x0B, + /* RLE: 021 Pixels @ 127,302*/ 21, 0x00, + /* ABS: 002 Pixels @ 148,302*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 150,302*/ 8, 0x03, + /* RLE: 001 Pixels @ 158,302*/ 1, 0x04, + /* RLE: 046 Pixels @ 159,302*/ 46, 0x00, + /* RLE: 001 Pixels @ 205,302*/ 1, 0x04, + /* RLE: 007 Pixels @ 206,302*/ 7, 0x03, + /* RLE: 043 Pixels @ 213,302*/ 43, 0x00, + /* ABS: 002 Pixels @ 256,302*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 258,302*/ 11, 0x03, + /* ABS: 010 Pixels @ 269,302*/ 0, 10, 0x04, 0x12, 0x0A, 0x03, 0x03, 0x0E, 0x12, 0x03, 0x03, 0x04, + /* RLE: 059 Pixels @ 279,302*/ 59, 0x00, + /* RLE: 004 Pixels @ 338,302*/ 4, 0x03, + /* ABS: 007 Pixels @ 342,302*/ 0, 7, 0x0B, 0x0F, 0x03, 0x00, 0x0E, 0x00, 0x03, + /* RLE: 039 Pixels @ 349,302*/ 39, 0x00, + /* RLE: 064 Pixels @ 000,303*/ 64, 0x02, + /* RLE: 001 Pixels @ 064,303*/ 1, 0x04, + /* RLE: 006 Pixels @ 065,303*/ 6, 0x03, + /* RLE: 001 Pixels @ 071,303*/ 1, 0x04, + /* RLE: 045 Pixels @ 072,303*/ 45, 0x00, + /* RLE: 001 Pixels @ 117,303*/ 1, 0x0B, + /* RLE: 008 Pixels @ 118,303*/ 8, 0x08, + /* RLE: 001 Pixels @ 126,303*/ 1, 0x0B, + /* RLE: 018 Pixels @ 127,303*/ 18, 0x00, + /* ABS: 002 Pixels @ 145,303*/ 0, 2, 0x04, 0x04, + /* RLE: 011 Pixels @ 147,303*/ 11, 0x03, + /* RLE: 001 Pixels @ 158,303*/ 1, 0x04, + /* RLE: 047 Pixels @ 159,303*/ 47, 0x00, + /* RLE: 001 Pixels @ 206,303*/ 1, 0x04, + /* RLE: 006 Pixels @ 207,303*/ 6, 0x03, + /* RLE: 001 Pixels @ 213,303*/ 1, 0x04, + /* RLE: 039 Pixels @ 214,303*/ 39, 0x00, + /* ABS: 002 Pixels @ 253,303*/ 0, 2, 0x04, 0x04, + /* RLE: 018 Pixels @ 255,303*/ 18, 0x03, + /* ABS: 006 Pixels @ 273,303*/ 0, 6, 0x0B, 0x0F, 0x06, 0x03, 0x03, 0x04, + /* RLE: 061 Pixels @ 279,303*/ 61, 0x00, + /* RLE: 003 Pixels @ 340,303*/ 3, 0x03, + /* ABS: 005 Pixels @ 343,303*/ 0, 5, 0x07, 0x11, 0x07, 0x07, 0x04, + /* RLE: 040 Pixels @ 348,303*/ 40, 0x00, + /* RLE: 064 Pixels @ 000,304*/ 64, 0x02, + /* RLE: 001 Pixels @ 064,304*/ 1, 0x04, + /* RLE: 006 Pixels @ 065,304*/ 6, 0x03, + /* RLE: 001 Pixels @ 071,304*/ 1, 0x04, + /* RLE: 045 Pixels @ 072,304*/ 45, 0x00, + /* RLE: 001 Pixels @ 117,304*/ 1, 0x0B, + /* RLE: 008 Pixels @ 118,304*/ 8, 0x08, + /* RLE: 001 Pixels @ 126,304*/ 1, 0x0B, + /* RLE: 016 Pixels @ 127,304*/ 16, 0x00, + /* ABS: 002 Pixels @ 143,304*/ 0, 2, 0x04, 0x04, + /* RLE: 013 Pixels @ 145,304*/ 13, 0x03, + /* RLE: 001 Pixels @ 158,304*/ 1, 0x04, + /* RLE: 047 Pixels @ 159,304*/ 47, 0x00, + /* RLE: 001 Pixels @ 206,304*/ 1, 0x04, + /* RLE: 006 Pixels @ 207,304*/ 6, 0x03, + /* RLE: 001 Pixels @ 213,304*/ 1, 0x04, + /* RLE: 037 Pixels @ 214,304*/ 37, 0x00, + /* ABS: 002 Pixels @ 251,304*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 253,304*/ 16, 0x03, + /* ABS: 011 Pixels @ 269,304*/ 0, 11, 0x00, 0x00, 0x0E, 0x07, 0x07, 0x0D, 0x0D, 0x00, 0x03, 0x03, 0x04, + /* RLE: 059 Pixels @ 280,304*/ 59, 0x00, + /* ABS: 009 Pixels @ 339,304*/ 0, 9, 0x03, 0x00, 0x0E, 0x0F, 0x07, 0x11, 0x0B, 0x00, 0x03, + /* RLE: 040 Pixels @ 348,304*/ 40, 0x00, + /* RLE: 064 Pixels @ 000,305*/ 64, 0x02, + /* RLE: 001 Pixels @ 064,305*/ 1, 0x04, + /* RLE: 006 Pixels @ 065,305*/ 6, 0x03, + /* RLE: 001 Pixels @ 071,305*/ 1, 0x04, + /* RLE: 045 Pixels @ 072,305*/ 45, 0x00, + /* RLE: 001 Pixels @ 117,305*/ 1, 0x0B, + /* RLE: 008 Pixels @ 118,305*/ 8, 0x08, + /* RLE: 001 Pixels @ 126,305*/ 1, 0x0B, + /* RLE: 013 Pixels @ 127,305*/ 13, 0x00, + /* ABS: 002 Pixels @ 140,305*/ 0, 2, 0x04, 0x04, + /* RLE: 015 Pixels @ 142,305*/ 15, 0x03, + /* ABS: 002 Pixels @ 157,305*/ 0, 2, 0x04, 0x04, + /* RLE: 047 Pixels @ 159,305*/ 47, 0x00, + /* RLE: 001 Pixels @ 206,305*/ 1, 0x04, + /* RLE: 006 Pixels @ 207,305*/ 6, 0x03, + /* ABS: 002 Pixels @ 213,305*/ 0, 2, 0x04, 0x04, + /* RLE: 033 Pixels @ 215,305*/ 33, 0x00, + /* ABS: 002 Pixels @ 248,305*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 250,305*/ 16, 0x03, + /* ABS: 014 Pixels @ 266,305*/ 0, 14, 0x04, 0x04, 0x00, 0x03, 0x00, 0x0F, 0x0E, 0x00, 0x03, 0x0A, 0x0F, 0x03, 0x03, 0x04, + /* RLE: 059 Pixels @ 280,305*/ 59, 0x00, + /* ABS: 005 Pixels @ 339,305*/ 0, 5, 0x03, 0x11, 0x07, 0x12, 0x0A, + /* RLE: 004 Pixels @ 344,305*/ 4, 0x03, + /* RLE: 001 Pixels @ 348,305*/ 1, 0x04, + /* RLE: 039 Pixels @ 349,305*/ 39, 0x00, + /* RLE: 064 Pixels @ 000,306*/ 64, 0x02, + /* RLE: 001 Pixels @ 064,306*/ 1, 0x04, + /* RLE: 006 Pixels @ 065,306*/ 6, 0x03, + /* RLE: 001 Pixels @ 071,306*/ 1, 0x04, + /* RLE: 046 Pixels @ 072,306*/ 46, 0x00, + /* RLE: 001 Pixels @ 118,306*/ 1, 0x0B, + /* RLE: 008 Pixels @ 119,306*/ 8, 0x08, + /* RLE: 001 Pixels @ 127,306*/ 1, 0x0B, + /* RLE: 009 Pixels @ 128,306*/ 9, 0x00, + /* ABS: 002 Pixels @ 137,306*/ 0, 2, 0x04, 0x04, + /* RLE: 017 Pixels @ 139,306*/ 17, 0x03, + /* ABS: 002 Pixels @ 156,306*/ 0, 2, 0x04, 0x04, + /* RLE: 048 Pixels @ 158,306*/ 48, 0x00, + /* RLE: 001 Pixels @ 206,306*/ 1, 0x04, + /* RLE: 007 Pixels @ 207,306*/ 7, 0x03, + /* ABS: 002 Pixels @ 214,306*/ 0, 2, 0x04, 0x04, + /* RLE: 030 Pixels @ 216,306*/ 30, 0x00, + /* ABS: 002 Pixels @ 246,306*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 248,306*/ 16, 0x03, + /* ABS: 002 Pixels @ 264,306*/ 0, 2, 0x04, 0x04, + /* RLE: 004 Pixels @ 266,306*/ 4, 0x00, + /* RLE: 004 Pixels @ 270,306*/ 4, 0x03, + /* ABS: 007 Pixels @ 274,306*/ 0, 7, 0x00, 0x12, 0x07, 0x03, 0x03, 0x03, 0x04, + /* RLE: 058 Pixels @ 281,306*/ 58, 0x00, + /* ABS: 002 Pixels @ 339,306*/ 0, 2, 0x03, 0x00, + /* RLE: 007 Pixels @ 341,306*/ 7, 0x03, + /* RLE: 001 Pixels @ 348,306*/ 1, 0x04, + /* RLE: 039 Pixels @ 349,306*/ 39, 0x00, + /* RLE: 064 Pixels @ 000,307*/ 64, 0x02, + /* RLE: 001 Pixels @ 064,307*/ 1, 0x04, + /* RLE: 006 Pixels @ 065,307*/ 6, 0x03, + /* RLE: 001 Pixels @ 071,307*/ 1, 0x04, + /* RLE: 046 Pixels @ 072,307*/ 46, 0x00, + /* RLE: 001 Pixels @ 118,307*/ 1, 0x0B, + /* RLE: 008 Pixels @ 119,307*/ 8, 0x08, + /* RLE: 001 Pixels @ 127,307*/ 1, 0x0B, + /* RLE: 007 Pixels @ 128,307*/ 7, 0x00, + /* ABS: 002 Pixels @ 135,307*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 137,307*/ 16, 0x03, + /* ABS: 002 Pixels @ 153,307*/ 0, 2, 0x04, 0x04, + /* RLE: 052 Pixels @ 155,307*/ 52, 0x00, + /* RLE: 001 Pixels @ 207,307*/ 1, 0x04, + /* RLE: 007 Pixels @ 208,307*/ 7, 0x03, + /* ABS: 002 Pixels @ 215,307*/ 0, 2, 0x04, 0x04, + /* RLE: 026 Pixels @ 217,307*/ 26, 0x00, + /* ABS: 002 Pixels @ 243,307*/ 0, 2, 0x04, 0x04, + /* RLE: 016 Pixels @ 245,307*/ 16, 0x03, + /* ABS: 002 Pixels @ 261,307*/ 0, 2, 0x04, 0x04, + /* RLE: 008 Pixels @ 263,307*/ 8, 0x00, + /* ABS: 010 Pixels @ 271,307*/ 0, 10, 0x03, 0x0B, 0x11, 0x07, 0x0F, 0x04, 0x03, 0x03, 0x03, 0x04, + /* RLE: 059 Pixels @ 281,307*/ 59, 0x00, + /* ABS: 009 Pixels @ 340,307*/ 0, 9, 0x03, 0x03, 0x00, 0x00, 0x03, 0x11, 0x0E, 0x03, 0x03, + /* RLE: 039 Pixels @ 349,307*/ 39, 0x00, + + + 0}; /* 20430 for 119504 pixels */ + +const GUI_BITMAP bmMap = { + 388, /* XSize */ + 308, /* YSize */ + 388, /* BytesPerLine */ + GUI_COMPRESS_RLE8, /* BitsPerPixel */ + acMap, /* Pointer to picture data (indices) */ + &PalMap /* Pointer to palette */ + ,GUI_DRAW_RLE8 +}; + +/* *** End of file *** */ diff --git a/User/system/lib/lcd/gui/GUIDemo/SeggerLogoBlue.c b/User/system/lib/lcd/gui/GUIDemo/SeggerLogoBlue.c new file mode 100644 index 0000000..94823c3 --- /dev/null +++ b/User/system/lib/lcd/gui/GUIDemo/SeggerLogoBlue.c @@ -0,0 +1,907 @@ +/* + C-file generated by Bitmap converter for emWin GSC V2.30b, compiled May 8 2002, 10:05:14 + + Copyright (C) 1998-2002 + Segger Microcontroller Systeme GmbH + www.segger.com + + Solutions for real time microcontroller applications + + Source file: SeggerLogo + Dimensions: 138 * 65 + NumColors: 6 +*/ + +#include "stdlib.h" +#include "GUI.h" +#include "GUIDEMO.h" + +#ifndef GUI_CONST_STORAGE + #define GUI_CONST_STORAGE const +#endif + +extern const GUI_BITMAP bmSeggerLogoBlue; + +/********************************************************************* +* +* colors (SEGGER logo) +* +********************************************************************** +*/ +GUI_CONST_STORAGE GUI_COLOR ColorsSeggerLogoBlue[] = { + 0x0000FF,0x000000,0x888888,0xFFFFFF + ,0xFF0000,0xBBBBBB +}; + +GUI_CONST_STORAGE GUI_LOGPALETTE PalSeggerLogoBlue = { + 6, /* number of entries */ + 1, /* Has transparency */ + &ColorsSeggerLogoBlue[0] +}; + +#if !(GUIDEMO_TINY) + +/********************************************************************* +* +* SEGGER logo, 100% size +* +********************************************************************** +*/ +#ifdef LOGO_COMP + +GUI_CONST_STORAGE unsigned char acSeggerLogoBlue[] = { + /* RLE: 141 Pixels @ 000,000*/ 141, 0x00, + /* RLE: 132 Pixels @ 003,001*/ 132, 0x01, + /* RLE: 005 Pixels @ 135,001*/ 5, 0x00, + /* RLE: 134 Pixels @ 002,002*/ 134, 0x01, + /* RLE: 003 Pixels @ 136,002*/ 3, 0x00, + /* RLE: 004 Pixels @ 001,003*/ 4, 0x01, + /* RLE: 128 Pixels @ 005,003*/ 128, 0x02, + /* RLE: 004 Pixels @ 133,003*/ 4, 0x01, + /* ABS: 005 Pixels @ 137,003*/ 0, 5, 0x00, 0x11, 0x10, + /* RLE: 130 Pixels @ 004,004*/ 130, 0x03, + /* RLE: 003 Pixels @ 134,004*/ 3, 0x01, + /* ABS: 005 Pixels @ 137,004*/ 0, 5, 0x00, 0x11, 0x20, + /* RLE: 130 Pixels @ 004,005*/ 130, 0x03, + /* RLE: 003 Pixels @ 134,005*/ 3, 0x01, + /* ABS: 005 Pixels @ 137,005*/ 0, 5, 0x00, 0x11, 0x20, + /* RLE: 130 Pixels @ 004,006*/ 130, 0x03, + /* ABS: 008 Pixels @ 134,006*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 130 Pixels @ 004,007*/ 130, 0x03, + /* ABS: 008 Pixels @ 134,007*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,008*/ 4, 0x03, + /* RLE: 004 Pixels @ 008,008*/ 4, 0x04, + /* RLE: 010 Pixels @ 012,008*/ 10, 0x03, + /* RLE: 004 Pixels @ 022,008*/ 4, 0x04, + /* RLE: 108 Pixels @ 026,008*/ 108, 0x03, + /* ABS: 008 Pixels @ 134,008*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,009*/ 4, 0x03, + /* RLE: 004 Pixels @ 008,009*/ 4, 0x04, + /* RLE: 010 Pixels @ 012,009*/ 10, 0x03, + /* RLE: 004 Pixels @ 022,009*/ 4, 0x04, + /* RLE: 108 Pixels @ 026,009*/ 108, 0x03, + /* ABS: 008 Pixels @ 134,009*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,010*/ 4, 0x03, + /* RLE: 005 Pixels @ 008,010*/ 5, 0x04, + /* RLE: 001 Pixels @ 013,010*/ 1, 0x05, + /* RLE: 008 Pixels @ 014,010*/ 8, 0x03, + /* RLE: 005 Pixels @ 022,010*/ 5, 0x04, + /* RLE: 001 Pixels @ 027,010*/ 1, 0x05, + /* RLE: 106 Pixels @ 028,010*/ 106, 0x03, + /* ABS: 008 Pixels @ 134,010*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,011*/ 4, 0x03, + /* RLE: 006 Pixels @ 008,011*/ 6, 0x04, + /* RLE: 008 Pixels @ 014,011*/ 8, 0x03, + /* RLE: 006 Pixels @ 022,011*/ 6, 0x04, + /* RLE: 106 Pixels @ 028,011*/ 106, 0x03, + /* ABS: 008 Pixels @ 134,011*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 005 Pixels @ 004,012*/ 5, 0x03, + /* RLE: 006 Pixels @ 009,012*/ 6, 0x04, + /* RLE: 008 Pixels @ 015,012*/ 8, 0x03, + /* RLE: 006 Pixels @ 023,012*/ 6, 0x04, + /* RLE: 105 Pixels @ 029,012*/ 105, 0x03, + /* ABS: 008 Pixels @ 134,012*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 006 Pixels @ 004,013*/ 6, 0x03, + /* RLE: 005 Pixels @ 010,013*/ 5, 0x04, + /* RLE: 001 Pixels @ 015,013*/ 1, 0x05, + /* RLE: 007 Pixels @ 016,013*/ 7, 0x03, + /* RLE: 001 Pixels @ 023,013*/ 1, 0x05, + /* RLE: 005 Pixels @ 024,013*/ 5, 0x04, + /* RLE: 001 Pixels @ 029,013*/ 1, 0x05, + /* RLE: 104 Pixels @ 030,013*/ 104, 0x03, + /* ABS: 008 Pixels @ 134,013*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 006 Pixels @ 004,014*/ 6, 0x03, + /* RLE: 001 Pixels @ 010,014*/ 1, 0x05, + /* RLE: 005 Pixels @ 011,014*/ 5, 0x04, + /* RLE: 001 Pixels @ 016,014*/ 1, 0x05, + /* RLE: 007 Pixels @ 017,014*/ 7, 0x03, + /* RLE: 006 Pixels @ 024,014*/ 6, 0x04, + /* RLE: 104 Pixels @ 030,014*/ 104, 0x03, + /* ABS: 008 Pixels @ 134,014*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 007 Pixels @ 004,015*/ 7, 0x03, + /* RLE: 001 Pixels @ 011,015*/ 1, 0x05, + /* RLE: 005 Pixels @ 012,015*/ 5, 0x04, + /* RLE: 008 Pixels @ 017,015*/ 8, 0x03, + /* RLE: 006 Pixels @ 025,015*/ 6, 0x04, + /* RLE: 103 Pixels @ 031,015*/ 103, 0x03, + /* ABS: 008 Pixels @ 134,015*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 008 Pixels @ 004,016*/ 8, 0x03, + /* RLE: 006 Pixels @ 012,016*/ 6, 0x04, + /* RLE: 008 Pixels @ 018,016*/ 8, 0x03, + /* RLE: 005 Pixels @ 026,016*/ 5, 0x04, + /* RLE: 001 Pixels @ 031,016*/ 1, 0x05, + /* RLE: 102 Pixels @ 032,016*/ 102, 0x03, + /* ABS: 008 Pixels @ 134,016*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 009 Pixels @ 004,017*/ 9, 0x03, + /* RLE: 006 Pixels @ 013,017*/ 6, 0x04, + /* RLE: 007 Pixels @ 019,017*/ 7, 0x03, + /* RLE: 001 Pixels @ 026,017*/ 1, 0x05, + /* RLE: 005 Pixels @ 027,017*/ 5, 0x04, + /* RLE: 001 Pixels @ 032,017*/ 1, 0x05, + /* RLE: 101 Pixels @ 033,017*/ 101, 0x03, + /* ABS: 008 Pixels @ 134,017*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 009 Pixels @ 004,018*/ 9, 0x03, + /* RLE: 001 Pixels @ 013,018*/ 1, 0x05, + /* RLE: 005 Pixels @ 014,018*/ 5, 0x04, + /* RLE: 001 Pixels @ 019,018*/ 1, 0x05, + /* RLE: 007 Pixels @ 020,018*/ 7, 0x03, + /* RLE: 006 Pixels @ 027,018*/ 6, 0x04, + /* RLE: 101 Pixels @ 033,018*/ 101, 0x03, + /* ABS: 008 Pixels @ 134,018*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 010 Pixels @ 004,019*/ 10, 0x03, + /* RLE: 001 Pixels @ 014,019*/ 1, 0x05, + /* RLE: 005 Pixels @ 015,019*/ 5, 0x04, + /* RLE: 008 Pixels @ 020,019*/ 8, 0x03, + /* RLE: 006 Pixels @ 028,019*/ 6, 0x04, + /* RLE: 100 Pixels @ 034,019*/ 100, 0x03, + /* ABS: 008 Pixels @ 134,019*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 011 Pixels @ 004,020*/ 11, 0x03, + /* RLE: 006 Pixels @ 015,020*/ 6, 0x04, + /* RLE: 008 Pixels @ 021,020*/ 8, 0x03, + /* RLE: 005 Pixels @ 029,020*/ 5, 0x04, + /* RLE: 001 Pixels @ 034,020*/ 1, 0x05, + /* RLE: 099 Pixels @ 035,020*/ 99, 0x03, + /* ABS: 012 Pixels @ 134,020*/ 0, 12, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, + /* RLE: 008 Pixels @ 008,021*/ 8, 0x03, + /* RLE: 006 Pixels @ 016,021*/ 6, 0x04, + /* RLE: 007 Pixels @ 022,021*/ 7, 0x03, + /* RLE: 001 Pixels @ 029,021*/ 1, 0x05, + /* RLE: 005 Pixels @ 030,021*/ 5, 0x04, + /* RLE: 099 Pixels @ 035,021*/ 99, 0x03, + /* ABS: 013 Pixels @ 134,021*/ 0, 13, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, 0x40, + /* RLE: 007 Pixels @ 009,022*/ 7, 0x03, + /* RLE: 001 Pixels @ 016,022*/ 1, 0x05, + /* RLE: 005 Pixels @ 017,022*/ 5, 0x04, + /* RLE: 001 Pixels @ 022,022*/ 1, 0x05, + /* RLE: 007 Pixels @ 023,022*/ 7, 0x03, + /* RLE: 006 Pixels @ 030,022*/ 6, 0x04, + /* RLE: 098 Pixels @ 036,022*/ 98, 0x03, + /* ABS: 014 Pixels @ 134,022*/ 0, 14, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, 0x44, + /* RLE: 007 Pixels @ 010,023*/ 7, 0x03, + /* RLE: 006 Pixels @ 017,023*/ 6, 0x04, + /* RLE: 008 Pixels @ 023,023*/ 8, 0x03, + /* RLE: 005 Pixels @ 031,023*/ 5, 0x04, + /* RLE: 001 Pixels @ 036,023*/ 1, 0x05, + /* RLE: 097 Pixels @ 037,023*/ 97, 0x03, + /* ABS: 015 Pixels @ 134,023*/ 0, 15, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, 0x44, 0x50, + /* RLE: 007 Pixels @ 011,024*/ 7, 0x03, + /* RLE: 006 Pixels @ 018,024*/ 6, 0x04, + /* RLE: 007 Pixels @ 024,024*/ 7, 0x03, + /* RLE: 001 Pixels @ 031,024*/ 1, 0x05, + /* RLE: 005 Pixels @ 032,024*/ 5, 0x04, + /* RLE: 001 Pixels @ 037,024*/ 1, 0x05, + /* RLE: 096 Pixels @ 038,024*/ 96, 0x03, + /* ABS: 011 Pixels @ 134,024*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 004 Pixels @ 007,025*/ 4, 0x04, + /* RLE: 008 Pixels @ 011,025*/ 8, 0x03, + /* RLE: 006 Pixels @ 019,025*/ 6, 0x04, + /* RLE: 007 Pixels @ 025,025*/ 7, 0x03, + /* RLE: 001 Pixels @ 032,025*/ 1, 0x05, + /* RLE: 005 Pixels @ 033,025*/ 5, 0x04, + /* RLE: 096 Pixels @ 038,025*/ 96, 0x03, + /* ABS: 011 Pixels @ 134,025*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 005 Pixels @ 007,026*/ 5, 0x04, + /* RLE: 007 Pixels @ 012,026*/ 7, 0x03, + /* RLE: 001 Pixels @ 019,026*/ 1, 0x05, + /* RLE: 005 Pixels @ 020,026*/ 5, 0x04, + /* RLE: 001 Pixels @ 025,026*/ 1, 0x05, + /* RLE: 007 Pixels @ 026,026*/ 7, 0x03, + /* RLE: 006 Pixels @ 033,026*/ 6, 0x04, + /* RLE: 095 Pixels @ 039,026*/ 95, 0x03, + /* ABS: 011 Pixels @ 134,026*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 006 Pixels @ 007,027*/ 6, 0x04, + /* RLE: 007 Pixels @ 013,027*/ 7, 0x03, + /* RLE: 001 Pixels @ 020,027*/ 1, 0x05, + /* RLE: 005 Pixels @ 021,027*/ 5, 0x04, + /* RLE: 008 Pixels @ 026,027*/ 8, 0x03, + /* RLE: 095 Pixels @ 034,027*/ 95, 0x04, + /* RLE: 005 Pixels @ 129,027*/ 5, 0x03, + /* ABS: 011 Pixels @ 134,027*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 006 Pixels @ 007,028*/ 6, 0x04, + /* RLE: 001 Pixels @ 013,028*/ 1, 0x05, + /* RLE: 007 Pixels @ 014,028*/ 7, 0x03, + /* RLE: 006 Pixels @ 021,028*/ 6, 0x04, + /* RLE: 007 Pixels @ 027,028*/ 7, 0x03, + /* RLE: 001 Pixels @ 034,028*/ 1, 0x05, + /* RLE: 095 Pixels @ 035,028*/ 95, 0x04, + /* RLE: 004 Pixels @ 130,028*/ 4, 0x03, + /* ABS: 011 Pixels @ 134,028*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 007 Pixels @ 007,029*/ 7, 0x04, + /* RLE: 008 Pixels @ 014,029*/ 8, 0x03, + /* RLE: 006 Pixels @ 022,029*/ 6, 0x04, + /* RLE: 007 Pixels @ 028,029*/ 7, 0x03, + /* RLE: 095 Pixels @ 035,029*/ 95, 0x04, + /* RLE: 004 Pixels @ 130,029*/ 4, 0x03, + /* ABS: 011 Pixels @ 134,029*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 008 Pixels @ 007,030*/ 8, 0x04, + /* RLE: 007 Pixels @ 015,030*/ 7, 0x03, + /* RLE: 001 Pixels @ 022,030*/ 1, 0x05, + /* RLE: 005 Pixels @ 023,030*/ 5, 0x04, + /* RLE: 001 Pixels @ 028,030*/ 1, 0x05, + /* RLE: 007 Pixels @ 029,030*/ 7, 0x03, + /* RLE: 094 Pixels @ 036,030*/ 94, 0x04, + /* RLE: 004 Pixels @ 130,030*/ 4, 0x03, + /* ABS: 011 Pixels @ 134,030*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 009 Pixels @ 007,031*/ 9, 0x04, + /* RLE: 007 Pixels @ 016,031*/ 7, 0x03, + /* RLE: 001 Pixels @ 023,031*/ 1, 0x05, + /* RLE: 005 Pixels @ 024,031*/ 5, 0x04, + /* RLE: 001 Pixels @ 029,031*/ 1, 0x05, + /* RLE: 006 Pixels @ 030,031*/ 6, 0x03, + /* RLE: 093 Pixels @ 036,031*/ 93, 0x04, + /* RLE: 005 Pixels @ 129,031*/ 5, 0x03, + /* ABS: 011 Pixels @ 134,031*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 010 Pixels @ 007,032*/ 10, 0x04, + /* RLE: 007 Pixels @ 017,032*/ 7, 0x03, + /* RLE: 006 Pixels @ 024,032*/ 6, 0x04, + /* RLE: 104 Pixels @ 030,032*/ 104, 0x03, + /* ABS: 011 Pixels @ 134,032*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 009 Pixels @ 007,033*/ 9, 0x04, + /* RLE: 007 Pixels @ 016,033*/ 7, 0x03, + /* RLE: 001 Pixels @ 023,033*/ 1, 0x05, + /* RLE: 005 Pixels @ 024,033*/ 5, 0x04, + /* RLE: 001 Pixels @ 029,033*/ 1, 0x05, + /* RLE: 006 Pixels @ 030,033*/ 6, 0x03, + /* RLE: 093 Pixels @ 036,033*/ 93, 0x04, + /* RLE: 005 Pixels @ 129,033*/ 5, 0x03, + /* ABS: 011 Pixels @ 134,033*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 008 Pixels @ 007,034*/ 8, 0x04, + /* RLE: 007 Pixels @ 015,034*/ 7, 0x03, + /* RLE: 001 Pixels @ 022,034*/ 1, 0x05, + /* RLE: 006 Pixels @ 023,034*/ 6, 0x04, + /* RLE: 007 Pixels @ 029,034*/ 7, 0x03, + /* RLE: 094 Pixels @ 036,034*/ 94, 0x04, + /* RLE: 004 Pixels @ 130,034*/ 4, 0x03, + /* ABS: 011 Pixels @ 134,034*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 007 Pixels @ 007,035*/ 7, 0x04, + /* RLE: 008 Pixels @ 014,035*/ 8, 0x03, + /* RLE: 006 Pixels @ 022,035*/ 6, 0x04, + /* RLE: 007 Pixels @ 028,035*/ 7, 0x03, + /* RLE: 095 Pixels @ 035,035*/ 95, 0x04, + /* RLE: 004 Pixels @ 130,035*/ 4, 0x03, + /* ABS: 011 Pixels @ 134,035*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 006 Pixels @ 007,036*/ 6, 0x04, + /* RLE: 001 Pixels @ 013,036*/ 1, 0x05, + /* RLE: 007 Pixels @ 014,036*/ 7, 0x03, + /* RLE: 006 Pixels @ 021,036*/ 6, 0x04, + /* RLE: 007 Pixels @ 027,036*/ 7, 0x03, + /* RLE: 001 Pixels @ 034,036*/ 1, 0x05, + /* RLE: 095 Pixels @ 035,036*/ 95, 0x04, + /* RLE: 004 Pixels @ 130,036*/ 4, 0x03, + /* ABS: 011 Pixels @ 134,036*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 006 Pixels @ 007,037*/ 6, 0x04, + /* RLE: 007 Pixels @ 013,037*/ 7, 0x03, + /* RLE: 001 Pixels @ 020,037*/ 1, 0x05, + /* RLE: 005 Pixels @ 021,037*/ 5, 0x04, + /* RLE: 008 Pixels @ 026,037*/ 8, 0x03, + /* RLE: 095 Pixels @ 034,037*/ 95, 0x04, + /* RLE: 005 Pixels @ 129,037*/ 5, 0x03, + /* ABS: 011 Pixels @ 134,037*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 005 Pixels @ 007,038*/ 5, 0x04, + /* RLE: 007 Pixels @ 012,038*/ 7, 0x03, + /* RLE: 001 Pixels @ 019,038*/ 1, 0x05, + /* RLE: 005 Pixels @ 020,038*/ 5, 0x04, + /* RLE: 001 Pixels @ 025,038*/ 1, 0x05, + /* RLE: 007 Pixels @ 026,038*/ 7, 0x03, + /* RLE: 006 Pixels @ 033,038*/ 6, 0x04, + /* RLE: 095 Pixels @ 039,038*/ 95, 0x03, + /* ABS: 011 Pixels @ 134,038*/ 0, 11, 0x21, 0x10, 0x01, 0x12, 0x33, 0x30, + /* RLE: 004 Pixels @ 007,039*/ 4, 0x04, + /* RLE: 008 Pixels @ 011,039*/ 8, 0x03, + /* RLE: 006 Pixels @ 019,039*/ 6, 0x04, + /* RLE: 007 Pixels @ 025,039*/ 7, 0x03, + /* RLE: 001 Pixels @ 032,039*/ 1, 0x05, + /* RLE: 005 Pixels @ 033,039*/ 5, 0x04, + /* RLE: 096 Pixels @ 038,039*/ 96, 0x03, + /* ABS: 015 Pixels @ 134,039*/ 0, 15, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, 0x44, 0x50, + /* RLE: 007 Pixels @ 011,040*/ 7, 0x03, + /* RLE: 006 Pixels @ 018,040*/ 6, 0x04, + /* RLE: 007 Pixels @ 024,040*/ 7, 0x03, + /* RLE: 001 Pixels @ 031,040*/ 1, 0x05, + /* RLE: 005 Pixels @ 032,040*/ 5, 0x04, + /* RLE: 097 Pixels @ 037,040*/ 97, 0x03, + /* ABS: 014 Pixels @ 134,040*/ 0, 14, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, 0x44, + /* RLE: 007 Pixels @ 010,041*/ 7, 0x03, + /* RLE: 001 Pixels @ 017,041*/ 1, 0x05, + /* RLE: 005 Pixels @ 018,041*/ 5, 0x04, + /* RLE: 008 Pixels @ 023,041*/ 8, 0x03, + /* RLE: 005 Pixels @ 031,041*/ 5, 0x04, + /* RLE: 001 Pixels @ 036,041*/ 1, 0x05, + /* RLE: 097 Pixels @ 037,041*/ 97, 0x03, + /* ABS: 013 Pixels @ 134,041*/ 0, 13, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, 0x40, + /* RLE: 007 Pixels @ 009,042*/ 7, 0x03, + /* RLE: 001 Pixels @ 016,042*/ 1, 0x05, + /* RLE: 005 Pixels @ 017,042*/ 5, 0x04, + /* RLE: 001 Pixels @ 022,042*/ 1, 0x05, + /* RLE: 007 Pixels @ 023,042*/ 7, 0x03, + /* RLE: 006 Pixels @ 030,042*/ 6, 0x04, + /* RLE: 098 Pixels @ 036,042*/ 98, 0x03, + /* ABS: 012 Pixels @ 134,042*/ 0, 12, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, + /* RLE: 008 Pixels @ 008,043*/ 8, 0x03, + /* RLE: 006 Pixels @ 016,043*/ 6, 0x04, + /* RLE: 007 Pixels @ 022,043*/ 7, 0x03, + /* RLE: 001 Pixels @ 029,043*/ 1, 0x05, + /* RLE: 005 Pixels @ 030,043*/ 5, 0x04, + /* RLE: 007 Pixels @ 035,043*/ 7, 0x03, + /* ABS: 007 Pixels @ 042,043*/ 0, 7, 0x22, 0x11, 0x12, 0x20, + /* RLE: 006 Pixels @ 049,043*/ 6, 0x03, + /* RLE: 001 Pixels @ 055,043*/ 1, 0x02, + /* RLE: 010 Pixels @ 056,043*/ 10, 0x01, + /* RLE: 001 Pixels @ 066,043*/ 1, 0x02, + /* RLE: 004 Pixels @ 067,043*/ 4, 0x03, + /* ABS: 008 Pixels @ 071,043*/ 0, 8, 0x52, 0x21, 0x11, 0x25, + /* RLE: 008 Pixels @ 079,043*/ 8, 0x03, + /* ABS: 008 Pixels @ 087,043*/ 0, 8, 0x52, 0x21, 0x11, 0x25, + /* RLE: 007 Pixels @ 095,043*/ 7, 0x03, + /* RLE: 001 Pixels @ 102,043*/ 1, 0x02, + /* RLE: 010 Pixels @ 103,043*/ 10, 0x01, + /* ABS: 004 Pixels @ 113,043*/ 0, 4, 0x23, 0x32, + /* RLE: 008 Pixels @ 117,043*/ 8, 0x01, + /* ABS: 002 Pixels @ 125,043*/ 0, 2, 0x25, + /* RLE: 007 Pixels @ 127,043*/ 7, 0x03, + /* ABS: 012 Pixels @ 134,043*/ 0, 12, 0x21, 0x10, 0x01, 0x12, 0x33, 0x34, + /* RLE: 007 Pixels @ 008,044*/ 7, 0x03, + /* RLE: 006 Pixels @ 015,044*/ 6, 0x04, + /* RLE: 008 Pixels @ 021,044*/ 8, 0x03, + /* RLE: 005 Pixels @ 029,044*/ 5, 0x04, + /* RLE: 001 Pixels @ 034,044*/ 1, 0x05, + /* RLE: 006 Pixels @ 035,044*/ 6, 0x03, + /* RLE: 009 Pixels @ 041,044*/ 9, 0x01, + /* RLE: 001 Pixels @ 050,044*/ 1, 0x05, + /* RLE: 004 Pixels @ 051,044*/ 4, 0x03, + /* RLE: 011 Pixels @ 055,044*/ 11, 0x01, + /* ABS: 005 Pixels @ 066,044*/ 0, 5, 0x23, 0x33, 0x20, + /* RLE: 009 Pixels @ 071,044*/ 9, 0x01, + /* RLE: 006 Pixels @ 080,044*/ 6, 0x03, + /* RLE: 001 Pixels @ 086,044*/ 1, 0x02, + /* RLE: 009 Pixels @ 087,044*/ 9, 0x01, + /* RLE: 006 Pixels @ 096,044*/ 6, 0x03, + /* RLE: 011 Pixels @ 102,044*/ 11, 0x01, + /* ABS: 003 Pixels @ 113,044*/ 0, 3, 0x23, 0x30, + /* RLE: 011 Pixels @ 116,044*/ 11, 0x01, + /* RLE: 001 Pixels @ 127,044*/ 1, 0x05, + /* RLE: 006 Pixels @ 128,044*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,044*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 010 Pixels @ 004,045*/ 10, 0x03, + /* RLE: 001 Pixels @ 014,045*/ 1, 0x05, + /* RLE: 005 Pixels @ 015,045*/ 5, 0x04, + /* RLE: 008 Pixels @ 020,045*/ 8, 0x03, + /* RLE: 006 Pixels @ 028,045*/ 6, 0x04, + /* RLE: 006 Pixels @ 034,045*/ 6, 0x03, + /* ABS: 011 Pixels @ 040,045*/ 0, 11, 0x21, 0x12, 0x33, 0x35, 0x11, 0x10, + /* RLE: 004 Pixels @ 051,045*/ 4, 0x03, + /* RLE: 003 Pixels @ 055,045*/ 3, 0x01, + /* RLE: 011 Pixels @ 058,045*/ 11, 0x03, + /* ABS: 012 Pixels @ 069,045*/ 0, 12, 0x21, 0x12, 0x53, 0x35, 0x21, 0x11, + /* RLE: 004 Pixels @ 081,045*/ 4, 0x03, + /* ABS: 012 Pixels @ 085,045*/ 0, 12, 0x21, 0x12, 0x53, 0x35, 0x21, 0x11, + /* RLE: 005 Pixels @ 097,045*/ 5, 0x03, + /* RLE: 003 Pixels @ 102,045*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,045*/ 11, 0x03, + /* RLE: 003 Pixels @ 116,045*/ 3, 0x01, + /* RLE: 005 Pixels @ 119,045*/ 5, 0x03, + /* ABS: 004 Pixels @ 124,045*/ 0, 4, 0x21, 0x12, + /* RLE: 006 Pixels @ 128,045*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,045*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 009 Pixels @ 004,046*/ 9, 0x03, + /* RLE: 001 Pixels @ 013,046*/ 1, 0x05, + /* RLE: 005 Pixels @ 014,046*/ 5, 0x04, + /* RLE: 001 Pixels @ 019,046*/ 1, 0x05, + /* RLE: 007 Pixels @ 020,046*/ 7, 0x03, + /* RLE: 006 Pixels @ 027,046*/ 6, 0x04, + /* RLE: 007 Pixels @ 033,046*/ 7, 0x03, + /* RLE: 003 Pixels @ 040,046*/ 3, 0x01, + /* RLE: 005 Pixels @ 043,046*/ 5, 0x03, + /* ABS: 003 Pixels @ 048,046*/ 0, 3, 0x51, 0x20, + /* RLE: 004 Pixels @ 051,046*/ 4, 0x03, + /* RLE: 003 Pixels @ 055,046*/ 3, 0x01, + /* RLE: 010 Pixels @ 058,046*/ 10, 0x03, + /* ABS: 004 Pixels @ 068,046*/ 0, 4, 0x51, 0x12, + /* RLE: 006 Pixels @ 072,046*/ 6, 0x03, + /* ABS: 010 Pixels @ 078,046*/ 0, 10, 0x21, 0x23, 0x33, 0x51, 0x12, + /* RLE: 006 Pixels @ 088,046*/ 6, 0x03, + /* ABS: 003 Pixels @ 094,046*/ 0, 3, 0x21, 0x20, + /* RLE: 005 Pixels @ 097,046*/ 5, 0x03, + /* RLE: 003 Pixels @ 102,046*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,046*/ 11, 0x03, + /* RLE: 003 Pixels @ 116,046*/ 3, 0x01, + /* RLE: 006 Pixels @ 119,046*/ 6, 0x03, + /* RLE: 003 Pixels @ 125,046*/ 3, 0x01, + /* RLE: 006 Pixels @ 128,046*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,046*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 009 Pixels @ 004,047*/ 9, 0x03, + /* RLE: 006 Pixels @ 013,047*/ 6, 0x04, + /* RLE: 007 Pixels @ 019,047*/ 7, 0x03, + /* RLE: 001 Pixels @ 026,047*/ 1, 0x05, + /* RLE: 005 Pixels @ 027,047*/ 5, 0x04, + /* RLE: 001 Pixels @ 032,047*/ 1, 0x05, + /* RLE: 007 Pixels @ 033,047*/ 7, 0x03, + /* ABS: 005 Pixels @ 040,047*/ 0, 5, 0x21, 0x12, 0x50, + /* RLE: 010 Pixels @ 045,047*/ 10, 0x03, + /* RLE: 003 Pixels @ 055,047*/ 3, 0x01, + /* RLE: 010 Pixels @ 058,047*/ 10, 0x03, + /* ABS: 004 Pixels @ 068,047*/ 0, 4, 0x21, 0x15, + /* RLE: 012 Pixels @ 072,047*/ 12, 0x03, + /* ABS: 004 Pixels @ 084,047*/ 0, 4, 0x21, 0x15, + /* RLE: 014 Pixels @ 088,047*/ 14, 0x03, + /* RLE: 003 Pixels @ 102,047*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,047*/ 11, 0x03, + /* RLE: 003 Pixels @ 116,047*/ 3, 0x01, + /* RLE: 006 Pixels @ 119,047*/ 6, 0x03, + /* RLE: 003 Pixels @ 125,047*/ 3, 0x01, + /* RLE: 006 Pixels @ 128,047*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,047*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 008 Pixels @ 004,048*/ 8, 0x03, + /* RLE: 006 Pixels @ 012,048*/ 6, 0x04, + /* RLE: 008 Pixels @ 018,048*/ 8, 0x03, + /* RLE: 005 Pixels @ 026,048*/ 5, 0x04, + /* RLE: 001 Pixels @ 031,048*/ 1, 0x05, + /* RLE: 009 Pixels @ 032,048*/ 9, 0x03, + /* RLE: 006 Pixels @ 041,048*/ 6, 0x01, + /* ABS: 002 Pixels @ 047,048*/ 0, 2, 0x22, + /* RLE: 006 Pixels @ 049,048*/ 6, 0x03, + /* RLE: 010 Pixels @ 055,048*/ 10, 0x01, + /* ABS: 006 Pixels @ 065,048*/ 0, 6, 0x23, 0x31, 0x11, + /* RLE: 013 Pixels @ 071,048*/ 13, 0x03, + /* RLE: 003 Pixels @ 084,048*/ 3, 0x01, + /* RLE: 015 Pixels @ 087,048*/ 15, 0x03, + /* RLE: 010 Pixels @ 102,048*/ 10, 0x01, + /* ABS: 007 Pixels @ 112,048*/ 0, 7, 0x23, 0x33, 0x11, 0x10, + /* RLE: 005 Pixels @ 119,048*/ 5, 0x03, + /* ABS: 004 Pixels @ 124,048*/ 0, 4, 0x21, 0x12, + /* RLE: 006 Pixels @ 128,048*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,048*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 007 Pixels @ 004,049*/ 7, 0x03, + /* RLE: 001 Pixels @ 011,049*/ 1, 0x05, + /* RLE: 005 Pixels @ 012,049*/ 5, 0x04, + /* RLE: 008 Pixels @ 017,049*/ 8, 0x03, + /* RLE: 006 Pixels @ 025,049*/ 6, 0x04, + /* RLE: 011 Pixels @ 031,049*/ 11, 0x03, + /* ABS: 003 Pixels @ 042,049*/ 0, 3, 0x52, 0x20, + /* RLE: 005 Pixels @ 045,049*/ 5, 0x01, + /* RLE: 001 Pixels @ 050,049*/ 1, 0x02, + /* RLE: 004 Pixels @ 051,049*/ 4, 0x03, + /* RLE: 010 Pixels @ 055,049*/ 10, 0x01, + /* ABS: 006 Pixels @ 065,049*/ 0, 6, 0x23, 0x31, 0x11, + /* RLE: 004 Pixels @ 071,049*/ 4, 0x03, + /* RLE: 001 Pixels @ 075,049*/ 1, 0x02, + /* RLE: 005 Pixels @ 076,049*/ 5, 0x01, + /* ABS: 006 Pixels @ 081,049*/ 0, 6, 0x23, 0x31, 0x11, + /* RLE: 004 Pixels @ 087,049*/ 4, 0x03, + /* RLE: 001 Pixels @ 091,049*/ 1, 0x02, + /* RLE: 005 Pixels @ 092,049*/ 5, 0x01, + /* RLE: 001 Pixels @ 097,049*/ 1, 0x02, + /* RLE: 004 Pixels @ 098,049*/ 4, 0x03, + /* RLE: 010 Pixels @ 102,049*/ 10, 0x01, + /* ABS: 004 Pixels @ 112,049*/ 0, 4, 0x23, 0x33, + /* RLE: 010 Pixels @ 116,049*/ 10, 0x01, + /* RLE: 001 Pixels @ 126,049*/ 1, 0x02, + /* RLE: 007 Pixels @ 127,049*/ 7, 0x03, + /* ABS: 008 Pixels @ 134,049*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 006 Pixels @ 004,050*/ 6, 0x03, + /* RLE: 001 Pixels @ 010,050*/ 1, 0x05, + /* RLE: 005 Pixels @ 011,050*/ 5, 0x04, + /* RLE: 001 Pixels @ 016,050*/ 1, 0x05, + /* RLE: 007 Pixels @ 017,050*/ 7, 0x03, + /* RLE: 001 Pixels @ 024,050*/ 1, 0x05, + /* RLE: 005 Pixels @ 025,050*/ 5, 0x04, + /* RLE: 016 Pixels @ 030,050*/ 16, 0x03, + /* ABS: 012 Pixels @ 046,050*/ 0, 12, 0x52, 0x11, 0x12, 0x33, 0x31, 0x11, + /* RLE: 010 Pixels @ 058,050*/ 10, 0x03, + /* RLE: 003 Pixels @ 068,050*/ 3, 0x01, + /* RLE: 004 Pixels @ 071,050*/ 4, 0x03, + /* RLE: 001 Pixels @ 075,050*/ 1, 0x02, + /* RLE: 006 Pixels @ 076,050*/ 6, 0x01, + /* ABS: 005 Pixels @ 082,050*/ 0, 5, 0x33, 0x11, 0x10, + /* RLE: 004 Pixels @ 087,050*/ 4, 0x03, + /* RLE: 001 Pixels @ 091,050*/ 1, 0x02, + /* RLE: 006 Pixels @ 092,050*/ 6, 0x01, + /* RLE: 004 Pixels @ 098,050*/ 4, 0x03, + /* RLE: 003 Pixels @ 102,050*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,050*/ 11, 0x03, + /* RLE: 010 Pixels @ 116,050*/ 10, 0x01, + /* RLE: 001 Pixels @ 126,050*/ 1, 0x02, + /* RLE: 007 Pixels @ 127,050*/ 7, 0x03, + /* ABS: 008 Pixels @ 134,050*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 006 Pixels @ 004,051*/ 6, 0x03, + /* RLE: 005 Pixels @ 010,051*/ 5, 0x04, + /* RLE: 001 Pixels @ 015,051*/ 1, 0x05, + /* RLE: 007 Pixels @ 016,051*/ 7, 0x03, + /* RLE: 001 Pixels @ 023,051*/ 1, 0x05, + /* RLE: 005 Pixels @ 024,051*/ 5, 0x04, + /* RLE: 001 Pixels @ 029,051*/ 1, 0x05, + /* RLE: 010 Pixels @ 030,051*/ 10, 0x03, + /* ABS: 003 Pixels @ 040,051*/ 0, 3, 0x21, 0x50, + /* RLE: 005 Pixels @ 043,051*/ 5, 0x03, + /* ABS: 010 Pixels @ 048,051*/ 0, 10, 0x51, 0x11, 0x33, 0x31, 0x11, + /* RLE: 010 Pixels @ 058,051*/ 10, 0x03, + /* ABS: 004 Pixels @ 068,051*/ 0, 4, 0x21, 0x15, + /* RLE: 007 Pixels @ 072,051*/ 7, 0x03, + /* RLE: 003 Pixels @ 079,051*/ 3, 0x01, + /* ABS: 006 Pixels @ 082,051*/ 0, 6, 0x33, 0x21, 0x15, + /* RLE: 007 Pixels @ 088,051*/ 7, 0x03, + /* RLE: 003 Pixels @ 095,051*/ 3, 0x01, + /* RLE: 004 Pixels @ 098,051*/ 4, 0x03, + /* RLE: 003 Pixels @ 102,051*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,051*/ 11, 0x03, + /* RLE: 003 Pixels @ 116,051*/ 3, 0x01, + /* RLE: 005 Pixels @ 119,051*/ 5, 0x03, + /* ABS: 004 Pixels @ 124,051*/ 0, 4, 0x21, 0x12, + /* RLE: 006 Pixels @ 128,051*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,051*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 005 Pixels @ 004,052*/ 5, 0x03, + /* RLE: 006 Pixels @ 009,052*/ 6, 0x04, + /* RLE: 008 Pixels @ 015,052*/ 8, 0x03, + /* RLE: 006 Pixels @ 023,052*/ 6, 0x04, + /* RLE: 011 Pixels @ 029,052*/ 11, 0x03, + /* RLE: 003 Pixels @ 040,052*/ 3, 0x01, + /* RLE: 006 Pixels @ 043,052*/ 6, 0x03, + /* RLE: 003 Pixels @ 049,052*/ 3, 0x01, + /* RLE: 003 Pixels @ 052,052*/ 3, 0x03, + /* RLE: 003 Pixels @ 055,052*/ 3, 0x01, + /* RLE: 010 Pixels @ 058,052*/ 10, 0x03, + /* ABS: 004 Pixels @ 068,052*/ 0, 4, 0x51, 0x12, + /* RLE: 006 Pixels @ 072,052*/ 6, 0x03, + /* ABS: 010 Pixels @ 078,052*/ 0, 10, 0x21, 0x11, 0x33, 0x51, 0x12, + /* RLE: 006 Pixels @ 088,052*/ 6, 0x03, + /* ABS: 004 Pixels @ 094,052*/ 0, 4, 0x21, 0x11, + /* RLE: 004 Pixels @ 098,052*/ 4, 0x03, + /* RLE: 003 Pixels @ 102,052*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,052*/ 11, 0x03, + /* RLE: 003 Pixels @ 116,052*/ 3, 0x01, + /* RLE: 006 Pixels @ 119,052*/ 6, 0x03, + /* RLE: 003 Pixels @ 125,052*/ 3, 0x01, + /* RLE: 006 Pixels @ 128,052*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,052*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,053*/ 4, 0x03, + /* RLE: 006 Pixels @ 008,053*/ 6, 0x04, + /* RLE: 008 Pixels @ 014,053*/ 8, 0x03, + /* RLE: 006 Pixels @ 022,053*/ 6, 0x04, + /* RLE: 012 Pixels @ 028,053*/ 12, 0x03, + /* ABS: 018 Pixels @ 040,053*/ 0, 18, 0x21, 0x11, 0x53, 0x33, 0x21, 0x12, 0x33, 0x31, 0x11, + /* RLE: 011 Pixels @ 058,053*/ 11, 0x03, + /* ABS: 009 Pixels @ 069,053*/ 0, 9, 0x21, 0x12, 0x53, 0x33, 0x20, + /* RLE: 004 Pixels @ 078,053*/ 4, 0x01, + /* RLE: 003 Pixels @ 082,053*/ 3, 0x03, + /* ABS: 009 Pixels @ 085,053*/ 0, 9, 0x21, 0x12, 0x53, 0x33, 0x20, + /* RLE: 004 Pixels @ 094,053*/ 4, 0x01, + /* RLE: 004 Pixels @ 098,053*/ 4, 0x03, + /* RLE: 003 Pixels @ 102,053*/ 3, 0x01, + /* RLE: 011 Pixels @ 105,053*/ 11, 0x03, + /* RLE: 003 Pixels @ 116,053*/ 3, 0x01, + /* RLE: 006 Pixels @ 119,053*/ 6, 0x03, + /* RLE: 003 Pixels @ 125,053*/ 3, 0x01, + /* RLE: 006 Pixels @ 128,053*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,053*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,054*/ 4, 0x03, + /* RLE: 005 Pixels @ 008,054*/ 5, 0x04, + /* RLE: 001 Pixels @ 013,054*/ 1, 0x05, + /* RLE: 008 Pixels @ 014,054*/ 8, 0x03, + /* RLE: 005 Pixels @ 022,054*/ 5, 0x04, + /* RLE: 001 Pixels @ 027,054*/ 1, 0x05, + /* RLE: 013 Pixels @ 028,054*/ 13, 0x03, + /* RLE: 001 Pixels @ 041,054*/ 1, 0x02, + /* RLE: 008 Pixels @ 042,054*/ 8, 0x01, + /* RLE: 001 Pixels @ 050,054*/ 1, 0x02, + /* RLE: 004 Pixels @ 051,054*/ 4, 0x03, + /* RLE: 011 Pixels @ 055,054*/ 11, 0x01, + /* ABS: 005 Pixels @ 066,054*/ 0, 5, 0x23, 0x33, 0x20, + /* RLE: 008 Pixels @ 071,054*/ 8, 0x01, + /* ABS: 003 Pixels @ 079,054*/ 0, 3, 0x21, 0x10, + /* RLE: 004 Pixels @ 082,054*/ 4, 0x03, + /* RLE: 001 Pixels @ 086,054*/ 1, 0x02, + /* RLE: 008 Pixels @ 087,054*/ 8, 0x01, + /* ABS: 003 Pixels @ 095,054*/ 0, 3, 0x21, 0x10, + /* RLE: 004 Pixels @ 098,054*/ 4, 0x03, + /* RLE: 011 Pixels @ 102,054*/ 11, 0x01, + /* ABS: 006 Pixels @ 113,054*/ 0, 6, 0x23, 0x31, 0x11, + /* RLE: 006 Pixels @ 119,054*/ 6, 0x03, + /* ABS: 003 Pixels @ 125,054*/ 0, 3, 0x21, 0x10, + /* RLE: 006 Pixels @ 128,054*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,054*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,055*/ 4, 0x03, + /* RLE: 004 Pixels @ 008,055*/ 4, 0x04, + /* RLE: 001 Pixels @ 012,055*/ 1, 0x05, + /* RLE: 009 Pixels @ 013,055*/ 9, 0x03, + /* RLE: 004 Pixels @ 022,055*/ 4, 0x04, + /* RLE: 001 Pixels @ 026,055*/ 1, 0x05, + /* RLE: 015 Pixels @ 027,055*/ 15, 0x03, + /* ABS: 008 Pixels @ 042,055*/ 0, 8, 0x52, 0x21, 0x11, 0x25, + /* RLE: 005 Pixels @ 050,055*/ 5, 0x03, + /* RLE: 001 Pixels @ 055,055*/ 1, 0x02, + /* RLE: 010 Pixels @ 056,055*/ 10, 0x01, + /* RLE: 001 Pixels @ 066,055*/ 1, 0x02, + /* RLE: 004 Pixels @ 067,055*/ 4, 0x03, + /* ABS: 011 Pixels @ 071,055*/ 0, 11, 0x52, 0x21, 0x12, 0x23, 0x51, 0x20, + /* RLE: 005 Pixels @ 082,055*/ 5, 0x03, + /* ABS: 011 Pixels @ 087,055*/ 0, 11, 0x52, 0x21, 0x12, 0x23, 0x51, 0x20, + /* RLE: 004 Pixels @ 098,055*/ 4, 0x03, + /* RLE: 001 Pixels @ 102,055*/ 1, 0x02, + /* RLE: 010 Pixels @ 103,055*/ 10, 0x01, + /* ABS: 006 Pixels @ 113,055*/ 0, 6, 0x23, 0x32, 0x12, + /* RLE: 006 Pixels @ 119,055*/ 6, 0x03, + /* ABS: 003 Pixels @ 125,055*/ 0, 3, 0x51, 0x20, + /* RLE: 006 Pixels @ 128,055*/ 6, 0x03, + /* ABS: 008 Pixels @ 134,055*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 004 Pixels @ 004,056*/ 4, 0x03, + /* RLE: 004 Pixels @ 008,056*/ 4, 0x04, + /* RLE: 010 Pixels @ 012,056*/ 10, 0x03, + /* RLE: 004 Pixels @ 022,056*/ 4, 0x04, + /* RLE: 108 Pixels @ 026,056*/ 108, 0x03, + /* ABS: 008 Pixels @ 134,056*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 130 Pixels @ 004,057*/ 130, 0x03, + /* ABS: 008 Pixels @ 134,057*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 130 Pixels @ 004,058*/ 130, 0x03, + /* ABS: 008 Pixels @ 134,058*/ 0, 8, 0x21, 0x10, 0x01, 0x12, + /* RLE: 130 Pixels @ 004,059*/ 130, 0x03, + /* RLE: 003 Pixels @ 134,059*/ 3, 0x01, + /* ABS: 005 Pixels @ 137,059*/ 0, 5, 0x00, 0x11, 0x10, + /* RLE: 129 Pixels @ 004,060*/ 129, 0x03, + /* ABS: 006 Pixels @ 133,060*/ 0, 6, 0x51, 0x11, 0x00, + /* RLE: 004 Pixels @ 001,061*/ 4, 0x01, + /* RLE: 128 Pixels @ 005,061*/ 128, 0x02, + /* RLE: 004 Pixels @ 133,061*/ 4, 0x01, + /* ABS: 002 Pixels @ 137,061*/ 0, 2, 0x00, + /* RLE: 135 Pixels @ 001,062*/ 135, 0x01, + /* RLE: 005 Pixels @ 136,062*/ 5, 0x00, + /* RLE: 132 Pixels @ 003,063*/ 132, 0x01, + /* RLE: 008 Pixels @ 135,063*/ 8, 0x00, + /* RLE: 128 Pixels @ 005,064*/ 128, 0x01, + /* RLE: 005 Pixels @ 133,064*/ 5, 0x00, + + 0}; /* 1682 for 8970 pixels */ + +GUI_CONST_STORAGE GUI_BITMAP bmSeggerLogoBlue = { + 138, /* XSize */ + 65, /* YSize */ + 69, /* BytesPerLine */ + GUI_COMPRESS_RLE4, /* BitsPerPixel */ + acSeggerLogoBlue, /* Pointer to picture data (indices) */ + &PalSeggerLogoBlue /* Pointer to palette */ + ,GUI_DRAW_RLE4 +}; + +#else + +GUI_CONST_STORAGE unsigned char acSeggerLogoBlue[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, + 0x01, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x11, 0x10, + 0x01, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x53, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x53, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x22, 0x11, 0x12, 0x23, 0x33, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x35, 0x22, 0x11, 0x12, 0x53, 0x33, 0x33, 0x33, 0x35, 0x22, 0x11, 0x12, 0x53, 0x33, 0x33, 0x33, 0x21, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x21, 0x11, 0x11, 0x11, 0x12, 0x53, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x34, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x53, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x21, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x21, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x15, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x21, 0x12, 0x33, 0x35, 0x11, 0x13, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x11, 0x25, 0x33, 0x52, 0x11, 0x13, 0x33, 0x32, 0x11, 0x25, 0x33, 0x52, 0x11, 0x13, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x12, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x51, 0x23, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x51, 0x12, 0x33, 0x33, 0x33, 0x21, 0x23, 0x33, 0x51, 0x12, 0x33, 0x33, 0x33, 0x21, 0x23, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x21, 0x12, 0x53, 0x33, 0x33, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x15, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x15, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x31, 0x11, 0x11, 0x12, 0x23, 0x33, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x12, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x52, 0x21, 0x11, 0x11, 0x23, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x11, 0x12, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x11, 0x12, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x52, 0x11, 0x12, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x11, 0x11, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x11, 0x11, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x53, 0x33, 0x33, 0x51, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x15, 0x33, 0x33, 0x33, 0x31, 0x11, 0x33, 0x21, 0x15, 0x33, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x12, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x31, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x51, 0x12, 0x33, 0x33, 0x33, 0x21, 0x11, 0x33, 0x51, 0x12, 0x33, 0x33, 0x33, 0x21, 0x11, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x11, 0x53, 0x33, 0x21, 0x12, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x11, 0x25, 0x33, 0x32, 0x11, 0x11, 0x33, 0x32, 0x11, 0x25, 0x33, 0x32, 0x11, 0x11, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x21, 0x11, 0x11, 0x11, 0x12, 0x11, 0x33, 0x33, 0x21, 0x11, 0x11, 0x11, 0x12, 0x11, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x11, 0x13, 0x33, 0x33, 0x32, 0x11, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x52, 0x21, 0x11, 0x25, 0x33, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x35, 0x22, 0x11, 0x22, 0x35, 0x12, 0x33, 0x33, 0x35, 0x22, 0x11, 0x22, 0x35, 0x12, 0x33, 0x33, 0x21, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x21, 0x23, 0x33, 0x33, 0x35, 0x12, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x01, 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x10, + 0x01, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x35, 0x11, 0x10, + 0x01, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x11, 0x10, + 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, + 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, + 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, 0x00 +}; + +GUI_CONST_STORAGE GUI_BITMAP bmSeggerLogoBlue = { + 138, /* XSize */ + 65, /* YSize */ + 69, /* BytesPerLine */ + 4, /* BitsPerPixel */ + acSeggerLogoBlue, /* Pointer to picture data (indices) */ + &PalSeggerLogoBlue /* Pointer to palette */ +}; + +#endif /* LOGO_COMP */ + +#elif (LCD_YSIZE < 90) /* GUIDEMO_TINY */ + +/********************************************************************* +* +* SEGGER logo, 65% size +* +********************************************************************** +*/ +GUI_CONST_STORAGE unsigned char acSeggerLogoBlue[] = { + 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, + 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x10, + 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x34, 0x43, 0x33, 0x33, 0x33, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x34, 0x44, 0x53, 0x33, 0x33, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x54, 0x44, 0x53, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x54, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x54, 0x44, 0x53, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x54, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x33, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x53, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x43, 0x33, 0x33, 0x54, 0x44, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x33, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x44, 0x43, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x44, 0x33, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x43, 0x33, 0x33, 0x54, 0x44, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x53, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x44, 0x33, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x54, 0x44, 0x33, 0x33, 0x32, 0x11, 0x23, 0x33, 0x32, 0x11, 0x11, 0x11, 0x23, 0x33, 0x22, 0x11, 0x53, 0x33, 0x33, 0x52, 0x11, 0x23, 0x33, 0x33, 0x11, 0x11, 0x11, 0x12, 0x32, 0x11, 0x11, 0x15, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x43, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x11, 0x11, 0x11, 0x53, 0x31, 0x11, 0x11, 0x11, 0x23, 0x32, 0x11, 0x11, 0x11, 0x33, 0x32, 0x11, 0x11, 0x11, 0x33, 0x33, 0x11, 0x11, 0x11, 0x12, 0x31, 0x11, 0x11, 0x11, 0x53, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x54, 0x44, 0x53, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x13, 0x33, 0x31, 0x23, 0x31, 0x13, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x21, 0x33, 0x51, 0x23, 0x33, 0x31, 0x23, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x13, 0x33, 0x31, 0x13, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x54, 0x44, 0x53, 0x33, 0x33, 0x12, 0x53, 0x33, 0x33, 0x31, 0x13, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x21, 0x53, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x13, 0x33, 0x31, 0x13, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x32, 0x21, 0x11, 0x23, 0x31, 0x11, 0x11, 0x11, 0x33, 0x11, 0x33, 0x21, 0x11, 0x23, 0x11, 0x33, 0x31, 0x11, 0x13, 0x33, 0x11, 0x11, 0x11, 0x23, 0x31, 0x11, 0x11, 0x12, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x54, 0x44, 0x53, 0x33, 0x35, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x35, 0x21, 0x13, 0x31, 0x13, 0x33, 0x33, 0x33, 0x11, 0x33, 0x21, 0x11, 0x13, 0x11, 0x33, 0x31, 0x11, 0x13, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x11, 0x11, 0x12, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x13, 0x33, 0x31, 0x13, 0x31, 0x13, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x21, 0x13, 0x51, 0x23, 0x33, 0x31, 0x13, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x13, 0x33, 0x31, 0x13, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x34, 0x44, 0x53, 0x33, 0x33, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x21, 0x11, 0x11, 0x23, 0x31, 0x11, 0x11, 0x11, 0x23, 0x32, 0x11, 0x11, 0x12, 0x13, 0x32, 0x11, 0x11, 0x12, 0x13, 0x33, 0x11, 0x11, 0x11, 0x12, 0x31, 0x13, 0x33, 0x31, 0x13, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x34, 0x45, 0x33, 0x33, 0x33, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x32, 0x21, 0x15, 0x33, 0x32, 0x11, 0x11, 0x11, 0x23, 0x33, 0x22, 0x12, 0x35, 0x23, 0x33, 0x52, 0x12, 0x25, 0x13, 0x33, 0x11, 0x11, 0x11, 0x12, 0x32, 0x23, 0x33, 0x31, 0x23, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x12, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x10, + 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x51, 0x10, + 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x10, + 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, + 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00 +}; + +GUI_CONST_STORAGE GUI_BITMAP bmSeggerLogoBlue = { + 89, /* XSize */ + 42, /* YSize */ + 45, /* BytesPerLine */ + 4, /* BitsPerPixel */ + acSeggerLogoBlue, /* Pointer to picture data (indices) */ + &PalSeggerLogoBlue /* Pointer to palette */ +}; + +#else /* (LCD_YSIZE < 90) */ + +/********************************************************************* +* +* SEGGER logo, 90% size +* +********************************************************************** +*/ +GUI_CONST_STORAGE unsigned char acSeggerLogoBlue[] = { + 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, + 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, + 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x11, 0x10, + 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x33, 0x33, 0x33, 0x33, 0x34, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x34, 0x44, 0x45, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x43, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x45, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x44, 0x33, 0x33, 0x33, 0x35, 0x44, 0x44, 0x53, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x44, 0x33, 0x33, 0x33, 0x54, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x54, 0x44, 0x43, 0x33, 0x33, 0x32, 0x21, 0x11, 0x22, 0x33, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x35, 0x22, 0x11, 0x12, 0x53, 0x33, 0x33, 0x33, 0x52, 0x21, 0x12, 0x53, 0x33, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x21, 0x11, 0x11, 0x11, 0x25, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x43, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x53, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x13, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x53, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x11, 0x23, 0x33, 0x51, 0x13, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x25, 0x33, 0x52, 0x11, 0x33, 0x33, 0x21, 0x12, 0x53, 0x52, 0x11, 0x13, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x23, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x35, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x11, 0x25, 0x33, 0x33, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x32, 0x15, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x11, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x22, 0x33, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x23, 0x31, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x23, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x35, 0x22, 0x11, 0x11, 0x13, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x23, 0x31, 0x13, 0x33, 0x32, 0x11, 0x11, 0x23, 0x31, 0x11, 0x33, 0x32, 0x11, 0x11, 0x12, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x23, 0x33, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x35, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x35, 0x21, 0x12, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x31, 0x13, 0x33, 0x32, 0x11, 0x11, 0x13, 0x31, 0x11, 0x33, 0x32, 0x11, 0x11, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x34, 0x44, 0x45, 0x33, 0x33, 0x33, 0x54, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x15, 0x33, 0x33, 0x35, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x32, 0x15, 0x33, 0x33, 0x33, 0x31, 0x13, 0x32, 0x11, 0x53, 0x33, 0x33, 0x31, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x32, 0x11, 0x23, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x35, 0x12, 0x33, 0x33, 0x33, 0x21, 0x13, 0x35, 0x11, 0x23, 0x33, 0x33, 0x21, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x44, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x15, 0x33, 0x32, 0x12, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x25, 0x33, 0x32, 0x11, 0x13, 0x33, 0x21, 0x12, 0x53, 0x32, 0x11, 0x11, 0x33, 0x31, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x45, 0x33, 0x33, 0x33, 0x34, 0x44, 0x44, 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x11, 0x11, 0x11, 0x13, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x31, 0x11, 0x11, 0x11, 0x12, 0x13, 0x33, 0x32, 0x11, 0x11, 0x11, 0x12, 0x11, 0x33, 0x31, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x11, 0x13, 0x33, 0x33, 0x21, 0x13, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x34, 0x44, 0x53, 0x33, 0x33, 0x33, 0x34, 0x44, 0x45, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x35, 0x22, 0x11, 0x12, 0x53, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x35, 0x22, 0x11, 0x22, 0x35, 0x23, 0x33, 0x33, 0x52, 0x21, 0x22, 0x35, 0x12, 0x33, 0x32, 0x11, 0x11, 0x11, 0x11, 0x12, 0x33, 0x21, 0x23, 0x33, 0x33, 0x51, 0x23, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x10, + 0x11, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x10, + 0x11, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x35, 0x11, 0x10, + 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x11, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, + 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x00, 0x00 +}; + +GUI_CONST_STORAGE GUI_BITMAP bmSeggerLogoBlue = { + 123, /* XSize */ + 58, /* YSize */ + 62, /* BytesPerLine */ + 4, /* BitsPerPixel */ + acSeggerLogoBlue, /* Pointer to picture data (indices) */ + &PalSeggerLogoBlue /* Pointer to palette */ +}; + +#endif /* (LCD_YSIZE < 90) */ + +/* *** End of file *** */ diff --git a/User/system/lib/lcd/gui/JPEG/CCGUIJPG.bat b/User/system/lib/lcd/gui/JPEG/CCGUIJPG.bat new file mode 100644 index 0000000..cfeeb4d --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/CCGUIJPG.bat @@ -0,0 +1,31 @@ +@ECHO OFF +ECHO CCGUIJPG.BAT: Compiling GUI\JPG +CALL CC GUI_JPEG +CALL CC jcomapi +CALL CC jdapimin +CALL CC jdapistd +CALL CC jdcoefct +CALL CC jdcolor +CALL CC jddctmgr +CALL CC jdhuff +CALL CC jdinput +CALL CC jdmainct +CALL CC jdmarker +CALL CC jdmaster +CALL CC jdmerge +CALL CC jdphuff +CALL CC jdpostct +CALL CC jdsample +CALL CC jdtrans +CALL CC jerror +CALL CC jfdctflt +CALL CC jfdctfst +CALL CC jfdctint +CALL CC jidctflt +CALL CC jidctfst +CALL CC jidctint +CALL CC jidctred +CALL CC jmemmgr +CALL CC jquant1 +CALL CC jquant2 +CALL CC jutils diff --git a/User/system/lib/lcd/gui/JPEG/Doc/ReadMe.txt b/User/system/lib/lcd/gui/JPEG/Doc/ReadMe.txt new file mode 100644 index 0000000..0b02f30 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/Doc/ReadMe.txt @@ -0,0 +1,406 @@ +Notes on the JPEG Library +========================= + +This JPEG module is derived from work of the IJG (see below), +and may be copyied and redistributed according to the +conditions under LEGAL ISSUES in this file. +The code has been modified in a variety of ways; +some code (GUI_JPEG.c) has been added to as "glue" to make it +work with emWin. +The original text of this file is below; some things stated may no +longer be correct for the code that ships with emWin. +However, we decided to leave it here because it explains the basic +concepts and structure of JPEG code. + +Segger Microcontroller Systeme GmbH, June 2003 +==================================================================== + + + + + +The Independent JPEG Group's JPEG software +========================================== + +README for release 6b of 27-Mar-1998 +==================================== + +This distribution contains the sixth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +Serious users of this software (particularly those incorporating it into +larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to +our electronic mailing list. Mailing list members are notified of updates +and have a chance to participate in technical discussions, etc. + +This software is the work of Tom Lane, Philip Gladstone, Jim Boucher, +Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, +Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG +Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +RELATED SOFTWARE Other stuff you should get. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.doc How to configure and install the IJG software. + usage.doc Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.doc). + wizard.doc Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.doc How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.doc Overview of the JPEG library's internal structure. + filelist.doc Road map of IJG files. + coderules.doc Coding style rules --- please read if you contribute code. + +Please read at least the files install.doc and usage.doc. Useful information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image compression and +decompression. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. JPEG is intended for compressing +"real-world" scenes; line drawings, cartoons and other non-realistic images +are not its strong suit. JPEG is lossy, meaning that the output image is not +exactly identical to the input image. Hence you must not use JPEG if you +have to have identical output bits. However, on typical photographic images, +very good compression levels can be obtained with no visible change, and +remarkably high compression levels are possible if you can tolerate a +low-quality image. For more details, see the references, or just experiment +with various compression settings. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +For legal reasons, we are not distributing code for the arithmetic-coding +variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting +the hierarchical or lossless processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. We have also included +"jpegtran", a utility for lossless transcoding between different JPEG +processes, and "rdjpgcom" and "wrjpgcom", two simple applications for +inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltconfig, ltmain.sh). Another support script, install-sh, is copyright +by M.I.T. but is also freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We highly recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article is +available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and IEEE, +and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by +M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides +good explanations and example C code for a multitude of compression methods +including JPEG. It is an excellent source if you are comfortable reading C +code but don't know much about data compression in general. The book's JPEG +sample code is far from industrial-strength, but when you are ready to look +at a full implementation, you've got one here... + +The best full description of JPEG is the textbook "JPEG Still Image Data +Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published +by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. +The book includes the complete text of the ISO JPEG standards (DIS 10918-1 +and draft DIS 10918-2). This is by far the most complete exposition of JPEG +in existence, and we highly recommend it. + +The JPEG standard itself is not available electronically; you must order a +paper copy through ISO or ITU. (Unless you feel a need to own a certified +official copy, we recommend buying the Pennebaker and Mitchell book instead; +it's much cheaper and includes a great deal of useful explanatory material.) +In the USA, copies of the standard may be ordered from ANSI Sales at (212) +642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI +doesn't take credit card orders, but Global does.) It's not cheap: as of +1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% +shipping/handling. The standard is divided into two parts, Part 1 being the +actual specification, while Part 2 covers compliance testing methods. Part 1 +is titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. + +Some extensions to the original JPEG standard are defined in JPEG Part 3, +a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84. IJG +currently does not support any Part 3 extensions. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. A copy of the JFIF spec is available from: + Literature Department + C-Cube Microsystems, Inc. + 1778 McCarthy Blvd. + Milpitas, CA 95035 + phone (408) 944-6300, fax (408) 944-6314 +A PostScript version of this document is available by FTP at +ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz. There is also a plain text +version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing +the figures. + +The TIFF 6.0 file format specification can be obtained by FTP from +ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from ftp.sgi.com or +from ftp://ftp.uu.net/graphics/jpeg/. It is expected that the next revision +of the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. libtiff is available +from ftp://ftp.sgi.com/graphics/tiff/. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is ftp.uu.net (Internet +address 192.48.96.9). The most recent released version can always be found +there in directory graphics/jpeg. This particular version will be archived +as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz. If you don't have +direct Internet access, UUNET's archives are also available via UUCP; contact +help@uunet.uu.net for information on retrieving files that way. + +Numerous Internet sites maintain copies of the UUNET files. However, only +ftp.uu.net is guaranteed to have the latest official version. + +You can also obtain this software in DOS-compatible "zip" archive format from +the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or +on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 +"JPEG Tools". Again, these versions may sometimes lag behind the ftp.uu.net +release. + +The JPEG FAQ (Frequently Asked Questions) article is a useful source of +general information about JPEG. It is updated constantly and therefore is +not included in this distribution. The FAQ is posted every two weeks to +Usenet newsgroups comp.graphics.misc, news.answers, and other groups. +It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ +and other news.answers archive sites, including the official news.answers +archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. +If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +RELATED SOFTWARE +================ + +Numerous viewing and image manipulation programs now support JPEG. (Quite a +few of them use this library to do so.) The JPEG FAQ described above lists +some of the more popular free and shareware viewers, and tells where to +obtain them on Internet. + +If you are on a Unix machine, we highly recommend Jef Poskanzer's free +PBMPLUS software, which provides many useful operations on PPM-format image +files. In particular, it can convert PPM images to and from a wide range of +other formats, thus making cjpeg/djpeg considerably more useful. The latest +version is distributed by the NetPBM group, and is available from numerous +sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/. +Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is; +you are likely to have difficulty making it work on any non-Unix machine. + +A different free JPEG implementation, written by the PVRG group at Stanford, +is available from ftp://havefun.stanford.edu/pub/jpeg/. This program +is designed for research and experimentation rather than production use; +it is slower, harder to use, and less portable than the IJG code, but it +is easier to read and modify. Also, the PVRG code supports lossless JPEG, +which we do not. (On the other hand, it doesn't do progressive JPEG.) + + +FILE FORMAT WARS +================ + +Some JPEG programs produce files that are not compatible with our library. +The root of the problem is that the ISO JPEG committee failed to specify a +concrete file format. Some vendors "filled in the blanks" on their own, +creating proprietary formats that no one else could read. (For example, none +of the early commercial JPEG implementations for the Macintosh were able to +exchange compressed files.) + +The file format we have adopted is called JFIF (see REFERENCES). This format +has been agreed to by a number of major commercial JPEG vendors, and it has +become the de facto standard. JFIF is a minimal or "low end" representation. +We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF +Technical Note #2) for "high end" applications that need to record a lot of +additional data about an image. TIFF/JPEG is fairly new and not yet widely +supported, unfortunately. + +The upcoming JPEG Part 3 standard defines a file format called SPIFF. +SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should +be able to read the most common variant of SPIFF. SPIFF has some technical +advantages over JFIF, but its major claim to fame is simply that it is an +official standard rather than an informal one. At this point it is unclear +whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto +standard. IJG intends to support SPIFF once the standard is frozen, but we +have not decided whether it should become our default output format or not. +(In any case, our decoder will remain capable of reading JFIF indefinitely.) + +Various proprietary file formats incorporating JPEG compression also exist. +We have little or no sympathy for the existence of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, open format standards for JPEG files. Don't +use a proprietary file format! + + +TO DO +===== + +The major thrust for v7 will probably be improvement of visual quality. +The current method for scaling the quantization tables is known not to be +very good at low Q values. We also intend to investigate block boundary +smoothing, "poor man's variable quantization", and other means of improving +quality-vs-file-size performance without sacrificing compatibility. + +In future versions, we are considering supporting some of the upcoming JPEG +Part 3 extensions --- principally, variable quantization and the SPIFF file +format. + +As always, speeding things up is of great interest. + +Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/User/system/lib/lcd/gui/JPEG/Doc/libjpeg.txt b/User/system/lib/lcd/gui/JPEG/Doc/libjpeg.txt new file mode 100644 index 0000000..2430b04 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/Doc/libjpeg.txt @@ -0,0 +1,3025 @@ +Notes on the JPEG Library +========================= + +This JPEG module is derived from work of the IJG (see below), +and may be copyied and redistributed according to the +conditions under LEGAL ISSUES in ReadMe.txt. +The code has been modified in a variety of ways; +some code (GUI_JPEG.c) has been added to as "glue" to make it +work with emWin. +The original text of this file is below; some things stated may no +longer be correct for the code that ships with emWin. +However, we decided to leave it here because it explains the basic +concepts and structure of JPEG code. + +Segger Microcontroller Systeme GmbH, June 2003 +==================================================================== + + + +USING THE IJG JPEG LIBRARY + +Copyright (C) 1994-1998, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file describes how to use the IJG JPEG library within an application +program. Read it if you want to write a program that uses the library. + +The file example.c provides heavily commented skeleton code for calling the +JPEG library. Also see jpeglib.h (the include file to be used by application +programs) for full details about data structures and function parameter lists. +The library source code, of course, is the ultimate reference. + +Note that there have been *major* changes from the application interface +presented by IJG version 4 and earlier versions. The old design had several +inherent limitations, and it had accumulated a lot of cruft as we added +features while trying to minimize application-interface changes. We have +sacrificed backward compatibility in the version 5 rewrite, but we think the +improvements justify this. + + +TABLE OF CONTENTS +----------------- + +Overview: + Functions provided by the library + Outline of typical usage +Basic library usage: + Data formats + Compression details + Decompression details + Mechanics of usage: include files, linking, etc +Advanced features: + Compression parameter selection + Decompression parameter selection + Special color spaces + Error handling + Compressed data handling (source and destination managers) + I/O suspension + Progressive JPEG support + Buffered-image mode + Abbreviated datastreams and multiple images + Special markers + Raw (downsampled) image data + Really raw data: DCT coefficients + Progress monitoring + Memory management + Memory usage + Library compile-time options + Portability considerations + Notes for MS-DOS implementors + +You should read at least the overview and basic usage sections before trying +to program with the library. The sections on advanced features can be read +if and when you need them. + + +OVERVIEW +======== + +Functions provided by the library +--------------------------------- + +The IJG JPEG library provides C code to read and write JPEG-compressed image +files. The surrounding application program receives or supplies image data a +scanline at a time, using a straightforward uncompressed image format. All +details of color conversion and other preprocessing/postprocessing can be +handled by the library. + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. The application indirectly selects use of this code +by specifying the format in which it wishes to supply or receive image data. +For example, if colormapped output is requested, then the decompression +library automatically invokes color quantization. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + +A word about functions *not* provided by the library. We handle a subset of +the ISO JPEG standard; most baseline, extended-sequential, and progressive +JPEG processes are supported. (Our subset includes all features now in common +use.) Unsupported ISO options include: + * Hierarchical storage + * Lossless JPEG + * Arithmetic entropy coding (unsupported for legal reasons) + * DNL marker + * Nonintegral subsampling ratios +We support both 8- and 12-bit data precision, but this is a compile-time +choice rather than a run-time choice; hence it is difficult to use both +precisions in a single application. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, this library is +used by the free LIBTIFF library to support JPEG compression in TIFF.) + + +Outline of typical usage +------------------------ + +The rough outline of a JPEG compression operation is: + + Allocate and initialize a JPEG compression object + Specify the destination for the compressed data (eg, a file) + Set parameters for compression, including image size & colorspace + jpeg_start_compress(...); + while (scan lines remain to be written) + jpeg_write_scanlines(...); + jpeg_finish_compress(...); + Release the JPEG compression object + +A JPEG compression object holds parameters and working state for the JPEG +library. We make creation/destruction of the object separate from starting +or finishing compression of an image; the same object can be re-used for a +series of image compression operations. This makes it easy to re-use the +same parameter settings for a sequence of images. Re-use of a JPEG object +also has important implications for processing abbreviated JPEG datastreams, +as discussed later. + +The image data to be compressed is supplied to jpeg_write_scanlines() from +in-memory buffers. If the application is doing file-to-file compression, +reading image data from the source file is the application's responsibility. +The library emits compressed data by calling a "data destination manager", +which typically will write the data into a file; but the application can +provide its own destination manager to do something else. + +Similarly, the rough outline of a JPEG decompression operation is: + + Allocate and initialize a JPEG decompression object + Specify the source of the compressed data (eg, a file) + Call jpeg_read_header() to obtain image info + Set parameters for decompression + jpeg_start_decompress(...); + while (scan lines remain to be read) + jpeg_read_scanlines(...); + jpeg_finish_decompress(...); + Release the JPEG decompression object + +This is comparable to the compression outline except that reading the +datastream header is a separate step. This is helpful because information +about the image's size, colorspace, etc is available when the application +selects decompression parameters. For example, the application can choose an +output scaling ratio that will fit the image into the available screen size. + +The decompression library obtains compressed data by calling a data source +manager, which typically will read the data from a file; but other behaviors +can be obtained with a custom source manager. Decompressed data is delivered +into in-memory buffers passed to jpeg_read_scanlines(). + +It is possible to abort an incomplete compression or decompression operation +by calling jpeg_abort(); or, if you do not need to retain the JPEG object, +simply release it by calling jpeg_destroy(). + +JPEG compression and decompression objects are two separate struct types. +However, they share some common fields, and certain routines such as +jpeg_destroy() can work on either type of object. + +The JPEG library has no static variables: all state is in the compression +or decompression object. Therefore it is possible to process multiple +compression and decompression operations concurrently, using multiple JPEG +objects. + +Both compression and decompression can be done in an incremental memory-to- +memory fashion, if suitable source/destination managers are used. See the +section on "I/O suspension" for more details. + + +BASIC LIBRARY USAGE +=================== + +Data formats +------------ + +Before diving into procedural details, it is helpful to understand the +image data format that the JPEG library expects or returns. + +The standard input image format is a rectangular array of pixels, with each +pixel having the same number of "component" or "sample" values (color +channels). You must specify how many components there are and the colorspace +interpretation of the components. Most applications will use RGB data +(three components per pixel) or grayscale data (one component per pixel). +PLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE. +A remarkable number of people manage to miss this, only to find that their +programs don't work with grayscale JPEG files. + +There is no provision for colormapped input. JPEG files are always full-color +or full grayscale (or sometimes another colorspace such as CMYK). You can +feed in a colormapped image by expanding it to full-color format. However +JPEG often doesn't work very well with source data that has been colormapped, +because of dithering noise. This is discussed in more detail in the JPEG FAQ +and the other references mentioned in the README file. + +Pixels are stored by scanlines, with each scanline running from left to +right. The component values for each pixel are adjacent in the row; for +example, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is an +array of data type JSAMPLE --- which is typically "unsigned char", unless +you've changed jmorecfg.h. (You can also change the RGB pixel layout, say +to B,G,R order, by modifying jmorecfg.h. But see the restrictions listed in +that file before doing so.) + +A 2-D array of pixels is formed by making a list of pointers to the starts of +scanlines; so the scanlines need not be physically adjacent in memory. Even +if you process just one scanline at a time, you must make a one-element +pointer array to conform to this structure. Pointers to JSAMPLE rows are of +type JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY. + +The library accepts or supplies one or more complete scanlines per call. +It is not possible to process part of a row at a time. Scanlines are always +processed top-to-bottom. You can process an entire image in one call if you +have it all in memory, but usually it's simplest to process one scanline at +a time. + +For best results, source data values should have the precision specified by +BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress +data that's only 6 bits/channel, you should left-justify each value in a +byte before passing it to the compressor. If you need to compress data +that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12. +(See "Library compile-time options", later.) + + +The data format returned by the decompressor is the same in all details, +except that colormapped output is supported. (Again, a JPEG file is never +colormapped. But you can ask the decompressor to perform on-the-fly color +quantization to deliver colormapped output.) If you request colormapped +output then the returned data array contains a single JSAMPLE per pixel; +its value is an index into a color map. The color map is represented as +a 2-D JSAMPARRAY in which each row holds the values of one color component, +that is, colormap[i][j] is the value of the i'th color component for pixel +value (map index) j. Note that since the colormap indexes are stored in +JSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE +(ie, at most 256 colors for an 8-bit JPEG library). + + +Compression details +------------------- + +Here we revisit the JPEG compression outline given in the overview. + +1. Allocate and initialize a JPEG compression object. + +A JPEG compression object is a "struct jpeg_compress_struct". (It also has +a bunch of subsidiary structures which are allocated via malloc(), but the +application doesn't control those directly.) This struct can be just a local +variable in the calling routine, if a single routine is going to execute the +whole JPEG compression sequence. Otherwise it can be static or allocated +from malloc(). + +You will also need a structure representing a JPEG error handler. The part +of this that the library cares about is a "struct jpeg_error_mgr". If you +are providing your own error handler, you'll typically want to embed the +jpeg_error_mgr struct in a larger structure; this is discussed later under +"Error handling". For now we'll assume you are just using the default error +handler. The default error handler will print JPEG error/warning messages +on stderr, and it will call exit() if a fatal error occurs. + +You must initialize the error handler structure, store a pointer to it into +the JPEG object's "err" field, and then call jpeg_create_compress() to +initialize the rest of the JPEG object. + +Typical code for this step, if you are using the default error handler, is + + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + +jpeg_create_compress allocates a small amount of memory, so it could fail +if you are out of memory. In that case it will exit via the error handler; +that's why the error handler must be initialized first. + + +2. Specify the destination for the compressed data (eg, a file). + +As previously mentioned, the JPEG library delivers compressed data to a +"data destination" module. The library includes one data destination +module which knows how to write to a stdio stream. You can use your own +destination module if you want to do something else, as discussed later. + +If you use the standard destination module, you must open the target stdio +stream beforehand. Typical code for this step looks like: + + FILE * outfile; + ... + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + +where the last line invokes the standard destination module. + +WARNING: it is critical that the binary compressed data be delivered to the +output file unchanged. On non-Unix systems the stdio library may perform +newline translation or otherwise corrupt binary data. To suppress this +behavior, you may need to use a "b" option to fopen (as shown above), or use +setmode() or another routine to put the stdio stream in binary mode. See +cjpeg.c and djpeg.c for code that has been found to work on many systems. + +You can select the data destination after setting other parameters (step 3), +if that's more convenient. You may not change the destination between +calling jpeg_start_compress() and jpeg_finish_compress(). + + +3. Set parameters for compression, including image size & colorspace. + +You must supply information about the source image by setting the following +fields in the JPEG object (cinfo structure): + + image_width Width of image, in pixels + image_height Height of image, in pixels + input_components Number of color channels (samples per pixel) + in_color_space Color space of source image + +The image dimensions are, hopefully, obvious. JPEG supports image dimensions +of 1 to 64K pixels in either direction. The input color space is typically +RGB or grayscale, and input_components is 3 or 1 accordingly. (See "Special +color spaces", later, for more info.) The in_color_space field must be +assigned one of the J_COLOR_SPACE enum constants, typically JCS_RGB or +JCS_GRAYSCALE. + +JPEG has a large number of compression parameters that determine how the +image is encoded. Most applications don't need or want to know about all +these parameters. You can set all the parameters to reasonable defaults by +calling jpeg_set_defaults(); then, if there are particular values you want +to change, you can do so after that. The "Compression parameter selection" +section tells about all the parameters. + +You must set in_color_space correctly before calling jpeg_set_defaults(), +because the defaults depend on the source image colorspace. However the +other three source image parameters need not be valid until you call +jpeg_start_compress(). There's no harm in calling jpeg_set_defaults() more +than once, if that happens to be convenient. + +Typical code for a 24-bit RGB source image is + + cinfo.image_width = Width; /* image width and height, in pixels */ + cinfo.image_height = Height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + + jpeg_set_defaults(&cinfo); + /* Make optional parameter settings here */ + + +4. jpeg_start_compress(...); + +After you have established the data destination and set all the necessary +source image info and other parameters, call jpeg_start_compress() to begin +a compression cycle. This will initialize internal state, allocate working +storage, and emit the first few bytes of the JPEG datastream header. + +Typical code: + + jpeg_start_compress(&cinfo, TRUE); + +The "TRUE" parameter ensures that a complete JPEG interchange datastream +will be written. This is appropriate in most cases. If you think you might +want to use an abbreviated datastream, read the section on abbreviated +datastreams, below. + +Once you have called jpeg_start_compress(), you may not alter any JPEG +parameters or other fields of the JPEG object until you have completed +the compression cycle. + + +5. while (scan lines remain to be written) + jpeg_write_scanlines(...); + +Now write all the required image data by calling jpeg_write_scanlines() +one or more times. You can pass one or more scanlines in each call, up +to the total image height. In most applications it is convenient to pass +just one or a few scanlines at a time. The expected format for the passed +data is discussed under "Data formats", above. + +Image data should be written in top-to-bottom scanline order. The JPEG spec +contains some weasel wording about how top and bottom are application-defined +terms (a curious interpretation of the English language...) but if you want +your files to be compatible with everyone else's, you WILL use top-to-bottom +order. If the source data must be read in bottom-to-top order, you can use +the JPEG library's virtual array mechanism to invert the data efficiently. +Examples of this can be found in the sample application cjpeg. + +The library maintains a count of the number of scanlines written so far +in the next_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.next_scanline < cinfo.image_height)". + +Code for this step depends heavily on the way that you store the source data. +example.c shows the following code for the case of a full-size 2-D source +array containing 3-byte RGB pixels: + + JSAMPROW row_pointer[1]; /* pointer to a single row */ + int row_stride; /* physical row width in buffer */ + + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + +jpeg_write_scanlines() returns the number of scanlines actually written. +This will normally be equal to the number passed in, so you can usually +ignore the return value. It is different in just two cases: + * If you try to write more scanlines than the declared image height, + the additional scanlines are ignored. + * If you use a suspending data destination manager, output buffer overrun + will cause the compressor to return before accepting all the passed lines. + This feature is discussed under "I/O suspension", below. The normal + stdio destination manager will NOT cause this to happen. +In any case, the return value is the same as the change in the value of +next_scanline. + + +6. jpeg_finish_compress(...); + +After all the image data has been written, call jpeg_finish_compress() to +complete the compression cycle. This step is ESSENTIAL to ensure that the +last bufferload of data is written to the data destination. +jpeg_finish_compress() also releases working memory associated with the JPEG +object. + +Typical code: + + jpeg_finish_compress(&cinfo); + +If using the stdio destination manager, don't forget to close the output +stdio stream (if necessary) afterwards. + +If you have requested a multi-pass operating mode, such as Huffman code +optimization, jpeg_finish_compress() will perform the additional passes using +data buffered by the first pass. In this case jpeg_finish_compress() may take +quite a while to complete. With the default compression parameters, this will +not happen. + +It is an error to call jpeg_finish_compress() before writing the necessary +total number of scanlines. If you wish to abort compression, call +jpeg_abort() as discussed below. + +After completing a compression cycle, you may dispose of the JPEG object +as discussed next, or you may use it to compress another image. In that case +return to step 2, 3, or 4 as appropriate. If you do not change the +destination manager, the new datastream will be written to the same target. +If you do not change any JPEG parameters, the new datastream will be written +with the same parameters as before. Note that you can change the input image +dimensions freely between cycles, but if you change the input colorspace, you +should call jpeg_set_defaults() to adjust for the new colorspace; and then +you'll need to repeat all of step 3. + + +7. Release the JPEG compression object. + +When you are done with a JPEG compression object, destroy it by calling +jpeg_destroy_compress(). This will free all subsidiary memory (regardless of +the previous state of the object). Or you can call jpeg_destroy(), which +works for either compression or decompression objects --- this may be more +convenient if you are sharing code between compression and decompression +cases. (Actually, these routines are equivalent except for the declared type +of the passed pointer. To avoid gripes from ANSI C compilers, jpeg_destroy() +should be passed a j_common_ptr.) + +If you allocated the jpeg_compress_struct structure from malloc(), freeing +it is your responsibility --- jpeg_destroy() won't. Ditto for the error +handler structure. + +Typical code: + + jpeg_destroy_compress(&cinfo); + + +8. Aborting. + +If you decide to abort a compression cycle before finishing, you can clean up +in either of two ways: + +* If you don't need the JPEG object any more, just call + jpeg_destroy_compress() or jpeg_destroy() to release memory. This is + legitimate at any point after calling jpeg_create_compress() --- in fact, + it's safe even if jpeg_create_compress() fails. + +* If you want to re-use the JPEG object, call jpeg_abort_compress(), or call + jpeg_abort() which works on both compression and decompression objects. + This will return the object to an idle state, releasing any working memory. + jpeg_abort() is allowed at any time after successful object creation. + +Note that cleaning up the data destination, if required, is your +responsibility; neither of these routines will call term_destination(). +(See "Compressed data handling", below, for more about that.) + +jpeg_destroy() and jpeg_abort() are the only safe calls to make on a JPEG +object that has reported an error by calling error_exit (see "Error handling" +for more info). The internal state of such an object is likely to be out of +whack. Either of these two routines will return the object to a known state. + + +Decompression details +--------------------- + +Here we revisit the JPEG decompression outline given in the overview. + +1. Allocate and initialize a JPEG decompression object. + +This is just like initialization for compression, as discussed above, +except that the object is a "struct jpeg_decompress_struct" and you +call jpeg_create_decompress(). Error handling is exactly the same. + +Typical code: + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + +(Both here and in the IJG code, we usually use variable name "cinfo" for +both compression and decompression objects.) + + +2. Specify the source of the compressed data (eg, a file). + +As previously mentioned, the JPEG library reads compressed data from a "data +source" module. The library includes one data source module which knows how +to read from a stdio stream. You can use your own source module if you want +to do something else, as discussed later. + +If you use the standard source module, you must open the source stdio stream +beforehand. Typical code for this step looks like: + + FILE * infile; + ... + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_src(&cinfo, infile); + +where the last line invokes the standard source module. + +WARNING: it is critical that the binary compressed data be read unchanged. +On non-Unix systems the stdio library may perform newline translation or +otherwise corrupt binary data. To suppress this behavior, you may need to use +a "b" option to fopen (as shown above), or use setmode() or another routine to +put the stdio stream in binary mode. See cjpeg.c and djpeg.c for code that +has been found to work on many systems. + +You may not change the data source between calling jpeg_read_header() and +jpeg_finish_decompress(). If you wish to read a series of JPEG images from +a single source file, you should repeat the jpeg_read_header() to +jpeg_finish_decompress() sequence without reinitializing either the JPEG +object or the data source module; this prevents buffered input data from +being discarded. + + +3. Call jpeg_read_header() to obtain image info. + +Typical code for this step is just + + jpeg_read_header(&cinfo, TRUE); + +This will read the source datastream header markers, up to the beginning +of the compressed data proper. On return, the image dimensions and other +info have been stored in the JPEG object. The application may wish to +consult this information before selecting decompression parameters. + +More complex code is necessary if + * A suspending data source is used --- in that case jpeg_read_header() + may return before it has read all the header data. See "I/O suspension", + below. The normal stdio source manager will NOT cause this to happen. + * Abbreviated JPEG files are to be processed --- see the section on + abbreviated datastreams. Standard applications that deal only in + interchange JPEG files need not be concerned with this case either. + +It is permissible to stop at this point if you just wanted to find out the +image dimensions and other header info for a JPEG file. In that case, +call jpeg_destroy() when you are done with the JPEG object, or call +jpeg_abort() to return it to an idle state before selecting a new data +source and reading another header. + + +4. Set parameters for decompression. + +jpeg_read_header() sets appropriate default decompression parameters based on +the properties of the image (in particular, its colorspace). However, you +may well want to alter these defaults before beginning the decompression. +For example, the default is to produce full color output from a color file. +If you want colormapped output you must ask for it. Other options allow the +returned image to be scaled and allow various speed/quality tradeoffs to be +selected. "Decompression parameter selection", below, gives details. + +If the defaults are appropriate, nothing need be done at this step. + +Note that all default values are set by each call to jpeg_read_header(). +If you reuse a decompression object, you cannot expect your parameter +settings to be preserved across cycles, as you can for compression. +You must set desired parameter values each time. + + +5. jpeg_start_decompress(...); + +Once the parameter values are satisfactory, call jpeg_start_decompress() to +begin decompression. This will initialize internal state, allocate working +memory, and prepare for returning data. + +Typical code is just + + jpeg_start_decompress(&cinfo); + +If you have requested a multi-pass operating mode, such as 2-pass color +quantization, jpeg_start_decompress() will do everything needed before data +output can begin. In this case jpeg_start_decompress() may take quite a while +to complete. With a single-scan (non progressive) JPEG file and default +decompression parameters, this will not happen; jpeg_start_decompress() will +return quickly. + +After this call, the final output image dimensions, including any requested +scaling, are available in the JPEG object; so is the selected colormap, if +colormapped output has been requested. Useful fields include + + output_width image width and height, as scaled + output_height + out_color_components # of color components in out_color_space + output_components # of color components returned per pixel + colormap the selected colormap, if any + actual_number_of_colors number of entries in colormap + +output_components is 1 (a colormap index) when quantizing colors; otherwise it +equals out_color_components. It is the number of JSAMPLE values that will be +emitted per pixel in the output arrays. + +Typically you will need to allocate data buffers to hold the incoming image. +You will need output_width * output_components JSAMPLEs per scanline in your +output buffer, and a total of output_height scanlines will be returned. + +Note: if you are using the JPEG library's internal memory manager to allocate +data buffers (as djpeg does), then the manager's protocol requires that you +request large buffers *before* calling jpeg_start_decompress(). This is a +little tricky since the output_XXX fields are not normally valid then. You +can make them valid by calling jpeg_calc_output_dimensions() after setting the +relevant parameters (scaling, output color space, and quantization flag). + + +6. while (scan lines remain to be read) + jpeg_read_scanlines(...); + +Now you can read the decompressed image data by calling jpeg_read_scanlines() +one or more times. At each call, you pass in the maximum number of scanlines +to be read (ie, the height of your working buffer); jpeg_read_scanlines() +will return up to that many lines. The return value is the number of lines +actually read. The format of the returned data is discussed under "Data +formats", above. Don't forget that grayscale and color JPEGs will return +different data formats! + +Image data is returned in top-to-bottom scanline order. If you must write +out the image in bottom-to-top order, you can use the JPEG library's virtual +array mechanism to invert the data efficiently. Examples of this can be +found in the sample application djpeg. + +The library maintains a count of the number of scanlines returned so far +in the output_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.output_scanline < cinfo.output_height)". (Note that the test +should NOT be against image_height, unless you never use scaling. The +image_height field is the height of the original unscaled image.) +The return value always equals the change in the value of output_scanline. + +If you don't use a suspending data source, it is safe to assume that +jpeg_read_scanlines() reads at least one scanline per call, until the +bottom of the image has been reached. + +If you use a buffer larger than one scanline, it is NOT safe to assume that +jpeg_read_scanlines() fills it. (The current implementation returns only a +few scanlines per call, no matter how large a buffer you pass.) So you must +always provide a loop that calls jpeg_read_scanlines() repeatedly until the +whole image has been read. + + +7. jpeg_finish_decompress(...); + +After all the image data has been read, call jpeg_finish_decompress() to +complete the decompression cycle. This causes working memory associated +with the JPEG object to be released. + +Typical code: + + jpeg_finish_decompress(&cinfo); + +If using the stdio source manager, don't forget to close the source stdio +stream if necessary. + +It is an error to call jpeg_finish_decompress() before reading the correct +total number of scanlines. If you wish to abort decompression, call +jpeg_abort() as discussed below. + +After completing a decompression cycle, you may dispose of the JPEG object as +discussed next, or you may use it to decompress another image. In that case +return to step 2 or 3 as appropriate. If you do not change the source +manager, the next image will be read from the same source. + + +8. Release the JPEG decompression object. + +When you are done with a JPEG decompression object, destroy it by calling +jpeg_destroy_decompress() or jpeg_destroy(). The previous discussion of +destroying compression objects applies here too. + +Typical code: + + jpeg_destroy_decompress(&cinfo); + + +9. Aborting. + +You can abort a decompression cycle by calling jpeg_destroy_decompress() or +jpeg_destroy() if you don't need the JPEG object any more, or +jpeg_abort_decompress() or jpeg_abort() if you want to reuse the object. +The previous discussion of aborting compression cycles applies here too. + + +Mechanics of usage: include files, linking, etc +----------------------------------------------- + +Applications using the JPEG library should include the header file jpeglib.h +to obtain declarations of data types and routines. Before including +jpeglib.h, include system headers that define at least the typedefs FILE and +size_t. On ANSI-conforming systems, including is sufficient; on +older Unix systems, you may need to define size_t. + +If the application needs to refer to individual JPEG library error codes, also +include jerror.h to define those symbols. + +jpeglib.h indirectly includes the files jconfig.h and jmorecfg.h. If you are +installing the JPEG header files in a system directory, you will want to +install all four files: jpeglib.h, jerror.h, jconfig.h, jmorecfg.h. + +The most convenient way to include the JPEG code into your executable program +is to prepare a library file ("libjpeg.a", or a corresponding name on non-Unix +machines) and reference it at your link step. If you use only half of the +library (only compression or only decompression), only that much code will be +included from the library, unless your linker is hopelessly brain-damaged. +The supplied makefiles build libjpeg.a automatically (see install.doc). + +While you can build the JPEG library as a shared library if the whim strikes +you, we don't really recommend it. The trouble with shared libraries is that +at some point you'll probably try to substitute a new version of the library +without recompiling the calling applications. That generally doesn't work +because the parameter struct declarations usually change with each new +version. In other words, the library's API is *not* guaranteed binary +compatible across versions; we only try to ensure source-code compatibility. +(In hindsight, it might have been smarter to hide the parameter structs from +applications and introduce a ton of access functions instead. Too late now, +however.) + +On some systems your application may need to set up a signal handler to ensure +that temporary files are deleted if the program is interrupted. This is most +critical if you are on MS-DOS and use the jmemdos.c memory manager back end; +it will try to grab extended memory for temp files, and that space will NOT be +freed automatically. See cjpeg.c or djpeg.c for an example signal handler. + +It may be worth pointing out that the core JPEG library does not actually +require the stdio library: only the default source/destination managers and +error handler need it. You can use the library in a stdio-less environment +if you replace those modules and use jmemnobs.c (or another memory manager of +your own devising). More info about the minimum system library requirements +may be found in jinclude.h. + + +ADVANCED FEATURES +================= + +Compression parameter selection +------------------------------- + +This section describes all the optional parameters you can set for JPEG +compression, as well as the "helper" routines provided to assist in this +task. Proper setting of some parameters requires detailed understanding +of the JPEG standard; if you don't know what a parameter is for, it's best +not to mess with it! See REFERENCES in the README file for pointers to +more info about JPEG. + +It's a good idea to call jpeg_set_defaults() first, even if you plan to set +all the parameters; that way your code is more likely to work with future JPEG +libraries that have additional parameters. For the same reason, we recommend +you use a helper routine where one is provided, in preference to twiddling +cinfo fields directly. + +The helper routines are: + +jpeg_set_defaults (j_compress_ptr cinfo) + This routine sets all JPEG parameters to reasonable defaults, using + only the input image's color space (field in_color_space, which must + already be set in cinfo). Many applications will only need to use + this routine and perhaps jpeg_set_quality(). + +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) + Sets the JPEG file's colorspace (field jpeg_color_space) as specified, + and sets other color-space-dependent parameters appropriately. See + "Special color spaces", below, before using this. A large number of + parameters, including all per-component parameters, are set by this + routine; if you want to twiddle individual parameters you should call + jpeg_set_colorspace() before rather than after. + +jpeg_default_colorspace (j_compress_ptr cinfo) + Selects an appropriate JPEG colorspace based on cinfo->in_color_space, + and calls jpeg_set_colorspace(). This is actually a subroutine of + jpeg_set_defaults(). It's broken out in case you want to change + just the colorspace-dependent JPEG parameters. + +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) + Constructs JPEG quantization tables appropriate for the indicated + quality setting. The quality value is expressed on the 0..100 scale + recommended by IJG (cjpeg's "-quality" switch uses this routine). + Note that the exact mapping from quality values to tables may change + in future IJG releases as more is learned about DCT quantization. + If the force_baseline parameter is TRUE, then the quantization table + entries are constrained to the range 1..255 for full JPEG baseline + compatibility. In the current implementation, this only makes a + difference for quality settings below 25, and it effectively prevents + very small/low quality files from being generated. The IJG decoder + is capable of reading the non-baseline files generated at low quality + settings when force_baseline is FALSE, but other decoders may not be. + +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) + Same as jpeg_set_quality() except that the generated tables are the + sample tables given in the JPEC spec section K.1, multiplied by the + specified scale factor (which is expressed as a percentage; thus + scale_factor = 100 reproduces the spec's tables). Note that larger + scale factors give lower quality. This entry point is useful for + conforming to the Adobe PostScript DCT conventions, but we do not + recommend linear scaling as a user-visible quality scale otherwise. + force_baseline again constrains the computed table entries to 1..255. + +int jpeg_quality_scaling (int quality) + Converts a value on the IJG-recommended quality scale to a linear + scaling percentage. Note that this routine may change or go away + in future releases --- IJG may choose to adopt a scaling method that + can't be expressed as a simple scalar multiplier, in which case the + premise of this routine collapses. Caveat user. + +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) + Allows an arbitrary quantization table to be created. which_tbl + indicates which table slot to fill. basic_table points to an array + of 64 unsigned ints given in normal array order. These values are + multiplied by scale_factor/100 and then clamped to the range 1..65535 + (or to 1..255 if force_baseline is TRUE). + CAUTION: prior to library version 6a, jpeg_add_quant_table expected + the basic table to be given in JPEG zigzag order. If you need to + write code that works with either older or newer versions of this + routine, you must check the library version number. Something like + "#if JPEG_LIB_VERSION >= 61" is the right test. + +jpeg_simple_progression (j_compress_ptr cinfo) + Generates a default scan script for writing a progressive-JPEG file. + This is the recommended method of creating a progressive file, + unless you want to make a custom scan sequence. You must ensure that + the JPEG color space is set correctly before calling this routine. + + +Compression parameters (cinfo fields) include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are: + JDCT_ISLOW: slow but accurate integer algorithm + JDCT_IFAST: faster, less accurate integer method + JDCT_FLOAT: floating-point method + JDCT_DEFAULT: default method (normally JDCT_ISLOW) + JDCT_FASTEST: fastest method (normally JDCT_IFAST) + The FLOAT method is very slightly more accurate than the ISLOW method, + but may give different results on different machines due to varying + roundoff behavior. The integer methods should give the same results + on all machines. On machines with sufficiently fast FP hardware, the + floating-point method may also be the fastest. The IFAST method is + considerably less accurate than the other two; its use is not + recommended if high quality is a concern. JDCT_DEFAULT and + JDCT_FASTEST are macros configurable by each installation. + +J_COLOR_SPACE jpeg_color_space +int num_components + The JPEG color space and corresponding number of components; see + "Special color spaces", below, for more info. We recommend using + jpeg_set_color_space() if you want to change these. + +boolean optimize_coding + TRUE causes the compressor to compute optimal Huffman coding tables + for the image. This requires an extra pass over the data and + therefore costs a good deal of space and time. The default is + FALSE, which tells the compressor to use the supplied or default + Huffman tables. In most cases optimal tables save only a few percent + of file size compared to the default tables. Note that when this is + TRUE, you need not supply Huffman tables at all, and any you do + supply will be overwritten. + +unsigned int restart_interval +int restart_in_rows + To emit restart markers in the JPEG file, set one of these nonzero. + Set restart_interval to specify the exact interval in MCU blocks. + Set restart_in_rows to specify the interval in MCU rows. (If + restart_in_rows is not 0, then restart_interval is set after the + image width in MCUs is computed.) Defaults are zero (no restarts). + One restart marker per MCU row is often a good choice. + NOTE: the overhead of restart markers is higher in grayscale JPEG + files than in color files, and MUCH higher in progressive JPEGs. + If you use restarts, you may want to use larger intervals in those + cases. + +const jpeg_scan_info * scan_info +int num_scans + By default, scan_info is NULL; this causes the compressor to write a + single-scan sequential JPEG file. If not NULL, scan_info points to + an array of scan definition records of length num_scans. The + compressor will then write a JPEG file having one scan for each scan + definition record. This is used to generate noninterleaved or + progressive JPEG files. The library checks that the scan array + defines a valid JPEG scan sequence. (jpeg_simple_progression creates + a suitable scan definition array for progressive JPEG.) This is + discussed further under "Progressive JPEG support". + +int smoothing_factor + If non-zero, the input image is smoothed; the value should be 1 for + minimal smoothing to 100 for maximum smoothing. Consult jcsample.c + for details of the smoothing algorithm. The default is zero. + +boolean write_JFIF_header + If TRUE, a JFIF APP0 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if a JFIF-legal JPEG color space + (ie, YCbCr or grayscale) is selected, otherwise FALSE. + +UINT8 JFIF_major_version +UINT8 JFIF_minor_version + The version number to be written into the JFIF marker. + jpeg_set_defaults() initializes the version to 1.01 (major=minor=1). + You should set it to 1.02 (major=1, minor=2) if you plan to write + any JFIF 1.02 extension markers. + +UINT8 density_unit +UINT16 X_density +UINT16 Y_density + The resolution information to be written into the JFIF marker; + not used otherwise. density_unit may be 0 for unknown, + 1 for dots/inch, or 2 for dots/cm. The default values are 0,1,1 + indicating square pixels of unknown size. + +boolean write_Adobe_marker + If TRUE, an Adobe APP14 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if JPEG color space RGB, CMYK, + or YCCK is selected, otherwise FALSE. It is generally a bad idea + to set both write_JFIF_header and write_Adobe_marker. In fact, + you probably shouldn't change the default settings at all --- the + default behavior ensures that the JPEG file's color space can be + recognized by the decoder. + +JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS] + Pointers to coefficient quantization tables, one per table slot, + or NULL if no table is defined for a slot. Usually these should + be set via one of the above helper routines; jpeg_add_quant_table() + is general enough to define any quantization table. The other + routines will set up table slot 0 for luminance quality and table + slot 1 for chrominance. + +JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS] +JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS] + Pointers to Huffman coding tables, one per table slot, or NULL if + no table is defined for a slot. Slots 0 and 1 are filled with the + JPEG sample tables by jpeg_set_defaults(). If you need to allocate + more table structures, jpeg_alloc_huff_table() may be used. + Note that optimal Huffman tables can be computed for an image + by setting optimize_coding, as discussed above; there's seldom + any need to mess with providing your own Huffman tables. + +There are some additional cinfo fields which are not documented here +because you currently can't change them; for example, you can't set +arith_code TRUE because arithmetic coding is unsupported. + + +Per-component parameters are stored in the struct cinfo.comp_info[i] for +component number i. Note that components here refer to components of the +JPEG color space, *not* the source image color space. A suitably large +comp_info[] array is allocated by jpeg_set_defaults(); if you choose not +to use that routine, it's up to you to allocate the array. + +int component_id + The one-byte identifier code to be recorded in the JPEG file for + this component. For the standard color spaces, we recommend you + leave the default values alone. + +int h_samp_factor +int v_samp_factor + Horizontal and vertical sampling factors for the component; must + be 1..4 according to the JPEG standard. Note that larger sampling + factors indicate a higher-resolution component; many people find + this behavior quite unintuitive. The default values are 2,2 for + luminance components and 1,1 for chrominance components, except + for grayscale where 1,1 is used. + +int quant_tbl_no + Quantization table number for component. The default value is + 0 for luminance components and 1 for chrominance components. + +int dc_tbl_no +int ac_tbl_no + DC and AC entropy coding table numbers. The default values are + 0 for luminance components and 1 for chrominance components. + +int component_index + Must equal the component's index in comp_info[]. (Beginning in + release v6, the compressor library will fill this in automatically; + you don't have to.) + + +Decompression parameter selection +--------------------------------- + +Decompression parameter selection is somewhat simpler than compression +parameter selection, since all of the JPEG internal parameters are +recorded in the source file and need not be supplied by the application. +(Unless you are working with abbreviated files, in which case see +"Abbreviated datastreams", below.) Decompression parameters control +the postprocessing done on the image to deliver it in a format suitable +for the application's use. Many of the parameters control speed/quality +tradeoffs, in which faster decompression may be obtained at the price of +a poorer-quality image. The defaults select the highest quality (slowest) +processing. + +The following fields in the JPEG object are set by jpeg_read_header() and +may be useful to the application in choosing decompression parameters: + +JDIMENSION image_width Width and height of image +JDIMENSION image_height +int num_components Number of color components +J_COLOR_SPACE jpeg_color_space Colorspace of image +boolean saw_JFIF_marker TRUE if a JFIF APP0 marker was seen + UINT8 JFIF_major_version Version information from JFIF marker + UINT8 JFIF_minor_version + UINT8 density_unit Resolution data from JFIF marker + UINT16 X_density + UINT16 Y_density +boolean saw_Adobe_marker TRUE if an Adobe APP14 marker was seen + UINT8 Adobe_transform Color transform code from Adobe marker + +The JPEG color space, unfortunately, is something of a guess since the JPEG +standard proper does not provide a way to record it. In practice most files +adhere to the JFIF or Adobe conventions, and the decoder will recognize these +correctly. See "Special color spaces", below, for more info. + + +The decompression parameters that determine the basic properties of the +returned image are: + +J_COLOR_SPACE out_color_space + Output color space. jpeg_read_header() sets an appropriate default + based on jpeg_color_space; typically it will be RGB or grayscale. + The application can change this field to request output in a different + colorspace. For example, set it to JCS_GRAYSCALE to get grayscale + output from a color file. (This is useful for previewing: grayscale + output is faster than full color since the color components need not + be processed.) Note that not all possible color space transforms are + currently implemented; you may need to extend jdcolor.c if you want an + unusual conversion. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Default is + 1/1, or no scaling. Currently, the only supported scaling ratios + are 1/1, 1/2, 1/4, and 1/8. (The library design allows for arbitrary + scaling ratios but this is not likely to be implemented any time soon.) + Smaller scaling ratios permit significantly faster decoding since + fewer pixels need be processed and a simpler IDCT method can be used. + +boolean quantize_colors + If set TRUE, colormapped output will be delivered. Default is FALSE, + meaning that full-color output will be delivered. + +The next three parameters are relevant only if quantize_colors is TRUE. + +int desired_number_of_colors + Maximum number of colors to use in generating a library-supplied color + map (the actual number of colors is returned in a different field). + Default 256. Ignored when the application supplies its own color map. + +boolean two_pass_quantize + If TRUE, an extra pass over the image is made to select a custom color + map for the image. This usually looks a lot better than the one-size- + fits-all colormap that is used otherwise. Default is TRUE. Ignored + when the application supplies its own color map. + +J_DITHER_MODE dither_mode + Selects color dithering method. Supported values are: + JDITHER_NONE no dithering: fast, very low quality + JDITHER_ORDERED ordered dither: moderate speed and quality + JDITHER_FS Floyd-Steinberg dither: slow, high quality + Default is JDITHER_FS. (At present, ordered dither is implemented + only in the single-pass, standard-colormap case. If you ask for + ordered dither when two_pass_quantize is TRUE or when you supply + an external color map, you'll get F-S dithering.) + +When quantize_colors is TRUE, the target color map is described by the next +two fields. colormap is set to NULL by jpeg_read_header(). The application +can supply a color map by setting colormap non-NULL and setting +actual_number_of_colors to the map size. Otherwise, jpeg_start_decompress() +selects a suitable color map and sets these two fields itself. +[Implementation restriction: at present, an externally supplied colormap is +only accepted for 3-component output color spaces.] + +JSAMPARRAY colormap + The color map, represented as a 2-D pixel array of out_color_components + rows and actual_number_of_colors columns. Ignored if not quantizing. + CAUTION: if the JPEG library creates its own colormap, the storage + pointed to by this field is released by jpeg_finish_decompress(). + Copy the colormap somewhere else first, if you want to save it. + +int actual_number_of_colors + The number of colors in the color map. + +Additional decompression parameters that the application may set include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are the same + as described above for compression. + +boolean do_fancy_upsampling + If TRUE, do careful upsampling of chroma components. If FALSE, + a faster but sloppier method is used. Default is TRUE. The visual + impact of the sloppier method is often very small. + +boolean do_block_smoothing + If TRUE, interblock smoothing is applied in early stages of decoding + progressive JPEG files; if FALSE, not. Default is TRUE. Early + progression stages look "fuzzy" with smoothing, "blocky" without. + In any case, block smoothing ceases to be applied after the first few + AC coefficients are known to full accuracy, so it is relevant only + when using buffered-image mode for progressive images. + +boolean enable_1pass_quant +boolean enable_external_quant +boolean enable_2pass_quant + These are significant only in buffered-image mode, which is + described in its own section below. + + +The output image dimensions are given by the following fields. These are +computed from the source image dimensions and the decompression parameters +by jpeg_start_decompress(). You can also call jpeg_calc_output_dimensions() +to obtain the values that will result from the current parameter settings. +This can be useful if you are trying to pick a scaling ratio that will get +close to a desired target size. It's also important if you are using the +JPEG library's memory manager to allocate output buffer space, because you +are supposed to request such buffers *before* jpeg_start_decompress(). + +JDIMENSION output_width Actual dimensions of output image. +JDIMENSION output_height +int out_color_components Number of color components in out_color_space. +int output_components Number of color components returned. +int rec_outbuf_height Recommended height of scanline buffer. + +When quantizing colors, output_components is 1, indicating a single color map +index per pixel. Otherwise it equals out_color_components. The output arrays +are required to be output_width * output_components JSAMPLEs wide. + +rec_outbuf_height is the recommended minimum height (in scanlines) of the +buffer passed to jpeg_read_scanlines(). If the buffer is smaller, the +library will still work, but time will be wasted due to unnecessary data +copying. In high-quality modes, rec_outbuf_height is always 1, but some +faster, lower-quality modes set it to larger values (typically 2 to 4). +If you are going to ask for a high-speed processing mode, you may as well +go to the trouble of honoring rec_outbuf_height so as to avoid data copying. +(An output buffer larger than rec_outbuf_height lines is OK, but won't +provide any material speed improvement over that height.) + + +Special color spaces +-------------------- + +The JPEG standard itself is "color blind" and doesn't specify any particular +color space. It is customary to convert color data to a luminance/chrominance +color space before compressing, since this permits greater compression. The +existing de-facto JPEG file format standards specify YCbCr or grayscale data +(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special +applications such as multispectral images, other color spaces can be used, +but it must be understood that such files will be unportable. + +The JPEG library can handle the most common colorspace conversions (namely +RGB <=> YCbCr and CMYK <=> YCCK). It can also deal with data of an unknown +color space, passing it through without conversion. If you deal extensively +with an unusual color space, you can easily extend the library to understand +additional color spaces and perform appropriate conversions. + +For compression, the source data's color space is specified by field +in_color_space. This is transformed to the JPEG file's color space given +by jpeg_color_space. jpeg_set_defaults() chooses a reasonable JPEG color +space depending on in_color_space, but you can override this by calling +jpeg_set_colorspace(). Of course you must select a supported transformation. +jccolor.c currently supports the following transformations: + RGB => YCbCr + RGB => GRAYSCALE + YCbCr => GRAYSCALE + CMYK => YCCK +plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB, +YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN. + +The de-facto file format standards (JFIF and Adobe) specify APPn markers that +indicate the color space of the JPEG file. It is important to ensure that +these are written correctly, or omitted if the JPEG file's color space is not +one of the ones supported by the de-facto standards. jpeg_set_colorspace() +will set the compression parameters to include or omit the APPn markers +properly, so long as it is told the truth about the JPEG color space. +For example, if you are writing some random 3-component color space without +conversion, don't try to fake out the library by setting in_color_space and +jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an +APPn marker of your own devising to identify the colorspace --- see "Special +markers", below. + +When told that the color space is UNKNOWN, the library will default to using +luminance-quality compression parameters for all color components. You may +well want to change these parameters. See the source code for +jpeg_set_colorspace(), in jcparam.c, for details. + +For decompression, the JPEG file's color space is given in jpeg_color_space, +and this is transformed to the output color space out_color_space. +jpeg_read_header's setting of jpeg_color_space can be relied on if the file +conforms to JFIF or Adobe conventions, but otherwise it is no better than a +guess. If you know the JPEG file's color space for certain, you can override +jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also +selects a default output color space based on (its guess of) jpeg_color_space; +set out_color_space to override this. Again, you must select a supported +transformation. jdcolor.c currently supports + YCbCr => GRAYSCALE + YCbCr => RGB + GRAYSCALE => RGB + YCCK => CMYK +as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an +application can force grayscale JPEGs to look like color JPEGs if it only +wants to handle one case.) + +The two-pass color quantizer, jquant2.c, is specialized to handle RGB data +(it weights distances appropriately for RGB colors). You'll need to modify +the code if you want to use it for non-RGB output color spaces. Note that +jquant2.c is used to map to an application-supplied colormap as well as for +the normal two-pass colormap selection process. + +CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG +files: 0 represents 100% ink coverage, rather than 0% ink as you'd expect. +This is arguably a bug in Photoshop, but if you need to work with Photoshop +CMYK files, you will have to deal with it in your application. We cannot +"fix" this in the library by inverting the data during the CMYK<=>YCCK +transform, because that would break other applications, notably Ghostscript. +Photoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK +data in the same inverted-YCCK representation used in bare JPEG files, but +the surrounding PostScript code performs an inversion using the PS image +operator. I am told that Photoshop 3.0 will write uninverted YCCK in +EPS/JPEG files, and will omit the PS-level inversion. (But the data +polarity used in bare JPEG files will not change in 3.0.) In either case, +the JPEG library must not invert the data itself, or else Ghostscript would +read these EPS files incorrectly. + + +Error handling +-------------- + +When the default error handler is used, any error detected inside the JPEG +routines will cause a message to be printed on stderr, followed by exit(). +You can supply your own error handling routines to override this behavior +and to control the treatment of nonfatal warnings and trace/debug messages. +The file example.c illustrates the most common case, which is to have the +application regain control after an error rather than exiting. + +The JPEG library never writes any message directly; it always goes through +the error handling routines. Three classes of messages are recognized: + * Fatal errors: the library cannot continue. + * Warnings: the library can continue, but the data is corrupt, and a + damaged output image is likely to result. + * Trace/informational messages. These come with a trace level indicating + the importance of the message; you can control the verbosity of the + program by adjusting the maximum trace level that will be displayed. + +You may, if you wish, simply replace the entire JPEG error handling module +(jerror.c) with your own code. However, you can avoid code duplication by +only replacing some of the routines depending on the behavior you need. +This is accomplished by calling jpeg_std_error() as usual, but then overriding +some of the method pointers in the jpeg_error_mgr struct, as illustrated by +example.c. + +All of the error handling routines will receive a pointer to the JPEG object +(a j_common_ptr which points to either a jpeg_compress_struct or a +jpeg_decompress_struct; if you need to tell which, test the is_decompressor +field). This struct includes a pointer to the error manager struct in its +"err" field. Frequently, custom error handler routines will need to access +additional data which is not known to the JPEG library or the standard error +handler. The most convenient way to do this is to embed either the JPEG +object or the jpeg_error_mgr struct in a larger structure that contains +additional fields; then casting the passed pointer provides access to the +additional fields. Again, see example.c for one way to do it. (Beginning +with IJG version 6b, there is also a void pointer "client_data" in each +JPEG object, which the application can also use to find related data. +The library does not touch client_data at all.) + +The individual methods that you might wish to override are: + +error_exit (j_common_ptr cinfo) + Receives control for a fatal error. Information sufficient to + generate the error message has been stored in cinfo->err; call + output_message to display it. Control must NOT return to the caller; + generally this routine will exit() or longjmp() somewhere. + Typically you would override this routine to get rid of the exit() + default behavior. Note that if you continue processing, you should + clean up the JPEG object with jpeg_abort() or jpeg_destroy(). + +output_message (j_common_ptr cinfo) + Actual output of any JPEG message. Override this to send messages + somewhere other than stderr. Note that this method does not know + how to generate a message, only where to send it. + +format_message (j_common_ptr cinfo, char * buffer) + Constructs a readable error message string based on the error info + stored in cinfo->err. This method is called by output_message. Few + applications should need to override this method. One possible + reason for doing so is to implement dynamic switching of error message + language. + +emit_message (j_common_ptr cinfo, int msg_level) + Decide whether or not to emit a warning or trace message; if so, + calls output_message. The main reason for overriding this method + would be to abort on warnings. msg_level is -1 for warnings, + 0 and up for trace messages. + +Only error_exit() and emit_message() are called from the rest of the JPEG +library; the other two are internal to the error handler. + +The actual message texts are stored in an array of strings which is pointed to +by the field err->jpeg_message_table. The messages are numbered from 0 to +err->last_jpeg_message, and it is these code numbers that are used in the +JPEG library code. You could replace the message texts (for instance, with +messages in French or German) by changing the message table pointer. See +jerror.h for the default texts. CAUTION: this table will almost certainly +change or grow from one library version to the next. + +It may be useful for an application to add its own message texts that are +handled by the same mechanism. The error handler supports a second "add-on" +message table for this purpose. To define an addon table, set the pointer +err->addon_message_table and the message numbers err->first_addon_message and +err->last_addon_message. If you number the addon messages beginning at 1000 +or so, you won't have to worry about conflicts with the library's built-in +messages. See the sample applications cjpeg/djpeg for an example of using +addon messages (the addon messages are defined in cderror.h). + +Actual invocation of the error handler is done via macros defined in jerror.h: + ERREXITn(...) for fatal errors + WARNMSn(...) for corrupt-data warnings + TRACEMSn(...) for trace and informational messages. +These macros store the message code and any additional parameters into the +error handler struct, then invoke the error_exit() or emit_message() method. +The variants of each macro are for varying numbers of additional parameters. +The additional parameters are inserted into the generated message using +standard printf() format codes. + +See jerror.h and jerror.c for further details. + + +Compressed data handling (source and destination managers) +---------------------------------------------------------- + +The JPEG compression library sends its compressed data to a "destination +manager" module. The default destination manager just writes the data to a +stdio stream, but you can provide your own manager to do something else. +Similarly, the decompression library calls a "source manager" to obtain the +compressed data; you can provide your own source manager if you want the data +to come from somewhere other than a stdio stream. + +In both cases, compressed data is processed a bufferload at a time: the +destination or source manager provides a work buffer, and the library invokes +the manager only when the buffer is filled or emptied. (You could define a +one-character buffer to force the manager to be invoked for each byte, but +that would be rather inefficient.) The buffer's size and location are +controlled by the manager, not by the library. For example, if you desired to +decompress a JPEG datastream that was all in memory, you could just make the +buffer pointer and length point to the original data in memory. Then the +buffer-reload procedure would be invoked only if the decompressor ran off the +end of the datastream, which would indicate an erroneous datastream. + +The work buffer is defined as an array of datatype JOCTET, which is generally +"char" or "unsigned char". On a machine where char is not exactly 8 bits +wide, you must define JOCTET as a wider data type and then modify the data +source and destination modules to transcribe the work arrays into 8-bit units +on external storage. + +A data destination manager struct contains a pointer and count defining the +next byte to write in the work buffer and the remaining free space: + + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is filled. The manager's empty_output_buffer method must reset the pointer +and count. The manager is expected to remember the buffer's starting address +and total size in private fields not visible to the library. + +A data destination manager provides three methods: + +init_destination (j_compress_ptr cinfo) + Initialize destination. This is called by jpeg_start_compress() + before any data is actually written. It must initialize + next_output_byte and free_in_buffer. free_in_buffer must be + initialized to a positive value. + +empty_output_buffer (j_compress_ptr cinfo) + This is called whenever the buffer has filled (free_in_buffer + reaches zero). In typical applications, it should write out the + *entire* buffer (use the saved start address and buffer length; + ignore the current state of next_output_byte and free_in_buffer). + Then reset the pointer & count to the start of the buffer, and + return TRUE indicating that the buffer has been dumped. + free_in_buffer must be set to a positive value when TRUE is + returned. A FALSE return should only be used when I/O suspension is + desired (this operating mode is discussed in the next section). + +term_destination (j_compress_ptr cinfo) + Terminate destination --- called by jpeg_finish_compress() after all + data has been written. In most applications, this must flush any + data remaining in the buffer. Use either next_output_byte or + free_in_buffer to determine how much data is in the buffer. + +term_destination() is NOT called by jpeg_abort() or jpeg_destroy(). If you +want the destination manager to be cleaned up during an abort, you must do it +yourself. + +You will also need code to create a jpeg_destination_mgr struct, fill in its +method pointers, and insert a pointer to the struct into the "dest" field of +the JPEG compression object. This can be done in-line in your setup code if +you like, but it's probably cleaner to provide a separate routine similar to +the jpeg_stdio_dest() routine of the supplied destination manager. + +Decompression source managers follow a parallel design, but with some +additional frammishes. The source manager struct contains a pointer and count +defining the next byte to read from the work buffer and the number of bytes +remaining: + + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is emptied. The manager's fill_input_buffer method must reset the pointer and +count. In most applications, the manager must remember the buffer's starting +address and total size in private fields not visible to the library. + +A data source manager provides five methods: + +init_source (j_decompress_ptr cinfo) + Initialize source. This is called by jpeg_read_header() before any + data is actually read. Unlike init_destination(), it may leave + bytes_in_buffer set to 0 (in which case a fill_input_buffer() call + will occur immediately). + +fill_input_buffer (j_decompress_ptr cinfo) + This is called whenever bytes_in_buffer has reached zero and more + data is wanted. In typical applications, it should read fresh data + into the buffer (ignoring the current state of next_input_byte and + bytes_in_buffer), reset the pointer & count to the start of the + buffer, and return TRUE indicating that the buffer has been reloaded. + It is not necessary to fill the buffer entirely, only to obtain at + least one more byte. bytes_in_buffer MUST be set to a positive value + if TRUE is returned. A FALSE return should only be used when I/O + suspension is desired (this mode is discussed in the next section). + +skip_input_data (j_decompress_ptr cinfo, long num_bytes) + Skip num_bytes worth of data. The buffer pointer and count should + be advanced over num_bytes input bytes, refilling the buffer as + needed. This is used to skip over a potentially large amount of + uninteresting data (such as an APPn marker). In some applications + it may be possible to optimize away the reading of the skipped data, + but it's not clear that being smart is worth much trouble; large + skips are uncommon. bytes_in_buffer may be zero on return. + A zero or negative skip count should be treated as a no-op. + +resync_to_restart (j_decompress_ptr cinfo, int desired) + This routine is called only when the decompressor has failed to find + a restart (RSTn) marker where one is expected. Its mission is to + find a suitable point for resuming decompression. For most + applications, we recommend that you just use the default resync + procedure, jpeg_resync_to_restart(). However, if you are able to back + up in the input data stream, or if you have a-priori knowledge about + the likely location of restart markers, you may be able to do better. + Read the read_restart_marker() and jpeg_resync_to_restart() routines + in jdmarker.c if you think you'd like to implement your own resync + procedure. + +term_source (j_decompress_ptr cinfo) + Terminate source --- called by jpeg_finish_decompress() after all + data has been read. Often a no-op. + +For both fill_input_buffer() and skip_input_data(), there is no such thing +as an EOF return. If the end of the file has been reached, the routine has +a choice of exiting via ERREXIT() or inserting fake data into the buffer. +In most cases, generating a warning message and inserting a fake EOI marker +is the best course of action --- this will allow the decompressor to output +however much of the image is there. In pathological cases, the decompressor +may swallow the EOI and again demand data ... just keep feeding it fake EOIs. +jdatasrc.c illustrates the recommended error recovery behavior. + +term_source() is NOT called by jpeg_abort() or jpeg_destroy(). If you want +the source manager to be cleaned up during an abort, you must do it yourself. + +You will also need code to create a jpeg_source_mgr struct, fill in its method +pointers, and insert a pointer to the struct into the "src" field of the JPEG +decompression object. This can be done in-line in your setup code if you +like, but it's probably cleaner to provide a separate routine similar to the +jpeg_stdio_src() routine of the supplied source manager. + +For more information, consult the stdio source and destination managers +in jdatasrc.c and jdatadst.c. + + +I/O suspension +-------------- + +Some applications need to use the JPEG library as an incremental memory-to- +memory filter: when the compressed data buffer is filled or emptied, they want +control to return to the outer loop, rather than expecting that the buffer can +be emptied or reloaded within the data source/destination manager subroutine. +The library supports this need by providing an "I/O suspension" mode, which we +describe in this section. + +The I/O suspension mode is not a panacea: nothing is guaranteed about the +maximum amount of time spent in any one call to the library, so it will not +eliminate response-time problems in single-threaded applications. If you +need guaranteed response time, we suggest you "bite the bullet" and implement +a real multi-tasking capability. + +To use I/O suspension, cooperation is needed between the calling application +and the data source or destination manager; you will always need a custom +source/destination manager. (Please read the previous section if you haven't +already.) The basic idea is that the empty_output_buffer() or +fill_input_buffer() routine is a no-op, merely returning FALSE to indicate +that it has done nothing. Upon seeing this, the JPEG library suspends +operation and returns to its caller. The surrounding application is +responsible for emptying or refilling the work buffer before calling the +JPEG library again. + +Compression suspension: + +For compression suspension, use an empty_output_buffer() routine that returns +FALSE; typically it will not do anything else. This will cause the +compressor to return to the caller of jpeg_write_scanlines(), with the return +value indicating that not all the supplied scanlines have been accepted. +The application must make more room in the output buffer, adjust the output +buffer pointer/count appropriately, and then call jpeg_write_scanlines() +again, pointing to the first unconsumed scanline. + +When forced to suspend, the compressor will backtrack to a convenient stopping +point (usually the start of the current MCU); it will regenerate some output +data when restarted. Therefore, although empty_output_buffer() is only +called when the buffer is filled, you should NOT write out the entire buffer +after a suspension. Write only the data up to the current position of +next_output_byte/free_in_buffer. The data beyond that point will be +regenerated after resumption. + +Because of the backtracking behavior, a good-size output buffer is essential +for efficiency; you don't want the compressor to suspend often. (In fact, an +overly small buffer could lead to infinite looping, if a single MCU required +more data than would fit in the buffer.) We recommend a buffer of at least +several Kbytes. You may want to insert explicit code to ensure that you don't +call jpeg_write_scanlines() unless there is a reasonable amount of space in +the output buffer; in other words, flush the buffer before trying to compress +more data. + +The compressor does not allow suspension while it is trying to write JPEG +markers at the beginning and end of the file. This means that: + * At the beginning of a compression operation, there must be enough free + space in the output buffer to hold the header markers (typically 600 or + so bytes). The recommended buffer size is bigger than this anyway, so + this is not a problem as long as you start with an empty buffer. However, + this restriction might catch you if you insert large special markers, such + as a JFIF thumbnail image, without flushing the buffer afterwards. + * When you call jpeg_finish_compress(), there must be enough space in the + output buffer to emit any buffered data and the final EOI marker. In the + current implementation, half a dozen bytes should suffice for this, but + for safety's sake we recommend ensuring that at least 100 bytes are free + before calling jpeg_finish_compress(). + +A more significant restriction is that jpeg_finish_compress() cannot suspend. +This means you cannot use suspension with multi-pass operating modes, namely +Huffman code optimization and multiple-scan output. Those modes write the +whole file during jpeg_finish_compress(), which will certainly result in +buffer overrun. (Note that this restriction applies only to compression, +not decompression. The decompressor supports input suspension in all of its +operating modes.) + +Decompression suspension: + +For decompression suspension, use a fill_input_buffer() routine that simply +returns FALSE (except perhaps during error recovery, as discussed below). +This will cause the decompressor to return to its caller with an indication +that suspension has occurred. This can happen at four places: + * jpeg_read_header(): will return JPEG_SUSPENDED. + * jpeg_start_decompress(): will return FALSE, rather than its usual TRUE. + * jpeg_read_scanlines(): will return the number of scanlines already + completed (possibly 0). + * jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE. +The surrounding application must recognize these cases, load more data into +the input buffer, and repeat the call. In the case of jpeg_read_scanlines(), +increment the passed pointers past any scanlines successfully read. + +Just as with compression, the decompressor will typically backtrack to a +convenient restart point before suspending. When fill_input_buffer() is +called, next_input_byte/bytes_in_buffer point to the current restart point, +which is where the decompressor will backtrack to if FALSE is returned. +The data beyond that position must NOT be discarded if you suspend; it needs +to be re-read upon resumption. In most implementations, you'll need to shift +this data down to the start of your work buffer and then load more data after +it. Again, this behavior means that a several-Kbyte work buffer is essential +for decent performance; furthermore, you should load a reasonable amount of +new data before resuming decompression. (If you loaded, say, only one new +byte each time around, you could waste a LOT of cycles.) + +The skip_input_data() source manager routine requires special care in a +suspension scenario. This routine is NOT granted the ability to suspend the +decompressor; it can decrement bytes_in_buffer to zero, but no more. If the +requested skip distance exceeds the amount of data currently in the input +buffer, then skip_input_data() must set bytes_in_buffer to zero and record the +additional skip distance somewhere else. The decompressor will immediately +call fill_input_buffer(), which should return FALSE, which will cause a +suspension return. The surrounding application must then arrange to discard +the recorded number of bytes before it resumes loading the input buffer. +(Yes, this design is rather baroque, but it avoids complexity in the far more +common case where a non-suspending source manager is used.) + +If the input data has been exhausted, we recommend that you emit a warning +and insert dummy EOI markers just as a non-suspending data source manager +would do. This can be handled either in the surrounding application logic or +within fill_input_buffer(); the latter is probably more efficient. If +fill_input_buffer() knows that no more data is available, it can set the +pointer/count to point to a dummy EOI marker and then return TRUE just as +though it had read more data in a non-suspending situation. + +The decompressor does not attempt to suspend within standard JPEG markers; +instead it will backtrack to the start of the marker and reprocess the whole +marker next time. Hence the input buffer must be large enough to hold the +longest standard marker in the file. Standard JPEG markers should normally +not exceed a few hundred bytes each (DHT tables are typically the longest). +We recommend at least a 2K buffer for performance reasons, which is much +larger than any correct marker is likely to be. For robustness against +damaged marker length counts, you may wish to insert a test in your +application for the case that the input buffer is completely full and yet +the decoder has suspended without consuming any data --- otherwise, if this +situation did occur, it would lead to an endless loop. (The library can't +provide this test since it has no idea whether "the buffer is full", or +even whether there is a fixed-size input buffer.) + +The input buffer would need to be 64K to allow for arbitrary COM or APPn +markers, but these are handled specially: they are either saved into allocated +memory, or skipped over by calling skip_input_data(). In the former case, +suspension is handled correctly, and in the latter case, the problem of +buffer overrun is placed on skip_input_data's shoulders, as explained above. +Note that if you provide your own marker handling routine for large markers, +you should consider how to deal with buffer overflow. + +Multiple-buffer management: + +In some applications it is desirable to store the compressed data in a linked +list of buffer areas, so as to avoid data copying. This can be handled by +having empty_output_buffer() or fill_input_buffer() set the pointer and count +to reference the next available buffer; FALSE is returned only if no more +buffers are available. Although seemingly straightforward, there is a +pitfall in this approach: the backtrack that occurs when FALSE is returned +could back up into an earlier buffer. For example, when fill_input_buffer() +is called, the current pointer & count indicate the backtrack restart point. +Since fill_input_buffer() will set the pointer and count to refer to a new +buffer, the restart position must be saved somewhere else. Suppose a second +call to fill_input_buffer() occurs in the same library call, and no +additional input data is available, so fill_input_buffer must return FALSE. +If the JPEG library has not moved the pointer/count forward in the current +buffer, then *the correct restart point is the saved position in the prior +buffer*. Prior buffers may be discarded only after the library establishes +a restart point within a later buffer. Similar remarks apply for output into +a chain of buffers. + +The library will never attempt to backtrack over a skip_input_data() call, +so any skipped data can be permanently discarded. You still have to deal +with the case of skipping not-yet-received data, however. + +It's much simpler to use only a single buffer; when fill_input_buffer() is +called, move any unconsumed data (beyond the current pointer/count) down to +the beginning of this buffer and then load new data into the remaining buffer +space. This approach requires a little more data copying but is far easier +to get right. + + +Progressive JPEG support +------------------------ + +Progressive JPEG rearranges the stored data into a series of scans of +increasing quality. In situations where a JPEG file is transmitted across a +slow communications link, a decoder can generate a low-quality image very +quickly from the first scan, then gradually improve the displayed quality as +more scans are received. The final image after all scans are complete is +identical to that of a regular (sequential) JPEG file of the same quality +setting. Progressive JPEG files are often slightly smaller than equivalent +sequential JPEG files, but the possibility of incremental display is the main +reason for using progressive JPEG. + +The IJG encoder library generates progressive JPEG files when given a +suitable "scan script" defining how to divide the data into scans. +Creation of progressive JPEG files is otherwise transparent to the encoder. +Progressive JPEG files can also be read transparently by the decoder library. +If the decoding application simply uses the library as defined above, it +will receive a final decoded image without any indication that the file was +progressive. Of course, this approach does not allow incremental display. +To perform incremental display, an application needs to use the decoder +library's "buffered-image" mode, in which it receives a decoded image +multiple times. + +Each displayed scan requires about as much work to decode as a full JPEG +image of the same size, so the decoder must be fairly fast in relation to the +data transmission rate in order to make incremental display useful. However, +it is possible to skip displaying the image and simply add the incoming bits +to the decoder's coefficient buffer. This is fast because only Huffman +decoding need be done, not IDCT, upsampling, colorspace conversion, etc. +The IJG decoder library allows the application to switch dynamically between +displaying the image and simply absorbing the incoming bits. A properly +coded application can automatically adapt the number of display passes to +suit the time available as the image is received. Also, a final +higher-quality display cycle can be performed from the buffered data after +the end of the file is reached. + +Progressive compression: + +To create a progressive JPEG file (or a multiple-scan sequential JPEG file), +set the scan_info cinfo field to point to an array of scan descriptors, and +perform compression as usual. Instead of constructing your own scan list, +you can call the jpeg_simple_progression() helper routine to create a +recommended progression sequence; this method should be used by all +applications that don't want to get involved in the nitty-gritty of +progressive scan sequence design. (If you want to provide user control of +scan sequences, you may wish to borrow the scan script reading code found +in rdswitch.c, so that you can read scan script files just like cjpeg's.) +When scan_info is not NULL, the compression library will store DCT'd data +into a buffer array as jpeg_write_scanlines() is called, and will emit all +the requested scans during jpeg_finish_compress(). This implies that +multiple-scan output cannot be created with a suspending data destination +manager, since jpeg_finish_compress() does not support suspension. We +should also note that the compressor currently forces Huffman optimization +mode when creating a progressive JPEG file, because the default Huffman +tables are unsuitable for progressive files. + +Progressive decompression: + +When buffered-image mode is not used, the decoder library will read all of +a multi-scan file during jpeg_start_decompress(), so that it can provide a +final decoded image. (Here "multi-scan" means either progressive or +multi-scan sequential.) This makes multi-scan files transparent to the +decoding application. However, existing applications that used suspending +input with version 5 of the IJG library will need to be modified to check +for a suspension return from jpeg_start_decompress(). + +To perform incremental display, an application must use the library's +buffered-image mode. This is described in the next section. + + +Buffered-image mode +------------------- + +In buffered-image mode, the library stores the partially decoded image in a +coefficient buffer, from which it can be read out as many times as desired. +This mode is typically used for incremental display of progressive JPEG files, +but it can be used with any JPEG file. Each scan of a progressive JPEG file +adds more data (more detail) to the buffered image. The application can +display in lockstep with the source file (one display pass per input scan), +or it can allow input processing to outrun display processing. By making +input and display processing run independently, it is possible for the +application to adapt progressive display to a wide range of data transmission +rates. + +The basic control flow for buffered-image decoding is + + jpeg_create_decompress() + set data source + jpeg_read_header() + set overall decompression parameters + cinfo.buffered_image = TRUE; /* select buffered-image mode */ + jpeg_start_decompress() + for (each output pass) { + adjust output decompression parameters if required + jpeg_start_output() /* start a new output pass */ + for (all scanlines in image) { + jpeg_read_scanlines() + display scanlines + } + jpeg_finish_output() /* terminate output pass */ + } + jpeg_finish_decompress() + jpeg_destroy_decompress() + +This differs from ordinary unbuffered decoding in that there is an additional +level of looping. The application can choose how many output passes to make +and how to display each pass. + +The simplest approach to displaying progressive images is to do one display +pass for each scan appearing in the input file. In this case the outer loop +condition is typically + while (! jpeg_input_complete(&cinfo)) +and the start-output call should read + jpeg_start_output(&cinfo, cinfo.input_scan_number); +The second parameter to jpeg_start_output() indicates which scan of the input +file is to be displayed; the scans are numbered starting at 1 for this +purpose. (You can use a loop counter starting at 1 if you like, but using +the library's input scan counter is easier.) The library automatically reads +data as necessary to complete each requested scan, and jpeg_finish_output() +advances to the next scan or end-of-image marker (hence input_scan_number +will be incremented by the time control arrives back at jpeg_start_output()). +With this technique, data is read from the input file only as needed, and +input and output processing run in lockstep. + +After reading the final scan and reaching the end of the input file, the +buffered image remains available; it can be read additional times by +repeating the jpeg_start_output()/jpeg_read_scanlines()/jpeg_finish_output() +sequence. For example, a useful technique is to use fast one-pass color +quantization for display passes made while the image is arriving, followed by +a final display pass using two-pass quantization for highest quality. This +is done by changing the library parameters before the final output pass. +Changing parameters between passes is discussed in detail below. + +In general the last scan of a progressive file cannot be recognized as such +until after it is read, so a post-input display pass is the best approach if +you want special processing in the final pass. + +When done with the image, be sure to call jpeg_finish_decompress() to release +the buffered image (or just use jpeg_destroy_decompress()). + +If input data arrives faster than it can be displayed, the application can +cause the library to decode input data in advance of what's needed to produce +output. This is done by calling the routine jpeg_consume_input(). +The return value is one of the following: + JPEG_REACHED_SOS: reached an SOS marker (the start of a new scan) + JPEG_REACHED_EOI: reached the EOI marker (end of image) + JPEG_ROW_COMPLETED: completed reading one MCU row of compressed data + JPEG_SCAN_COMPLETED: completed reading last MCU row of current scan + JPEG_SUSPENDED: suspended before completing any of the above +(JPEG_SUSPENDED can occur only if a suspending data source is used.) This +routine can be called at any time after initializing the JPEG object. It +reads some additional data and returns when one of the indicated significant +events occurs. (If called after the EOI marker is reached, it will +immediately return JPEG_REACHED_EOI without attempting to read more data.) + +The library's output processing will automatically call jpeg_consume_input() +whenever the output processing overtakes the input; thus, simple lockstep +display requires no direct calls to jpeg_consume_input(). But by adding +calls to jpeg_consume_input(), you can absorb data in advance of what is +being displayed. This has two benefits: + * You can limit buildup of unprocessed data in your input buffer. + * You can eliminate extra display passes by paying attention to the + state of the library's input processing. + +The first of these benefits only requires interspersing calls to +jpeg_consume_input() with your display operations and any other processing +you may be doing. To avoid wasting cycles due to backtracking, it's best to +call jpeg_consume_input() only after a hundred or so new bytes have arrived. +This is discussed further under "I/O suspension", above. (Note: the JPEG +library currently is not thread-safe. You must not call jpeg_consume_input() +from one thread of control if a different library routine is working on the +same JPEG object in another thread.) + +When input arrives fast enough that more than one new scan is available +before you start a new output pass, you may as well skip the output pass +corresponding to the completed scan. This occurs for free if you pass +cinfo.input_scan_number as the target scan number to jpeg_start_output(). +The input_scan_number field is simply the index of the scan currently being +consumed by the input processor. You can ensure that this is up-to-date by +emptying the input buffer just before calling jpeg_start_output(): call +jpeg_consume_input() repeatedly until it returns JPEG_SUSPENDED or +JPEG_REACHED_EOI. + +The target scan number passed to jpeg_start_output() is saved in the +cinfo.output_scan_number field. The library's output processing calls +jpeg_consume_input() whenever the current input scan number and row within +that scan is less than or equal to the current output scan number and row. +Thus, input processing can "get ahead" of the output processing but is not +allowed to "fall behind". You can achieve several different effects by +manipulating this interlock rule. For example, if you pass a target scan +number greater than the current input scan number, the output processor will +wait until that scan starts to arrive before producing any output. (To avoid +an infinite loop, the target scan number is automatically reset to the last +scan number when the end of image is reached. Thus, if you specify a large +target scan number, the library will just absorb the entire input file and +then perform an output pass. This is effectively the same as what +jpeg_start_decompress() does when you don't select buffered-image mode.) +When you pass a target scan number equal to the current input scan number, +the image is displayed no faster than the current input scan arrives. The +final possibility is to pass a target scan number less than the current input +scan number; this disables the input/output interlock and causes the output +processor to simply display whatever it finds in the image buffer, without +waiting for input. (However, the library will not accept a target scan +number less than one, so you can't avoid waiting for the first scan.) + +When data is arriving faster than the output display processing can advance +through the image, jpeg_consume_input() will store data into the buffered +image beyond the point at which the output processing is reading data out +again. If the input arrives fast enough, it may "wrap around" the buffer to +the point where the input is more than one whole scan ahead of the output. +If the output processing simply proceeds through its display pass without +paying attention to the input, the effect seen on-screen is that the lower +part of the image is one or more scans better in quality than the upper part. +Then, when the next output scan is started, you have a choice of what target +scan number to use. The recommended choice is to use the current input scan +number at that time, which implies that you've skipped the output scans +corresponding to the input scans that were completed while you processed the +previous output scan. In this way, the decoder automatically adapts its +speed to the arriving data, by skipping output scans as necessary to keep up +with the arriving data. + +When using this strategy, you'll want to be sure that you perform a final +output pass after receiving all the data; otherwise your last display may not +be full quality across the whole screen. So the right outer loop logic is +something like this: + do { + absorb any waiting input by calling jpeg_consume_input() + final_pass = jpeg_input_complete(&cinfo); + adjust output decompression parameters if required + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + } while (! final_pass); +rather than quitting as soon as jpeg_input_complete() returns TRUE. This +arrangement makes it simple to use higher-quality decoding parameters +for the final pass. But if you don't want to use special parameters for +the final pass, the right loop logic is like this: + for (;;) { + absorb any waiting input by calling jpeg_consume_input() + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + if (jpeg_input_complete(&cinfo) && + cinfo.input_scan_number == cinfo.output_scan_number) + break; + } +In this case you don't need to know in advance whether an output pass is to +be the last one, so it's not necessary to have reached EOF before starting +the final output pass; rather, what you want to test is whether the output +pass was performed in sync with the final input scan. This form of the loop +will avoid an extra output pass whenever the decoder is able (or nearly able) +to keep up with the incoming data. + +When the data transmission speed is high, you might begin a display pass, +then find that much or all of the file has arrived before you can complete +the pass. (You can detect this by noting the JPEG_REACHED_EOI return code +from jpeg_consume_input(), or equivalently by testing jpeg_input_complete().) +In this situation you may wish to abort the current display pass and start a +new one using the newly arrived information. To do so, just call +jpeg_finish_output() and then start a new pass with jpeg_start_output(). + +A variant strategy is to abort and restart display if more than one complete +scan arrives during an output pass; this can be detected by noting +JPEG_REACHED_SOS returns and/or examining cinfo.input_scan_number. This +idea should be employed with caution, however, since the display process +might never get to the bottom of the image before being aborted, resulting +in the lower part of the screen being several passes worse than the upper. +In most cases it's probably best to abort an output pass only if the whole +file has arrived and you want to begin the final output pass immediately. + +When receiving data across a communication link, we recommend always using +the current input scan number for the output target scan number; if a +higher-quality final pass is to be done, it should be started (aborting any +incomplete output pass) as soon as the end of file is received. However, +many other strategies are possible. For example, the application can examine +the parameters of the current input scan and decide whether to display it or +not. If the scan contains only chroma data, one might choose not to use it +as the target scan, expecting that the scan will be small and will arrive +quickly. To skip to the next scan, call jpeg_consume_input() until it +returns JPEG_REACHED_SOS or JPEG_REACHED_EOI. Or just use the next higher +number as the target scan for jpeg_start_output(); but that method doesn't +let you inspect the next scan's parameters before deciding to display it. + + +In buffered-image mode, jpeg_start_decompress() never performs input and +thus never suspends. An application that uses input suspension with +buffered-image mode must be prepared for suspension returns from these +routines: +* jpeg_start_output() performs input only if you request 2-pass quantization + and the target scan isn't fully read yet. (This is discussed below.) +* jpeg_read_scanlines(), as always, returns the number of scanlines that it + was able to produce before suspending. +* jpeg_finish_output() will read any markers following the target scan, + up to the end of the file or the SOS marker that begins another scan. + (But it reads no input if jpeg_consume_input() has already reached the + end of the file or a SOS marker beyond the target output scan.) +* jpeg_finish_decompress() will read until the end of file, and thus can + suspend if the end hasn't already been reached (as can be tested by + calling jpeg_input_complete()). +jpeg_start_output(), jpeg_finish_output(), and jpeg_finish_decompress() +all return TRUE if they completed their tasks, FALSE if they had to suspend. +In the event of a FALSE return, the application must load more input data +and repeat the call. Applications that use non-suspending data sources need +not check the return values of these three routines. + + +It is possible to change decoding parameters between output passes in the +buffered-image mode. The decoder library currently supports only very +limited changes of parameters. ONLY THE FOLLOWING parameter changes are +allowed after jpeg_start_decompress() is called: +* dct_method can be changed before each call to jpeg_start_output(). + For example, one could use a fast DCT method for early scans, changing + to a higher quality method for the final scan. +* dither_mode can be changed before each call to jpeg_start_output(); + of course this has no impact if not using color quantization. Typically + one would use ordered dither for initial passes, then switch to + Floyd-Steinberg dither for the final pass. Caution: changing dither mode + can cause more memory to be allocated by the library. Although the amount + of memory involved is not large (a scanline or so), it may cause the + initial max_memory_to_use specification to be exceeded, which in the worst + case would result in an out-of-memory failure. +* do_block_smoothing can be changed before each call to jpeg_start_output(). + This setting is relevant only when decoding a progressive JPEG image. + During the first DC-only scan, block smoothing provides a very "fuzzy" look + instead of the very "blocky" look seen without it; which is better seems a + matter of personal taste. But block smoothing is nearly always a win + during later stages, especially when decoding a successive-approximation + image: smoothing helps to hide the slight blockiness that otherwise shows + up on smooth gradients until the lowest coefficient bits are sent. +* Color quantization mode can be changed under the rules described below. + You *cannot* change between full-color and quantized output (because that + would alter the required I/O buffer sizes), but you can change which + quantization method is used. + +When generating color-quantized output, changing quantization method is a +very useful way of switching between high-speed and high-quality display. +The library allows you to change among its three quantization methods: +1. Single-pass quantization to a fixed color cube. + Selected by cinfo.two_pass_quantize = FALSE and cinfo.colormap = NULL. +2. Single-pass quantization to an application-supplied colormap. + Selected by setting cinfo.colormap to point to the colormap (the value of + two_pass_quantize is ignored); also set cinfo.actual_number_of_colors. +3. Two-pass quantization to a colormap chosen specifically for the image. + Selected by cinfo.two_pass_quantize = TRUE and cinfo.colormap = NULL. + (This is the default setting selected by jpeg_read_header, but it is + probably NOT what you want for the first pass of progressive display!) +These methods offer successively better quality and lesser speed. However, +only the first method is available for quantizing in non-RGB color spaces. + +IMPORTANT: because the different quantizer methods have very different +working-storage requirements, the library requires you to indicate which +one(s) you intend to use before you call jpeg_start_decompress(). (If we did +not require this, the max_memory_to_use setting would be a complete fiction.) +You do this by setting one or more of these three cinfo fields to TRUE: + enable_1pass_quant Fixed color cube colormap + enable_external_quant Externally-supplied colormap + enable_2pass_quant Two-pass custom colormap +All three are initialized FALSE by jpeg_read_header(). But +jpeg_start_decompress() automatically sets TRUE the one selected by the +current two_pass_quantize and colormap settings, so you only need to set the +enable flags for any other quantization methods you plan to change to later. + +After setting the enable flags correctly at jpeg_start_decompress() time, you +can change to any enabled quantization method by setting two_pass_quantize +and colormap properly just before calling jpeg_start_output(). The following +special rules apply: +1. You must explicitly set cinfo.colormap to NULL when switching to 1-pass + or 2-pass mode from a different mode, or when you want the 2-pass + quantizer to be re-run to generate a new colormap. +2. To switch to an external colormap, or to change to a different external + colormap than was used on the prior pass, you must call + jpeg_new_colormap() after setting cinfo.colormap. +NOTE: if you want to use the same colormap as was used in the prior pass, +you should not do either of these things. This will save some nontrivial +switchover costs. +(These requirements exist because cinfo.colormap will always be non-NULL +after completing a prior output pass, since both the 1-pass and 2-pass +quantizers set it to point to their output colormaps. Thus you have to +do one of these two things to notify the library that something has changed. +Yup, it's a bit klugy, but it's necessary to do it this way for backwards +compatibility.) + +Note that in buffered-image mode, the library generates any requested colormap +during jpeg_start_output(), not during jpeg_start_decompress(). + +When using two-pass quantization, jpeg_start_output() makes a pass over the +buffered image to determine the optimum color map; it therefore may take a +significant amount of time, whereas ordinarily it does little work. The +progress monitor hook is called during this pass, if defined. It is also +important to realize that if the specified target scan number is greater than +or equal to the current input scan number, jpeg_start_output() will attempt +to consume input as it makes this pass. If you use a suspending data source, +you need to check for a FALSE return from jpeg_start_output() under these +conditions. The combination of 2-pass quantization and a not-yet-fully-read +target scan is the only case in which jpeg_start_output() will consume input. + + +Application authors who support buffered-image mode may be tempted to use it +for all JPEG images, even single-scan ones. This will work, but it is +inefficient: there is no need to create an image-sized coefficient buffer for +single-scan images. Requesting buffered-image mode for such an image wastes +memory. Worse, it can cost time on large images, since the buffered data has +to be swapped out or written to a temporary file. If you are concerned about +maximum performance on baseline JPEG files, you should use buffered-image +mode only when the incoming file actually has multiple scans. This can be +tested by calling jpeg_has_multiple_scans(), which will return a correct +result at any time after jpeg_read_header() completes. + +It is also worth noting that when you use jpeg_consume_input() to let input +processing get ahead of output processing, the resulting pattern of access to +the coefficient buffer is quite nonsequential. It's best to use the memory +manager jmemnobs.c if you can (ie, if you have enough real or virtual main +memory). If not, at least make sure that max_memory_to_use is set as high as +possible. If the JPEG memory manager has to use a temporary file, you will +probably see a lot of disk traffic and poor performance. (This could be +improved with additional work on the memory manager, but we haven't gotten +around to it yet.) + +In some applications it may be convenient to use jpeg_consume_input() for all +input processing, including reading the initial markers; that is, you may +wish to call jpeg_consume_input() instead of jpeg_read_header() during +startup. This works, but note that you must check for JPEG_REACHED_SOS and +JPEG_REACHED_EOI return codes as the equivalent of jpeg_read_header's codes. +Once the first SOS marker has been reached, you must call +jpeg_start_decompress() before jpeg_consume_input() will consume more input; +it'll just keep returning JPEG_REACHED_SOS until you do. If you read a +tables-only file this way, jpeg_consume_input() will return JPEG_REACHED_EOI +without ever returning JPEG_REACHED_SOS; be sure to check for this case. +If this happens, the decompressor will not read any more input until you call +jpeg_abort() to reset it. It is OK to call jpeg_consume_input() even when not +using buffered-image mode, but in that case it's basically a no-op after the +initial markers have been read: it will just return JPEG_SUSPENDED. + + +Abbreviated datastreams and multiple images +------------------------------------------- + +A JPEG compression or decompression object can be reused to process multiple +images. This saves a small amount of time per image by eliminating the +"create" and "destroy" operations, but that isn't the real purpose of the +feature. Rather, reuse of an object provides support for abbreviated JPEG +datastreams. Object reuse can also simplify processing a series of images in +a single input or output file. This section explains these features. + +A JPEG file normally contains several hundred bytes worth of quantization +and Huffman tables. In a situation where many images will be stored or +transmitted with identical tables, this may represent an annoying overhead. +The JPEG standard therefore permits tables to be omitted. The standard +defines three classes of JPEG datastreams: + * "Interchange" datastreams contain an image and all tables needed to decode + the image. These are the usual kind of JPEG file. + * "Abbreviated image" datastreams contain an image, but are missing some or + all of the tables needed to decode that image. + * "Abbreviated table specification" (henceforth "tables-only") datastreams + contain only table specifications. +To decode an abbreviated image, it is necessary to load the missing table(s) +into the decoder beforehand. This can be accomplished by reading a separate +tables-only file. A variant scheme uses a series of images in which the first +image is an interchange (complete) datastream, while subsequent ones are +abbreviated and rely on the tables loaded by the first image. It is assumed +that once the decoder has read a table, it will remember that table until a +new definition for the same table number is encountered. + +It is the application designer's responsibility to figure out how to associate +the correct tables with an abbreviated image. While abbreviated datastreams +can be useful in a closed environment, their use is strongly discouraged in +any situation where data exchange with other applications might be needed. +Caveat designer. + +The JPEG library provides support for reading and writing any combination of +tables-only datastreams and abbreviated images. In both compression and +decompression objects, a quantization or Huffman table will be retained for +the lifetime of the object, unless it is overwritten by a new table definition. + + +To create abbreviated image datastreams, it is only necessary to tell the +compressor not to emit some or all of the tables it is using. Each +quantization and Huffman table struct contains a boolean field "sent_table", +which normally is initialized to FALSE. For each table used by the image, the +header-writing process emits the table and sets sent_table = TRUE unless it is +already TRUE. (In normal usage, this prevents outputting the same table +definition multiple times, as would otherwise occur because the chroma +components typically share tables.) Thus, setting this field to TRUE before +calling jpeg_start_compress() will prevent the table from being written at +all. + +If you want to create a "pure" abbreviated image file containing no tables, +just call "jpeg_suppress_tables(&cinfo, TRUE)" after constructing all the +tables. If you want to emit some but not all tables, you'll need to set the +individual sent_table fields directly. + +To create an abbreviated image, you must also call jpeg_start_compress() +with a second parameter of FALSE, not TRUE. Otherwise jpeg_start_compress() +will force all the sent_table fields to FALSE. (This is a safety feature to +prevent abbreviated images from being created accidentally.) + +To create a tables-only file, perform the same parameter setup that you +normally would, but instead of calling jpeg_start_compress() and so on, call +jpeg_write_tables(&cinfo). This will write an abbreviated datastream +containing only SOI, DQT and/or DHT markers, and EOI. All the quantization +and Huffman tables that are currently defined in the compression object will +be emitted unless their sent_tables flag is already TRUE, and then all the +sent_tables flags will be set TRUE. + +A sure-fire way to create matching tables-only and abbreviated image files +is to proceed as follows: + + create JPEG compression object + set JPEG parameters + set destination to tables-only file + jpeg_write_tables(&cinfo); + set destination to image file + jpeg_start_compress(&cinfo, FALSE); + write data... + jpeg_finish_compress(&cinfo); + +Since the JPEG parameters are not altered between writing the table file and +the abbreviated image file, the same tables are sure to be used. Of course, +you can repeat the jpeg_start_compress() ... jpeg_finish_compress() sequence +many times to produce many abbreviated image files matching the table file. + +You cannot suppress output of the computed Huffman tables when Huffman +optimization is selected. (If you could, there'd be no way to decode the +image...) Generally, you don't want to set optimize_coding = TRUE when +you are trying to produce abbreviated files. + +In some cases you might want to compress an image using tables which are +not stored in the application, but are defined in an interchange or +tables-only file readable by the application. This can be done by setting up +a JPEG decompression object to read the specification file, then copying the +tables into your compression object. See jpeg_copy_critical_parameters() +for an example of copying quantization tables. + + +To read abbreviated image files, you simply need to load the proper tables +into the decompression object before trying to read the abbreviated image. +If the proper tables are stored in the application program, you can just +allocate the table structs and fill in their contents directly. For example, +to load a fixed quantization table into table slot "n": + + if (cinfo.quant_tbl_ptrs[n] == NULL) + cinfo.quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) &cinfo); + quant_ptr = cinfo.quant_tbl_ptrs[n]; /* quant_ptr is JQUANT_TBL* */ + for (i = 0; i < 64; i++) { + /* Qtable[] is desired quantization table, in natural array order */ + quant_ptr->quantval[i] = Qtable[i]; + } + +Code to load a fixed Huffman table is typically (for AC table "n"): + + if (cinfo.ac_huff_tbl_ptrs[n] == NULL) + cinfo.ac_huff_tbl_ptrs[n] = jpeg_alloc_huff_table((j_common_ptr) &cinfo); + huff_ptr = cinfo.ac_huff_tbl_ptrs[n]; /* huff_ptr is JHUFF_TBL* */ + for (i = 1; i <= 16; i++) { + /* counts[i] is number of Huffman codes of length i bits, i=1..16 */ + huff_ptr->bits[i] = counts[i]; + } + for (i = 0; i < 256; i++) { + /* symbols[] is the list of Huffman symbols, in code-length order */ + huff_ptr->huffval[i] = symbols[i]; + } + +(Note that trying to set cinfo.quant_tbl_ptrs[n] to point directly at a +constant JQUANT_TBL object is not safe. If the incoming file happened to +contain a quantization table definition, your master table would get +overwritten! Instead allocate a working table copy and copy the master table +into it, as illustrated above. Ditto for Huffman tables, of course.) + +You might want to read the tables from a tables-only file, rather than +hard-wiring them into your application. The jpeg_read_header() call is +sufficient to read a tables-only file. You must pass a second parameter of +FALSE to indicate that you do not require an image to be present. Thus, the +typical scenario is + + create JPEG decompression object + set source to tables-only file + jpeg_read_header(&cinfo, FALSE); + set source to abbreviated image file + jpeg_read_header(&cinfo, TRUE); + set decompression parameters + jpeg_start_decompress(&cinfo); + read data... + jpeg_finish_decompress(&cinfo); + +In some cases, you may want to read a file without knowing whether it contains +an image or just tables. In that case, pass FALSE and check the return value +from jpeg_read_header(): it will be JPEG_HEADER_OK if an image was found, +JPEG_HEADER_TABLES_ONLY if only tables were found. (A third return value, +JPEG_SUSPENDED, is possible when using a suspending data source manager.) +Note that jpeg_read_header() will not complain if you read an abbreviated +image for which you haven't loaded the missing tables; the missing-table check +occurs later, in jpeg_start_decompress(). + + +It is possible to read a series of images from a single source file by +repeating the jpeg_read_header() ... jpeg_finish_decompress() sequence, +without releasing/recreating the JPEG object or the data source module. +(If you did reinitialize, any partial bufferload left in the data source +buffer at the end of one image would be discarded, causing you to lose the +start of the next image.) When you use this method, stored tables are +automatically carried forward, so some of the images can be abbreviated images +that depend on tables from earlier images. + +If you intend to write a series of images into a single destination file, +you might want to make a specialized data destination module that doesn't +flush the output buffer at term_destination() time. This would speed things +up by some trifling amount. Of course, you'd need to remember to flush the +buffer after the last image. You can make the later images be abbreviated +ones by passing FALSE to jpeg_start_compress(). + + +Special markers +--------------- + +Some applications may need to insert or extract special data in the JPEG +datastream. The JPEG standard provides marker types "COM" (comment) and +"APP0" through "APP15" (application) to hold application-specific data. +Unfortunately, the use of these markers is not specified by the standard. +COM markers are fairly widely used to hold user-supplied text. The JFIF file +format spec uses APP0 markers with specified initial strings to hold certain +data. Adobe applications use APP14 markers beginning with the string "Adobe" +for miscellaneous data. Other APPn markers are rarely seen, but might +contain almost anything. + +If you wish to store user-supplied text, we recommend you use COM markers +and place readable 7-bit ASCII text in them. Newline conventions are not +standardized --- expect to find LF (Unix style), CR/LF (DOS style), or CR +(Mac style). A robust COM reader should be able to cope with random binary +garbage, including nulls, since some applications generate COM markers +containing non-ASCII junk. (But yours should not be one of them.) + +For program-supplied data, use an APPn marker, and be sure to begin it with an +identifying string so that you can tell whether the marker is actually yours. +It's probably best to avoid using APP0 or APP14 for any private markers. +(NOTE: the upcoming SPIFF standard will use APP8 markers; we recommend you +not use APP8 markers for any private purposes, either.) + +Keep in mind that at most 65533 bytes can be put into one marker, but you +can have as many markers as you like. + +By default, the IJG compression library will write a JFIF APP0 marker if the +selected JPEG colorspace is grayscale or YCbCr, or an Adobe APP14 marker if +the selected colorspace is RGB, CMYK, or YCCK. You can disable this, but +we don't recommend it. The decompression library will recognize JFIF and +Adobe markers and will set the JPEG colorspace properly when one is found. + + +You can write special markers immediately following the datastream header by +calling jpeg_write_marker() after jpeg_start_compress() and before the first +call to jpeg_write_scanlines(). When you do this, the markers appear after +the SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before +all else. Specify the marker type parameter as "JPEG_COM" for COM or +"JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write +any marker type, but we don't recommend writing any other kinds of marker.) +For example, to write a user comment string pointed to by comment_text: + jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); + +If it's not convenient to store all the marker data in memory at once, +you can instead call jpeg_write_m_header() followed by multiple calls to +jpeg_write_m_byte(). If you do it this way, it's your responsibility to +call jpeg_write_m_byte() exactly the number of times given in the length +parameter to jpeg_write_m_header(). (This method lets you empty the +output buffer partway through a marker, which might be important when +using a suspending data destination module. In any case, if you are using +a suspending destination, you should flush its buffer after inserting +any special markers. See "I/O suspension".) + +Or, if you prefer to synthesize the marker byte sequence yourself, +you can just cram it straight into the data destination module. + +If you are writing JFIF 1.02 extension markers (thumbnail images), don't +forget to set cinfo.JFIF_minor_version = 2 so that the encoder will write the +correct JFIF version number in the JFIF header marker. The library's default +is to write version 1.01, but that's wrong if you insert any 1.02 extension +markers. (We could probably get away with just defaulting to 1.02, but there +used to be broken decoders that would complain about unknown minor version +numbers. To reduce compatibility risks it's safest not to write 1.02 unless +you are actually using 1.02 extensions.) + + +When reading, two methods of handling special markers are available: +1. You can ask the library to save the contents of COM and/or APPn markers +into memory, and then examine them at your leisure afterwards. +2. You can supply your own routine to process COM and/or APPn markers +on-the-fly as they are read. +The first method is simpler to use, especially if you are using a suspending +data source; writing a marker processor that copes with input suspension is +not easy (consider what happens if the marker is longer than your available +input buffer). However, the second method conserves memory since the marker +data need not be kept around after it's been processed. + +For either method, you'd normally set up marker handling after creating a +decompression object and before calling jpeg_read_header(), because the +markers of interest will typically be near the head of the file and so will +be scanned by jpeg_read_header. Once you've established a marker handling +method, it will be used for the life of that decompression object +(potentially many datastreams), unless you change it. Marker handling is +determined separately for COM markers and for each APPn marker code. + + +To save the contents of special markers in memory, call + jpeg_save_markers(cinfo, marker_code, length_limit) +where marker_code is the marker type to save, JPEG_COM or JPEG_APP0+n. +(To arrange to save all the special marker types, you need to call this +routine 17 times, for COM and APP0-APP15.) If the incoming marker is longer +than length_limit data bytes, only length_limit bytes will be saved; this +parameter allows you to avoid chewing up memory when you only need to see the +first few bytes of a potentially large marker. If you want to save all the +data, set length_limit to 0xFFFF; that is enough since marker lengths are only +16 bits. As a special case, setting length_limit to 0 prevents that marker +type from being saved at all. (That is the default behavior, in fact.) + +After jpeg_read_header() completes, you can examine the special markers by +following the cinfo->marker_list pointer chain. All the special markers in +the file appear in this list, in order of their occurrence in the file (but +omitting any markers of types you didn't ask for). Both the original data +length and the saved data length are recorded for each list entry; the latter +will not exceed length_limit for the particular marker type. Note that these +lengths exclude the marker length word, whereas the stored representation +within the JPEG file includes it. (Hence the maximum data length is really +only 65533.) + +It is possible that additional special markers appear in the file beyond the +SOS marker at which jpeg_read_header stops; if so, the marker list will be +extended during reading of the rest of the file. This is not expected to be +common, however. If you are short on memory you may want to reset the length +limit to zero for all marker types after finishing jpeg_read_header, to +ensure that the max_memory_to_use setting cannot be exceeded due to addition +of later markers. + +The marker list remains stored until you call jpeg_finish_decompress or +jpeg_abort, at which point the memory is freed and the list is set to empty. +(jpeg_destroy also releases the storage, of course.) + +Note that the library is internally interested in APP0 and APP14 markers; +if you try to set a small nonzero length limit on these types, the library +will silently force the length up to the minimum it wants. (But you can set +a zero length limit to prevent them from being saved at all.) Also, in a +16-bit environment, the maximum length limit may be constrained to less than +65533 by malloc() limitations. It is therefore best not to assume that the +effective length limit is exactly what you set it to be. + + +If you want to supply your own marker-reading routine, you do it by calling +jpeg_set_marker_processor(). A marker processor routine must have the +signature + boolean jpeg_marker_parser_method (j_decompress_ptr cinfo) +Although the marker code is not explicitly passed, the routine can find it +in cinfo->unread_marker. At the time of call, the marker proper has been +read from the data source module. The processor routine is responsible for +reading the marker length word and the remaining parameter bytes, if any. +Return TRUE to indicate success. (FALSE should be returned only if you are +using a suspending data source and it tells you to suspend. See the standard +marker processors in jdmarker.c for appropriate coding methods if you need to +use a suspending data source.) + +If you override the default APP0 or APP14 processors, it is up to you to +recognize JFIF and Adobe markers if you want colorspace recognition to occur +properly. We recommend copying and extending the default processors if you +want to do that. (A better idea is to save these marker types for later +examination by calling jpeg_save_markers(); that method doesn't interfere +with the library's own processing of these markers.) + +jpeg_set_marker_processor() and jpeg_save_markers() are mutually exclusive +--- if you call one it overrides any previous call to the other, for the +particular marker type specified. + +A simple example of an external COM processor can be found in djpeg.c. +Also, see jpegtran.c for an example of using jpeg_save_markers. + + +Raw (downsampled) image data +---------------------------- + +Some applications need to supply already-downsampled image data to the JPEG +compressor, or to receive raw downsampled data from the decompressor. The +library supports this requirement by allowing the application to write or +read raw data, bypassing the normal preprocessing or postprocessing steps. +The interface is different from the standard one and is somewhat harder to +use. If your interest is merely in bypassing color conversion, we recommend +that you use the standard interface and simply set jpeg_color_space = +in_color_space (or jpeg_color_space = out_color_space for decompression). +The mechanism described in this section is necessary only to supply or +receive downsampled image data, in which not all components have the same +dimensions. + + +To compress raw data, you must supply the data in the colorspace to be used +in the JPEG file (please read the earlier section on Special color spaces) +and downsampled to the sampling factors specified in the JPEG parameters. +You must supply the data in the format used internally by the JPEG library, +namely a JSAMPIMAGE array. This is an array of pointers to two-dimensional +arrays, each of type JSAMPARRAY. Each 2-D array holds the values for one +color component. This structure is necessary since the components are of +different sizes. If the image dimensions are not a multiple of the MCU size, +you must also pad the data correctly (usually, this is done by replicating +the last column and/or row). The data must be padded to a multiple of a DCT +block in each component: that is, each downsampled row must contain a +multiple of 8 valid samples, and there must be a multiple of 8 sample rows +for each component. (For applications such as conversion of digital TV +images, the standard image size is usually a multiple of the DCT block size, +so that no padding need actually be done.) + +The procedure for compression of raw data is basically the same as normal +compression, except that you call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do +the following: + * Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().) + This notifies the library that you will be supplying raw data. + * Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace() + call is a good idea. Note that since color conversion is bypassed, + in_color_space is ignored, except that jpeg_set_defaults() uses it to + choose the default jpeg_color_space setting. + * Ensure the sampling factors, cinfo->comp_info[i].h_samp_factor and + cinfo->comp_info[i].v_samp_factor, are correct. Since these indicate the + dimensions of the data you are supplying, it's wise to set them + explicitly, rather than assuming the library's defaults are what you want. + +To pass raw data to the library, call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). The two routines work similarly except that +jpeg_write_raw_data takes a JSAMPIMAGE data array rather than JSAMPARRAY. +The scanlines count passed to and returned from jpeg_write_raw_data is +measured in terms of the component with the largest v_samp_factor. + +jpeg_write_raw_data() processes one MCU row per call, which is to say +v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines +value must be at least max_v_samp_factor*DCTSIZE, and the return value will +be exactly that amount (or possibly some multiple of that amount, in future +library versions). This is true even on the last call at the bottom of the +image; don't forget to pad your data as necessary. + +The required dimensions of the supplied data can be computed for each +component as + cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row + cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image +after jpeg_start_compress() has initialized those fields. If the valid data +is smaller than this, it must be padded appropriately. For some sampling +factors and image sizes, additional dummy DCT blocks are inserted to make +the image a multiple of the MCU dimensions. The library creates such dummy +blocks itself; it does not read them from your supplied data. Therefore you +need never pad by more than DCTSIZE samples. An example may help here. +Assume 2h2v downsampling of YCbCr data, that is + cinfo->comp_info[0].h_samp_factor = 2 for Y + cinfo->comp_info[0].v_samp_factor = 2 + cinfo->comp_info[1].h_samp_factor = 1 for Cb + cinfo->comp_info[1].v_samp_factor = 1 + cinfo->comp_info[2].h_samp_factor = 1 for Cr + cinfo->comp_info[2].v_samp_factor = 1 +and suppose that the nominal image dimensions (cinfo->image_width and +cinfo->image_height) are 101x101 pixels. Then jpeg_start_compress() will +compute downsampled_width = 101 and width_in_blocks = 13 for Y, +downsampled_width = 51 and width_in_blocks = 7 for Cb and Cr (and the same +for the height fields). You must pad the Y data to at least 13*8 = 104 +columns and rows, the Cb/Cr data to at least 7*8 = 56 columns and rows. The +MCU height is max_v_samp_factor = 2 DCT rows so you must pass at least 16 +scanlines on each call to jpeg_write_raw_data(), which is to say 16 actual +sample rows of Y and 8 each of Cb and Cr. A total of 7 MCU rows are needed, +so you must pass a total of 7*16 = 112 "scanlines". The last DCT block row +of Y data is dummy, so it doesn't matter what you pass for it in the data +arrays, but the scanlines count must total up to 112 so that all of the Cb +and Cr data gets passed. + +Output suspension is supported with raw-data compression: if the data +destination module suspends, jpeg_write_raw_data() will return 0. +In this case the same data rows must be passed again on the next call. + + +Decompression with raw data output implies bypassing all postprocessing: +you cannot ask for rescaling or color quantization, for instance. More +seriously, you must deal with the color space and sampling factors present in +the incoming file. If your application only handles, say, 2h1v YCbCr data, +you must check for and fail on other color spaces or other sampling factors. +The library will not convert to a different color space for you. + +To obtain raw data output, set cinfo->raw_data_out = TRUE before +jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to +verify that the color space and sampling factors are ones you can handle. +Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The +decompression process is otherwise the same as usual. + +jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a +buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is +the same as for raw-data compression). The buffer you pass must be large +enough to hold the actual data plus padding to DCT-block boundaries. As with +compression, any entirely dummy DCT blocks are not processed so you need not +allocate space for them, but the total scanline count includes them. The +above example of computing buffer dimensions for raw-data compression is +equally valid for decompression. + +Input suspension is supported with raw-data decompression: if the data source +module suspends, jpeg_read_raw_data() will return 0. You can also use +buffered-image mode to read raw data in multiple passes. + + +Really raw data: DCT coefficients +--------------------------------- + +It is possible to read or write the contents of a JPEG file as raw DCT +coefficients. This facility is mainly intended for use in lossless +transcoding between different JPEG file formats. Other possible applications +include lossless cropping of a JPEG image, lossless reassembly of a +multi-strip or multi-tile TIFF/JPEG file into a single JPEG datastream, etc. + +To read the contents of a JPEG file as DCT coefficients, open the file and do +jpeg_read_header() as usual. But instead of calling jpeg_start_decompress() +and jpeg_read_scanlines(), call jpeg_read_coefficients(). This will read the +entire image into a set of virtual coefficient-block arrays, one array per +component. The return value is a pointer to an array of virtual-array +descriptors. Each virtual array can be accessed directly using the JPEG +memory manager's access_virt_barray method (see Memory management, below, +and also read structure.doc's discussion of virtual array handling). Or, +for simple transcoding to a different JPEG file format, the array list can +just be handed directly to jpeg_write_coefficients(). + +Each block in the block arrays contains quantized coefficient values in +normal array order (not JPEG zigzag order). The block arrays contain only +DCT blocks containing real data; any entirely-dummy blocks added to fill out +interleaved MCUs at the right or bottom edges of the image are discarded +during reading and are not stored in the block arrays. (The size of each +block array can be determined from the width_in_blocks and height_in_blocks +fields of the component's comp_info entry.) This is also the data format +expected by jpeg_write_coefficients(). + +When you are done using the virtual arrays, call jpeg_finish_decompress() +to release the array storage and return the decompression object to an idle +state; or just call jpeg_destroy() if you don't need to reuse the object. + +If you use a suspending data source, jpeg_read_coefficients() will return +NULL if it is forced to suspend; a non-NULL return value indicates successful +completion. You need not test for a NULL return value when using a +non-suspending data source. + +It is also possible to call jpeg_read_coefficients() to obtain access to the +decoder's coefficient arrays during a normal decode cycle in buffered-image +mode. This frammish might be useful for progressively displaying an incoming +image and then re-encoding it without loss. To do this, decode in buffered- +image mode as discussed previously, then call jpeg_read_coefficients() after +the last jpeg_finish_output() call. The arrays will be available for your use +until you call jpeg_finish_decompress(). + + +To write the contents of a JPEG file as DCT coefficients, you must provide +the DCT coefficients stored in virtual block arrays. You can either pass +block arrays read from an input JPEG file by jpeg_read_coefficients(), or +allocate virtual arrays from the JPEG compression object and fill them +yourself. In either case, jpeg_write_coefficients() is substituted for +jpeg_start_compress() and jpeg_write_scanlines(). Thus the sequence is + * Create compression object + * Set all compression parameters as necessary + * Request virtual arrays if needed + * jpeg_write_coefficients() + * jpeg_finish_compress() + * Destroy or re-use compression object +jpeg_write_coefficients() is passed a pointer to an array of virtual block +array descriptors; the number of arrays is equal to cinfo.num_components. + +The virtual arrays need only have been requested, not realized, before +jpeg_write_coefficients() is called. A side-effect of +jpeg_write_coefficients() is to realize any virtual arrays that have been +requested from the compression object's memory manager. Thus, when obtaining +the virtual arrays from the compression object, you should fill the arrays +after calling jpeg_write_coefficients(). The data is actually written out +when you call jpeg_finish_compress(); jpeg_write_coefficients() only writes +the file header. + +When writing raw DCT coefficients, it is crucial that the JPEG quantization +tables and sampling factors match the way the data was encoded, or the +resulting file will be invalid. For transcoding from an existing JPEG file, +we recommend using jpeg_copy_critical_parameters(). This routine initializes +all the compression parameters to default values (like jpeg_set_defaults()), +then copies the critical information from a source decompression object. +The decompression object should have just been used to read the entire +JPEG input file --- that is, it should be awaiting jpeg_finish_decompress(). + +jpeg_write_coefficients() marks all tables stored in the compression object +as needing to be written to the output file (thus, it acts like +jpeg_start_compress(cinfo, TRUE)). This is for safety's sake, to avoid +emitting abbreviated JPEG files by accident. If you really want to emit an +abbreviated JPEG file, call jpeg_suppress_tables(), or set the tables' +individual sent_table flags, between calling jpeg_write_coefficients() and +jpeg_finish_compress(). + + +Progress monitoring +------------------- + +Some applications may need to regain control from the JPEG library every so +often. The typical use of this feature is to produce a percent-done bar or +other progress display. (For a simple example, see cjpeg.c or djpeg.c.) +Although you do get control back frequently during the data-transferring pass +(the jpeg_read_scanlines or jpeg_write_scanlines loop), any additional passes +will occur inside jpeg_finish_compress or jpeg_start_decompress; those +routines may take a long time to execute, and you don't get control back +until they are done. + +You can define a progress-monitor routine which will be called periodically +by the library. No guarantees are made about how often this call will occur, +so we don't recommend you use it for mouse tracking or anything like that. +At present, a call will occur once per MCU row, scanline, or sample row +group, whichever unit is convenient for the current processing mode; so the +wider the image, the longer the time between calls. During the data +transferring pass, only one call occurs per call of jpeg_read_scanlines or +jpeg_write_scanlines, so don't pass a large number of scanlines at once if +you want fine resolution in the progress count. (If you really need to use +the callback mechanism for time-critical tasks like mouse tracking, you could +insert additional calls inside some of the library's inner loops.) + +To establish a progress-monitor callback, create a struct jpeg_progress_mgr, +fill in its progress_monitor field with a pointer to your callback routine, +and set cinfo->progress to point to the struct. The callback will be called +whenever cinfo->progress is non-NULL. (This pointer is set to NULL by +jpeg_create_compress or jpeg_create_decompress; the library will not change +it thereafter. So if you allocate dynamic storage for the progress struct, +make sure it will live as long as the JPEG object does. Allocating from the +JPEG memory manager with lifetime JPOOL_PERMANENT will work nicely.) You +can use the same callback routine for both compression and decompression. + +The jpeg_progress_mgr struct contains four fields which are set by the library: + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +During any one pass, pass_counter increases from 0 up to (not including) +pass_limit; the step size is usually but not necessarily 1. The pass_limit +value may change from one pass to another. The expected total number of +passes is in total_passes, and the number of passes already completed is in +completed_passes. Thus the fraction of work completed may be estimated as + completed_passes + (pass_counter/pass_limit) + -------------------------------------------- + total_passes +ignoring the fact that the passes may not be equal amounts of work. + +When decompressing, pass_limit can even change within a pass, because it +depends on the number of scans in the JPEG file, which isn't always known in +advance. The computed fraction-of-work-done may jump suddenly (if the library +discovers it has overestimated the number of scans) or even decrease (in the +opposite case). It is not wise to put great faith in the work estimate. + +When using the decompressor's buffered-image mode, the progress monitor work +estimate is likely to be completely unhelpful, because the library has no way +to know how many output passes will be demanded of it. Currently, the library +sets total_passes based on the assumption that there will be one more output +pass if the input file end hasn't yet been read (jpeg_input_complete() isn't +TRUE), but no more output passes if the file end has been reached when the +output pass is started. This means that total_passes will rise as additional +output passes are requested. If you have a way of determining the input file +size, estimating progress based on the fraction of the file that's been read +will probably be more useful than using the library's value. + + +Memory management +----------------- + +This section covers some key facts about the JPEG library's built-in memory +manager. For more info, please read structure.doc's section about the memory +manager, and consult the source code if necessary. + +All memory and temporary file allocation within the library is done via the +memory manager. If necessary, you can replace the "back end" of the memory +manager to control allocation yourself (for example, if you don't want the +library to use malloc() and free() for some reason). + +Some data is allocated "permanently" and will not be freed until the JPEG +object is destroyed. Most data is allocated "per image" and is freed by +jpeg_finish_compress, jpeg_finish_decompress, or jpeg_abort. You can call the +memory manager yourself to allocate structures that will automatically be +freed at these times. Typical code for this is + ptr = (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, size); +Use JPOOL_PERMANENT to get storage that lasts as long as the JPEG object. +Use alloc_large instead of alloc_small for anything bigger than a few Kbytes. +There are also alloc_sarray and alloc_barray routines that automatically +build 2-D sample or block arrays. + +The library's minimum space requirements to process an image depend on the +image's width, but not on its height, because the library ordinarily works +with "strip" buffers that are as wide as the image but just a few rows high. +Some operating modes (eg, two-pass color quantization) require full-image +buffers. Such buffers are treated as "virtual arrays": only the current strip +need be in memory, and the rest can be swapped out to a temporary file. + +If you use the simplest memory manager back end (jmemnobs.c), then no +temporary files are used; virtual arrays are simply malloc()'d. Images bigger +than memory can be processed only if your system supports virtual memory. +The other memory manager back ends support temporary files of various flavors +and thus work in machines without virtual memory. They may also be useful on +Unix machines if you need to process images that exceed available swap space. + +When using temporary files, the library will make the in-memory buffers for +its virtual arrays just big enough to stay within a "maximum memory" setting. +Your application can set this limit by setting cinfo->mem->max_memory_to_use +after creating the JPEG object. (Of course, there is still a minimum size for +the buffers, so the max-memory setting is effective only if it is bigger than +the minimum space needed.) If you allocate any large structures yourself, you +must allocate them before jpeg_start_compress() or jpeg_start_decompress() in +order to have them counted against the max memory limit. Also keep in mind +that space allocated with alloc_small() is ignored, on the assumption that +it's too small to be worth worrying about; so a reasonable safety margin +should be left when setting max_memory_to_use. + +If you use the jmemname.c or jmemdos.c memory manager back end, it is +important to clean up the JPEG object properly to ensure that the temporary +files get deleted. (This is especially crucial with jmemdos.c, where the +"temporary files" may be extended-memory segments; if they are not freed, +DOS will require a reboot to recover the memory.) Thus, with these memory +managers, it's a good idea to provide a signal handler that will trap any +early exit from your program. The handler should call either jpeg_abort() +or jpeg_destroy() for any active JPEG objects. A handler is not needed with +jmemnobs.c, and shouldn't be necessary with jmemansi.c or jmemmac.c either, +since the C library is supposed to take care of deleting files made with +tmpfile(). + + +Memory usage +------------ + +Working memory requirements while performing compression or decompression +depend on image dimensions, image characteristics (such as colorspace and +JPEG process), and operating mode (application-selected options). + +As of v6b, the decompressor requires: + 1. About 24K in more-or-less-fixed-size data. This varies a bit depending + on operating mode and image characteristics (particularly color vs. + grayscale), but it doesn't depend on image dimensions. + 2. Strip buffers (of size proportional to the image width) for IDCT and + upsampling results. The worst case for commonly used sampling factors + is about 34 bytes * width in pixels for a color image. A grayscale image + only needs about 8 bytes per pixel column. + 3. A full-image DCT coefficient buffer is needed to decode a multi-scan JPEG + file (including progressive JPEGs), or whenever you select buffered-image + mode. This takes 2 bytes/coefficient. At typical 2x2 sampling, that's + 3 bytes per pixel for a color image. Worst case (1x1 sampling) requires + 6 bytes/pixel. For grayscale, figure 2 bytes/pixel. + 4. To perform 2-pass color quantization, the decompressor also needs a + 128K color lookup table and a full-image pixel buffer (3 bytes/pixel). +This does not count any memory allocated by the application, such as a +buffer to hold the final output image. + +The above figures are valid for 8-bit JPEG data precision and a machine with +32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and +quantization pixel buffer. The "fixed-size" data will be somewhat smaller +with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual +color spaces will require different amounts of space. + +The full-image coefficient and pixel buffers, if needed at all, do not +have to be fully RAM resident; you can have the library use temporary +files instead when the total memory usage would exceed a limit you set. +(But if your OS supports virtual memory, it's probably better to just use +jmemnobs and let the OS do the swapping.) + +The compressor's memory requirements are similar, except that it has no need +for color quantization. Also, it needs a full-image DCT coefficient buffer +if Huffman-table optimization is asked for, even if progressive mode is not +requested. + +If you need more detailed information about memory usage in a particular +situation, you can enable the MEM_STATS code in jmemmgr.c. + + +Library compile-time options +---------------------------- + +A number of compile-time options are available by modifying jmorecfg.h. + +The JPEG standard provides for both the baseline 8-bit DCT process and +a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define +BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be +larger than a char, so it affects the surrounding application's image data. +The sample applications cjpeg and djpeg can support 12-bit mode only for PPM +and GIF file formats; you must disable the other file formats to compile a +12-bit cjpeg or djpeg. (install.doc has more information about that.) +At present, a 12-bit library can handle *only* 12-bit images, not both +precisions. (If you need to include both 8- and 12-bit libraries in a single +application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES +for just one of the copies. You'd have to access the 8-bit and 12-bit copies +from separate application source files. This is untested ... if you try it, +we'd like to hear whether it works!) + +Note that a 12-bit library always compresses in Huffman optimization mode, +in order to generate valid Huffman tables. This is necessary because our +default Huffman tables only cover 8-bit data. If you need to output 12-bit +files in one pass, you'll have to supply suitable default Huffman tables. +You may also want to supply your own DCT quantization tables; the existing +quality-scaling code has been developed for 8-bit use, and probably doesn't +generate especially good tables for 12-bit. + +The maximum number of components (color channels) in the image is determined +by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we +expect that few applications will need more than four or so. + +On machines with unusual data type sizes, you may be able to improve +performance or reduce memory space by tweaking the various typedefs in +jmorecfg.h. In particular, on some RISC CPUs, access to arrays of "short"s +is quite slow; consider trading memory for speed by making JCOEF, INT16, and +UINT16 be "int" or "unsigned int". UINT8 is also a candidate to become int. +You probably don't want to make JSAMPLE be int unless you have lots of memory +to burn. + +You can reduce the size of the library by compiling out various optional +functions. To do this, undefine xxx_SUPPORTED symbols as necessary. + +You can also save a few K by not having text error messages in the library; +the standard error message table occupies about 5Kb. This is particularly +reasonable for embedded applications where there's no good way to display +a message anyway. To do this, remove the creation of the message table +(jpeg_std_message_table[]) from jerror.c, and alter format_message to do +something reasonable without it. You could output the numeric value of the +message code number, for example. If you do this, you can also save a couple +more K by modifying the TRACEMSn() macros in jerror.h to expand to nothing; +you don't need trace capability anyway, right? + + +Portability considerations +-------------------------- + +The JPEG library has been written to be extremely portable; the sample +applications cjpeg and djpeg are slightly less so. This section summarizes +the design goals in this area. (If you encounter any bugs that cause the +library to be less portable than is claimed here, we'd appreciate hearing +about them.) + +The code works fine on ANSI C, C++, and pre-ANSI C compilers, using any of +the popular system include file setups, and some not-so-popular ones too. +See install.doc for configuration procedures. + +The code is not dependent on the exact sizes of the C data types. As +distributed, we make the assumptions that + char is at least 8 bits wide + short is at least 16 bits wide + int is at least 16 bits wide + long is at least 32 bits wide +(These are the minimum requirements of the ANSI C standard.) Wider types will +work fine, although memory may be used inefficiently if char is much larger +than 8 bits or short is much bigger than 16 bits. The code should work +equally well with 16- or 32-bit ints. + +In a system where these assumptions are not met, you may be able to make the +code work by modifying the typedefs in jmorecfg.h. However, you will probably +have difficulty if int is less than 16 bits wide, since references to plain +int abound in the code. + +char can be either signed or unsigned, although the code runs faster if an +unsigned char type is available. If char is wider than 8 bits, you will need +to redefine JOCTET and/or provide custom data source/destination managers so +that JOCTET represents exactly 8 bits of data on external storage. + +The JPEG library proper does not assume ASCII representation of characters. +But some of the image file I/O modules in cjpeg/djpeg do have ASCII +dependencies in file-header manipulation; so does cjpeg's select_file_type() +routine. + +The JPEG library does not rely heavily on the C library. In particular, C +stdio is used only by the data source/destination modules and the error +handler, all of which are application-replaceable. (cjpeg/djpeg are more +heavily dependent on stdio.) malloc and free are called only from the memory +manager "back end" module, so you can use a different memory allocator by +replacing that one file. + +The code generally assumes that C names must be unique in the first 15 +characters. However, global function names can be made unique in the +first 6 characters by defining NEED_SHORT_EXTERNAL_NAMES. + +More info about porting the code may be gleaned by reading jconfig.doc, +jmorecfg.h, and jinclude.h. + + +Notes for MS-DOS implementors +----------------------------- + +The IJG code is designed to work efficiently in 80x86 "small" or "medium" +memory models (i.e., data pointers are 16 bits unless explicitly declared +"far"; code pointers can be either size). You may be able to use small +model to compile cjpeg or djpeg by itself, but you will probably have to use +medium model for any larger application. This won't make much difference in +performance. You *will* take a noticeable performance hit if you use a +large-data memory model (perhaps 10%-25%), and you should avoid "huge" model +if at all possible. + +The JPEG library typically needs 2Kb-3Kb of stack space. It will also +malloc about 20K-30K of near heap space while executing (and lots of far +heap, but that doesn't count in this calculation). This figure will vary +depending on selected operating mode, and to a lesser extent on image size. +There is also about 5Kb-6Kb of constant data which will be allocated in the +near data segment (about 4Kb of this is the error message table). +Thus you have perhaps 20K available for other modules' static data and near +heap space before you need to go to a larger memory model. The C library's +static data will account for several K of this, but that still leaves a good +deal for your needs. (If you are tight on space, you could reduce the sizes +of the I/O buffers allocated by jdatasrc.c and jdatadst.c, say from 4K to +1K. Another possibility is to move the error message table to far memory; +this should be doable with only localized hacking on jerror.c.) + +About 2K of the near heap space is "permanent" memory that will not be +released until you destroy the JPEG object. This is only an issue if you +save a JPEG object between compression or decompression operations. + +Far data space may also be a tight resource when you are dealing with large +images. The most memory-intensive case is decompression with two-pass color +quantization, or single-pass quantization to an externally supplied color +map. This requires a 128Kb color lookup table plus strip buffers amounting +to about 40 bytes per column for typical sampling ratios (eg, about 25600 +bytes for a 640-pixel-wide image). You may not be able to process wide +images if you have large data structures of your own. + +Of course, all of these concerns vanish if you use a 32-bit flat-memory-model +compiler, such as DJGPP or Watcom C. We highly recommend flat model if you +can use it; the JPEG library is significantly faster in flat model. diff --git a/User/system/lib/lcd/gui/JPEG/Doc/structure.txt b/User/system/lib/lcd/gui/JPEG/Doc/structure.txt new file mode 100644 index 0000000..492f944 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/Doc/structure.txt @@ -0,0 +1,969 @@ +Notes on the JPEG Library +========================= + +This JPEG module is derived from work of the IJG (see below), +and may be copyied and redistributed according to the +conditions under LEGAL ISSUES in ReadMe.txt. +The code has been modified in a variety of ways; +some code (GUI_JPEG.c) has been added to as "glue" to make it +work with emWin. +The original text of this file is below; some things stated may no +longer be correct for the code that ships with emWin. +However, we decided to leave it here because it explains the basic +concepts and structure of JPEG code. + +Segger Microcontroller Systeme GmbH, June 2003 +==================================================================== + + + + + +IJG JPEG LIBRARY: SYSTEM ARCHITECTURE + +Copyright (C) 1991-1995, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file provides an overview of the architecture of the IJG JPEG software; +that is, the functions of the various modules in the system and the interfaces +between modules. For more precise details about any data structure or calling +convention, see the include files and comments in the source code. + +We assume that the reader is already somewhat familiar with the JPEG standard. +The README file includes references for learning about JPEG. The file +libjpeg.doc describes the library from the viewpoint of an application +programmer using the library; it's best to read that file before this one. +Also, the file coderules.doc describes the coding style conventions we use. + +In this document, JPEG-specific terminology follows the JPEG standard: + A "component" means a color channel, e.g., Red or Luminance. + A "sample" is a single component value (i.e., one number in the image data). + A "coefficient" is a frequency coefficient (a DCT transform output number). + A "block" is an 8x8 group of samples or coefficients. + An "MCU" (minimum coded unit) is an interleaved set of blocks of size + determined by the sampling factors, or a single block in a + noninterleaved scan. +We do not use the terms "pixel" and "sample" interchangeably. When we say +pixel, we mean an element of the full-size image, while a sample is an element +of the downsampled image. Thus the number of samples may vary across +components while the number of pixels does not. (This terminology is not used +rigorously throughout the code, but it is used in places where confusion would +otherwise result.) + + +*** System features *** + +The IJG distribution contains two parts: + * A subroutine library for JPEG compression and decompression. + * cjpeg/djpeg, two sample applications that use the library to transform + JFIF JPEG files to and from several other image formats. +cjpeg/djpeg are of no great intellectual complexity: they merely add a simple +command-line user interface and I/O routines for several uncompressed image +formats. This document concentrates on the library itself. + +We desire the library to be capable of supporting all JPEG baseline, extended +sequential, and progressive DCT processes. Hierarchical processes are not +supported. + +The library does not support the lossless (spatial) JPEG process. Lossless +JPEG shares little or no code with lossy JPEG, and would normally be used +without the extensive pre- and post-processing provided by this library. +We feel that lossless JPEG is better handled by a separate library. + +Within these limits, any set of compression parameters allowed by the JPEG +spec should be readable for decompression. (We can be more restrictive about +what formats we can generate.) Although the system design allows for all +parameter values, some uncommon settings are not yet implemented and may +never be; nonintegral sampling ratios are the prime example. Furthermore, +we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a +run-time option, because most machines can store 8-bit pixels much more +compactly than 12-bit. + +For legal reasons, JPEG arithmetic coding is not currently supported, but +extending the library to include it would be straightforward. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, libtiff uses this +library to implement JPEG compression within the TIFF file format.) + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. This code can be omitted if not needed. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + + +*** Portability issues *** + +Portability is an essential requirement for the library. The key portability +issues that show up at the level of system architecture are: + +1. Memory usage. We want the code to be able to run on PC-class machines +with limited memory. Images should therefore be processed sequentially (in +strips), to avoid holding the whole image in memory at once. Where a +full-image buffer is necessary, we should be able to use either virtual memory +or temporary files. + +2. Near/far pointer distinction. To run efficiently on 80x86 machines, the +code should distinguish "small" objects (kept in near data space) from +"large" ones (kept in far data space). This is an annoying restriction, but +fortunately it does not impact code quality for less brain-damaged machines, +and the source code clutter turns out to be minimal with sufficient use of +pointer typedefs. + +3. Data precision. We assume that "char" is at least 8 bits, "short" and +"int" at least 16, "long" at least 32. The code will work fine with larger +data sizes, although memory may be used inefficiently in some cases. However, +the JPEG compressed datastream must ultimately appear on external storage as a +sequence of 8-bit bytes if it is to conform to the standard. This may pose a +problem on machines where char is wider than 8 bits. The library represents +compressed data as an array of values of typedef JOCTET. If no data type +exactly 8 bits wide is available, custom data source and data destination +modules must be written to unpack and pack the chosen JOCTET datatype into +8-bit external representation. + + +*** System overview *** + +The compressor and decompressor are each divided into two main sections: +the JPEG compressor or decompressor proper, and the preprocessing or +postprocessing functions. The interface between these two sections is the +image data that the official JPEG spec regards as its input or output: this +data is in the colorspace to be used for compression, and it is downsampled +to the sampling factors to be used. The preprocessing and postprocessing +steps are responsible for converting a normal image representation to or from +this form. (Those few applications that want to deal with YCbCr downsampled +data can skip the preprocessing or postprocessing step.) + +Looking more closely, the compressor library contains the following main +elements: + + Preprocessing: + * Color space conversion (e.g., RGB to YCbCr). + * Edge expansion and downsampling. Optionally, this step can do simple + smoothing --- this is often helpful for low-quality source data. + JPEG proper: + * MCU assembly, DCT, quantization. + * Entropy coding (sequential or progressive, Huffman or arithmetic). + +In addition to these modules we need overall control, marker generation, +and support code (memory management & error handling). There is also a +module responsible for physically writing the output data --- typically +this is just an interface to fwrite(), but some applications may need to +do something else with the data. + +The decompressor library contains the following main elements: + + JPEG proper: + * Entropy decoding (sequential or progressive, Huffman or arithmetic). + * Dequantization, inverse DCT, MCU disassembly. + Postprocessing: + * Upsampling. Optionally, this step may be able to do more general + rescaling of the image. + * Color space conversion (e.g., YCbCr to RGB). This step may also + provide gamma adjustment [ currently it does not ]. + * Optional color quantization (e.g., reduction to 256 colors). + * Optional color precision reduction (e.g., 24-bit to 15-bit color). + [This feature is not currently implemented.] + +We also need overall control, marker parsing, and a data source module. +The support code (memory management & error handling) can be shared with +the compression half of the library. + +There may be several implementations of each of these elements, particularly +in the decompressor, where a wide range of speed/quality tradeoffs is very +useful. It must be understood that some of the best speedups involve +merging adjacent steps in the pipeline. For example, upsampling, color space +conversion, and color quantization might all be done at once when using a +low-quality ordered-dither technique. The system architecture is designed to +allow such merging where appropriate. + + +Note: it is convenient to regard edge expansion (padding to block boundaries) +as a preprocessing/postprocessing function, even though the JPEG spec includes +it in compression/decompression. We do this because downsampling/upsampling +can be simplified a little if they work on padded data: it's not necessary to +have special cases at the right and bottom edges. Therefore the interface +buffer is always an integral number of blocks wide and high, and we expect +compression preprocessing to pad the source data properly. Padding will occur +only to the next block (8-sample) boundary. In an interleaved-scan situation, +additional dummy blocks may be used to fill out MCUs, but the MCU assembly and +disassembly logic will create or discard these blocks internally. (This is +advantageous for speed reasons, since we avoid DCTing the dummy blocks. +It also permits a small reduction in file size, because the compressor can +choose dummy block contents so as to minimize their size in compressed form. +Finally, it makes the interface buffer specification independent of whether +the file is actually interleaved or not.) Applications that wish to deal +directly with the downsampled data must provide similar buffering and padding +for odd-sized images. + + +*** Poor man's object-oriented programming *** + +It should be clear by now that we have a lot of quasi-independent processing +steps, many of which have several possible behaviors. To avoid cluttering the +code with lots of switch statements, we use a simple form of object-style +programming to separate out the different possibilities. + +For example, two different color quantization algorithms could be implemented +as two separate modules that present the same external interface; at runtime, +the calling code will access the proper module indirectly through an "object". + +We can get the limited features we need while staying within portable C. +The basic tool is a function pointer. An "object" is just a struct +containing one or more function pointer fields, each of which corresponds to +a method name in real object-oriented languages. During initialization we +fill in the function pointers with references to whichever module we have +determined we need to use in this run. Then invocation of the module is done +by indirecting through a function pointer; on most machines this is no more +expensive than a switch statement, which would be the only other way of +making the required run-time choice. The really significant benefit, of +course, is keeping the source code clean and well structured. + +We can also arrange to have private storage that varies between different +implementations of the same kind of object. We do this by making all the +module-specific object structs be separately allocated entities, which will +be accessed via pointers in the master compression or decompression struct. +The "public" fields or methods for a given kind of object are specified by +a commonly known struct. But a module's initialization code can allocate +a larger struct that contains the common struct as its first member, plus +additional private fields. With appropriate pointer casting, the module's +internal functions can access these private fields. (For a simple example, +see jdatadst.c, which implements the external interface specified by struct +jpeg_destination_mgr, but adds extra fields.) + +(Of course this would all be a lot easier if we were using C++, but we are +not yet prepared to assume that everyone has a C++ compiler.) + +An important benefit of this scheme is that it is easy to provide multiple +versions of any method, each tuned to a particular case. While a lot of +precalculation might be done to select an optimal implementation of a method, +the cost per invocation is constant. For example, the upsampling step might +have a "generic" method, plus one or more "hardwired" methods for the most +popular sampling factors; the hardwired methods would be faster because they'd +use straight-line code instead of for-loops. The cost to determine which +method to use is paid only once, at startup, and the selection criteria are +hidden from the callers of the method. + +This plan differs a little bit from usual object-oriented structures, in that +only one instance of each object class will exist during execution. The +reason for having the class structure is that on different runs we may create +different instances (choose to execute different modules). You can think of +the term "method" as denoting the common interface presented by a particular +set of interchangeable functions, and "object" as denoting a group of related +methods, or the total shared interface behavior of a group of modules. + + +*** Overall control structure *** + +We previously mentioned the need for overall control logic in the compression +and decompression libraries. In IJG implementations prior to v5, overall +control was mostly provided by "pipeline control" modules, which proved to be +large, unwieldy, and hard to understand. To improve the situation, the +control logic has been subdivided into multiple modules. The control modules +consist of: + +1. Master control for module selection and initialization. This has two +responsibilities: + + 1A. Startup initialization at the beginning of image processing. + The individual processing modules to be used in this run are selected + and given initialization calls. + + 1B. Per-pass control. This determines how many passes will be performed + and calls each active processing module to configure itself + appropriately at the beginning of each pass. End-of-pass processing, + where necessary, is also invoked from the master control module. + + Method selection is partially distributed, in that a particular processing + module may contain several possible implementations of a particular method, + which it will select among when given its initialization call. The master + control code need only be concerned with decisions that affect more than + one module. + +2. Data buffering control. A separate control module exists for each + inter-processing-step data buffer. This module is responsible for + invoking the processing steps that write or read that data buffer. + +Each buffer controller sees the world as follows: + +input data => processing step A => buffer => processing step B => output data + | | | + ------------------ controller ------------------ + +The controller knows the dataflow requirements of steps A and B: how much data +they want to accept in one chunk and how much they output in one chunk. Its +function is to manage its buffer and call A and B at the proper times. + +A data buffer control module may itself be viewed as a processing step by a +higher-level control module; thus the control modules form a binary tree with +elementary processing steps at the leaves of the tree. + +The control modules are objects. A considerable amount of flexibility can +be had by replacing implementations of a control module. For example: +* Merging of adjacent steps in the pipeline is done by replacing a control + module and its pair of processing-step modules with a single processing- + step module. (Hence the possible merges are determined by the tree of + control modules.) +* In some processing modes, a given interstep buffer need only be a "strip" + buffer large enough to accommodate the desired data chunk sizes. In other + modes, a full-image buffer is needed and several passes are required. + The control module determines which kind of buffer is used and manipulates + virtual array buffers as needed. One or both processing steps may be + unaware of the multi-pass behavior. + +In theory, we might be able to make all of the data buffer controllers +interchangeable and provide just one set of implementations for all. In +practice, each one contains considerable special-case processing for its +particular job. The buffer controller concept should be regarded as an +overall system structuring principle, not as a complete description of the +task performed by any one controller. + + +*** Compression object structure *** + +Here is a sketch of the logical structure of the JPEG compression library: + + |-- Colorspace conversion + |-- Preprocessing controller --| + | |-- Downsampling +Main controller --| + | |-- Forward DCT, quantize + |-- Coefficient controller --| + |-- Entropy encoding + +This sketch also describes the flow of control (subroutine calls) during +typical image data processing. Each of the components shown in the diagram is +an "object" which may have several different implementations available. One +or more source code files contain the actual implementation(s) of each object. + +The objects shown above are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the preprocessed input data. This controller invokes preprocessing to + fill the subsampled-data buffer, and JPEG compression to empty it. There is + usually no need for a full-image buffer here; a strip buffer is adequate. + +* Preprocessing controller: buffer controller for the downsampling input data + buffer, which lies between colorspace conversion and downsampling. Note + that a unified conversion/downsampling module would probably replace this + controller entirely. + +* Colorspace conversion: converts application image data into the desired + JPEG color space; also changes the data from pixel-interleaved layout to + separate component planes. Processes one pixel row at a time. + +* Downsampling: performs reduction of chroma components as required. + Optionally may perform pixel-level smoothing as well. Processes a "row + group" at a time, where a row group is defined as Vmax pixel rows of each + component before downsampling, and Vk sample rows afterwards (remember Vk + differs across components). Some downsampling or smoothing algorithms may + require context rows above and below the current row group; the + preprocessing controller is responsible for supplying these rows via proper + buffering. The downsampler is responsible for edge expansion at the right + edge (i.e., extending each sample row to a multiple of 8 samples); but the + preprocessing controller is responsible for vertical edge expansion (i.e., + duplicating the bottom sample row as needed to make a multiple of 8 rows). + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU assembly, including insertion of dummy DCT + blocks when needed at the right or bottom edge. When performing + Huffman-code optimization or emitting a multiscan JPEG file, this + controller is responsible for buffering the full image. The equivalent of + one fully interleaved MCU row of subsampled data is processed per call, + even when the JPEG file is noninterleaved. + +* Forward DCT and quantization: Perform DCT, quantize, and emit coefficients. + Works on one or more DCT blocks at a time. (Note: the coefficients are now + emitted in normal array order, which the entropy encoder is expected to + convert to zigzag order as necessary. Prior versions of the IJG code did + the conversion to zigzag order within the quantization step.) + +* Entropy encoding: Perform Huffman or arithmetic entropy coding and emit the + coded data to the data destination module. Works on one MCU per call. + For progressive JPEG, the same DCT blocks are fed to the entropy coder + during each pass, and the coder must emit the appropriate subset of + coefficients. + +In addition to the above objects, the compression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. + +* Marker writing: generates JPEG markers (except for RSTn, which is emitted + by the entropy encoder when needed). + +* Data destination manager: writes the output JPEG datastream to its final + destination (e.g., a file). The destination manager supplied with the + library knows how to write to a stdio stream; for other behaviors, the + surrounding application may provide its own destination manager. + +* Memory manager: allocates and releases memory, controls virtual arrays + (with backing store management, where required). + +* Error handler: performs formatting and output of error and trace messages; + determines handling of nonfatal errors. The surrounding application may + override some or all of this object's methods to change error handling. + +* Progress monitor: supports output of "percent-done" progress reports. + This object represents an optional callback to the surrounding application: + if wanted, it must be supplied by the application. + +The error handler, destination manager, and progress monitor objects are +defined as separate objects in order to simplify application-specific +customization of the JPEG library. A surrounding application may override +individual methods or supply its own all-new implementation of one of these +objects. The object interfaces for these objects are therefore treated as +part of the application interface of the library, whereas the other objects +are internal to the library. + +The error handler and memory manager are shared by JPEG compression and +decompression; the progress monitor, if used, may be shared as well. + + +*** Decompression object structure *** + +Here is a sketch of the logical structure of the JPEG decompression library: + + |-- Entropy decoding + |-- Coefficient controller --| + | |-- Dequantize, Inverse DCT +Main controller --| + | |-- Upsampling + |-- Postprocessing controller --| |-- Colorspace conversion + |-- Color quantization + |-- Color precision reduction + +As before, this diagram also represents typical control flow. The objects +shown are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the output of JPEG decompression proper. This controller's primary + task is to feed the postprocessing procedure. Some upsampling algorithms + may require context rows above and below the current row group; when this + is true, the main controller is responsible for managing its buffer so as + to make context rows available. In the current design, the main buffer is + always a strip buffer; a full-image buffer is never required. + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU disassembly, including deletion of any dummy + DCT blocks at the right or bottom edge. When reading a multiscan JPEG + file, this controller is responsible for buffering the full image. + (Buffering DCT coefficients, rather than samples, is necessary to support + progressive JPEG.) The equivalent of one fully interleaved MCU row of + subsampled data is processed per call, even when the source JPEG file is + noninterleaved. + +* Entropy decoding: Read coded data from the data source module and perform + Huffman or arithmetic entropy decoding. Works on one MCU per call. + For progressive JPEG decoding, the coefficient controller supplies the prior + coefficients of each MCU (initially all zeroes), which the entropy decoder + modifies in each scan. + +* Dequantization and inverse DCT: like it says. Note that the coefficients + buffered by the coefficient controller have NOT been dequantized; we + merge dequantization and inverse DCT into a single step for speed reasons. + When scaled-down output is asked for, simplified DCT algorithms may be used + that emit only 1x1, 2x2, or 4x4 samples per DCT block, not the full 8x8. + Works on one DCT block at a time. + +* Postprocessing controller: buffer controller for the color quantization + input buffer, when quantization is in use. (Without quantization, this + controller just calls the upsampler.) For two-pass quantization, this + controller is responsible for buffering the full-image data. + +* Upsampling: restores chroma components to full size. (May support more + general output rescaling, too. Note that if undersized DCT outputs have + been emitted by the DCT module, this module must adjust so that properly + sized outputs are created.) Works on one row group at a time. This module + also calls the color conversion module, so its top level is effectively a + buffer controller for the upsampling->color conversion buffer. However, in + all but the highest-quality operating modes, upsampling and color + conversion are likely to be merged into a single step. + +* Colorspace conversion: convert from JPEG color space to output color space, + and change data layout from separate component planes to pixel-interleaved. + Works on one pixel row at a time. + +* Color quantization: reduce the data to colormapped form, using either an + externally specified colormap or an internally generated one. This module + is not used for full-color output. Works on one pixel row at a time; may + require two passes to generate a color map. Note that the output will + always be a single component representing colormap indexes. In the current + design, the output values are JSAMPLEs, so an 8-bit compilation cannot + quantize to more than 256 colors. This is unlikely to be a problem in + practice. + +* Color reduction: this module handles color precision reduction, e.g., + generating 15-bit color (5 bits/primary) from JPEG's 24-bit output. + Not quite clear yet how this should be handled... should we merge it with + colorspace conversion??? + +Note that some high-speed operating modes might condense the entire +postprocessing sequence to a single module (upsample, color convert, and +quantize in one step). + +In addition to the above objects, the decompression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. This is subdivided into + input and output control: jdinput.c controls only input-side processing, + while jdmaster.c handles overall initialization and output-side control. + +* Marker reading: decodes JPEG markers (except for RSTn). + +* Data source manager: supplies the input JPEG datastream. The source + manager supplied with the library knows how to read from a stdio stream; + for other behaviors, the surrounding application may provide its own source + manager. + +* Memory manager: same as for compression library. + +* Error handler: same as for compression library. + +* Progress monitor: same as for compression library. + +As with compression, the data source manager, error handler, and progress +monitor are candidates for replacement by a surrounding application. + + +*** Decompression input and output separation *** + +To support efficient incremental display of progressive JPEG files, the +decompressor is divided into two sections that can run independently: + +1. Data input includes marker parsing, entropy decoding, and input into the + coefficient controller's DCT coefficient buffer. Note that this + processing is relatively cheap and fast. + +2. Data output reads from the DCT coefficient buffer and performs the IDCT + and all postprocessing steps. + +For a progressive JPEG file, the data input processing is allowed to get +arbitrarily far ahead of the data output processing. (This occurs only +if the application calls jpeg_consume_input(); otherwise input and output +run in lockstep, since the input section is called only when the output +section needs more data.) In this way the application can avoid making +extra display passes when data is arriving faster than the display pass +can run. Furthermore, it is possible to abort an output pass without +losing anything, since the coefficient buffer is read-only as far as the +output section is concerned. See libjpeg.doc for more detail. + +A full-image coefficient array is only created if the JPEG file has multiple +scans (or if the application specifies buffered-image mode anyway). When +reading a single-scan file, the coefficient controller normally creates only +a one-MCU buffer, so input and output processing must run in lockstep in this +case. jpeg_consume_input() is effectively a no-op in this situation. + +The main impact of dividing the decompressor in this fashion is that we must +be very careful with shared variables in the cinfo data structure. Each +variable that can change during the course of decompression must be +classified as belonging to data input or data output, and each section must +look only at its own variables. For example, the data output section may not +depend on any of the variables that describe the current scan in the JPEG +file, because these may change as the data input section advances into a new +scan. + +The progress monitor is (somewhat arbitrarily) defined to treat input of the +file as one pass when buffered-image mode is not used, and to ignore data +input work completely when buffered-image mode is used. Note that the +library has no reliable way to predict the number of passes when dealing +with a progressive JPEG file, nor can it predict the number of output passes +in buffered-image mode. So the work estimate is inherently bogus anyway. + +No comparable division is currently made in the compression library, because +there isn't any real need for it. + + +*** Data formats *** + +Arrays of pixel sample values use the following data structure: + + typedef something JSAMPLE; a pixel component value, 0..MAXJSAMPLE + typedef JSAMPLE *JSAMPROW; ptr to a row of samples + typedef JSAMPROW *JSAMPARRAY; ptr to a list of rows + typedef JSAMPARRAY *JSAMPIMAGE; ptr to a list of color-component arrays + +The basic element type JSAMPLE will typically be one of unsigned char, +(signed) char, or short. Short will be used if samples wider than 8 bits are +to be supported (this is a compile-time option). Otherwise, unsigned char is +used if possible. If the compiler only supports signed chars, then it is +necessary to mask off the value when reading. Thus, all reads of JSAMPLE +values must be coded as "GETJSAMPLE(value)", where the macro will be defined +as "((value) & 0xFF)" on signed-char machines and "((int) (value))" elsewhere. + +With these conventions, JSAMPLE values can be assumed to be >= 0. This helps +simplify correct rounding during downsampling, etc. The JPEG standard's +specification that sample values run from -128..127 is accommodated by +subtracting 128 just as the sample value is copied into the source array for +the DCT step (this will be an array of signed ints). Similarly, during +decompression the output of the IDCT step will be immediately shifted back to +0..255. (NB: different values are required when 12-bit samples are in use. +The code is written in terms of MAXJSAMPLE and CENTERJSAMPLE, which will be +defined as 255 and 128 respectively in an 8-bit implementation, and as 4095 +and 2048 in a 12-bit implementation.) + +We use a pointer per row, rather than a two-dimensional JSAMPLE array. This +choice costs only a small amount of memory and has several benefits: +* Code using the data structure doesn't need to know the allocated width of + the rows. This simplifies edge expansion/compression, since we can work + in an array that's wider than the logical picture width. +* Indexing doesn't require multiplication; this is a performance win on many + machines. +* Arrays with more than 64K total elements can be supported even on machines + where malloc() cannot allocate chunks larger than 64K. +* The rows forming a component array may be allocated at different times + without extra copying. This trick allows some speedups in smoothing steps + that need access to the previous and next rows. + +Note that each color component is stored in a separate array; we don't use the +traditional layout in which the components of a pixel are stored together. +This simplifies coding of modules that work on each component independently, +because they don't need to know how many components there are. Furthermore, +we can read or write each component to a temporary file independently, which +is helpful when dealing with noninterleaved JPEG files. + +In general, a specific sample value is accessed by code such as + GETJSAMPLE(image[colorcomponent][row][col]) +where col is measured from the image left edge, but row is measured from the +first sample row currently in memory. Either of the first two indexings can +be precomputed by copying the relevant pointer. + + +Since most image-processing applications prefer to work on images in which +the components of a pixel are stored together, the data passed to or from the +surrounding application uses the traditional convention: a single pixel is +represented by N consecutive JSAMPLE values, and an image row is an array of +(# of color components)*(image width) JSAMPLEs. One or more rows of data can +be represented by a pointer of type JSAMPARRAY in this scheme. This scheme is +converted to component-wise storage inside the JPEG library. (Applications +that want to skip JPEG preprocessing or postprocessing will have to contend +with component-wise storage.) + + +Arrays of DCT-coefficient values use the following data structure: + + typedef short JCOEF; a 16-bit signed integer + typedef JCOEF JBLOCK[DCTSIZE2]; an 8x8 block of coefficients + typedef JBLOCK *JBLOCKROW; ptr to one horizontal row of 8x8 blocks + typedef JBLOCKROW *JBLOCKARRAY; ptr to a list of such rows + typedef JBLOCKARRAY *JBLOCKIMAGE; ptr to a list of color component arrays + +The underlying type is at least a 16-bit signed integer; while "short" is big +enough on all machines of interest, on some machines it is preferable to use +"int" for speed reasons, despite the storage cost. Coefficients are grouped +into 8x8 blocks (but we always use #defines DCTSIZE and DCTSIZE2 rather than +"8" and "64"). + +The contents of a coefficient block may be in either "natural" or zigzagged +order, and may be true values or divided by the quantization coefficients, +depending on where the block is in the processing pipeline. In the current +library, coefficient blocks are kept in natural order everywhere; the entropy +codecs zigzag or dezigzag the data as it is written or read. The blocks +contain quantized coefficients everywhere outside the DCT/IDCT subsystems. +(This latter decision may need to be revisited to support variable +quantization a la JPEG Part 3.) + +Notice that the allocation unit is now a row of 8x8 blocks, corresponding to +eight rows of samples. Otherwise the structure is much the same as for +samples, and for the same reasons. + +On machines where malloc() can't handle a request bigger than 64Kb, this data +structure limits us to rows of less than 512 JBLOCKs, or a picture width of +4000+ pixels. This seems an acceptable restriction. + + +On 80x86 machines, the bottom-level pointer types (JSAMPROW and JBLOCKROW) +must be declared as "far" pointers, but the upper levels can be "near" +(implying that the pointer lists are allocated in the DS segment). +We use a #define symbol FAR, which expands to the "far" keyword when +compiling on 80x86 machines and to nothing elsewhere. + + +*** Suspendable processing *** + +In some applications it is desirable to use the JPEG library as an +incremental, memory-to-memory filter. In this situation the data source or +destination may be a limited-size buffer, and we can't rely on being able to +empty or refill the buffer at arbitrary times. Instead the application would +like to have control return from the library at buffer overflow/underrun, and +then resume compression or decompression at a later time. + +This scenario is supported for simple cases. (For anything more complex, we +recommend that the application "bite the bullet" and develop real multitasking +capability.) The libjpeg.doc file goes into more detail about the usage and +limitations of this capability; here we address the implications for library +structure. + +The essence of the problem is that the entropy codec (coder or decoder) must +be prepared to stop at arbitrary times. In turn, the controllers that call +the entropy codec must be able to stop before having produced or consumed all +the data that they normally would handle in one call. That part is reasonably +straightforward: we make the controller call interfaces include "progress +counters" which indicate the number of data chunks successfully processed, and +we require callers to test the counter rather than just assume all of the data +was processed. + +Rather than trying to restart at an arbitrary point, the current Huffman +codecs are designed to restart at the beginning of the current MCU after a +suspension due to buffer overflow/underrun. At the start of each call, the +codec's internal state is loaded from permanent storage (in the JPEG object +structures) into local variables. On successful completion of the MCU, the +permanent state is updated. (This copying is not very expensive, and may even +lead to *improved* performance if the local variables can be registerized.) +If a suspension occurs, the codec simply returns without updating the state, +thus effectively reverting to the start of the MCU. Note that this implies +leaving some data unprocessed in the source/destination buffer (ie, the +compressed partial MCU). The data source/destination module interfaces are +specified so as to make this possible. This also implies that the data buffer +must be large enough to hold a worst-case compressed MCU; a couple thousand +bytes should be enough. + +In a successive-approximation AC refinement scan, the progressive Huffman +decoder has to be able to undo assignments of newly nonzero coefficients if it +suspends before the MCU is complete, since decoding requires distinguishing +previously-zero and previously-nonzero coefficients. This is a bit tedious +but probably won't have much effect on performance. Other variants of Huffman +decoding need not worry about this, since they will just store the same values +again if forced to repeat the MCU. + +This approach would probably not work for an arithmetic codec, since its +modifiable state is quite large and couldn't be copied cheaply. Instead it +would have to suspend and resume exactly at the point of the buffer end. + +The JPEG marker reader is designed to cope with suspension at an arbitrary +point. It does so by backing up to the start of the marker parameter segment, +so the data buffer must be big enough to hold the largest marker of interest. +Again, a couple KB should be adequate. (A special "skip" convention is used +to bypass COM and APPn markers, so these can be larger than the buffer size +without causing problems; otherwise a 64K buffer would be needed in the worst +case.) + +The JPEG marker writer currently does *not* cope with suspension. I feel that +this is not necessary; it is much easier simply to require the application to +ensure there is enough buffer space before starting. (An empty 2K buffer is +more than sufficient for the header markers; and ensuring there are a dozen or +two bytes available before calling jpeg_finish_compress() will suffice for the +trailer.) This would not work for writing multi-scan JPEG files, but +we simply do not intend to support that capability with suspension. + + +*** Memory manager services *** + +The JPEG library's memory manager controls allocation and deallocation of +memory, and it manages large "virtual" data arrays on machines where the +operating system does not provide virtual memory. Note that the same +memory manager serves both compression and decompression operations. + +In all cases, allocated objects are tied to a particular compression or +decompression master record, and they will be released when that master +record is destroyed. + +The memory manager does not provide explicit deallocation of objects. +Instead, objects are created in "pools" of free storage, and a whole pool +can be freed at once. This approach helps prevent storage-leak bugs, and +it speeds up operations whenever malloc/free are slow (as they often are). +The pools can be regarded as lifetime identifiers for objects. Two +pools/lifetimes are defined: + * JPOOL_PERMANENT lasts until master record is destroyed + * JPOOL_IMAGE lasts until done with image (JPEG datastream) +Permanent lifetime is used for parameters and tables that should be carried +across from one datastream to another; this includes all application-visible +parameters. Image lifetime is used for everything else. (A third lifetime, +JPOOL_PASS = one processing pass, was originally planned. However it was +dropped as not being worthwhile. The actual usage patterns are such that the +peak memory usage would be about the same anyway; and having per-pass storage +substantially complicates the virtual memory allocation rules --- see below.) + +The memory manager deals with three kinds of object: +1. "Small" objects. Typically these require no more than 10K-20K total. +2. "Large" objects. These may require tens to hundreds of K depending on + image size. Semantically they behave the same as small objects, but we + distinguish them for two reasons: + * On MS-DOS machines, large objects are referenced by FAR pointers, + small objects by NEAR pointers. + * Pool allocation heuristics may differ for large and small objects. + Note that individual "large" objects cannot exceed the size allowed by + type size_t, which may be 64K or less on some machines. +3. "Virtual" objects. These are large 2-D arrays of JSAMPLEs or JBLOCKs + (typically large enough for the entire image being processed). The + memory manager provides stripwise access to these arrays. On machines + without virtual memory, the rest of the array may be swapped out to a + temporary file. + +(Note: JSAMPARRAY and JBLOCKARRAY data structures are a combination of large +objects for the data proper and small objects for the row pointers. For +convenience and speed, the memory manager provides single routines to create +these structures. Similarly, virtual arrays include a small control block +and a JSAMPARRAY or JBLOCKARRAY working buffer, all created with one call.) + +In the present implementation, virtual arrays are only permitted to have image +lifespan. (Permanent lifespan would not be reasonable, and pass lifespan is +not very useful since a virtual array's raison d'etre is to store data for +multiple passes through the image.) We also expect that only "small" objects +will be given permanent lifespan, though this restriction is not required by +the memory manager. + +In a non-virtual-memory machine, some performance benefit can be gained by +making the in-memory buffers for virtual arrays be as large as possible. +(For small images, the buffers might fit entirely in memory, so blind +swapping would be very wasteful.) The memory manager will adjust the height +of the buffers to fit within a prespecified maximum memory usage. In order +to do this in a reasonably optimal fashion, the manager needs to allocate all +of the virtual arrays at once. Therefore, there isn't a one-step allocation +routine for virtual arrays; instead, there is a "request" routine that simply +allocates the control block, and a "realize" routine (called just once) that +determines space allocation and creates all of the actual buffers. The +realize routine must allow for space occupied by non-virtual large objects. +(We don't bother to factor in the space needed for small objects, on the +grounds that it isn't worth the trouble.) + +To support all this, we establish the following protocol for doing business +with the memory manager: + 1. Modules must request virtual arrays (which may have only image lifespan) + during the initial setup phase, i.e., in their jinit_xxx routines. + 2. All "large" objects (including JSAMPARRAYs and JBLOCKARRAYs) must also be + allocated during initial setup. + 3. realize_virt_arrays will be called at the completion of initial setup. + The above conventions ensure that sufficient information is available + for it to choose a good size for virtual array buffers. +Small objects of any lifespan may be allocated at any time. We expect that +the total space used for small objects will be small enough to be negligible +in the realize_virt_arrays computation. + +In a virtual-memory machine, we simply pretend that the available space is +infinite, thus causing realize_virt_arrays to decide that it can allocate all +the virtual arrays as full-size in-memory buffers. The overhead of the +virtual-array access protocol is very small when no swapping occurs. + +A virtual array can be specified to be "pre-zeroed"; when this flag is set, +never-yet-written sections of the array are set to zero before being made +available to the caller. If this flag is not set, never-written sections +of the array contain garbage. (This feature exists primarily because the +equivalent logic would otherwise be needed in jdcoefct.c for progressive +JPEG mode; we may as well make it available for possible other uses.) + +The first write pass on a virtual array is required to occur in top-to-bottom +order; read passes, as well as any write passes after the first one, may +access the array in any order. This restriction exists partly to simplify +the virtual array control logic, and partly because some file systems may not +support seeking beyond the current end-of-file in a temporary file. The main +implication of this restriction is that rearrangement of rows (such as +converting top-to-bottom data order to bottom-to-top) must be handled while +reading data out of the virtual array, not while putting it in. + + +*** Memory manager internal structure *** + +To isolate system dependencies as much as possible, we have broken the +memory manager into two parts. There is a reasonably system-independent +"front end" (jmemmgr.c) and a "back end" that contains only the code +likely to change across systems. All of the memory management methods +outlined above are implemented by the front end. The back end provides +the following routines for use by the front end (none of these routines +are known to the rest of the JPEG code): + +jpeg_mem_init, jpeg_mem_term system-dependent initialization/shutdown + +jpeg_get_small, jpeg_free_small interface to malloc and free library routines + (or their equivalents) + +jpeg_get_large, jpeg_free_large interface to FAR malloc/free in MSDOS machines; + else usually the same as + jpeg_get_small/jpeg_free_small + +jpeg_mem_available estimate available memory + +jpeg_open_backing_store create a backing-store object + +read_backing_store, manipulate a backing-store object +write_backing_store, +close_backing_store + +On some systems there will be more than one type of backing-store object +(specifically, in MS-DOS a backing store file might be an area of extended +memory as well as a disk file). jpeg_open_backing_store is responsible for +choosing how to implement a given object. The read/write/close routines +are method pointers in the structure that describes a given object; this +lets them be different for different object types. + +It may be necessary to ensure that backing store objects are explicitly +released upon abnormal program termination. For example, MS-DOS won't free +extended memory by itself. To support this, we will expect the main program +or surrounding application to arrange to call self_destruct (typically via +jpeg_destroy) upon abnormal termination. This may require a SIGINT signal +handler or equivalent. We don't want to have the back end module install its +own signal handler, because that would pre-empt the surrounding application's +ability to control signal handling. + +The IJG distribution includes several memory manager back end implementations. +Usually the same back end should be suitable for all applications on a given +system, but it is possible for an application to supply its own back end at +need. + + +*** Implications of DNL marker *** + +Some JPEG files may use a DNL marker to postpone definition of the image +height (this would be useful for a fax-like scanner's output, for instance). +In these files the SOF marker claims the image height is 0, and you only +find out the true image height at the end of the first scan. + +We could read these files as follows: +1. Upon seeing zero image height, replace it by 65535 (the maximum allowed). +2. When the DNL is found, update the image height in the global image + descriptor. +This implies that control modules must avoid making copies of the image +height, and must re-test for termination after each MCU row. This would +be easy enough to do. + +In cases where image-size data structures are allocated, this approach will +result in very inefficient use of virtual memory or much-larger-than-necessary +temporary files. This seems acceptable for something that probably won't be a +mainstream usage. People might have to forgo use of memory-hogging options +(such as two-pass color quantization or noninterleaved JPEG files) if they +want efficient conversion of such files. (One could improve efficiency by +demanding a user-supplied upper bound for the height, less than 65536; in most +cases it could be much less.) + +The standard also permits the SOF marker to overestimate the image height, +with a DNL to give the true, smaller height at the end of the first scan. +This would solve the space problems if the overestimate wasn't too great. +However, it implies that you don't even know whether DNL will be used. + +This leads to a couple of very serious objections: +1. Testing for a DNL marker must occur in the inner loop of the decompressor's + Huffman decoder; this implies a speed penalty whether the feature is used + or not. +2. There is no way to hide the last-minute change in image height from an + application using the decoder. Thus *every* application using the IJG + library would suffer a complexity penalty whether it cared about DNL or + not. +We currently do not support DNL because of these problems. + +A different approach is to insist that DNL-using files be preprocessed by a +separate program that reads ahead to the DNL, then goes back and fixes the SOF +marker. This is a much simpler solution and is probably far more efficient. +Even if one wants piped input, buffering the first scan of the JPEG file needs +a lot smaller temp file than is implied by the maximum-height method. For +this approach we'd simply treat DNL as a no-op in the decompressor (at most, +check that it matches the SOF image height). + +We will not worry about making the compressor capable of outputting DNL. +Something similar to the first scheme above could be applied if anyone ever +wants to make that work. diff --git a/User/system/lib/lcd/gui/JPEG/Doc/vssver.scc b/User/system/lib/lcd/gui/JPEG/Doc/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..a4a8c4fa6c9a30631d5cf90fde1ef54118f38138 GIT binary patch literal 80 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WY$`m+gzFf)KbD3F%(PFuL=ak~N|P$Ue<=RQ%f P9L5g^^5 + +#include "GUI_Private.h" +#include "jpeglib.h" +#include "jerror.h" +#include "jmemsys.h" + + +/********************************************************************* +* +* Local defines & data types +* +********************************************************************** +*/ +#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ + +/* Expanded data source object for stdio input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + const U8* pFileData; + I32 FileSize; + I32 Off; + boolean start_of_file; /* have we gotten any data yet? */ +} SOURCE_MANAGER; + +static const U8 _abEnd[2] = { + 0xFF, JPEG_EOI +}; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +/* + * Initialize source --- called by jpeg_read_header + * before any data is actually read. + */ + +static void _InitSource (j_decompress_ptr cinfo) { + SOURCE_MANAGER* pSrc = (SOURCE_MANAGER*) cinfo->src; + + /* We reset the empty-input-file flag for each image, + * but we don't clear the input buffer. + * This is correct behavior for reading a series of images from one source. + */ + pSrc->start_of_file = TRUE; +} + +/* + * Fill the input buffer --- called whenever buffer is emptied. + * + * In typical applications, this should read fresh data into the buffer + * (ignoring the current state of next_input_byte & bytes_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been reloaded. It is not necessary to + * fill the buffer entirely, only to obtain at least one more byte. + * + * There is no such thing as an EOF return. If the end of the file has been + * reached, the routine has a choice of ERREXIT() or inserting fake data into + * the buffer. In most cases, generating a warning message and inserting a + * fake EOI marker is the best course of action --- this will allow the + * decompressor to output however much of the image is there. However, + * the resulting error message is misleading if the real problem is an empty + * input file, so we handle that case specially. + * + * In applications that need to be able to suspend compression due to input + * not being available yet, a FALSE return indicates that no more data can be + * obtained right now, but more may be forthcoming later. In this situation, + * the decompressor will return to its caller (with an indication of the + * number of scanlines it has read, if any). The application should resume + * decompression after it has loaded more data into the input buffer. Note + * that there are substantial restrictions on the use of suspension --- see + * the documentation. + * + * When suspending, the decompressor will back up to a convenient restart point + * (typically the start of the current MCU). next_input_byte & bytes_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point must be rescanned after resumption, so move it to + * the front of the buffer rather than discarding it. + */ + +static boolean _FillInputBuffer(j_decompress_ptr cinfo) { + SOURCE_MANAGER* pSrc = (SOURCE_MANAGER*) cinfo->src; + size_t nbytes; + int RemBytes = pSrc->FileSize - pSrc->Off; + if (RemBytes > 0) { + nbytes = (RemBytes > INPUT_BUF_SIZE) ? INPUT_BUF_SIZE : RemBytes; + pSrc->pub.next_input_byte = pSrc->pFileData + pSrc->Off; + pSrc->Off += nbytes; + } else { + if (pSrc->start_of_file) /* Treat empty input file as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + nbytes = 2; + pSrc->pub.next_input_byte = _abEnd; + } + + pSrc->pub.bytes_in_buffer = nbytes; + pSrc->start_of_file = FALSE; + return TRUE; +} + +/* + * Skip data --- used to skip over a potentially large amount of + * uninteresting data (such as an APPn marker). + * + * Writers of suspendable-input applications must note that skip_input_data + * is not granted the right to give a suspension return. If the skip extends + * beyond the data currently in the buffer, the buffer can be marked empty so + * that the next read will cause a fill_input_buffer call that can suspend. + * Arranging for additional bytes to be discarded before reloading the input + * buffer is the application writer's problem. + */ + +static void _SkipInputData (j_decompress_ptr cinfo, long num_bytes) { + SOURCE_MANAGER* pSrc = (SOURCE_MANAGER*) cinfo->src; + /* Just a dumb implementation for now. Could use fseek() except + * it doesn't work on pipes. Not clear that being smart is worth + * any trouble anyway --- large skips are infrequent. + */ + if (num_bytes > 0) { + while (num_bytes > (long) pSrc->pub.bytes_in_buffer) { + num_bytes -= (long) pSrc->pub.bytes_in_buffer; + (void) _FillInputBuffer(cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + pSrc->pub.next_input_byte += (size_t) num_bytes; + pSrc->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} +/* + * An additional method that can be provided by data source modules is the + * resync_to_restart method for error recovery in the presence of RST markers. + * For the moment, this source module just uses the default resync method + * provided by the JPEG library. That method assumes that no backtracking + * is possible. + */ + + +/* + * Terminate source --- called by jpeg_finish_decompress + * after all data has been read. Often a no-op. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +static void _TermSource(j_decompress_ptr cinfo) { + /* no work necessary here */ + GUI_USE_PARA(cinfo); +} + + +static void _InitSrc(j_decompress_ptr cinfo, const U8* pFileData, I32 FileSize) { + SOURCE_MANAGER* pSrc; + /* The source object and input buffer are made permanent so that a series + * of JPEG images can be read from the same file by calling jpeg_stdio_src + * only before the first one. (If we discarded the buffer at the end of + * one image, we'd likely lose the start of the next one.) + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (jpeg_source_mgr *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(SOURCE_MANAGER)); + } + pSrc = (SOURCE_MANAGER*) cinfo->src; + pSrc->pub.init_source = _InitSource; + pSrc->pub.fill_input_buffer = _FillInputBuffer; + pSrc->pub.skip_input_data = _SkipInputData; + pSrc->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + pSrc->pub.term_source = _TermSource; + pSrc->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + pSrc->pub.next_input_byte = NULL; /* until buffer loaded */ + /* + * Init private part of Source manager + */ + pSrc->FileSize = FileSize; + pSrc->pFileData = pFileData; + pSrc->Off = 0; +} + + +/********************************************************************* +* +* Memory allocation +* +********************************************************************** +*/ + +int AllocCnt; /* for debugging only */ +int TotalSize; +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) { + GUI_USE_PARA(cinfo); + AllocCnt++; + TotalSize += sizeofobject; + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) { + GUI_USE_PARA(cinfo); + GUI_USE_PARA(sizeofobject); + if (--AllocCnt) { + TotalSize = 0; + } + free(object); +} + +/* + * This routine computes the total memory space available for allocation. + * Here we always say, "we got all you want bud!" + */ + +GLOBAL(long) jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, long max_bytes_needed, long already_allocated) { + GUI_USE_PARA(cinfo); + GUI_USE_PARA(min_bytes_needed); + GUI_USE_PARA(already_allocated); + return max_bytes_needed; +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. Here, there isn't any. + * just set max_memory_to_use to 0 + */ + +GLOBAL(long) jpeg_mem_init (j_common_ptr cinfo) { + GUI_USE_PARA(cinfo); + return 0; +} + +GLOBAL(void) jpeg_mem_term (j_common_ptr cinfo) { + GUI_USE_PARA(cinfo); +} + + + + + + + + + + + + + + + +/********************************************************************* +* +* _Init +*/ +static void _Init(struct jpeg_error_mgr* pjerr, struct jpeg_decompress_struct *pcinfo, const void * pFileData, int DataSize) { + /* 1. Allocate and initialize a JPEG decompression object. */ + pcinfo->err = jpeg_std_error(pjerr); + jpeg_create_decompress(pcinfo); + /* 2. Init the source manager so the library can retrieve data via methods */ + _InitSrc(pcinfo, (const U8*)pFileData, DataSize); + /* 3. Call jpeg_read_header() to obtain image info. */ + jpeg_read_header(pcinfo, TRUE); +} + +/********************************************************************* +* +* _WritePixelsRGB +*/ +static void _WritePixelsRGB(const U8*p, int x0, int y0, int xSize) { + U8 r,g,b; + while (xSize) { + r = *p++; + g = *p++; + b = *p++; + LCD_SetColor(r | (g << 8) | (U32)((U32)b << 16)); + LCD_DrawPixel(x0++, y0); + xSize--; + } +} + +/********************************************************************* +* +* _WritePixelsGray +*/ +static void _WritePixelsGray(const U8*p, int x0, int y0, int xSize) { + U8 u; + while (xSize) { + u = *p++; + LCD_SetColor(u * (U32)0x10101); + LCD_DrawPixel(x0++, y0); + xSize--; + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_JPEG_GetInfo +*/ +int GUI_JPEG_GetInfo(const void * pFileData, int DataSize, GUI_JPEG_INFO* pInfo) { + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + _Init(&jerr, &cinfo, pFileData, DataSize); + /* + * Release the JPEG decompression object. + */ + jpeg_destroy_decompress(&cinfo); + if (pInfo) { + pInfo->XSize = cinfo.image_width; + pInfo->YSize = cinfo.image_height; + } + return 0; +} + + +/********************************************************************* +* +* GUI_JPEG_Draw +*/ +int GUI_JPEG_Draw(const void * pFileData, int DataSize, int x0, int y0) { + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + int Ret = 0; + GUI_HMEM hBuffer = 0; + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + GUI_LOCK(); + _Init(&jerr, &cinfo, pFileData, DataSize); + #if (GUI_WINSUPPORT) + WM_ADDORG(x0,y0); + r.x1 = (r.x0 = x0) + cinfo.image_width - 1; + r.y1 = (r.y0 = y0) + cinfo.image_height - 1; + WM_ITERATE_START(&r) { + #endif + if (hBuffer) { + _Init(&jerr, &cinfo, pFileData, DataSize); + } + /* 4. Set up parameters for decompression (optional ...) */ + /* 5. jpeg_start_decompress(...); Should normally return quickly */ + jpeg_start_decompress(&cinfo); + /* 6. while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + if (!hBuffer) { + hBuffer = GUI_ALLOC_AllocNoInit(cinfo.image_width * 3); + } + while (cinfo.output_scanline < cinfo.output_height) { + U8* p; + p = (U8*)GUI_ALLOC_h2p(hBuffer); + jpeg_read_scanlines(&cinfo, &p, 1); + if (cinfo.jpeg_color_space == JCS_GRAYSCALE) { + _WritePixelsGray(p, x0, y0 + cinfo.output_scanline, cinfo.image_width); + } else { + _WritePixelsRGB(p, x0, y0 + cinfo.output_scanline, cinfo.image_width); + } + } + /* 7. jpeg_finish_decompress(...); */ + /* Complete the decompression cycle. This causes working memory associated */ + /* with the JPEG object to be released. */ + jpeg_finish_decompress(&cinfo); + /* 8. Release the JPEG decompression object. */ + jpeg_destroy_decompress(&cinfo); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + GUI_ALLOC_Free(hBuffer); + GUI_UNLOCK(); + return Ret; +} + +/*************************** End of file ****************************/ + + diff --git a/User/system/lib/lcd/gui/JPEG/Image/testimg.bmp b/User/system/lib/lcd/gui/JPEG/Image/testimg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8603d15484d47f0b90eb4246a2309c566f8adaa7 GIT binary patch literal 35050 zcma)_3tX1<-TyC>J>f74nTlu{hZGOkAIYFla+;t5CY2?gP!NJV4nbH*Qq9cO(pDM; z!M&9_Ivv~Qt&darbb%w{>;N(93 zxHBv7XHI7B(@w~}KJe$ADSu}5{^WsOJ zI*aaj&q=#&u9K8K$JtiC&KVZ*ptI}npPaa{e{tsJr8}`x=Q!~HsR(Vsi< z6VE!Oi}IYG&-{b)>)&p5?#y26JhZRG$({Pp-* zCw1O_CwWqxb9CK0XX?y{oy_bsXH@hjPSN_U&Mi~dI4|D+3nw(>O(%BzBqu+k&AETU zpPdmABb=wQ?{OwQFwa@{>=RD&H|L!P?{9O~{_2Et>+PR7lZUrCQMc@K?!9N3^Ug2U zIFoPR=1iHL>OA~zgh97 zQ}*1a&dy)`!O57K?Cjou%vo0awDVT&Kb+b>z3seK^OCdexy{b8O`DvjH`h6TI(F8{ zfBl!v@!ve@{BGyF&KqxTaT@mTck=Fk!`c17Q%?8|Y0g7g`tAhI9RdZO+J1QG8yYZ8p|f+xHfQhdKRENIzv;|R|J2ENuE=>{#eV08am$>Wr!IAVwQrmA zhpKO!@bFKa`!cpU^X{MTjJ)Z7Cw|gC=jFd_cLqni;N&d-)LF3nMdzOBpE(o9e(J1P z@R{?=+)tcU3miq2f7o6*&mpTt`_=9u%{Kd|&TcVv=GydTmdh$0;>X>hx2O zPFmI*PP|&Ef4qNaUZ|(VpHB--3yn`pjJamg)oWjUX56@?7b5!{e`U&)n+FZL@4f?b z<}6)0?muafk&!?A#mI5vc5aDE>byi*>mC)=J*s1(tTC@{_a%^7cLZIT6|)f zf11A$0-81!U0lyT^FGWRF2@wVl9#1`lg;o8l3{!6i z3&y^ys;XN3QmR%BT(zouYpb7Mr;Z&W>M?CXJdpm0yLVmv#H-i2id~4@+2{Cyt59-~ zC_njM4*rMIE}b*@F?9Q3yJbsMpb&NN*5Cm%C53yV+~V&c4CiCeZv_Pz6Cxs{V034c zu8F{gRaYJ3)6#&#K#kDuc$JvA8&kdDp@|$9*{9EOlpHkZ z(0%_A@kV!}wm7<%gC>D!)7%sOW(FU2NO2{f1E7uMk^@xtr zm*yuSSM^1`s;U$i_pj=nlH##d%o42l^XJcpVx(#~WN2c%f8M^UfBEWl_@lMR$ekDZ z95?{v$^Ve?hYGr{<&OY%5fTpgQd*^EcsRELD8s`Gpu`n}bo|!3*s4*wD*A!F&~Kri zA5I9RT@122to&f1QxJbX91KJcVN?hV5vxDv{p$PBuF15jS4a={61BeSAMjvd^{H-kUS{#=%>zk!C{&PDmh)m zcmgdBx$A0+tDT2>!BWV77IHfO$o-HaAG_u8`~UHi^FBU-8-oIa0%=KHO-Yk7bS1GS zD5bU4OxK_Ekrm~}Q$hJ*lHYF<(66-%p*@w1LNvxIe(p!^kdP4C&8*giBx5Ef#_am_ z6R&pB@fnQul>-M3Y?|{giLaB$^Q7ai+`zi?;m7a)iBApf$dSM!HAiY{#OSu7z@jKc z+Vdk|6k=;DI{Nbp5nVEHp!B>jU=y(Lhk!UG>Y<;So|wpvOcnL8R+{UQ6ULla{X zCtdyOtK>(w5m_(vx#jpP$BzT44B5fa@eBXvF*5Sue?m8;CZp!aMs7!HHg4Q_BruTc z#tzV+q@eK70_;>mwqmOO{{986eu|@FvU~R_f=aS_budx|Jj#xW)?g-B^ z&K)_jk&BB8X;M&NcvNXnP-{vMGRB7%0GT32S3$#)c(jGa_dUXeik}M?dJxGXtsnwv z?@C8kNpng?SDp}b{6o_y0(xA%R&`Eii@dON=gvNT1|J_h7<2s(bc~GrpAY7b_44w{ zh#it4xFJXCTvqp9oPp;|&7>nirKNtP4=k0ufszF&3(-+{U7Ga!zJ#VGG{7Sxm5rQn z|NgZ7MIJ_JXby>-1RVM01hj-P(ceEth0Z0$$Y(BG7Kzj6F8Oq@<#44qmng>tfm_ULvHhW3- z#83-~rGBkZ-S-#7#}70{$K#KRr;=0212a|fK*+S1CHHp8j~61Z>w}PeBKyoae&E1h zx#a(?WaQ5O`2fKD{NQctyRh?4Xpg%AZu@)U7E+`}b3Xuc}(;;EoPdQcq$^LrF@GR3m$gU-Iis9c7MsAAL4m z=tJRpVJAA0B(M8-(e)Xsc-q4sWaJ0u*4I~5Y}+N1M*h)WrjRO1s~ zlLTZaLi*v4lF=pPLDKz8bITmy&|R*W(w#ysJ`o*BEex-SOJ$CS5KaMGo#P*~`;jNQ zgq)=puIsa@k8G8?l~Q2sflb%_A4*34N+Raw*5^(=yA8-8IAlkY#VY6oo;!D1*Ns5p znhLc?lrm{BZrRO2nuenETz*JszA1L$$rT|KVtisE-3}p=A3G#WLqk2sAFa^A9k+bX z9hEvTRD$bHw>Cey_SM1H{X28rdH+~EG1nTV3L|DJ9Xr~&K&fZ83ZtY%NhOmb6bDI3 zHRnUOY}x;>gf43*spxpC)el3(5$SJ0xQcq5DlL9L-A5QLabU1AQf{u@nyq53;~zP> z_PWlXIu1w$9Ug9(^5Px6dM$bJS%@D~MaK`sd>??;9qm|^Ct1Q%2 z6j;-dV#K^XmxgPB8u?b#?#y&mAEQ}0+W1vVBC_`DWvo>b9Em(Xfai41NAG5=n!M4 ztLRd#;vxP-VqdBNL3Wy|M@Wh3G1kz~yxltv(o612Da3J+$6p!LE3qJc_x7t#{x8-V z`Da9|_pV1pZow55u_Q+$1QJXSpjhRKfF>AIE{Z-PKoC-XyW!k-m zm>*)Lt*!WA_p0tyAku-P8;OpIeY>Zat$OssFXftPQb;_13`lci&w0*;I3A>1fE zjWVz%@ci@%3oA`cG(;a4n5xdIQ@@mW4c{OjEqv9g_`c|fkfx&*<=jCh zyXBdhThir)rsc(CUcL7Bm+AmRjC|~>LA^#442+N2eeh-y<+v{4HS*yny@)mS_2T1_ zN?7gJZ(F}hI(A42qNEfg7HaOOJJ(!Ma-+{!pQOS{qon-4WU8VQtWd49tREF6CcbA1 z3Q{_r=zHSCs_t|<+qZrkuPe_Z|g}GjE6P^t98A|iWTkd;&fj=V=@oC!+ z9hmb;mpr-iH{X%-kuj{EOKw6KT83=f)~~J($Rl+_&bhW)r^q8h52Tr@BCAp2k_4fR z>YxNwf*}D-LGc1+8O5H-P^oMx7y5NiT=^c5o@Rva_3hieQ2y8T2DiQ$u}+Q3zi`sxcwGZF6^Fo%{A{am}4V4 z+@0vV_yn(UXyr#FG`l5k7x=_$&Z%|10*r9qO)6|&Ofpt4l!2vh7~$(5}sC#KDw-A&`G zp0>E}dt68#mLJ_(M^Q(n%GLUj(viw1X33#0bvcYX``q%!J9@>3rvx!5m=#py6Z6%e z1Dhh3M!xV}ZhcOpH&D%C%?V*mJiyruV=g)>tRkdqr!rS5O0w*%bOfiMO7qAF=8+7a z`94WOL71yXJJdJs=!d92RWBG7k&(E%^5W>Di(Nn-7-;3%ch&yZOFDw)amG#^C1+aR zmPbx@Ngj+kU3K#vTX4o8T4_*a|Dw3OuO5H+;s5#h+=<>T5T&++B_uSbCp3vQtU28` zw;o%Sjz*@t$*#p>yrOiujLm%tEB=UzJ$oL>$k?3Wlf>ASjFR9|C?WAk$~XE_E@GuV zf$lIK9^FllA_P!3qEHnzxgx3n?atM*Q%7~RVzwVTiA#x0%m*h7!svBi8bg+6Ui zVOC{n&C`GTf6rYxH`u$mCAp;~A)%?I8A=ht$bCqMj&e#5p-YL364DZ-@tr1Pnx(?o z6Uw>_uM8ib%>{S`6}K?4OEFTL+PICW$os7+@ry5xzG#ddM30auPJDszXkB!?^oCV+ zQgZF9%yDSo`{9QMEr?-kDJ!Kl3n42D3rkBkW_)+o+_~P~IW5Ue&CM+dEeXxE4o2TF z3f9Rc2{)6aC|&f=;E(nWOdJ-O1XRTgVjdz#`$AqS_#V25PHdd;6d z-^b^CcoBnk($Czlu#hPYlr>(-n-bpF7$u|`s*A|0?v6*sG|!`Y$ZCdY4=P{twrq!T z?R_Ut4*F_KC?d9|5VQ;VWV0%R0*Bevm85zMj(e2{s!=n{iT?xC{1CiA^U%57TaC#n)o^k|Zg@=)AqQI(37}rc5v=goG{g!E~48Yq`4wOm~2uaX;?zYHc9|@7+}a` zt6Mwu(-RZ4!-Qefm1bg|JC^~X2?^v_pQ7;YE9o#{vE5a!`n6_RWv6ifLe53yj?q_K zG1~Nl@sf@n0fpiTIFgW;ddC2D=To4GQO4?n0_UHpXh@wpH6(Xvb&j{8g@vg!H3w{R zO|_}HxH-KT(6CcyLn`_Wq0H$w`Fq~zi86|{lR=zJ>NI19dNP;Orsa_%LY$AmqNEQ= ziw2H}jIVYwOa}1K$ilLg2Jn7q4F^48gbpg4z9*8-ihZ)9#f&ylj zP%))7@JN3B*;7-erdCHsSLbw63fAL?InB*E#mU9V&FSfQYRK8MjOTbl>ZL5{0Rpa$ zN{{BMD_ny_&(mlOVhz5COL~o+?xTt3_!B4mQIhbQrI`XumZ#lUE$(*FY*k^$Ak80@ zF0EcQOrav%1bfuDx!ZV@%@&x9#B1hUNQm{9h2(mJ*cOqKV{l4`Il8oPrxrer*m zuv)>0l?JU;%DHHlP$#>9m^077G+7POZ1zY7krg40ajZ{40YSApohG^jN+N!K^ezE~ z97dB7W5p#+Nj$O}{bV=hxMB*bj6C7OUDEJ;C@LlusUy{@%oucT?4Gli!B`z2AhXjj z0ot`K2W`1|G)<+-K}L66j*f@hhDg3TQPJyau!~W8eq1-%&6cOnO@@$Wj9&AnPah!( zG0c^$XK1BR_e7jlWk=~~p;eHwRyB;(>YPhDx|D#bNkaW7lo^NutRyRi^#_!xDI06X z?uqrTZfgrjZua#J;X-p!B`QO4VHB@9$;MePTaArnT+Y&mN*&Wny7lXK_H0AQSzQ_$ z`dub1O=u9Uk|p+JXiU$;ICkvxHNASRj893~eC$9Xv z%xu@(1!8hKo!}p~kX$P8%YbZvvKgUU!a_ozJd06Uxx+)O0O4~1=|x*Pgx*k+X8P3; zg{>sOFYEew#VW9xLwe00tJOOsjw&WJ!lPP);G@XF9~UonQ%4t{G;^i2GaVuEP<6sl zuv*QEv5HZaiZ^DZ6ylaCNr4&PRTEu=Snfimcd!BkBLpF5OMHEs=}%f@ZP>=!Knkv3 zzlzujjFgWd#5cXUnX6%jG++VSzMo+xpB~~BJD#*+`c;*M7s05R z4#gbTAKl2RB#Dx)M|%8Ggmx98OVugi`2rtH{#j5~RYg@r6|t=5h!_3gbhtv!cCd9k zdKl04!~A%!xwyEgB|#P(aw;UG!9Xi2q~Y0+a(Ve$`Ep46-N~0R~dvu%2pZa@DO&y9r}{00%WVEl+^OrrezJ2 zQDKMo>A7hci3;JWqN1cEpZQ+-jV(%Xsdq6Q=ccBT zQwa&Yg}fF05K*xP6QE8=@7)BZqOfmR!c_H9tXW{9JUEAtQE!0H{(8%i4trvS-tY7xDgf+U|k-v#G{HGy_E z_iTs=)9qrg1P|Hj*<6AN5b3>p7pE6DHSvjXODIQ4Fby#zEWIhcsknD>@7~S5ky7^R zo50_lZ7{d=P@b#H$d@zD#~EoOR;~de= zRq8NIm(^+kjJ2;52Vz`75_d^FN>c>&DJvknmYKrJ{!vMos0a(_JHxoA9@oL21#&4^Ula=NQqMhsaj>k#dO3UAq3C8ssm!R0Ci4y61E7VA%N;4p7$wJmMkks ziqjB7QBo00^uR~q(DU>61XnQa7IIcW14JCN)(}N0#s&~_6>+J4^fNRPN-d_@45a;> z5R>j2GAind${=#1tJVRDkdzEeE(BNPix7YGpEmNHcSc=|rw6GnWMv@*c~BubE~d=! zTnyEME5tA|^RD%W?ixgZeYnChA@rlrya^M^$_n-u6mgL~hf8C^kh=a%D#{u`GaX$q zC8gY{LEfl{VkI3321}G$I9@v0GNb|hbA9pXbTd@s6dn)49W$bnTR^m)oF{otWw3Sc(WK zZzz|Mhc#iLy7UIHxK?g!FPj*A4#{n>_=;N&nS5FB`yWmWuFv<%7b9K8Zlm70bKT*^ zRs~SBB4tW^UqYw|yV3pV=z$pI=x$C{5H%WOiLeq_WU=98WqAX}kH0=MbNp?K@)j*x zl$Vzm3LTK56sY<-6(GXKk?HV6hhW&M#S;{6ZX@MU>{!iil=?L2Ql>Wt1o)QU4J6ho zKWsu{U0h<`@l|O=qmr=h$YtKkavCS5zMVgI`gHPRQ22?%cdi3+#I%(K*ejlyLY3}8 zgm9YFw1!7sG1{>?3!<>4zapj-37vVjjn7=MVg-!W#t(2QJxYRl9-qu7u8{vMW(v_N z^K|lKgJPzyZ*p66E>>x=M|MlLPsU>9dC3tG5n(C;q_0`25{yCCg4opLi_U^PD@clh z;144LT3S-ioS8m7rAnjoeY>suX5__by+*ENY6(PoB5qY1-FYX8gw-7Jo&7}vq%Uc~ zM{#E~>&ckDTL@-hR#s8b>eU0w-nwo43K-|jTQO|KFxl*m9UJh?@p++0i6s+W8PN5q znV&zmEjhWw4pMPdt=715feL9Ob#SCKWswpt{AMy7z0;T1rZ=@kL`Tqb(Z{1EB}Gc< zm)@IBsXiST4YYxeEh1oMds9o}#4|O4%m=oX`jtk7_8K*6-8w?-N_x#5I;uc*DLrBW zX^f)8T&q?W4IFrR*`h^~QMS5b*vl`k=pj8TxZN}q~5=LxU*-Z=pQ3L0tv z$~ApUM5WZBUWwwX2?=Gogv95_AY!R)%9%kQ8#XoSJP<{wpYpHqSDr?>c(%MeAYx|w z@Z^~-6YF3stgI{@6XY}Pn>+8klRR?x1fw|}I*PHwTHVMaMqyThh^Y=N8(4PvTQI&X z$Q3VhaodI!8^&kilvD*~s|5KHIt>ZIt!>iRj{Ex#0-Q4a>lkJOnR0w)#8`Z_u`%J{PCSpqYkfx(Hu|)Dq0UG&pH^1Iv{2h4NQA$ z;9Hkpe)$)&QOW4JnyqeFk-24j-UK|6)vxhBHDiP4dN<}oL`O%5HJ6uTmlWW#NE9T}FOIvAULRpFQ++u=!(i@Pyq-f6R@BZQjTFDjy@dF%4BmtF!= zl=C_))qND?ZFxQ!ap&X1<0;I8a~i87-d`3S%@~~IGRa({_Baow*J{Ds) z=8*}gl2k$pRdbTqDt`bWA(_m$DDAD6XfoHAO-lw9-eEp|GK3!vC6u*-Y*ZX#F#M$oMt z?lPMH$_dm|EBPj4t;5@w4GkkcWgtK&*o(X(4Ohl$xj z5IM)9D6WipX3<+Fq?9zWc`J4ZQB4^{jH=Up813*zM%uDv%c7xD(*e1MWl!z+Ov`d= zI#*HRPVZUEX}aSkO!`(3Dpi^Rn~rjEUEF_>$L5HL8N(HKW=`BTX3W=Gy5iRw7`~Ej z$Vka3^_2ESg^nwEM>k3y$787KcNCPRP~Unaz5(bCJMOg9Cn^2}=Wwq4OeLZU}4jI(ClG;2B6<;!p4ioMD@(UA-( zN@YzKvBQXYRgxTyM*`X2I1wSW=pl&H2!Oof@X8Y&@9Q9xJ3_cpT6S}&l&J~<5(S4V(cN}Q3#+bZ!KGt?}WHlt&~1iDnW4OsMrbd*P;;-j}d`mwIx-umsg zJFd;7+9@bQ#tbh8JgyYt^Gxitm6wnoJjN>Xvg6aE#AW3iuv5dlng4+}Jze%GJ9QZq zf6Q1dMb1J=k(rR7p(~9iCBALhGiJ^tgS5{~ts8?wijdLXcqS#gKw8X^tnit&E>^!I z3PhP|LDGcKnA@ns2Ym6C7>B{Q{?SK2yZ6!09{r4V>$lftX6EIUkv^yZ@`LAMs?Tfg zs=1B9MTUmzty_L#SR z{k`|zdxP4&pZ)H$M>bp^b3U!iXM)ezjQqJ*Mq{RJZFHiVa~MF)4I_?{9uz`Ve%G3g zIaUyy3TbJ{$!ToN38QQ!ee|v^Ca@~5k{_uE#K^3(x{_wE2q{zG7uD?NC1E8I$7Tcw za`?=tv16=r9~4EuDxB4SvP}@J@q(9R%oB_K7qc`FM%Nc>G^RtfP2X|+fPDjoeL+LW z_3J;o_l75)cw+6^Cr%zZ^t;ctlRiT8KAJvu>~|niR<|WHfYDryWW-LAqVl4vLUOt! zY$y-&4kkdBBCud!PmD*6&xP{MGc5z0J@fc zpLq4a;K7`3ru&`>i_XR+VI;I>97$rL zi8-ed{kP_z2Q%AX+(OkQ9ukvX5nF6Ls2$w=|wP zlEf@b6zg(KM$-?-qaE2pj9OLBN>=s>@iYy{>1iAzRs+WG+c#{O#hrQcKEL6K1AT7c ze7T*sTs3778x*Yh$=E$tJ|ErIlFV!djA0B6Hw0H#d&>b!0_YVI`9Z|sd>K#;VKTWT z0O{JYquZKD9J78rtGKN=IT`9?V2YVmcgu3gh)?QOiR@j!YckG4X!22c1dN28_Tf#9 zZzH7U?(xQz-86usHrgHI(9^|zPk5GHuhQ5fW2-d;)o|025!JXngWQL?s@l2r-a~7T zyNrTdu;w2hc+Gu3nobqRR!g59jEdaq>gq7&H`HNj<^d10G2`a)l9o2S7Ncf>Bf1S2 zRIxgICWMUY1PGEqBllC*XCQ>0q->Xui6@;hGLp`CUiC5<6ghDDnxujnIVE*#-hcu7ULJZt(jA*CegqmG_OR`-GvE2mw&c$88c5id<8Q@VCre1Zve zF6da}@`$aXNPW{f;X!D>d8GAw-N(6bv1jXZ+5(!3n?SKbCbxdBi%7(g*=dGG zmTDp-x3xvLv^33#ZaNknkWi99fGHkc+s?oofP&6x;m;VnV)1|~IN7owRl`|WwJsQl zjMbhcAs@^B5FvqVJkv8O3vXOJ?Hbk}k3LGYp&xZv(;T`SzT)uV!xyK$cOpLiUl>)? zC56Woqzynw)ja$5z1)Ms_10@Y`yJ=LkB!x7Vgbq6X%n+)N*QMx>OlL(b+lG_c?bL@T#BN>t=%b$FO0zKFCUEGcPg zYC3iI-ONQQtCZy6o?KJ)?-8Za>1pGVwO0GgDh}w-(UnpD$Sg|q^Dd;-0TU}W2C^(i zraJquOL=%S;vLrDIEb{7dv{&4QjE3_L8rZXUKPc~O<>kz^CCr`eJajx-SGE!e|y)J z(b0;A)*E7i2}YK~c@Om#qD2ip@nntsbBxFsK$JnXWa3X#t#5WyNy*&_%tC5f**7%@ ze~g$~Uu^@*6oBfo$ih|qz(|b74|%Q&1GnWN_4EL6NYw%D!)LbKej3J=w$|bBY^i97 zSgG5-`R4G*i`OKk4g6npB=96L-N-~vnNQgSNC%j)UVH7EfBHF@p9q;e(}vR$$o;uY zHRgKPQ<8IlGB4n$a|j{HjK3A5c<&!`h^YGG+S=mewgAnW^Luh+P901QX(;z@LCH1- zM{M%P#vjv@1C%|4s0)8j>S#FY4dXIJ9oHcn>&_*u(prbn=qNro4wp}!ckea31mAZnDoq2X>@q~+03QsR!LV{|8@#;=<084}3)z>B!u;crYr-R%`5 zGJdme)R*tPbMop*yXkirRA3U1rlJ;$Z-1=jJJEfpn6hlE9=g?-0|~k?NI(SArP#*7)(Szy9XW-#C^%vweASdvQ|&okT6h zC9b;0$~qK2_HmtW|R8=v{pbOXWhvWW`QEJwpH|rcLWL4amcXzuEf@dVaH2Ix6Cf zx|yARo;diigKX-07@;KfAc{~8Q-zVr?)5+X?XQ3Ru(5r4dvY=nFszw8o!rcF8rFoN zq%Ss1xM_>dks1V9LJ%Ln@`r{|Z8Vi4Zg@NCgab@&YA1!*{7-ofYhaljk*UfZWft!A zGld;dM~GCjj5Fj^OGE;zJTic&6ATpcts_SbVso)4 z4nBg8*r*l*n9&-p!MS&YRuZKcH@x{bAR7~Awg+h07kv&fx{(8`lXK zX9YwA6c_W787wNEbOufXuuMQuUt^WXZ#?B==T)WeJAIA+>&i%t+yED#}>N;Rq=|l~1_=7D!dxjOJ*JRS}bcob>2q zW`e+^<6)C>^2}3DUeN2}#c3CNjb!n|Q5ptIP+hl=8i)t3D<(_|z z9C;DMJ6Y6_CrDI6L=^)!Q=RjZPSA2Lx+{X#(1 zxRwn&-`$(xaQ(0xf22gD0cRdB89k8M*+_|w!&~0Jf63m%(?-7d&Xk|t@(L4?Uw*lD z-BuWX^v)mu^2+hY<~%IO$1l~Z2p6a=!nheOJ&&{r4AEs~vL;|fj~**t9x!at7jJF$ zI+NNoe0h5@HCsz^aXUelRq+%lIyRQe>$ud=5)ZZ5Z}~&EO={KTDtXkJMpWG#Yr;1t zqdUfGZb?m3D$QI7Cn%cm&6%=<0xbh(v(&{_Rk-$Re!5FdT1jSOca?Ke+ zEsQ{TT}zs4q2!aY$iu(n;!zT?G_S&&L9yy;SHcK6WE(>P%f6a+bY-_*H{as!i}K9x zH~sW4fBDg0{_>Yse&1(jWaOMV$LBou*l|a-43tt3k7OAq4aelE23mXU5aD`;%h#`; zx1&domszRv?mZJ*hBq~_P#nZ!qE0G7k50S`=~}9U6eGGQu=d6S`GJaU%XaFCDTUHV z{k+m|6MAfbjtmq)=8#2Hgs>`4tPDOdpBpX8W7*Xa*~^Yax6N#Cd}9HpU-@qt)W>tS z^fS-={`Wtn_36`RC%aKR_Sj={*qYE|tEdN}=IEH>k&Z;zvb6D;Jw6uTywBHv{`uAG z*MEE~t35Vsc;KFishq9K`C|khDol2YAF} zo~PvldX23|DC@UT_A{!J2{~7g|hY7%gW&7s!xo5U1f-%|mWnw6DjG_497M^>f;%+}3~o=&iS| zU;phd{_yO?saihGjkRrBIULf)7#3wqf^TX_xm-y}MD<)TmS>P|axcHTS&`FvQN&kk zns%d==b&VA8yb4-SA-QNqGV)3m*Ls!=$y9f4qPe=f3{$_ zw7E?uqbnx&*lJWDv#dJTzpyl@RO@umk++J9^7egfjGwwqVjAN5kH7uu&3A8{nA##O z35`k_tg7ZTIfg+kxGGtyVzotoJSy#>Af0EW6pex~WPRd_Kzw652HO``)qO&Aw~vrvXSqN zW$&Y9_J_~E@XrOI?0@;@L!WdpRu81>i+bTeDCvagS6W!gY9x@k1QrdHjw19lx#gn- z)|ZD37?AhY=FJ&r-e!XiSuDG(Fo!Bbg_eet>MLjshue6fQuJ=s*Fse3BQRo;B~N_- z0nsg-#L|W{;)}9&*{JR~2andsn6ns#NmOOR_QPX8`}qey@sEld@zp~Qf8rtQd|=ZJ zSIDIo91?~Hu~b5q_Qxp$v*>)RM#mju{BJHdn35t~G3>Ut-nxAC>eqDI{F&P)HqufV zxFBC*s0ucyC`ju@V4@yM^FvS=R!p{zFS$@1E0uF}fi;AnWrXyW-Eae)ePCfA=A?SJ zkQB4C17^&0DR~a$``_*P$>yknHTOUCulxG4C#9=of8$9>kwYPx_|%vrJ@}B?o$su`_w(Rr%nYjpT zdIAhXSuP@8SX+xV*MhAsM{_!k*sMjALR3c^6ZLj&g7qLRscmf=v-_|sEw*H5I}@nmdCiQiGF!G@hOE<&QD6fe<`h^Is+timls zn&NJ{Z$O*+Q#4gRVPOo_<<>WQH&gX6%-kjg4N@k{gcnmK+0{eGX8h!zf9`6kM$6Xd zgAcemE`?Eq+OS27A1g~i2C*m*9VZN!XNaQ2R3Ckms$3$Ly@ZU4OmP*o{#R+)_or!&K2q0|#iYduL5LaI8Jw)i#}BX_uA z4m;E_US|_5Ohb1zbISmYM$ed$Gk5Hh4?aBSlMWe0sBO|7d+dOR@tI9xEOZH79SN&a zkrKe;j(8*O-bX*)k;yu<)rk0-LQ^4UCKnd=uNs*4MdARK(QWp+(JNo$r7EDgXnmFR zp)BBzs*Wp51#Hw+Nl`-pL>+#|Z3JMt#SDSDkQ5d$hS2wJPG+n!06*+7R3a<5*+|La zi5cI$``rI@$&MbzPv#6hFxcJm=YklKkoDvyBc91l6)*-Cy;hc&`SI1lQ#if#%oV+?&xc~G%sEH$(%Wx z9y3T73k}Z*<&MgZ6y#vW|Rl|HS85Vd|- z>0ARdRO%&nt4!Abh$|-918njK_tdE*SE~YrNmS({N^Qb-y6)9ioXUk?bK$@_e$JUxnWL^%U{qY%fJ}OiJ2Hu-WpS^) zrq%dr!t8)F#-LLDZ6W(1ontFmAxcJLRCsiC;jrm-VZF5qL{Mr_u9k30j>Mv=8C2Tm zXuOtYPN^K596-UqM3+J0kmi$Sv#i^C;Wsa2oPPJYhpooxl00l{#-)*)4y>KB_La3$ ze(kW>)!ea=qc04q0#T4rMOj5Hqc)J~#9L zo$%oc&uy&v$FFclSGh}dx$V3)cr9PVaq#5L2OWvXc1Z$cC97mKMlc!c$Xk?$gjxNA z`j^^f1InY^_}xmCe?o+jQl7Wj&ada`x>%jz$(gJ|v=cq0s9J7AZoO7^(iCS+NOTmi zI+Rk;>{2JqS(?pd%0pxE?M!z9h_Q-}CxjZJ&deDtsn0$cIO4w^SB-;dav^J|>E+T- zt~+q@;3JPLIk@Bz$5j#g>y)voLrMnbRNH}o}DR7M}`g6Dwu9oXWk}bMG2(!H}sU(8kY8^0KpROO zz_#3eSJIk09zW3Mlj}ZlTL)yMLeAQQk8IzyYkRL=_#?;6g=8mZ3rh(TGEK>7s*epgS}Vb%>Wxh12coSeMPo(od_4z1Tvg0#sR zMOEf&=vq`)Q|4(%lL6bQXT8ac8p#9DL)T%iGiNl;oROW~KI6mNf4+Img8TXE8#SXe zNtb>?<`}&8&?DP-?~a+q_i8QF#$HBgmI|4S)$Enwoh+T*q=s}RBPTi$fjxA5dqdDh z@k2};l4owLn>$g%z6}i(aACRq&Jt^L*6@lfj7 z31#IWEgGq8PcELR2d4C_nZYvC0U}+i_y4qKzR#Mk2AyQ(sT%u-euAWtAbv7HtRI6(by|{gMVq#y;w{esg z$&7Bmk+Hg%>Qs6VIdJe`;8MxCBM8}K)G%2ayDaJU_ATXckDctk$)vh+DM-_^XWolE|0NXnuS*PiNa1} z#9!};J%cZc zE@B6v4&4Y!{ai>k9T2RrJVLt0T1Y9NQG}q4lg~6ZHYME6o)rCZa}#`(N!a@;*iD)t zAydf>2~CXjr+U-D=KL%M^H^{#sY(FYbk|OBZEU>f z?IAsTQjrBkY5VIXONcJqwlBG3(9I{OoMejpphw32`wJY`6$?3qiECC+f5Q|nv?dXd zlE_phQwCXhb83Vmlas5>yc+0rk>)G`u5wL z72mIZBE1p@m&1bhc=?1*_n$ufgDV4=OlePs3`8J{WvbY!`0UlxXY--h@D}RYyu=S_lh(+c#{kh zm8q%|rgNQ2O-nOWqqJW&YYi+tz3t4z+lOw8^@a8F1ZwjpXoY+c>y z$&)XeNuCr*6o%xP5Q z$O@yPe6;EQG}=mTyRO-_cM0vwNlSL^VyRr;RYe6!)Z~R+E0NI;9jRA?TuB-92Bt}Of0@qwfDfg#C;O+dA30kz#d_rriH)sb>l}7{W}lLZiuyD4 z_T2$>M`|)SD_)QZxkK}ZWSr+q5NKn+8=BK1#^uW?a&j6OI=<3vf4cI@yPldmcW&?* z_8U4qrso)CEJoMDeL_!cVUqRew4>LsbnfUi*Ua9vchcUyyN<5JANMo1>WEN{B+r4W zq*3pK<1RF9h?x9aWJWVn-RTn%bVu8mB`_{x=aQ9Gnzd2;B(i@hU(LZ@OU!@tf-~mV=+xNr)2DO3K~6Jg?z9IqM!)gK8$WxJ z_FoGYELgK<&GfMue5(SRd5#$~#_EnSUymsb3}?#%W|QArc@)6eqpz7g`{?Z1vvp-&lf}m^(-yr9G$Pf=D@y&bxcrr0bd*E4`sKbqpxAb zoDlcUzJ@mKJ!T3R9CyeYE@2_cDKOg6(#_Jl#^s^2=iHe~%66rlwNky{&vesM%v?Xi zlmJCckhIafwyENwrsJu*J@RE|hrY1~yRP9Ig*X9d`UxOE`0lQ|o?P(Nk|kSr?G+!< zQNHyB%W&iaV;tVUlP9^jyR>hEJQihdcHdXD2-N`eA>nA$7JnnHbqO z#*mM&M<70n`|5k4GPJ3qKagvBebsBp-mQCSySD67$i(jAQPIx`^_?909stMT&?7o2uzsQFnNIbC;zw;4qMax>OSE&y=r z)~$PI?>&0-8ZPfi#VWaun&EZcea+?;X`DQFao0sGmF17D z-aQ`~Zmw`<_xuM7?N?1W-RUOjcpzlS^fA|->?JH3xY$^ZT_1U3d*m6UM@aT3=ev>= zcC5vEjs0lNmXUjfIEfr^lq5%GO}LTw0A>w7J?E8<#E)}XS)em=>)v&D{^-tiG6CFq z@2+VI#VJ7?xdwCu>9NF)f2I?y>l1znNWG)~1FyAK>JkD8B7s4H+BH-P9^0~0Z2CGD z+XGSND!>k>L`}W}qSGbW?r6;#B@RW^-S52zVNptyLYF>hZj|~^112bmvCG? zAFo_TjFnOGD|anfGHKG*tAF%M+K+y;_3Cw7zudZY*ENZJZLKld@xu6j1L~)q|3}uU zD?Uk}v5Sj|rIPnOh{y;_tXqsT0zg06gcKjm0xZ8_#eig#S%a9N(ss`Wy}nv9atV=2iI?6Eg54#_T`+sncZK}DT+^c@;kWmM2p{7DxwRwjHcS3sfG_ULkJqC%8u@(6h zK>lOF$nATPaeq-!RTf`hQHf|As^Wq1nO|`LiV0EiyL-UcqsOGHxlGzSY1iyYFiygq z2XdAi+UV+D%*{F=yIQUN^P%EkcD{cqvKH}o%>u8s(C6M z0*w{vP`c#}G7@TxP)p;aBj4u*C6BJTVzSz8RfJ-MQaa`a=YRLXnl)?;Oy7up0*v-m zBnpn!TxRaYSQ!)-llkqA^*uOa^NY)0VlSt(#NGQS<#+G)k7rYg4o0&8)ikc=wfB%|3WfQ*~6`n&=e*_qVcZp`D8_JtSP+glM= zjP>kXUynTQx*z^pV)dA~n_Y z$W7(B`x#hwgHKN)n(YWtBI?TG9^wtr#+HRpr6LN)TM-N*8+6);B1>Mi{>`JMJW`PE zMM5Gayc7#K@YLLj{EQm9r|Qxc+J9spZxf4*A-CzGmzFzR?aY6Wd##oY^d*ekc#!WGE|KkYuHrh z^~hFPF~GQTKh8vQD;{BbSXD7Fb)XUT{2@mIOJTInkpEupVdCk|jz@?+gD7`vHh*;6 zcvnV2GO@k7EG;dqU|{$_wyMO>#T-u*@UWqG1*5MCO;vXH~K zSJR0gZ(x=zbmPlQIN!xJR_&Ic^#an8$q;zNrmN|wr@Xh#j5WBzYe*oUT%qZxBk>3+ zSF}Tr9M}$DM4U19qw#EMu*hU&#lq^cn3$N|G5+xb(J@Z(6sE4tm^`E&J`>lT%XInu z4onJgnP*4S3Q;C{K;+;VAE&iosLc#|Bcp^gMC{e{RNU==v`1)TSy7Ca)V{J?Lz2FaP|zF{o$*F`2v zuIxngn5&r4(S)qPSh0T#s_p?v3lF6TX{DuF(&lyJ2iLRB=*t7dSo9i`!zYWgk76_)4V~y38X6_^CLi7Obwz}OhJY#3Nft3ox5-yk`wN1-K|Th zG62(bja78^l6xVB@a>-&($QLnrC~vy1F&PlR54U9uXlg@+YOm3dJK4LH7c%N%~x_g Sa`hccw(kxNXLrXq=l=ug74q5u literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/JPEG/Image/testimg.jpg b/User/system/lib/lcd/gui/JPEG/Image/testimg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b34ca5d3151840576b6cdf33c3d52d0368172d4c GIT binary patch literal 5756 zcmbW&XHXMPn*i|8tMo_<9YqKNhS0l6fFLE5&=KhbX+c60rK9u!p@Y&}04brP^eVkd zQ96QxpdeC&^Z&j#cQg0t?w+09FZ;~S^P6qg3)iav1~^O`1|T8=0EqrJ!1WS99Y9G= zPC-saNkKtDMMX(X%W{L3hK81%iJ6{-i-U)oivtAW6%-TVpOR857?!O_Xt#TDiA)EDFD9}pNG5g8Tz@>NW7N-8cbJtH%#ps=X8q_nKOqOQJy z(Ad=6(%RkA+t)uZI5a#pJu^EuzwmK!ZGB^NYkTL*?%vUlpT{S^PJf@B|KlP8ko=qV zcle$eGj-6py```5~c{EcdbbwOv#Kl7@#s zJM<*=O+o0|t)qWv|C0UhU}66+*?+&X z!_{KtrmR!-Go3zbLI(HAIP$g8bmuxKcq#Y3c5~p2PqWz&{UTHNgz8e=95eq7E@AHhT zgr`HYx%umHH4{H8@4|IxLPei#l$})R{Bb;y#aZ0u-ZV85k2tHq=(nH=?UiFlw7$MKc&ZsYHCmZwIus7|gL2hpKMvTOla z%$yU6BZA&~FQM*OYqBa_aYw-rI?rKDMubU~guoz5shzwc?}eF@tODlm^@vxx3^mmJ zK^ceUJy7c?FvW{j~jmI8j)fVwn)LF z;ynwa|7~Pf7sb!DG^&(Z4LCoa+KKk@EHia?E!;Df5AI&pYr&?4}TE2Ern$8lbPRQ=vj@p!!auOKz`wcbHNDQOe`kd~(>KdbCKPZpTE7E1A{gbR$HX_u56 zPYc<|$A8sj9ZBL$BNc!Asr`cnkHepx{MqPY!}b$|=8EWbsOf$X!2eQqAmA0~Loj-ruOx?r{Clf#d?j$){^>5{FRNQ~GA9p+?R zZ4Pn+%2H9a=NGHNH{iuAkI92a1NQUwIb{4CxDke!<8o<+Ho&R<9}(L=qGguXrSJzW zI5r$wa)vH?A>lYDewI=b!D4H$8QP~4k?N5czM_9zmJ4d6#tmTD%Ickc5XOH#6&lBP z=26NGR#yK|2mGXT+>4XvC^IoeYoD9Esc})D`12QEXdakQZh~TpE^>C8b+XIL*~BsrZs;>bjo5EjFf2zUhRM&h zBr<}lA$m8S8sZX~=M5)p$&8zxc?In(7Bok2Nn@B^H+mX@9JrcEnNz--3cSkX3^O6u zlg~mnq?v8HO#8qfYKkF2a|wFqpyqNToSbln{KD}g$_Caf!3P!JNhr7plY&${hl#`O z^=pkaqUp?w^$y^a-%cI2==YJn)1GMqy-2sL!;eX$AV+kkU5lSE1Id(KSpTU)qQ1KBf*#E)|HGi+|*-Z0AT*$(=%1Qkt`!-!gxb2^01lH?nK0 zXBM6kYMIW!*WjuuSa*C}W9L8EPi^=(x@)XMPwPP48$aYrB4X>YiZyRj+LMY<3ybUJ z4%pYncK2&3&X1bb$WL!$Ph}t8RlF`$NXz4+Rt&%P0Fh7gZq183NP0 zVXakw`=Ajb-sus-Jsa+5lv-3YX;LJLFY?mUB*@=Fgas66*-%*sv(lEb{O+F}gY1+N zoR*;ZG{fuP?5LFf_>Vr|d-6k-YfKX;%(j*DLY_%nh7$B_fMCqKwDA2YAK1s5agbHO zw)1?dLVD(y~Z(s`<1Ua0IM9>SH!i1f(7mPSCqmCXZPAF1{Y zbYcHzgU@TmTgX?#Z{^Mn1=5qmk@hi7UZnF7g@oqL((MoK`%go4d0g3dt$pj;Cj`pL zUQsBunu<+mCZ@WpSbTXV#hZLP;>7C6lsudNX{q)iEW%qNm7Pw@DkaYOu#9P4Tc|Cb z{=*UQ(cgD>tLI5vN|)5wvJI#8&vMTC(BE@kHGLEx8owoQejBS?n=Qh~=ZvF=Y0%1q zT^ae=_==pd$PS_!=K8b)$8l|GxOm85NR>+I#({>m6-Y7>qa&62KltvvNO_uDnv zW#lGUHuvu~?kr2HfVsSM=#RF(?Z--ABK4e|ScGc83Xk@`IevO$70E4?s_`r9ySw%{ z^p#8!VDq?Cx3muvuar%$KK5z7-6D01YrL*&V=X2cJeh$>VsGy?B6N~6Ph1#4sF0)* zvb-}>YNDcWuDCZTc{x71Stc!xI8%FU6#MFHR6o+?OG&Zbvzo`fXIQaybnc%H;fXqE zi1v?sHbKk=OETWZ*v2yV_t`wxjr)GWSIql4#(SAdR4^H=otsSjpj9hR^TNf7>>t;d zcz5tX`ri7cNW%-s7t{$?sqYuaU3#pvCf~`@%mlk)Nz*g}oH^BohUBE&edTVn30ui% zKyNoaHVn&6o+)WOv=Fp&cFvUNC85aME=*Gdx=MV|RCNh1O&jtVbLm=18CAy(83#Ox zjAFZ7?E)NFDwT)EYMGrtcU1VcGi3Qo9)5v~=-|w}t5j&3IT|MOzGz(oRN|eo+6suX zQkzI3wO$G>A6-cqUkQMo1SHqilrKLU0R5^qLT0ePX&i(2y+6JpH2KJ4N0=i)$-&@+ zjwCBos<#IjwnVHX?*@1^>HhfG{--pBX_eqSeNP{U+*{vy0$(W%7h+R$|OG}owZylVUXUg*e|Jc7irXxB+s#f)0RRn?tJU4`DE))@}}l> zl^FgMow|kSUsUN_nlEZ}lO`o=c>-W<9=`@yv=ozqV)C>(G{tsA1GC~xX^Szzkm3=C zg~;YX74=;`U-ycE!l(TC$RUU0N>&m37*TXKjPmsB`J`RILG~Ao*Xgcj(fQ?<^9-qm zn2nNvGU9rWyWF|)-z#nQLmuF|f}<3se2F3M;ju83ywp4dDtZTu>1e$yOmmhcPSbXe zGMqIZ2zc~FZg?aiY3b>q5o@-C24%$&j&gWh-?On~*qSVXitRlxg zo%k`-Nvfa)J$8;@%i~mwxJ2jfAAeIBud+AeYkj9Ru(EdzI7lE=d5bwZDK*#OpjEL3SvPyhAks^jr)njc5x2h7_r^TbsVBeMSD7hBymqGJIY zD!G^|p4wZx=3X)lw%x!++ipckvsF1I9e@(Yg9smX}$zvtPR_eDS( z_3p-lj{2WmSVtR>^GUVE@OSmyx~LWL0LywwNvyUZn{+K_KZTd@I+@Cki7S(l;c?Hr zZMVjekRWc6We5Xi71Cq}5z(ApOA2#%Mz2byhaI3iV|{HjRO!-2Ru^docm;!bwR$?_Jg9T7 z0U}(|K8XIZ;ctt5QZLnph|BI?*t7G*tBLOOjeus#6!tL21KsnlQ0w0q3G_3w?1E*B zdMJn=14ZDh>JK+NM;VNpE4m$_HSFb};Ikal8a@BB!k~ItTmupF)+vGI=Pe-@0okt> zeISBJP-_RnMIysTmtXO8SP$i?jnfnvd#l;ela=*MAzVgYsgfHqC@83|j#7D?_~+1w zlH(^U!J;DgP3S6-iLS;If^x9Mru66)mS@H^*dt`AbgKPodEG&%p8A**M(+_3i1g2k zFuBFJ6#^8TiZvcEr&ohJmbylnLUf{OXdir~gboLapQIp^v9#6y@B zb@<6okqAHJGSvvOHq^B zeh9_H0yhUa4CRCfPc5ziA^QZNq#3ZWWnkrsLiy@-qz0VJF33#rBN*27DFEiJE0jej z-#ra9nYR3-Itf?cjtC52HUS-tq8ozVRYXL}@KCmChKbJq}S$RreJ5KsQa$5)CF( zVA}K)0}NH9bHqt(0!;^01Gej{Poz_XZ<@$Ex8Q%A?V;T?=yu5Y->bB7#eT1Vjy?OZ zI_qrR;`jyC!aIW<1T3zIv=}aIEZM@?*V{(v^ra`Y6^X1!^5dJtSE@&}n{})ycAah|8ThJhaVDOkd6FvP4>PC;fDMJP=I0VRU=# z=&Q!li<_nb@>zF4Q?t1tV50|N?1Vdpo^5%!46qSw$0)>J4pnxkmDwh+e4I_=rf}yn zV}hwgkh<1aE|v(Ut63~;N!i7={@VY3zol1Y**Ew?agc&iVc9Cy%CR&oYsWZf9_`1| z-D-BAJnOwB=~wle*UW$nzs7m-p$&|Jj7_?`&q>Hr*J}XFZ)2(o&AuX|KAi)xDiPNJ zrq>2Rrpdq4yJQxb8zwwk>y!jZw)Ia#u7bgfiFyqYH*`niyXiBYqiSD0 zgUP~)^7v9y>&%@Zr;Oo1WMh3kN}hC=uF!L{Eq++0(&0IIy+nVdx{!$T#6@?k-d(laezRBR+Fvesf&p104Dc4rWBo9xMy$2LAA5;nm-t4bvd;?}UTY@u~2 zJP=2Xi3|sfYO|C`k9)%PWPtI5)oBJ2UZ}BB6k!3U~vl; zK+?ftnAVf9l{XXTKgxnoiA-)%)ZYMH17e~+I49Qs{lkCOcW=jlu?Mabo;D&{?sM8O zeWRE=CBGzta;3II$*R+LGz9`OhMxHTsgrQj!Vx7}f~W~m!srZw zBt{G3L^(l_(SrEoyyv{%THk-)exCpKTF-j!-@f*B?R%e-&X)jCUCd1k00;yCfEN$o zd=8)q08>-bP*Z_vXlQ6@!E_K71_(VpgoBBhk%fno_X-auH#gr^Nnt*IaRF{_5xHyP zQb;r!%`2>+B9Bs*lt!a|e*{QNOADcgurn~Qqu|_d)c<>&696zUAPcZU3FHS*z<`u6 z;CU~A3jm;?1pfZr{|-tZ1&E58=33s9Knh9#i0XV60HFi|D4>+ki!%47pfY%N zQuWq7$pHT;QGd6!&c}Cj*P1#+Cq;vvm(6;a*OV#u`G0u>N#*%CGfHk!eQ059`s`{^ zQ#Xphd>^il<=I2E9KN9H5&qvvI0=x5K7akdua)B25|B+kQ+t%1`C zZG9ta`rQ@C*Va5ds@>1P`?+AWNJAg}u&H_5CoY!py$ zxetTR=7Qc-tDszoB7KeQ`9p6BKKL05&*=o~T4mX7i(Zi@dg*S#5vDpcOx`LgNO%MF zN>5OJ1;P+*HMvcklNxI(VV5DT>3P5%Mz!7NpMH*2t|3lm9+STxp98L!97qqliJBVG zk<$%`fBC6!Ax0+1hJeg_Cy!aT_EJCSwJPj8d*Q-eyK!PtAa8Szt?^>L`uNXF0Y<8= zGw87g!-bX9{nfK^hvGH40!fqWVz-KVI2IZpIIH`J!{aC zQrLyq#Gn8Q3Lxdh08#!&i$Dqhj1mN8;)5fpnE6rC>MR0M8mwr|3;BUB6bq!H_(h)s ztgMmb<)KHVq+q!J_^}8YG=3)6qL%z6ms1)yk9AnZI>u_%CLtDIEQ^zvf)LM4VeI}SFXr05WAg_jWjrl8*;;4lHiC3V&zsLEM+JP(EEn?wW+?7rL0>;W>j-yCE(W z3=wBII^QB&`H&iE%IKNXLivv0utEfzly{jyr!hVF+f;lhW0IMwS~DfMMD}GNi4MEf zH9qptof+#P7aNMCXTMB|WO8I4@s0Z=?tiT^)gF)V<_o%Jx&a|hk?MQJ`2mO@=ywkV zuoZ6uTYZ|T*9JY}jjRhqUZR|gYEs$cdo;k&d$BLXcDXw#TMrqp6sY+o4JhX`&qmST z_;YFwKgIC}siOY@a_-Fo%acUNC?as@LuTEXs{bTo!k!ioz>6)shTT8sHc zf8HW_P!TL1ND2>;4$B9B`mqan>I|;*R+%Q&RQEX0;MKFN&jEG;9T5vpnUS2ZX4)9b znJ;I0xXG{1P2R|On1ezbZm z=Ze0F@{La^U*2T@R5*zZ5q3#5QiLYd%55FfKT%9x6kU*m73Us$jj zaKAgfMb&#x;qu+#OxbVg0bcu7h%2{|j(5AIg%mK>4r(iz=YVe+KWAPwB9g=(r(-@P zqjNAT+|F{w$fJz5G%y#F{9M--j}pt~@Ru)}&q5xd9SLiq7;)o1PX4(D`V5E11(F`` zW{&;jTMnEo@R~Uw-idoR1h@-qRxbHx8FM8Rqgz!mLmH!*z9Af0g-!>Kb0_Q_Ov(n% zm|1b%(UU-~H%@CF7O{3N>GQDB?B zL#^n=pswP~&|tby|IZ1KoKB8g7G6fA7*?85<6v|Ska}yZ^)b^eW&@6x*Ohgjb{AXz}_lSsevZ&pF@%7e5q0`R}6t z%L@iaLN7@1`9`D_*Z&&;YH(~Bq8lv9bmCCFR2pJTJSLA+%Lx?xaZQ+p| zAZA!lEDEafq#-l6#JET!T19(8IkEFv_hn%^`&qZAJ-kr=z}ybbjWnzJQDdD%1LugS z#|g+(A%2K@F*roDq*dqE#3{=jtM_z6+c^M|5vC(FOOS*~Bx(*ssBlnS*upQi%<@y- z6tJ{cl&6-6Q}B}y!|d9cqU?4_-uR8&IS9Ob!JFUAzQiF+3+dtg`VO+%6Ox*v^3-hP z00B5E)9Ro_*@16nF6knZDs?8_^Z2&AMq3(oV@M?vE=#F9MCVfmrK$t1xMKIPM8DWf zoU5y&A%QE>oKvpcPadr%m$sFA^c>zGjw$85lX?!Qo2uJD^9zV4N9Xexpy(lis4CfC zakEHyX=`haBU*+x;Cl^&&#V;Ijjsj@?%=qz7Sq|R9k1upCcYs}3y5?FtCE`TBu5A; zkX{i3V*r93k8vV_Nz}TV+NPwh^$h}di`1!oQa_^7s?yG=l)uMDcPHcSRy1m_ z`~8Hj_FEVZW{{bz_=PhzxQN~w1~soRPcoz%$*)_yi7sl3$S-+d#Y|Qg&Q!y62cuh> z0aQ;&CJPo3wNmfPbxJp}vB4ONi1n9ZHpX>xor9VLF_v-7KQ=cXtz9W$wZV%L5g@dw zD2$MxwdSg`nOZYi@t`nRgm7-T%YGcWo=7}9H?Jq zE{ROx&nwk&q1V8~lKNkT2sa5AgBLYSofWj&Jl>n1wN6EjSA=0SH~VTz!rl+Cri2EX z?1>NZY1?_2BzN;Kvu%xvlP~^~Z{Fh)86b zU-W7IuX?z>*${j4K#yyE=I*PdX_-epnhkpmdFjmgGsPKWWEU81ckYCGUC4~Q!4oYkYK~VpNdY#eV#|AGp}I004A;E%9CPAA-x% zK0DSSZxZMR3I&qB$}1sg>J`4}jaXJ&(yOR*8Awz-eso`j2t*r$hNt(l-IO8Ll)awR zZ_k(rVJsB3vgTYq3t`PLNbjI&&r*-Un#4o&D6gt(0-i%HRD2X`N7c2sJKmnq6%zj2 zVFh6Su?!&9|E9!0mJz|{dtn(ne|yI7D1~CnmLViTuQu@~{F9#9>$e~Y6B0{Z@tEi< zw7AK4o2i0&&55dgELP(0959BHg>@B25W-+>C%6K}Y? zCFa1{fmP~P81)~W-0DIqX6*giDev-F(YCyZ;RoC|PN^FE<>fJD4C()HbS`M?0=(bLc0ERA8?59C zkTO#X%Ljs9J^saqqpMbzmTl~Kuxsj^o8(J&CGr%*Zuz3XUQa)tZrwVL?60J8zKGLN ze3NaGMiRc$!8?Os(6TnR z2qTk-#khk7cNhe9x<>Ct9?jups5X{Sba3isf&F064Y06>ev-`a(CU+|hBDnz792Jd z`xzPczE_(KypTGY6jLt0%lTHSqib=H(9Fm36&Lgl3R8a04YCgDeI2j=P=4)$c7!Qo z>Mqw4#^()o{Nb)HIuM3ZUpYN1XN{X(t7b1*^Qw17*;|yQXW}Xsv%yVt`k=%9) zhE*8Fex{UE4OT{po~UzH(+pvqaX0Hxvg%#=Nuo7wxi>MhbJqwGYcj<{^xd{%)M^?U9(E?`-s_h!GdQ zdMlNsX+Pfwze<+4#2X&w57_?2yl4LtW4GAUZc{pcjcdh7+dSLq)ymj(VDSJyx%s50pw`*0W z{6G$k#4Tjl$txcx*9!FWwVYhmG+f+gu9Z(4ajFCczYr9c_)e=o$28WQKDRu;s$@EZht6QyL4 z-|Ykbz7OX6i6bV?^n|0lw&WUQV@^V4gN4(xBfV-!y?LV0BiY$G7QAcOOv8`+1qB0z z_R)#gaJbIfq028^oo$NwXIJLpZ+T>l@Pf^OOFfyEFGzp3WY$+#EGI|UUqxM7&a`BZ zg412Uk2t%Yltvhs`Rg|4gy3dRxp`iXMee?KaBrtANNUUmUMcoo(u=d;9Kc3%Hm_G} z%X<*5QPB<49LiaZHkNL^8JCr&8>yE?No&XSB@x`vR5w-)y$3QO)>Lr>kID{;+Rbw*PAqI_S$ z*Sy=-5iHfMIwvPly6=EVmzBI9Y=aSv^nfUXPjUUX7B6lo7zQ^$tX1}8W&<R^Ck^ zY7s$OVXSu-gi{C=Uer8gtWlK#;7gq>b3EMQR$rli350iho&)0G>36h=-M1g|^pUON z$RdYB*I!#P@LYPp{uN7nPiWUeEeRGWgZvF1J~N@}2ECI}z_a82GNMl|)p$u=hJ6KV zm^uu7bQBY_v!Qh5W*`xBX{N~`8gpCADEPX5HR}WdF%?qZIp>fFSV{q~w$y1VZCkz3 zGA}&4ImT@ARLmLNOjWlKBk;;|7et++tsMF1W?+uAALH{d#TY%Sd4+gi875vsBoM2Z zuykS?H}5=JntNZHel|LD3XwL9+3J;E$Bxx5M`y)Fmjuy53M;JR1b=`#@?7TD$d&uc zmbQl578?_}A*f7OU!KCtDw;_GG)x4sA=U>Glz0)GI-6o|S6VKjezpen8p z7iThx<&QEMOOU=!#>qVhOc;D1pTI^fHn7EQZA^+ SFy0h4Vu|?xbo`-qKJz~|j?X{< literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/JPEG/Image/testorig.jpg b/User/system/lib/lcd/gui/JPEG/Image/testorig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9816a0c6231a7c5eaafd445368a9eeb1cffc63df GIT binary patch literal 5770 zcmbW(S5y;DmjLjD7OF@IQiAkel%{kP4J8sV5JE?av`~c5K@n7n^ePbPA&}6K-V}sT z6$Ap(MS2lLiZsRb|9yLQ&)KKly>n(BX70IXelrg!N z0e1kjG&CR@YFZEoL`O$U&&bZi$iTqJ#mdIa&dberm6sa=;TM(_;}?_`f|9_4@od6bEKn7r$5-13uU;$FH z0RQv=`2Oyb8u+gO{AU0uD5v}?P-#-n?}3J#cObo3loIJvk*M8(7l0; zqpPP6GeMf7%*-t;9UnS5ySTccef|6c0)v7>p1+8UijH|1o0^uM@hUSb8(V}c#+Q^5 zh-Gi;>KhuHnp;}mclVHb`}zk4$HvJMlb@%iXTB~iudJ@EZ)|S;*grTt`gweEdiIYC z2%!8o>+kq)*#B^`{B==KQBhKX{&4{*0{?bO7Ak51IU3g62#~!Go1lCIExUF~VQm+k zkb?0Z*a0(2&mpY%RpiG%w13I|cd%#wFWG;={@XPJV59{8y*x@5fEHkX6&-NqEJ3S? z<#s$i(D{LY#413eeOAVPAa+U0kWstlJphrN%u^#VXy|6n@KTl<_J$Q*uxOI8hlbqK zDP}!=!sKQ-&!OyG_4ppirXlO<(FiKvWV~|;@?o?ctY?&aGu)#B9wM@=mIcwLXC zX;3_2+-1L{U}YJV%VV+Ar(9mj9P+K3FD_oZ%sn9Zc?1GGNv^OIRS#2&?}_TF>e&s- zeEWVW!?2H0;x#eQl%iEN_sV_eY$03yrAB{J)^xZIVCD18ug0ZFoB38Vyi9z^i#SNJ zC+SgSIV@BD^;N;TjOtGZ3D){kqoHeKjVHA@lbgPpi(M(j8Vvd{F;j}SE=gr^WJ}BCLveC z3P&@zLLUF_Gv(C!3XdJ+j0t?C_|v$Va(nw;9`DC@bw8LY6`#POjhd~@tFq-7iz7YG zkTtU2MfEHTUq3JgCC5Kpq)>etsqf-}f0+U+8~IGVZ{9T=pKTVLS1P%n`nRoZ zt8pD|uMng_I{zEq4-VK}p%+1EpmlsZNsD?1{taw00G6d&dICme;5rQtLSl#_r&SYd6hX$**^2 zH*IEu^m?-&r^PP)(sh`8Q*Y<(R^}zSW;=|S$O~A5?{sZLJ%1-@m|!JaQpSUFKFvkb zRP-E4Hy+vC$C)lH*A_e%QX1Q^q_RwCap4keiOC9=YTSFgLWB6k{RPB1SXnHI)!7&( zt8@8qIRb@4xYr&jwzcWg53p2YELbv=nH;vT)@B7?Y1~JN5zkNj6ioR{`Y7JyT<1S0 zcjNuBnNcn(`=20wO1W-Drx;31XXH1v&)G4!Z~5(qsx^mYW|=Y~0rtQ10=e|&qX}S# z;fc6x5p6KDwkmcT-y9|NB)Jn8?~AN*nD4q^83u7x!6t}!wAXrd)S#4vuW4iMP4PE% zwE+(1IjLy9Px9eV6$ggnFO(Z-Q*j)v!mj&>$Fb{ZTO0p=Y+4guzb0}D)W)}ILL+`@ zvG}*DvB(EPPkBmSfuCkiVDX9Hi5jnx`tm0Ar6`dSSe zTe^G1UF=1*cY7FW6PU^g%DQt6Y5!?Ly9}3VG*(G%;>pb+0~tzw+B)4;9_^TlMg&f$ zi})%ePJ~P+Uiq-orP-jrEZ1Vv1->?;g(2wjub7I>t;642&%^b){6@UdLFqTF_>}HP zttdWbnQZtF^wP#B)!V%&y~4k@_0@BqdJbNnuJ8Hi*rm&U15*ZJvmFLL$pMR(4UIai z_2Pu=SPAkz-W!88Ji4 z=6=P}UY+>du6_5RSTz{+o+iAX=X?%1h|&pB^v0aP*fY`#`W4N5lwJ=gXsTi*&Pz}( z9}Iv51Ac6#B7N^VJW9~c4ElAur_q6PG0j{%ub9}s)POUa9?8nq-s&svCKA_G2wwiA z7r6!bc+8pU_$&UEMbv5!tta<=I_VA#si{19xo7EF_Itk7CaFBhbMEpsw+6F#nuSqb zBOwX)m+f$JpuA9%74O~NVhg(N z!);TRtT_sKZ}b+Fy~;rv7)I#__*ucjs{(_;!Is*CgSu2Jp(aJ9oMKqv$i8F(7=3C2a8fAqv3w@#8 z?@?>5Ldmi^T@gokWB}JN$Yb*P<_{>^*5Pi)E#ByN9WFzvIQD*Njpo9xO2fbbj@6G3 zg?4pjzFf3oRVaiVz0C5{^V-*wj4m1^W4Qa|^A{8zzc%9c)5KnX~U+JgGovhEM9a0rk{v4j7YErx-q^+CRPLrTSK6+U<}KWDn(Iep0~W4hy`HM$wM=!75?hj?5S zdAXw8JBB{QhC5lXL@gYxjl$~zOm3ULMpEsz&TI=Y$h83b=)Crd9m97X?QH$WMeSQ_ zZmet2gJ{rL?9NZ$n`;rPuU$zj&32M@FLHnbRaQLK3CL6cWHQInAb~Sbc?6v|NOGXC zsBNp#kkST1e zn^y$BOY;a%KnEmSHDxyOBOM=-pF}F#1S)o$W~iLsJyIXG;Lm!O%oAuF-z->%H>qE1 z*gfLJxBvYsi|zv;dFh+=Csm`Rb$0#1vvX!~#yPl_pXTb1<-Auz6fTWX-pq;(Xa+nB z;X~8hmh6lIQE_ASL?U0_sZD3~9Zz(tgEdLNDf@=G-mT8IV?Owimz_);$@r$6FE27@ zX!5QJuSt`Dr+AP-+a=V*Su$7~j0pA$Twb^KQ=*$IJuzzZF)4HL5aC>azN}cdDS+7s zTXy{Jw|rDmrc~iU!aP0p|TJ@wA3maZdy!cX&i z>)2Pwn*- zOT^H3>#@E5|B#QLEH;nTHEJaV0Yk?cVmLU;F3-Mc?-M zx!#$gDd8JJr^l;N8_+9TsWnl`roMS9|qwB^RiK`nman zsimw9eYql-%DMLYHOs|}2W{5PId=tkWIhUT3?}|PLk;)BF+43eeMk6GRLiO{+`6&l z{JPX})>XiU)cW?la*a8>im6Xy(%y}uO&RRR2%wi0fO=Qq4`8y&?KViTG*u^MsAcGC z2@c#XVUuq_#7y51@RDc#bY_xkg|6M0rzM!avCxnt4Q4IHK}trSX`Efuo9Bg=oUyp9 z&V<=-pr0!Bh_L52Z|0!^6@5I0VHv6dCa=^J!?^>UwCS}4dBbb^Ce!2p09bxe8$oP+ zQ^y3wSF?u!_*5(V^ahmAg4y>&@I7eZTzOeQEdMz!&j<~Isfgvdbw}L8IEktF%B3>O z=(ZN8|BA*IJCW`s45N?Ig)Ny=CL0R)oNExjFu6O2-?T<59i{|Y-|F?vZ~X!6CN@<1 z$T~TzH`#AmAtH09FZXn3kO_x6H)9^fqux2kU+mjHn0|V86kTF5hrS{=^PbLGE1YO> zg*)R9Ad|kmPGvp*!hiN8td|$aJY(Rn%;jX8C&WQ8s{!3>{nJiex+-J9~LKZ zmIl-t(6iO2G-C9M)JPYSP13hN#rEY1@o-!1-fNv&sDC992>AL?nIZ2miRw9}|3`!wct9?Gw??;jC^l4)Mo9asnXP;%90t*kP?|3D(S59YV_ZJfxdCU`*DVy1U zP~@MwK9yWub!i&$Rho6`)JOt*anY)Ib6M4LfrU2r`ftl?f(j@~^_E{ejvFDaOw`-M za>%(qh14>oce;+033>j=Ia8=qF&GdS`b8|Zfg#0;@7rv=gM}>VI4#XgAj2A< zteKH4Y`>7xL~ZyqK2>fY1f z6F@r?y@ifXMS6-UajC^ncAyJ_m1^Z*w<*=P*oqfBDa-S=>_TnsY@beun|WO+B9P1# zbm@ar)9P7r{3{(2Ei*LcZDXGF#dy?*>O|``@wxe&54^6eLa&|e{xC=z{9t5~*HEs} z(J^g7#peO}yq^Qv{U$YX!BtZ!9H>cKLrUF9TQW6fzmq=I4O-?{5nX_nmuAW4skXORozZcF{OUWbLROcn97_yI zm!L%NB|^;Cm_DE(mZHP>vKJi%?^>z*DM9_?2uW(3 zp;cNLPnee;G0$whk`GRy?866LDlh7&B8pVN9)MOWSmD#SAP33u6X7wLDch<764En` zOCo>O?1huAVA~_gAZ|5i?EXV02}s&ZEBt9Esx_6Xe!sEF{QO<#`j_!N0`X3Tkvr(M zi0kL`5z%3Z;saCzT=lzto4flIw}h_ar=6@TP4402N05-o;BCvy z7r{XqaHl5Au`9K!%dDodQEB>muEO-ALJ75WBmsK^XVKT#axRtFkNP|g$g@~l>Fc1e z7|)g9h?xK)by7j8gLT4cCzq1(G9n7{tn6fiS$)!fp=8WSaIn_DFUPcg1#-bO)1}Fn6j7fX51NCTRr;^`PxmHw!KtSeua$3zrJ_lWSZ( zZ#r(9f7azW1%>yP6X|s|tZt&uBT=f$qvW7YDL~Gbz(EGL@~ppxY?dq6T4Hx$C6r zd|~6eh=)dBHMp1w8s+`J;EQoP)HAL(=gsp{fd^veoliA0c91O1mvt=%D@C+S%9-Mb zx6i8$`#xmyr-OJ^Cw&v$7mh}vEm6d`R@PHKknir(w7GH{YcUR@W6&NOO-MF~dJckQu)LnE}U_{r;`I})_ z#TiaR$#`!ylhS8w4-?12_G(W-cm=K{!A9yAkxYrqFtUa5_}!M|h?dU|zm32t9{UxY zi#1;KXA>O{u0gy>9}xRbJ~H^e@^@17T~{1O(T5s)fEv8)P#;Bi(E~9^Pv8y`kebr9 zVoGXD?v2%4`dP75QJOCGYMml}U6*fkQ*K3GyRRmOZ@Ppsc6}|B>{ktPV9O|EqX#ng9Q(i%9Qn47NBI1q+ zKt&jNMeVq+VK9Cl6e5n7iA`KhB*%NV6vdi^ZHssX<@bX7Vx&)(zx{p1+rRDoonK3> zyH+rI;A7n7@n%pyBnJUycD&g#ZW|QFV59Ic5p^J!I<>uH-JJ2VYXt#?-}EOC8;|+1 zN?SCN)iCj@m~Sd^iEe``MX^QH{?-_3eMfdrKT3X~u~^Dsuv;8( e^;Dd4QS7i5y@D0wT$xcv%Tm0kNlEL^^nU=~nbB7O literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/JPEG/Image/testprog.jpg b/User/system/lib/lcd/gui/JPEG/Image/testprog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..920fee2e32b5a8ab0af796e010ee8a1add3eee63 GIT binary patch literal 5655 zcmb7{cQjmU+s0=`?^D!47`-!$(TOfvln|nKi8@;JPDG8P6J&IW9yPk?L{IeSHIir% zk>KN;^S$&#ty6@|`>s0_)UFDt%00;yCfHxQ5dJ&)qAjHQf zz{evbARr(jA|xiIBqJpuA*F-DC@2}>Om`UJ3=GU{0-Ve&e5?!%Tw>gOLP!(}#l$Hg zBQ7j0Ac7LUeF>0=h=`Pgl$MN)Rv5v65dMGHbq@eS2uK5L-~d?wAP5i#0=(`8&;tM< z9N_Ke{QoB^V#GdhuimXn;{b) zxA>^!0F~>|#=Atb8uQ%#4<8Ve*CP{t`&F6yws-GrC25R0RtHy(444airxDB*!+$yQ zs8Lcfuwya)&$wq?aiG(Wx5u+&x&G|)iW(T*!Is$@T%v3uQ7QV zSY6Q+{W7ml-j~yTEszX*G543_ z3pU59D;JtKdx2UzU8l3Z+NFHP#m)1K?r6Vro}89gY*lj;$+0~O5Lb;X8f9)zmYny5 zxXzRTd4;$oJlNoQ1AX_z>|_On(|XG4OW6or^s3rS2UqWcPwIRNW-Rt*E_2o4>$pX6IvCi#4zi)NLHf8f5&oNjCP44XnNE;8nZlJZj8y zIIj%9zhWWgr*=h8qL{|3ipB_H>7)kgPUQG^U)b)+NHtOk?g6heDISj_W>=2I`1s&> zXU?lYhVLxmjymIiUIE+4+~u$o0we1H6tEoy7jioPz#7oI@Mv4&c$`O|YH0$u8>{hv z0iYY>;o#ujIPC8Nf&dU4TriXwfy9Hc2#d%ounJL9p>DiKcw<)}9_T7A16Womz{E%* zoRp-(kbAO%JE)s4)+|@Go(UH*TGF)M*0hOMs!9-CUKNHF^_L3iyew8v<1zera}zj9 zod&q{Y6f8s=f2s!?>AiVMtt1i%}N^RRQ7(&Q&zs?%7P0D(xrw948Dw)S?ft+!a;PG zy7HFzU9oE^V5HIXmR-UETJ(hHS=vjQ%5&;_-+*Tb z)dlPlZJ(x0qxmZNpXahKvBGFuBT<&Id*7?IIpSqSbmW%cTV2yuJ0U zo*DXlL>;@lt9wDkP_jbfUDFLRLKfICysWy{9)0%tSd=Ai{ zHQtsC*ycgNv~7?iDGXg?i&-~ZvU9Pg2TSXbzFs*aaGGPB$BIC(^g5Xaxp{&!omvXM zJzA#_!t%JmU&ZQqbHbqs+ooF*J+9_GM&Q@=KFu8u_uk#HI+=(uy#`cSXJIy{^Zg=K zf3mx7RQM&lAo}+Coa~Kg=KbI#Z4!O`Qq%Gb3Wj%#gvR-ITR2Qzo)@0)6T8%zua3iD zm~M~X==+fsy1o@7Q6d7RO6RQJ4?4vC1w2sjZAGICq03PV#dETu z(5jbLxp90$dlJ1LA~dx{o<2P>Sg8awr|C;>dAUM#6;U@hGWuSrjmTd;NyMa=@7#qZ2(gnHuh7OKvDkU|(H&NT;>V z9>jK%1rDoaO=zRwIy~myZ0PGNhn@`BD0{Vx5WX(^$XI0J$J`==`twr2!{IETja)!h zgZfFvxrDpn6=@|y?B@DU%FmTXteI^@#Y6jOb)p<0Odd(Pc3l9^{BPP;sHC=Cge&QD z+m)uUwziZ!+6tp(*0Rozd24%lV=41PeHS^BDPq2L{fFCe{6slKIb>)j<&7v#!J=lGwIQ+~ zPVsAisW~;v2ZCBUNdc3^E54err3^0*hc*CjB1mAlA7la z^3*{S8$CSOp4WEN%acv9FW6ZpsBol1y2j zkOosgsF}h~nEoN$KYRla{2R4E02l&dMnHv-Eb_WmICoivtuY>9$^Q}#Uk>yeJVnFg zN}ON9bKoQD_Q9AJHNT~rmfr0g_3I&2y8KyOO&wDdrwxA&x&Lom^x?a7ygAJ3l1&|| zWq}^y`<4g0$EcB>vpuNeJkFnIT90bfP%6wR)r^W3O#h2`&6`%i&$uR`g0qAdQ>}p}4E`b*lFL~mVa1576iglnHr77n~22f>~ zoi_q3^QRfep4YsoQD#it_YsDd0lb}uLt>}lE)^_m(79e|U)baea}N~LnxDE`_xWK2 zdKW#T5UtuAM2d}kAdHPB{B&NGl~B_IclmV8t^()aJXNIb|7|x7@1GbV@|>^83f@{3 zEmodk8wy2G>xXgmqp_^2cfI?M3LtiJc=XnB$~obR?~xgYsBfk7P?o6jE94Yh*9wc( z3kEMiYbM)8u-({SZHZ1yl#yuVm>C<5I;JzY4DiT=IG<{>->ul|DE!cxCvSj1A(>tVq$Uy>U7nhtnY7Ej6Nus<^>{BMlP##&q`)vY zy!Q(lT%e((bR5L$m#};9W5e#mvAs`l`YhS6_<`Ts()tJjz3>V$HO?U<7Z0`-^!|X` z^-b3-t)o7h?iq)oOd)UAsXW8=)f+!7LfA(%ds1&!);fz1li+l!dR8z}ddTNKe)YZf4*yfsHGm2297AF(7tHtJz7@gFO4K!gnV>5$RPF{BtdQGT z*uD2V2!I?rCP ztBYn{#&Ff^hJ*-dt&a~i6`x8pCr0a%>cIk7vioXws#3k<+^2%V>yDmxW^&>%kGp$U z87Dwqyngo9HcO@TjM>)w8TE^ULj{#DdL9;CB`bs0N>1i*tuV zO`Hj{S5r^&=C2$3A{FbkbklV5EMvt54za2LK0!AQp<*oi{JZ>Wutif03@RipZ z-mWRtFY&?q!_?OYp3ht?4>2_7Y3dLwUZF}2>C1cj}>>(sPdmRFjM=GrOR}xOxAsp zlx)v6dN&Yu07EbFZ|Gy&&)`3vs4bNREa?K*mVZSAIBy}AK=~0oThjK zk#&nr1Xmjc8K!rR_wf$}xoo@=)`PI|zxbuvFkgK!H+$s--#P;X#J%k!{+TWSH(7EM zCE(jAnXK(*UOPPcZ=irrrH1=5Lm}#eapI%OI^|0!o85Fet$40dO*T7aqbyugB_Nk@ zkMSD^_w%-*in4g;450{55XV}$-g{aKr1=qmN8*B1IM%Xn6pQzRIZ7-TAwzRiFCrMM+5CtuF(A$UM1HR@ywx&-|gs9wG zP3tNtfttk|7?yUkPCX?)0qi?S63#lj^2CF5QR{2Y>yWcL6-E;qgpM`|^!wpbY&+{; zBxbbn5OiX`SW&rvoPJQIYMc8bih=Pp>bi^3rlsHHOD>d3K&bV+d-ptq_<}Cd56to8 z)d_-G7ro1rghrcQ@|RAdO#{)jN;7-UQ*d=uM@6~k%_0?z-f7jsC>Lt(-t#)l;Fhl5 zCuUWIP@1y(D5BBSnH#-Nc6)x}gs>9N#1@Dd`E`O}e47loCV{<+N+qq)kAFZcAH3g` zR<)`^W(c-4kaRPP2Y1nnzbiLl7N+q@q9Wrha}l6IdQVCJW0_ z#cqY@o*GC{f$c0DSq(yeamT+QLUX7Lio-C)29?M?V)UnZZHQwFK~`XxMO?JUKD_FP z@lJ1nlqGFcT5?UfQN?mUT(G_7sm6dV3nS)?rF||#XjuV>O#eGrM}I)aEY6KLr2*#{n4BAcvp+nOGQ2pnRSxj z2qpvLP`m~4k(AM91$N_@8T2Hzt{LOq*WF{j;W67n?DYc&P^*<64hUs zn_IokL(L3#0tX&KHo&Gqafs6I7td!I)VAs#0NOu7)2V+(mVA9~-)xlL{~&Nw`iw(p{8zlb#hs9CFYq;vGqJ%{<(K=O z^@464$F=e@WU1>VuE0{kTk5r(7F%AEC9r%YzR|shJo{i9rcA@M6Z9(Nu%Hq!QpQLl z6I1I=)ovp^lcjLj!Qr~`M$>s~eV;FFp7RPitYY*=1tvr9;u5Qj(mR;WNp`_}?S0*NZ!0O17jS5$qW4qOgdqc(E}HrWIl;#kEx#ljhbX~C zsF5pQ1Ii$E;zqw^G$J0cwP$(_Pm4b}xl>l{n=!JQ?H~xAq1vSpBXbRji@5qGIxCp; zTLGcJ8iU;&IZ@!sS}N*QA1sz<9}bJGA;PHO8k-c@8%b@6d17(T%qj7qUYsZ0?6z56+I?~sasnVb9`n?ZjVtZ3B7%oF~GNLhe#LwZ#q;};^oZisv30;4}CYxss%Jin` zJ}ZSZkL0KdZN}0x5OJ4Su%;$1BJvgNy`Pe@RVcB;2Gwk@0U%wNCx0E^V&GL8LmRKu z-sSM6qzFZ{UIIDm+n#|kOp)bT#;B*P(fM$jQr|k)hk>_=uK0@ZWl@L*4 zD2uZ*`|z;_)RsDT;*`4^IDXN**v3#jGDu;n$2hu2e_hm9F0NmR5z)R^LnX>9WdC4L U9#E?5!l?r;*e8trGk!h)KW4JmQUCw| literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/JPEG/Image/vssver.scc b/User/system/lib/lcd/gui/JPEG/Image/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..efbc7d103ef019e0a29038c8eef9dd87dde5899d GIT binary patch literal 112 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WWMtGH=JGBbcd6p+?gRba5^ak~N|P$U}2&)Lr8 h1mnj5`P@EhTVVWHAV0)DwI0Tg1M-bOA6*9H0{{`CA7TIi literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/JPEG/jcomapi.c b/User/system/lib/lcd/gui/JPEG/jcomapi.c new file mode 100644 index 0000000..2dbd71a --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jcomapi.c @@ -0,0 +1,97 @@ +/* + * jcomapi.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface routines that are used for both + * compression and decompression. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Abort processing of a JPEG compression or decompression operation, + * but don't destroy the object itself. + * + * For this, we merely clean up all the nonpermanent memory pools. + * Note that temp files (virtual arrays) are not allowed to belong to + * the permanent pool, so we will be able to close all temp files here. + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_abort (j_common_ptr cinfo) +{ + int pool; + + /* Do nothing if called on a not-initialized or destroyed JPEG object. */ + if (cinfo->mem == NULL) + return; + + /* Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) { + (*cinfo->mem->free_pool) (cinfo, pool); + } + + /* Reset overall state for possible reuse of object */ + if (cinfo->is_decompressor) { + cinfo->global_state = DSTATE_START; + /* Try to keep application from accessing now-deleted marker list. + * A bit kludgy to do it here, but this is the most central place. + */ + ((j_decompress_ptr) cinfo)->marker_list = NULL; + } else { + cinfo->global_state = CSTATE_START; + } +} + + +/* + * Destruction of a JPEG object. + * + * Everything gets deallocated except the master jpeg_compress_struct itself + * and the error manager struct. Both of these are supplied by the application + * and must be freed, if necessary, by the application. (Often they are on + * the stack and so don't need to be freed anyway.) + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) jpeg_destroy (j_common_ptr cinfo) { + /* We need only tell the memory manager to release everything. */ + /* NB: mem pointer is NULL if memory mgr failed to initialize. */ + if (cinfo->mem != NULL) { + (*cinfo->mem->self_destruct) (cinfo); + } + cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */ + cinfo->global_state = 0; /* mark it destroyed */ +} + + +/* + * Convenience routines for allocating quantization and Huffman tables. + * (Would jutils.c be a more reasonable place to put these?) + */ + +GLOBAL(JQUANT_TBL *) jpeg_alloc_quant_table (j_common_ptr cinfo) { + JQUANT_TBL *tbl; + tbl = (JQUANT_TBL *) (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} + + +GLOBAL(JHUFF_TBL *) jpeg_alloc_huff_table (j_common_ptr cinfo) { + JHUFF_TBL *tbl; + tbl = (JHUFF_TBL *) (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} diff --git a/User/system/lib/lcd/gui/JPEG/jconfig.h b/User/system/lib/lcd/gui/JPEG/jconfig.h new file mode 100644 index 0000000..9f20d29 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jconfig.h @@ -0,0 +1,100 @@ + + +/* + * jconfig.doc + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file documents the configuration options that are required to + * customize the JPEG software for a particular system. + * + */ + + +#include "GUI.h" /* Only needed for GUI_USE_PARA(xxx) */ + +/* + * These symbols indicate the properties of your machine or compiler. + * #define the symbol if yes, #undef it if no. + */ + + +/* Does your compiler support the declaration "unsigned char" ? + * How about "unsigned short" ? + */ +#define HAVE_UNSIGNED_CHAR + + +/* Define this if an ordinary "char" type is unsigned. + * If you're not sure, leaving it undefined will work at some cost in speed. + * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal. + */ +#ifdef CHAR_IS_UNSIGNED + #undef CHAR_IS_UNSIGNED +#endif +#define HAVE_STDDEF_H /* Define this if your system has an ANSI-conforming file. */ +#define HAVE_STDLIB_H /* Define this if your system has an ANSI-conforming file. */ +#ifdef NEED_BSD_STRINGS + #undef NEED_BSD_STRINGS /* Define this if your system does not have an ANSI/SysV , but does have a BSD-style . */ +#endif + +/* Define this if your system does not provide typedef size_t in any of the + * ANSI-standard places (stddef.h, stdlib.h, or stdio.h), but places it in + * instead. + */ +#ifdef NEED_SYS_TYPES_H + #undef NEED_SYS_TYPES_H +#endif + +/* For 80x86 machines, you need to define NEED_FAR_POINTERS, + * unless you are using a large-data memory model or 80386 flat-memory mode. + * On less brain-damaged CPUs this symbol must not be defined. + * (Defining this symbol causes large data structures to be referenced through + * "far" pointers and to be allocated with a special version of malloc.) + */ +#ifdef NEED_SYS_TYPES_H + #undef NEED_FAR_POINTERS +#endif + + +/* Although a real ANSI C compiler can deal perfectly well with pointers to + * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI + * and pseudo-ANSI compilers get confused. To keep one of these bozos happy, + * define INCOMPLETE_TYPES_BROKEN. This is not recommended unless you + * actually get "missing structure definition" warnings or errors while + * compiling the JPEG code. + */ +#ifdef INCOMPLETE_TYPES_BROKEN + #undef INCOMPLETE_TYPES_BROKEN +#endif + + +/* + * The following options affect code selection within the JPEG library, + * but they don't need to be visible to applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS has been defined. + */ + +#ifdef JPEG_INTERNALS + +/* Define this if your compiler implements ">>" on signed values as a logical + * (unsigned) shift; leave it undefined if ">>" is a signed (arithmetic) shift, + * which is the normal and rational definition. + */ +#ifdef RIGHT_SHIFT_IS_UNSIGNED + #undef RIGHT_SHIFT_IS_UNSIGNED +#endif + + +#endif /* JPEG_INTERNALS */ + +#ifndef GUI_USE_PARA + #define GUI_USE_PARA(x) +#endif + + + + diff --git a/User/system/lib/lcd/gui/JPEG/jdapimin.c b/User/system/lib/lcd/gui/JPEG/jdapimin.c new file mode 100644 index 0000000..cadb59f --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdapimin.c @@ -0,0 +1,395 @@ +/* + * jdapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-decompression case or the + * transcoding-only case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jdapistd.c. But also see jcomapi.c for routines + * shared by compression and decompression, and jdtrans.c for the transcoding + * case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG decompression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_decompress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = TRUE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->src = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Initialize marker processor so application can override methods + * for COM, APPn markers before calling jpeg_read_header. + */ + cinfo->marker_list = NULL; + jinit_marker_reader(cinfo); + + /* And initialize the overall input controller. */ + jinit_input_controller(cinfo); + + /* OK, I'm ready */ + cinfo->global_state = DSTATE_START; +} + + +/* + * Destruction of a JPEG decompression object + */ + +GLOBAL(void) +jpeg_destroy_decompress (j_decompress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG decompression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_decompress (j_decompress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Set default decompression parameters. + */ + +LOCAL(void) +default_decompress_parms (j_decompress_ptr cinfo) +{ + /* Guess the input colorspace, and set output colorspace accordingly. */ + /* (Wish JPEG committee had provided a real way to specify this...) */ + /* Note application may override our guesses. */ + switch (cinfo->num_components) { + case 1: + cinfo->jpeg_color_space = JCS_GRAYSCALE; + cinfo->out_color_space = JCS_GRAYSCALE; + break; + + case 3: + if (cinfo->saw_JFIF_marker) { + cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ + } else if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_RGB; + break; + case 1: + cinfo->jpeg_color_space = JCS_YCbCr; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + break; + } + } else { + /* Saw no special markers, try to guess from the component IDs */ + int cid0 = cinfo->comp_info[0].component_id; + int cid1 = cinfo->comp_info[1].component_id; + int cid2 = cinfo->comp_info[2].component_id; + + if (cid0 == 1 && cid1 == 2 && cid2 == 3) + cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ + else if (cid0 == 82 && cid1 == 71 && cid2 == 66) + cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ + else { + TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + } + } + /* Always guess RGB is proper output colorspace. */ + cinfo->out_color_space = JCS_RGB; + break; + + case 4: + if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_CMYK; + break; + case 2: + cinfo->jpeg_color_space = JCS_YCCK; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ + break; + } + } else { + /* No special markers, assume straight CMYK. */ + cinfo->jpeg_color_space = JCS_CMYK; + } + cinfo->out_color_space = JCS_CMYK; + break; + + default: + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->out_color_space = JCS_UNKNOWN; + break; + } + + /* Set defaults for other decompression parameters. */ + cinfo->scale_num = 1; /* 1:1 scaling */ + cinfo->scale_denom = 1; + cinfo->output_gamma = 1.0; + cinfo->buffered_image = FALSE; + cinfo->raw_data_out = FALSE; + cinfo->dct_method = JDCT_DEFAULT; + cinfo->do_fancy_upsampling = TRUE; + cinfo->do_block_smoothing = TRUE; + cinfo->quantize_colors = FALSE; + /* We set these in case application only sets quantize_colors. */ + cinfo->dither_mode = JDITHER_FS; +#ifdef QUANT_2PASS_SUPPORTED + cinfo->two_pass_quantize = TRUE; +#else + cinfo->two_pass_quantize = FALSE; +#endif + cinfo->desired_number_of_colors = 256; + cinfo->colormap = NULL; + /* Initialize for no mode change in buffered-image mode. */ + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; +} + + +/* + * Decompression startup: read start of JPEG datastream to see what's there. + * Need only initialize JPEG object and supply a data source before calling. + * + * This routine will read as far as the first SOS marker (ie, actual start of + * compressed data), and will save all tables and parameters in the JPEG + * object. It will also initialize the decompression parameters to default + * values, and finally return JPEG_HEADER_OK. On return, the application may + * adjust the decompression parameters and then call jpeg_start_decompress. + * (Or, if the application only wanted to determine the image parameters, + * the data need not be decompressed. In that case, call jpeg_abort or + * jpeg_destroy to release any temporary space.) + * If an abbreviated (tables only) datastream is presented, the routine will + * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then + * re-use the JPEG object to read the abbreviated image datastream(s). + * It is unnecessary (but OK) to call jpeg_abort in this case. + * The JPEG_SUSPENDED return code only occurs if the data source module + * requests suspension of the decompressor. In this case the application + * should load more source data and then re-call jpeg_read_header to resume + * processing. + * If a non-suspending data source is used and require_image is TRUE, then the + * return code need not be inspected since only JPEG_HEADER_OK is possible. + * + * This routine is now just a front end to jpeg_consume_input, with some + * extra error checking. + */ + +GLOBAL(int) +jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) +{ + int retcode; + + if (cinfo->global_state != DSTATE_START && + cinfo->global_state != DSTATE_INHEADER) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + retcode = jpeg_consume_input(cinfo); + + switch (retcode) { + case JPEG_REACHED_SOS: + retcode = JPEG_HEADER_OK; + break; + case JPEG_REACHED_EOI: + if (require_image) /* Complain if application wanted an image */ + ERREXIT(cinfo, JERR_NO_IMAGE); + /* Reset to start state; it would be safer to require the application to + * call jpeg_abort, but we can't change it now for compatibility reasons. + * A side effect is to free any temporary memory (there shouldn't be any). + */ + jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */ + retcode = JPEG_HEADER_TABLES_ONLY; + break; + case JPEG_SUSPENDED: + /* no work */ + break; + } + + return retcode; +} + + +/* + * Consume data in advance of what the decompressor requires. + * This can be called at any time once the decompressor object has + * been created and a data source has been set up. + * + * This routine is essentially a state machine that handles a couple + * of critical state-transition actions, namely initial setup and + * transition from header scanning to ready-for-start_decompress. + * All the actual input is done via the input controller's consume_input + * method. + */ + +GLOBAL(int) +jpeg_consume_input (j_decompress_ptr cinfo) +{ + int retcode = JPEG_SUSPENDED; + + /* NB: every possible DSTATE value should be listed in this switch */ + switch (cinfo->global_state) { + case DSTATE_START: + /* Start-of-datastream actions: reset appropriate modules */ + (*cinfo->inputctl->reset_input_controller) (cinfo); + /* Initialize application's data source module */ + (*cinfo->src->init_source) (cinfo); + cinfo->global_state = DSTATE_INHEADER; + /*FALLTHROUGH*/ + case DSTATE_INHEADER: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ + /* Set up default parameters based on header data */ + default_decompress_parms(cinfo); + /* Set global state: ready for start_decompress */ + cinfo->global_state = DSTATE_READY; + } + break; + case DSTATE_READY: + /* Can't advance past first SOS until start_decompress is called */ + retcode = JPEG_REACHED_SOS; + break; + case DSTATE_PRELOAD: + case DSTATE_PRESCAN: + case DSTATE_SCANNING: + case DSTATE_RAW_OK: + case DSTATE_BUFIMAGE: + case DSTATE_BUFPOST: + case DSTATE_STOPPING: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + break; + default: + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + return retcode; +} + + +/* + * Have we finished reading the input file? + */ + +GLOBAL(boolean) +jpeg_input_complete (j_decompress_ptr cinfo) +{ + /* Check for valid jpeg object */ + if (cinfo->global_state < DSTATE_START || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->eoi_reached; +} + + +/* + * Is there more than one scan? + */ + +GLOBAL(boolean) +jpeg_has_multiple_scans (j_decompress_ptr cinfo) +{ + /* Only valid after jpeg_read_header completes */ + if (cinfo->global_state < DSTATE_READY || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->has_multiple_scans; +} + + +/* + * Finish JPEG decompression. + * + * This will normally just verify the file trailer and release temp storage. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_decompress (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) { + /* Terminate final pass of non-buffered mode */ + if (cinfo->output_scanline < cinfo->output_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state == DSTATE_BUFIMAGE) { + /* Finishing after a buffered-image operation */ + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state != DSTATE_STOPPING) { + /* STOPPING = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read until EOI */ + while (! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + /* Do final cleanup */ + (*cinfo->src->term_source) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); + return TRUE; +} diff --git a/User/system/lib/lcd/gui/JPEG/jdapistd.c b/User/system/lib/lcd/gui/JPEG/jdapistd.c new file mode 100644 index 0000000..83d7d99 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdapistd.c @@ -0,0 +1,275 @@ +/* + * jdapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-decompression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_decompress, it will end up linking in the entire decompressor. + * We thus must separate this file from jdapimin.c to avoid linking the + * whole decompression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); + + +/* + * Decompression initialization. + * jpeg_read_header must be completed before calling this. + * + * If a multipass operating mode was selected, this will do all but the + * last pass, and thus may take a great deal of time. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_start_decompress (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize master control, select active modules */ + jinit_master_decompress(cinfo); + if (cinfo->buffered_image) { + /* No more work here; expecting jpeg_start_output next */ + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; + } + cinfo->global_state = DSTATE_PRELOAD; + } + if (cinfo->global_state == DSTATE_PRELOAD) { + /* If file has multiple scans, absorb them all into the coef buffer */ + if (cinfo->inputctl->has_multiple_scans) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + while (1) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return FALSE; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* jdmaster underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + } + cinfo->output_scan_number = cinfo->input_scan_number; + } else if (cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any dummy output passes, and set up for the final pass */ + return output_pass_setup(cinfo); +} + + +/* + * Set up for an output pass, and perform any dummy pass(es) needed. + * Common subroutine for jpeg_start_decompress and jpeg_start_output. + * Entry: global_state = DSTATE_PRESCAN only if previously suspended. + * Exit: If done, returns TRUE and sets global_state for proper output mode. + * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. + */ + +LOCAL(boolean) +output_pass_setup (j_decompress_ptr cinfo) +{ + if (cinfo->global_state != DSTATE_PRESCAN) { + /* First call: do pass setup */ + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; + cinfo->global_state = DSTATE_PRESCAN; + } + /* Loop over any required dummy passes */ + while (cinfo->master->is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Crank through the dummy pass */ + while (cinfo->output_scanline < cinfo->output_height) { + JDIMENSION last_scanline; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* Process some data */ + last_scanline = cinfo->output_scanline; + (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, + &cinfo->output_scanline, (JDIMENSION) 0); + if (cinfo->output_scanline == last_scanline) + return FALSE; /* No progress made, must suspend */ + } + /* Finish up dummy pass, and set up for another one */ + (*cinfo->master->finish_output_pass) (cinfo); + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } + /* Ready for application to drive output pass through + * jpeg_read_scanlines or jpeg_read_raw_data. + */ + cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; + return TRUE; +} + + +/* + * Read some scanlines of data from the JPEG decompressor. + * + * The return value will be the number of lines actually read. + * This may be less than the number requested in several cases, + * including bottom of image, data source suspension, and operating + * modes that emit multiple scanlines at a time. + * + * Note: we warn about excess calls to jpeg_read_scanlines() since + * this likely signals an application programmer error. However, + * an oversize buffer (max_lines > scanlines remaining) is not an error. + */ + +GLOBAL(JDIMENSION) +jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION max_lines) +{ + JDIMENSION row_ctr; + + if (cinfo->global_state != DSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Process some data */ + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); + cinfo->output_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to read raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION max_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != DSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Verify that at least one iMCU row can be returned. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size; + if (max_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Decompress directly into user's buffer. */ + if (! (*cinfo->coef->decompress_data) (cinfo, data)) + return 0; /* suspension forced, can do nothing more */ + + /* OK, we processed one iMCU row. */ + cinfo->output_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} + + +/* Additional entry points for buffered-image mode. */ + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Initialize for an output pass in buffered-image mode. + */ + +GLOBAL(boolean) +jpeg_start_output (j_decompress_ptr cinfo, int scan_number) +{ + if (cinfo->global_state != DSTATE_BUFIMAGE && + cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Limit scan number to valid range */ + if (scan_number <= 0) + scan_number = 1; + if (cinfo->inputctl->eoi_reached && + scan_number > cinfo->input_scan_number) + scan_number = cinfo->input_scan_number; + cinfo->output_scan_number = scan_number; + /* Perform any dummy output passes, and set up for the real pass */ + return output_pass_setup(cinfo); +} + + +/* + * Finish up after an output pass in buffered-image mode. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_output (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { + /* Terminate this pass. */ + /* We do not require the whole pass to have been completed. */ + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_BUFPOST; + } else if (cinfo->global_state != DSTATE_BUFPOST) { + /* BUFPOST = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read markers looking for SOS or EOI */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jdcoefct.c b/User/system/lib/lcd/gui/JPEG/jdcoefct.c new file mode 100644 index 0000000..3197f01 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdcoefct.c @@ -0,0 +1,737 @@ +/* + * jdcoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for decompression. + * This controller is the top level of the JPEG decompressor proper. + * The coefficient buffer lies between entropy decoding and inverse-DCT steps. + * + * In buffered-image mode, this controller is the interface between + * input-oriented processing and output-oriented processing. + * Also, the input side (only) is used when reading a file for transcoding. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* Block smoothing is only applicable for progressive JPEG, so: */ +#ifndef D_PROGRESSIVE_SUPPORTED +#undef BLOCK_SMOOTHING_SUPPORTED +#endif + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_coef_controller pub; /* public fields */ + + /* These variables keep track of the current location of the input side. */ + /* cinfo->input_iMCU_row is also used for this. */ + JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* The output side's location is represented by cinfo->output_iMCU_row. */ + + /* In single-pass modes, it's sufficient to buffer just one MCU. + * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, + * and let the entropy decoder write into that workspace each time. + * (On 80x86, the workspace is FAR even though it's not really very big; + * this is to keep the module interfaces unchanged when a large coefficient + * buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays; it is used only by the input side. + */ + JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +#endif + +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* When doing block smoothing, we latch coefficient Al values here */ + int * coef_bits_latch; +#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ +#endif +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + +/* Forward declarations */ +METHODDEF(int) decompress_onepass + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#ifdef D_MULTISCAN_FILES_SUPPORTED +METHODDEF(int) decompress_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif +#ifdef BLOCK_SMOOTHING_SUPPORTED +LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); +METHODDEF(int) decompress_smooth_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_decompress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row (input side) */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->MCU_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for an input processing pass. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + cinfo->input_iMCU_row = 0; + start_iMCU_row(cinfo); +} + + +/* + * Initialize for an output processing pass. + */ + +METHODDEF(void) +start_output_pass (j_decompress_ptr cinfo) +{ +#ifdef BLOCK_SMOOTHING_SUPPORTED + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* If multipass, check to see whether to use block smoothing on this pass */ + if (coef->pub.coef_arrays != NULL) { + if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) + coef->pub.decompress_data = decompress_smooth_data; + else + coef->pub.decompress_data = decompress_data; + } +#endif + cinfo->output_iMCU_row = 0; +} + + +/* + * Decompress and return some data in the single-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Input and output must run in lockstep since we have only a one-MCU buffer. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(int) +decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, useful_width; + JSAMPARRAY output_ptr; + JDIMENSION start_col, output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Loop to process as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ + jzero_far((void FAR *) coef->MCU_buffer[0], + (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + /* Determine where data should go in output_buf and do the IDCT thing. + * We skip dummy blocks at the right and bottom edges (but blkn gets + * incremented past them!). Note the inner loop relies on having + * allocated the MCU_buffer[] blocks sequentially. + */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) { + blkn += compptr->MCU_blocks; + continue; + } + inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; + useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + output_ptr = output_buf[compptr->component_index] + + yoffset * compptr->DCT_scaled_size; + start_col = MCU_col_num * compptr->MCU_sample_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (cinfo->input_iMCU_row < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + output_col = start_col; + for (xindex = 0; xindex < useful_width; xindex++) { + (*inverse_DCT) (cinfo, compptr, + (JCOEFPTR) coef->MCU_buffer[blkn+xindex], + output_ptr, output_col); + output_col += compptr->DCT_scaled_size; + } + } + blkn += compptr->MCU_width; + output_ptr += compptr->DCT_scaled_size; + } + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + cinfo->output_iMCU_row++; + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Dummy consume-input routine for single-pass operation. + */ + +METHODDEF(int) +dummy_consume_data (j_decompress_ptr cinfo) +{ + GUI_USE_PARA(cinfo); + return JPEG_SUSPENDED; /* Always indicate nothing was done */ +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Consume input data and store it in the full-image coefficient buffer. + * We read as much as one fully interleaved MCU row ("iMCU" row) per call, + * ie, v_samp_factor block rows for each component in the scan. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + */ + +METHODDEF(int) +consume_data (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + cinfo->input_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Note: entropy decoder expects buffer to be zeroed, + * but this is handled automatically by the memory manager + * because we requested a pre-zeroed array. + */ + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to fetch the MCU. */ + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Decompress and return some data in the multi-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image. + */ + +METHODDEF(int) +decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num; + int ci, block_row, block_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number < cinfo->output_scan_number || + (cinfo->input_scan_number == cinfo->output_scan_number && + cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + cinfo->output_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + output_col = 0; + for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { + (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, + output_ptr, output_col); + buffer_ptr++; + output_col += compptr->DCT_scaled_size; + } + output_ptr += compptr->DCT_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +#ifdef BLOCK_SMOOTHING_SUPPORTED + +/* + * This code applies interblock smoothing as described by section K.8 + * of the JPEG standard: the first 5 AC coefficients are estimated from + * the DC values of a DCT block and its 8 neighboring blocks. + * We apply smoothing only for progressive JPEG decoding, and only if + * the coefficients it can estimate are not yet known to full precision. + */ + +/* Natural-order array positions of the first 5 zigzag-order coefficients */ +#define Q01_POS 1 +#define Q10_POS 8 +#define Q20_POS 16 +#define Q11_POS 9 +#define Q02_POS 2 + +/* + * Determine whether block smoothing is applicable and safe. + * We also latch the current states of the coef_bits[] entries for the + * AC coefficients; otherwise, if the input side of the decompressor + * advances into a new scan, we might think the coefficients are known + * more accurately than they really are. + */ + +LOCAL(boolean) +smoothing_ok (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + boolean smoothing_useful = FALSE; + int ci, coefi; + jpeg_component_info *compptr; + JQUANT_TBL * qtable; + int * coef_bits; + int * coef_bits_latch; + + if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) + return FALSE; + + /* Allocate latch area if not already done */ + if (coef->coef_bits_latch == NULL) + coef->coef_bits_latch = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * + (SAVED_COEFS * SIZEOF(int))); + coef_bits_latch = coef->coef_bits_latch; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* All components' quantization values must already be latched. */ + if ((qtable = compptr->quant_table) == NULL) + return FALSE; + /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ + if (qtable->quantval[0] == 0 || + qtable->quantval[Q01_POS] == 0 || + qtable->quantval[Q10_POS] == 0 || + qtable->quantval[Q20_POS] == 0 || + qtable->quantval[Q11_POS] == 0 || + qtable->quantval[Q02_POS] == 0) + return FALSE; + /* DC values must be at least partly known for all components. */ + coef_bits = cinfo->coef_bits[ci]; + if (coef_bits[0] < 0) + return FALSE; + /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ + for (coefi = 1; coefi <= 5; coefi++) { + coef_bits_latch[coefi] = coef_bits[coefi]; + if (coef_bits[coefi] != 0) + smoothing_useful = TRUE; + } + coef_bits_latch += SAVED_COEFS; + } + + return smoothing_useful; +} + + +/* + * Variant of decompress_data for use when doing block smoothing. + */ + +METHODDEF(int) +decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num, last_block_column; + int ci, block_row, block_rows, access_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr, prev_block_row, next_block_row; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + boolean first_row, last_row; + JBLOCK workspace; + int *coef_bits; + JQUANT_TBL *quanttbl; + INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; + int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; + int Al, pred; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if (cinfo->input_scan_number == cinfo->output_scan_number) { + /* If input is working on current scan, we ordinarily want it to + * have completed the current row. But if input scan is DC, + * we want it to keep one row ahead so that next block row's DC + * values are up to date. + */ + JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; + if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) + break; + } + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) { + block_rows = compptr->v_samp_factor; + access_rows = block_rows * 2; /* this and next iMCU row */ + last_row = FALSE; + } else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + access_rows = block_rows; /* this iMCU row only */ + last_row = TRUE; + } + /* Align the virtual buffer for this component. */ + if (cinfo->output_iMCU_row > 0) { + access_rows += compptr->v_samp_factor; /* prior iMCU row too */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, + (JDIMENSION) access_rows, FALSE); + buffer += compptr->v_samp_factor; /* point to current iMCU row */ + first_row = FALSE; + } else { + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); + first_row = TRUE; + } + /* Fetch component-dependent info */ + coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); + quanttbl = compptr->quant_table; + Q00 = quanttbl->quantval[0]; + Q01 = quanttbl->quantval[Q01_POS]; + Q10 = quanttbl->quantval[Q10_POS]; + Q20 = quanttbl->quantval[Q20_POS]; + Q11 = quanttbl->quantval[Q11_POS]; + Q02 = quanttbl->quantval[Q02_POS]; + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + if (first_row && block_row == 0) + prev_block_row = buffer_ptr; + else + prev_block_row = buffer[block_row-1]; + if (last_row && block_row == block_rows-1) + next_block_row = buffer_ptr; + else + next_block_row = buffer[block_row+1]; + /* We fetch the surrounding DC values using a sliding-register approach. + * Initialize all nine here so as to do the right thing on narrow pics. + */ + DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; + DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; + DC7 = DC8 = DC9 = (int) next_block_row[0][0]; + output_col = 0; + last_block_column = compptr->width_in_blocks - 1; + for (block_num = 0; block_num <= last_block_column; block_num++) { + /* Fetch current DCT block into workspace so we can modify it. */ + jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); + /* Update DC values */ + if (block_num < last_block_column) { + DC3 = (int) prev_block_row[1][0]; + DC6 = (int) buffer_ptr[1][0]; + DC9 = (int) next_block_row[1][0]; + } + /* Compute coefficient estimates per K.8. + * An estimate is applied only if coefficient is still zero, + * and is not known to be fully accurate. + */ + /* AC01 */ + if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { + num = 36 * Q00 * (DC4 - DC6); + if (num >= 0) { + pred = (int) (((Q01<<7) + num) / (Q01<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q10<<7) + num) / (Q10<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q20<<7) + num) / (Q20<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q11<<7) + num) / (Q11<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q02<<7) + num) / (Q02<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<DCT_scaled_size; + } + output_ptr += compptr->DCT_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* BLOCK_SMOOTHING_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_d_coef_controller *) coef; + coef->pub.start_input_pass = start_input_pass; + coef->pub.start_output_pass = start_output_pass; +#ifdef BLOCK_SMOOTHING_SUPPORTED + coef->coef_bits_latch = NULL; +#endif + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + /* Note we ask for a pre-zeroed array. */ + int ci, access_rows; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + access_rows = compptr->v_samp_factor; +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* If block smoothing could be used, need a bigger window */ + if (cinfo->progressive_mode) + access_rows *= 3; +#endif + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) access_rows); + } + coef->pub.consume_data = consume_data; + coef->pub.decompress_data = decompress_data; + coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->pub.consume_data = dummy_consume_data; + coef->pub.decompress_data = decompress_onepass; + coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jdcolor.c b/User/system/lib/lcd/gui/JPEG/jdcolor.c new file mode 100644 index 0000000..954bf5a --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdcolor.c @@ -0,0 +1,397 @@ +/* + * jdcolor.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains output colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_deconverter pub; /* public fields */ + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ +} my_color_deconverter; + +typedef my_color_deconverter * my_cconvert_ptr; + + +/**************** YCbCr -> RGB conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * R = Y + 1.40200 * Cr + * G = Y - 0.34414 * Cb - 0.71414 * Cr + * B = Y + 1.77200 * Cb + * where Cb and Cr represent the incoming values less CENTERJSAMPLE. + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * Notice that Y, being an integral input, does not contribute any fraction + * so it need not participate in the rounding. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times Cb and Cr for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The Cr=>R and Cb=>B values can be rounded to integers in advance; the + * values for the G calculation are left scaled up, since we must add them + * together before rounding. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + int i; + INT32 x; + SHIFT_TEMPS + + cconvert->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + cconvert->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + cconvert->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + cconvert->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Convert some rows of samples to the output colorspace. + * + * Note that we change from noninterleaved, one-plane-per-component format + * to interleaved-pixel format. The output buffer is therefore three times + * as wide as the input buffer. + * A starting row offset is provided only for the input buffer. The caller + * can easily adjust the passed output_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +ycc_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; + outptr[RGB_GREEN] = range_limit[y + + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS))]; + outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/**************** Cases other than YCbCr -> RGB **************/ + + +/* + * Color conversion for no colorspace change: just copy the data, + * converting from separate-planes to interleaved representation. + */ + +METHODDEF(void) +null_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION count; + register int num_components = cinfo->num_components; + JDIMENSION num_cols = cinfo->output_width; + int ci; + + while (--num_rows >= 0) { + for (ci = 0; ci < num_components; ci++) { + inptr = input_buf[ci][input_row]; + outptr = output_buf[0] + ci; + for (count = num_cols; count > 0; count--) { + *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */ + outptr += num_components; + } + } + input_row++; + output_buf++; + } +} + + +/* + * Color conversion for grayscale: just copy the data. + * This also works for YCbCr -> grayscale conversion, in which + * we just copy the Y (luminance) component and ignore chrominance. + */ + +METHODDEF(void) +grayscale_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, + num_rows, cinfo->output_width); +} + + +/* + * Convert grayscale to RGB: just duplicate the graylevel three times. + * This is provided to support applications that don't want to cope + * with grayscale as a separate case. + */ + +METHODDEF(void) +gray_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr = input_buf[0][input_row++]; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + /* We can dispense with GETJSAMPLE() here */ + outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/* + * Adobe-style YCCK->CMYK conversion. + * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same + * conversion as above, while passing K (black) unchanged. + * We assume build_ycc_rgb_table has been called. + */ + +METHODDEF(void) +ycck_cmyk_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2, inptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + inptr3 = input_buf[3][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ + outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS)))]; + outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ + /* K passes through unchanged */ + outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ + outptr += 4; + } + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +start_pass_dcolor (j_decompress_ptr cinfo) +{ + GUI_USE_PARA(cinfo); + /* no work needed */ +} + + +/* + * Module initialization routine for output colorspace conversion. + */ + +GLOBAL(void) +jinit_color_deconverter (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + int ci; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_deconverter)); + cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert; + cconvert->pub.start_pass = start_pass_dcolor; + + /* Make sure num_components agrees with jpeg_color_space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_RGB: + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->num_components < 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + } + + /* Set out_color_components and conversion method based on requested space. + * Also clear the component_needed flags for any unused components, + * so that earlier pipeline stages can avoid useless computation. + */ + + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + if (cinfo->jpeg_color_space == JCS_GRAYSCALE || + cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = grayscale_convert; + /* For color->grayscale conversion, only the Y (0) component is needed */ + for (ci = 1; ci < cinfo->num_components; ci++) + cinfo->comp_info[ci].component_needed = FALSE; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + cinfo->out_color_components = RGB_PIXELSIZE; + if (cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = ycc_rgb_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { + cconvert->pub.color_convert = gray_rgb_convert; + } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + cinfo->out_color_components = 4; + if (cinfo->jpeg_color_space == JCS_YCCK) { + cconvert->pub.color_convert = ycck_cmyk_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_CMYK) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: + /* Permit null conversion to same output space */ + if (cinfo->out_color_space == cinfo->jpeg_color_space) { + cinfo->out_color_components = cinfo->num_components; + cconvert->pub.color_convert = null_convert; + } else /* unsupported non-null conversion */ + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + } + + if (cinfo->quantize_colors) + cinfo->output_components = 1; /* single colormapped output component */ + else + cinfo->output_components = cinfo->out_color_components; +} diff --git a/User/system/lib/lcd/gui/JPEG/jdct.h b/User/system/lib/lcd/gui/JPEG/jdct.h new file mode 100644 index 0000000..1c4b262 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdct.h @@ -0,0 +1,163 @@ +/* + * jdct.h + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file contains common declarations for the forward and + * inverse DCT modules. These declarations are private to the DCT managers + * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. + * The individual DCT algorithms are kept in separate files to ease + * machine-dependent tuning (e.g., assembly coding). + */ + + +/* + * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; + * the DCT is to be performed in-place in that buffer. Type DCTELEM is int + * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT + * implementations use an array of type FAST_FLOAT, instead.) + * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). + * The DCT outputs are returned scaled up by a factor of 8; they therefore + * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This + * convention improves accuracy in integer implementations and saves some + * work in floating-point ones. + * Quantization of the output coefficients is done by jcdctmgr.c. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef int DCTELEM; /* 16 or 32 bits is fine */ +#else +typedef INT32 DCTELEM; /* must have 32 bits */ +#endif + +typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data)); +typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); + + +/* + * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer + * to an output sample array. The routine must dequantize the input data as + * well as perform the IDCT; for dequantization, it uses the multiplier table + * pointed to by compptr->dct_table. The output data is to be placed into the + * sample array starting at a specified column. (Any row offset needed will + * be applied to the array pointer before it is passed to the IDCT code.) + * Note that the number of samples emitted by the IDCT routine is + * DCT_scaled_size * DCT_scaled_size. + */ + +/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ + +/* + * Each IDCT routine has its own ideas about the best dct_table element type. + */ + +typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ +#if BITS_IN_JSAMPLE == 8 +typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ +#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ +#else +typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ +#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ +#endif +typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ + + +/* + * Each IDCT routine is responsible for range-limiting its results and + * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could + * be quite far out of range if the input data is corrupt, so a bulletproof + * range-limiting step is required. We use a mask-and-table-lookup method + * to do the combined operations quickly. See the comments with + * prepare_range_limit_table (in jdmaster.c) for more info. + */ + +#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) + +#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ + + + +/* Extern declarations for the forward and inverse DCT routines. */ + +EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data)); +EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data)); +EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data)); + +EXTERN(void) jpeg_idct_islow + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_ifast + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_float + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); + + +/* + * Macros for handling fixed-point arithmetic; these are used by many + * but not all of the DCT/IDCT modules. + * + * All values are expected to be of type INT32. + * Fractional constants are scaled left by CONST_BITS bits. + * CONST_BITS is defined within each module using these macros, + * and may differ from one module to the next. + */ + +#define ONE ((INT32) 1) +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. + * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, + * thus causing a lot of useless floating-point operations at run time. + */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * This macro is used only when the two inputs will actually be no more than + * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a + * full 32x32 multiply. This provides a useful speedup on many machines. + * Unfortunately there is no way to specify a 16x16->32 multiply portably + * in C, but some C compilers will do the right thing if you provide the + * correct combination of casts. + */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) +#endif +#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) +#endif + +#ifndef MULTIPLY16C16 /* default definition */ +#define MULTIPLY16C16(var,const) ((var) * (const)) +#endif + +/* Same except both inputs are variables. */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) +#endif + +#ifndef MULTIPLY16V16 /* default definition */ +#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) +#endif diff --git a/User/system/lib/lcd/gui/JPEG/jddctmgr.c b/User/system/lib/lcd/gui/JPEG/jddctmgr.c new file mode 100644 index 0000000..160f926 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jddctmgr.c @@ -0,0 +1,266 @@ +/* + * jddctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the inverse-DCT management logic. + * This code selects a particular IDCT implementation to be used, + * and it performs related housekeeping chores. No code in this file + * is executed per IDCT step, only during output pass setup. + * + * Note that the IDCT routines are responsible for performing coefficient + * dequantization as well as the IDCT proper. This module sets up the + * dequantization multiplier table needed by the IDCT routine. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* + * The decompressor input side (jdinput.c) saves away the appropriate + * quantization table for each component at the start of the first scan + * involving that component. (This is necessary in order to correctly + * decode files that reuse Q-table slots.) + * When we are ready to make an output pass, the saved Q-table is converted + * to a multiplier table that will actually be used by the IDCT routine. + * The multiplier table contents are IDCT-method-dependent. To support + * application changes in IDCT method between scans, we can remake the + * multiplier tables if necessary. + * In buffered-image mode, the first output pass may occur before any data + * has been seen for some components, and thus before their Q-tables have + * been saved away. To handle this case, multiplier tables are preset + * to zeroes; the result of the IDCT will be a neutral gray level. + */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_inverse_dct pub; /* public fields */ + + /* This array contains the IDCT method code that each multiplier table + * is currently set up for, or -1 if it's not yet set up. + * The actual multiplier tables are pointed to by dct_table in the + * per-component comp_info structures. + */ + int cur_method[MAX_COMPONENTS]; +} my_idct_controller; + +typedef my_idct_controller * my_idct_ptr; + + +/* Allocated multiplier tables: big enough for any supported variant */ + +typedef union { + ISLOW_MULT_TYPE islow_array[DCTSIZE2]; +#ifdef DCT_IFAST_SUPPORTED + IFAST_MULT_TYPE ifast_array[DCTSIZE2]; +#endif +#ifdef DCT_FLOAT_SUPPORTED + FLOAT_MULT_TYPE float_array[DCTSIZE2]; +#endif +} multiplier_table; + + +/* The current scaled-IDCT routines require ISLOW-style multiplier tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. + */ +#ifdef DCT_ISLOW_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#else +#ifdef IDCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * Prepare for an output pass. + * Here we select the proper IDCT routine for each component and build + * a matching multiplier table. + */ + +METHODDEF(void) start_pass (j_decompress_ptr cinfo) { + my_idct_ptr idct = (my_idct_ptr) cinfo->idct; + int ci, i; + jpeg_component_info *compptr; + int method = 0; + inverse_DCT_method_ptr method_ptr = NULL; + JQUANT_TBL * qtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + /* Select the proper IDCT routine for this component's scaling */ + switch (compptr->DCT_scaled_size) { +#ifdef IDCT_SCALING_SUPPORTED + case 1: + method_ptr = jpeg_idct_1x1; + method = JDCT_ISLOW; /* jidctred uses islow-style table */ + break; + case 2: + method_ptr = jpeg_idct_2x2; + method = JDCT_ISLOW; /* jidctred uses islow-style table */ + break; + case 4: + method_ptr = jpeg_idct_4x4; + method = JDCT_ISLOW; /* jidctred uses islow-style table */ + break; +#endif + case DCTSIZE: + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + method_ptr = jpeg_idct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + method_ptr = jpeg_idct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + method_ptr = jpeg_idct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size); + break; + } + idct->pub.inverse_DCT[ci] = method_ptr; + /* Create multiplier table from quant table. + * However, we can skip this if the component is uninteresting + * or if we already built the table. Also, if no quant table + * has yet been saved for the component, we leave the + * multiplier table all-zero; we'll be reading zeroes from the + * coefficient controller's buffer anyway. + */ + if (! compptr->component_needed || idct->cur_method[ci] == method) + continue; + qtbl = compptr->quant_table; + if (qtbl == NULL) /* happens if no data yet for component */ + continue; + idct->cur_method[ci] = method; + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + { + /* For LL&M IDCT method, multipliers are equal to raw quantization + * coefficients, but are stored as ints to ensure access efficiency. + */ + ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; + for (i = 0; i < DCTSIZE2; i++) { + ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; + } + } + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * For integer operation, the multiplier table is to be scaled by + * IFAST_SCALE_BITS. + */ + IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + for (i = 0; i < DCTSIZE2; i++) { + ifmtbl[i] = (IFAST_MULT_TYPE) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-IFAST_SCALE_BITS); + } + } + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + */ + FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fmtbl[i] = (FLOAT_MULT_TYPE) + ((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col]); + i++; + } + } + } + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Initialize IDCT manager. + */ + +GLOBAL(void) +jinit_inverse_dct (j_decompress_ptr cinfo) +{ + my_idct_ptr idct; + int ci; + jpeg_component_info *compptr; + + idct = (my_idct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_idct_controller)); + cinfo->idct = (struct jpeg_inverse_dct *) idct; + idct->pub.start_pass = start_pass; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate and pre-zero a multiplier table for each component */ + compptr->dct_table = + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(multiplier_table)); + MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); + /* Mark multiplier table not yet set up for any method */ + idct->cur_method[ci] = -1; + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jdhuff.c b/User/system/lib/lcd/gui/JPEG/jdhuff.c new file mode 100644 index 0000000..b5ba39f --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdhuff.c @@ -0,0 +1,651 @@ +/* + * jdhuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines. + * + * Much of the complexity here has to do with supporting input suspension. + * If the data source module demands suspension, we want to be able to back + * up to the start of the current MCU. To do this, we copy state variables + * into local working storage, and update them back to the permanent + * storage only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdhuff.h" /* Declarations shared with jdphuff.c */ + + +/* + * Expanded entropy decoder object for Huffman decoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + /* These fields are loaded into local variables at start of each MCU. + * In case of suspension, we exit WITHOUT updating them. + */ + bitread_perm_state bitstate; /* Bit buffer at start of MCU */ + savable_state saved; /* Other state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + + /* Precalculated info set up by start_pass for use in decode_mcu: */ + + /* Pointers to derived tables to be used for each block within an MCU */ + d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + /* Whether we care about the DC and AC coefficient values for each block */ + boolean dc_needed[D_MAX_BLOCKS_IN_MCU]; + boolean ac_needed[D_MAX_BLOCKS_IN_MCU]; +} huff_entropy_decoder; + +typedef huff_entropy_decoder * huff_entropy_ptr; + + +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, blkn, dctbl, actbl; + jpeg_component_info * compptr; + + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning because + * there are some baseline files out there with all zeroes in these bytes. + */ + if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || + cinfo->Ah != 0 || cinfo->Al != 0) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + dctbl = compptr->dc_tbl_no; + actbl = compptr->ac_tbl_no; + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl, + & entropy->dc_derived_tbls[dctbl]); + jpeg_make_d_derived_tbl(cinfo, FALSE, actbl, + & entropy->ac_derived_tbls[actbl]); + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Precalculate decoding info for each block in an MCU of this scan */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* Precalculate which table to use for each block */ + entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; + entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; + /* Decide whether we really care about the coefficient values */ + if (compptr->component_needed) { + entropy->dc_needed[blkn] = TRUE; + /* we don't need the ACs if producing a 1/8th-size image */ + entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1); + } else { + entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE; + } + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->pub.insufficient_data = FALSE; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + * + * Note this is also used by jdphuff.c. + */ + +GLOBAL(void) +jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, + d_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + d_derived_tbl *dtbl; + int p, i, l, si, numsymbols; + int lookbits, ctr; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (d_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(d_derived_tbl)); + dtbl = *pdtbl; + dtbl->pub = htbl; /* fill in back link */ + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + numsymbols = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure F.15: generate decoding tables for bit-sequential decoding */ + + p = 0; + for (l = 1; l <= 16; l++) { + if (htbl->bits[l]) { + /* valoffset[l] = huffval[] index of 1st symbol of code length l, + * minus the minimum code of length l + */ + dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p]; + p += htbl->bits[l]; + dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ + } else { + dtbl->maxcode[l] = -1; /* -1 if no codes of this length */ + } + } + dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */ + + /* Compute lookahead tables to speed up decoding. + * First we set all the table entries to 0, indicating "too long"; + * then we iterate through the Huffman codes that are short enough and + * fill in all the entries that correspond to bit sequences starting + * with that code. + */ + + MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits)); + + p = 0; + for (l = 1; l <= HUFF_LOOKAHEAD; l++) { + for (i = 1; i <= (int) htbl->bits[l]; i++, p++) { + /* l = current code's length, p = its index in huffcode[] & huffval[]. */ + /* Generate left-justified code followed by all possible bit sequences */ + lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l); + for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) { + dtbl->look_nbits[lookbits] = l; + dtbl->look_sym[lookbits] = htbl->huffval[p]; + lookbits++; + } + } + } + + /* Validate symbols as being reasonable. + * For AC tables, we make no check, but accept all byte values 0..255. + * For DC tables, we require the symbols to be in range 0..15. + * (Tighter bounds could be applied depending on the data depth and mode, + * but this is sufficient to ensure safe decoding.) + */ + if (isDC) { + for (i = 0; i < numsymbols; i++) { + int sym = htbl->huffval[i]; + if (sym < 0 || sym > 15) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + } + } +} + + +/* + * Out-of-line code for bit fetching (shared with jdphuff.c). + * See jdhuff.h for info about usage. + * Note: current values of get_buffer and bits_left are passed as parameters, + * but are returned in the corresponding fields of the state struct. + * + * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width + * of get_buffer to be used. (On machines with wider words, an even larger + * buffer could be used.) However, on some machines 32-bit shifts are + * quite slow and take time proportional to the number of places shifted. + * (This is true with most PC compilers, for instance.) In this case it may + * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the + * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. + */ + +#ifdef SLOW_SHIFT_32 +#define MIN_GET_BITS 15 /* minimum allowable value */ +#else +#define MIN_GET_BITS (BIT_BUF_SIZE-7) +#endif + + +GLOBAL(boolean) +jpeg_fill_bit_buffer (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + int nbits) +/* Load up the bit buffer to a depth of at least nbits */ +{ + /* Copy heavily used state fields into locals (hopefully registers) */ + register const JOCTET * next_input_byte = state->next_input_byte; + register size_t bytes_in_buffer = state->bytes_in_buffer; + j_decompress_ptr cinfo = state->cinfo; + + /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ + /* (It is assumed that no request will be for more than that many bits.) */ + /* We fail to do so only if we hit a marker or are forced to suspend. */ + + if (cinfo->unread_marker == 0) { /* cannot advance past a marker */ + while (bits_left < MIN_GET_BITS) { + register int c; + + /* Attempt to read a byte */ + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + + /* If it's 0xFF, check and discard stuffed zero byte */ + if (c == 0xFF) { + /* Loop here to discard any padding FF's on terminating marker, + * so that we can save a valid unread_marker value. NOTE: we will + * accept multiple FF's followed by a 0 as meaning a single FF data + * byte. This data pattern is not valid according to the standard. + */ + do { + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + } while (c == 0xFF); + + if (c == 0) { + /* Found FF/00, which represents an FF data byte */ + c = 0xFF; + } else { + /* Oops, it's actually a marker indicating end of compressed data. + * Save the marker code for later use. + * Fine point: it might appear that we should save the marker into + * bitread working state, not straight into permanent state. But + * once we have hit a marker, we cannot need to suspend within the + * current MCU, because we will read no more bytes from the data + * source. So it is OK to update permanent state right away. + */ + cinfo->unread_marker = c; + /* See if we need to insert some fake zero bits. */ + goto no_more_bytes; + } + } + + /* OK, load c into get_buffer */ + get_buffer = (get_buffer << 8) | c; + bits_left += 8; + } /* end while */ + } else { + no_more_bytes: + /* We get here if we've read the marker that terminates the compressed + * data segment. There should be enough bits in the buffer register + * to satisfy the request; if so, no problem. + */ + if (nbits > bits_left) { + /* Uh-oh. Report corrupted data to user and stuff zeroes into + * the data stream, so that we can produce some kind of image. + * We use a nonvolatile flag to ensure that only one warning message + * appears per data segment. + */ + if (! cinfo->entropy->insufficient_data) { + WARNMS(cinfo, JWRN_HIT_MARKER); + cinfo->entropy->insufficient_data = TRUE; + } + /* Fill the buffer with zero bits */ + get_buffer <<= MIN_GET_BITS - bits_left; + bits_left = MIN_GET_BITS; + } + } + + /* Unload the local registers */ + state->next_input_byte = next_input_byte; + state->bytes_in_buffer = bytes_in_buffer; + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + return TRUE; +} + + +/* + * Out-of-line code for Huffman code decoding. + * See jdhuff.h for info about usage. + */ + +GLOBAL(int) +jpeg_huff_decode (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + d_derived_tbl * htbl, int min_bits) +{ + register int l = min_bits; + register INT32 code; + + /* HUFF_DECODE has determined that the code is at least min_bits */ + /* bits long, so fetch that many bits in one swoop. */ + + CHECK_BIT_BUFFER(*state, l, return -1); + code = GET_BITS(l); + + /* Collect the rest of the Huffman code one bit at a time. */ + /* This is per Figure F.16 in the JPEG spec. */ + + while (code > htbl->maxcode[l]) { + code <<= 1; + CHECK_BIT_BUFFER(*state, 1, return -1); + code |= GET_BITS(1); + l++; + } + + /* Unload the local registers */ + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + /* With garbage input we may reach the sentinel value l = 17. */ + + if (l > 16) { + WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE); + return 0; /* fake a zero as the safest result */ + } + + return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ]; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and add will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) + +#else + +#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) + +static const int extend_test[16] = /* entry n is 2**(n-1) */ + { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + +static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ + { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, + ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, + ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, + ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; + +#endif /* AVOID_TABLES */ + + +/* + * Check for a restart marker & resynchronize decoder. + * Returns FALSE if must suspend. + */ + +LOCAL(boolean) +process_restart (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci; + + /* Throw away any unused bits remaining in bit buffer; */ + /* include any full bytes in next_marker's count of discarded bytes */ + cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; + entropy->bitstate.bits_left = 0; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + return FALSE; + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; + + /* Reset out-of-data flag, unless read_restart_marker left us smack up + * against a marker. In that case we will end up treating the next data + * segment as empty, and we can avoid producing bogus output pixels by + * leaving the flag set. + */ + if (cinfo->unread_marker == 0) + entropy->pub.insufficient_data = FALSE; + + return TRUE; +} + + +/* + * Decode and return one MCU's worth of Huffman-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER. + * (Wholesale zeroing is usually a little faster than retail...) + * + * Returns FALSE if data source requested suspension. In that case no + * changes have been made to permanent state. (Exception: some output + * coefficients may already have been assigned. This is harmless for + * this module, since we'll just re-assign them on the next call.) + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn]; + d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn]; + register int s, k, r; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, dctbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + if (entropy->dc_needed[blkn]) { + /* Convert DC difference to actual value, update last_dc_val */ + int ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */ + (*block)[0] = (JCOEF) s; + } + + if (entropy->ac_needed[blkn]) { + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (k = 1; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, actbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in jpeg_natural_order[] will save us + * if k >= DCTSIZE2, which could happen if the data is corrupted. + */ + (*block)[jpeg_natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + break; + k += 15; + } + } + + } else { + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (k = 1; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, actbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + } + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Module initialization routine for Huffman entropy decoding. + */ + +GLOBAL(void) +jinit_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass_huff_decoder; + entropy->pub.decode_mcu = decode_mcu; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jdhuff.h b/User/system/lib/lcd/gui/JPEG/jdhuff.h new file mode 100644 index 0000000..4d7ae8b --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdhuff.h @@ -0,0 +1,193 @@ +/* + * jdhuff.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains declarations for Huffman entropy decoding routines + * that are shared between the sequential decoder (jdhuff.c) and the + * progressive decoder (jdphuff.c). No other modules need to see these. + */ + + +/* Derived data constructed for each Huffman table */ + +#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ + +typedef struct { + /* Basic tables: (element [0] of each array is unused) */ + INT32 maxcode[18]; /* largest code of length k (-1 if none) */ + /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ + INT32 valoffset[17]; /* huffval[] offset for codes of length k */ + /* valoffset[k] = huffval[] index of 1st symbol of code length k, less + * the smallest code of length k; so given a code of length k, the + * corresponding symbol is huffval[code + valoffset[k]] + */ + + /* Link to public Huffman table (needed only in jpeg_huff_decode) */ + JHUFF_TBL *pub; + + /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of + * the input data stream. If the next Huffman code is no more + * than HUFF_LOOKAHEAD bits long, we can obtain its length and + * the corresponding symbol directly from these tables. + */ + int look_nbits[1< 32 bits on your machine, and shifting/masking longs is + * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE + * appropriately should be a win. Unfortunately we can't define the size + * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) + * because not all machines measure sizeof in 8-bit bytes. + */ + +typedef struct { /* Bitreading state saved across MCUs */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ +} bitread_perm_state; + +typedef struct { /* Bitreading working state within an MCU */ + /* Current data source location */ + /* We need a copy, rather than munging the original, in case of suspension */ + const JOCTET * next_input_byte; /* => next byte to read from source */ + size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ + /* Bit input buffer --- note these values are kept in register variables, + * not in this struct, inside the inner loops. + */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ + /* Pointer needed by jpeg_fill_bit_buffer. */ + j_decompress_ptr cinfo; /* back link to decompress master record */ +} bitread_working_state; + +/* Macros to declare and load/save bitread local variables. */ +#define BITREAD_STATE_VARS \ + register bit_buf_type get_buffer; \ + register int bits_left; \ + bitread_working_state br_state + +#define BITREAD_LOAD_STATE(cinfop,permstate) \ + br_state.cinfo = cinfop; \ + br_state.next_input_byte = cinfop->src->next_input_byte; \ + br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ + get_buffer = permstate.get_buffer; \ + bits_left = permstate.bits_left; + +#define BITREAD_SAVE_STATE(cinfop,permstate) \ + cinfop->src->next_input_byte = br_state.next_input_byte; \ + cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ + permstate.get_buffer = get_buffer; \ + permstate.bits_left = bits_left + +/* + * These macros provide the in-line portion of bit fetching. + * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer + * before using GET_BITS, PEEK_BITS, or DROP_BITS. + * The variables get_buffer and bits_left are assumed to be locals, + * but the state struct might not be (jpeg_huff_decode needs this). + * CHECK_BIT_BUFFER(state,n,action); + * Ensure there are N bits in get_buffer; if suspend, take action. + * val = GET_BITS(n); + * Fetch next N bits. + * val = PEEK_BITS(n); + * Fetch next N bits without removing them from the buffer. + * DROP_BITS(n); + * Discard next N bits. + * The value N should be a simple variable, not an expression, because it + * is evaluated multiple times. + */ + +#define CHECK_BIT_BUFFER(state,nbits,action) \ + { if (bits_left < (nbits)) { \ + if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ + { action; } \ + get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } + +#define GET_BITS(nbits) \ + (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1)) + +#define PEEK_BITS(nbits) \ + (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1)) + +#define DROP_BITS(nbits) \ + (bits_left -= (nbits)) + +/* Load up the bit buffer to a depth of at least nbits */ +EXTERN(boolean) jpeg_fill_bit_buffer + JPP((bitread_working_state * state, register bit_buf_type get_buffer, + register int bits_left, int nbits)); + + +/* + * Code for extracting next Huffman-coded symbol from input bit stream. + * Again, this is time-critical and we make the main paths be macros. + * + * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits + * without looping. Usually, more than 95% of the Huffman codes will be 8 + * or fewer bits long. The few overlength codes are handled with a loop, + * which need not be inline code. + * + * Notes about the HUFF_DECODE macro: + * 1. Near the end of the data segment, we may fail to get enough bits + * for a lookahead. In that case, we do it the hard way. + * 2. If the lookahead table contains no entry, the next code must be + * more than HUFF_LOOKAHEAD bits long. + * 3. jpeg_huff_decode returns -1 if forced to suspend. + */ + +#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ +{ register int nb, look; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + nb = 1; goto slowlabel; \ + } \ + } \ + look = PEEK_BITS(HUFF_LOOKAHEAD); \ + if ((nb = htbl->look_nbits[look]) != 0) { \ + DROP_BITS(nb); \ + result = htbl->look_sym[look]; \ + } else { \ + nb = HUFF_LOOKAHEAD+1; \ +slowlabel: \ + if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ + { failaction; } \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + } \ +} + +/* Out-of-line case for Huffman code fetching */ +EXTERN(int) jpeg_huff_decode + JPP((bitread_working_state * state, register bit_buf_type get_buffer, + register int bits_left, d_derived_tbl * htbl, int min_bits)); diff --git a/User/system/lib/lcd/gui/JPEG/jdinput.c b/User/system/lib/lcd/gui/JPEG/jdinput.c new file mode 100644 index 0000000..0c2ac8f --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdinput.c @@ -0,0 +1,381 @@ +/* + * jdinput.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input control logic for the JPEG decompressor. + * These routines are concerned with controlling the decompressor's input + * processing (marker reading and coefficient decoding). The actual input + * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_input_controller pub; /* public fields */ + + boolean inheaders; /* TRUE until first SOS is reached */ +} my_input_controller; + +typedef my_input_controller * my_inputctl_ptr; + + +/* Forward declarations */ +METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); + + +/* + * Routines to calculate various quantities related to the size of the image. + */ + +LOCAL(void) +initial_setup (j_decompress_ptr cinfo) +/* Called once, when first SOS marker is reached */ +{ + int ci; + jpeg_component_info *compptr; + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. + * In the full decompressor, this will be overridden by jdmaster.c; + * but in the transcoder, jdmaster.c is not used, so we must do it here. + */ + cinfo->min_DCT_scaled_size = DCTSIZE; + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_scaled_size = DCTSIZE; + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * DCTSIZE)); + /* downsampled_width and downsampled_height will also be overridden by + * jdmaster.c if we are doing full decompression. The transcoder library + * doesn't use these values, but the calling application might. + */ + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) cinfo->max_h_samp_factor); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) cinfo->max_v_samp_factor); + /* Mark component needed, until color conversion says otherwise */ + compptr->component_needed = TRUE; + /* Mark no quantization table yet saved for component */ + compptr->quant_table = NULL; + } + + /* Compute number of fully interleaved MCU rows. */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor*DCTSIZE)); + + /* Decide whether file contains multiple scans */ + if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) + cinfo->inputctl->has_multiple_scans = TRUE; + else + cinfo->inputctl->has_multiple_scans = FALSE; +} + + +LOCAL(void) +per_scan_setup (j_decompress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = compptr->DCT_scaled_size; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, + (long) (cinfo->max_h_samp_factor*DCTSIZE)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor*DCTSIZE)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } +} + + +/* + * Save away a copy of the Q-table referenced by each component present + * in the current scan, unless already saved during a prior scan. + * + * In a multiple-scan JPEG file, the encoder could assign different components + * the same Q-table slot number, but change table definitions between scans + * so that each component uses a different Q-table. (The IJG encoder is not + * currently capable of doing this, but other encoders might.) Since we want + * to be able to dequantize all the components at the end of the file, this + * means that we have to save away the table actually used for each component. + * We do this by copying the table at the start of the first scan containing + * the component. + * The JPEG spec prohibits the encoder from changing the contents of a Q-table + * slot between scans of a component using that slot. If the encoder does so + * anyway, this decoder will simply use the Q-table values that were current + * at the start of the first scan for the component. + * + * The decompressor output side looks only at the saved quant tables, + * not at the current Q-table slots. + */ + +LOCAL(void) +latch_quant_tables (j_decompress_ptr cinfo) +{ + int ci, qtblno; + jpeg_component_info *compptr; + JQUANT_TBL * qtbl; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* No work if we already saved Q-table for this component */ + if (compptr->quant_table != NULL) + continue; + /* Make sure specified quantization table is present */ + qtblno = compptr->quant_tbl_no; + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + /* OK, save away the quantization table */ + qtbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(JQUANT_TBL)); + MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); + compptr->quant_table = qtbl; + } +} + + +/* + * Initialize the input modules to read a scan of compressed data. + * The first call to this is done by jdmaster.c after initializing + * the entire decompressor (during jpeg_start_decompress). + * Subsequent calls come from consume_markers, below. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + per_scan_setup(cinfo); + latch_quant_tables(cinfo); + (*cinfo->entropy->start_pass) (cinfo); + (*cinfo->coef->start_input_pass) (cinfo); + cinfo->inputctl->consume_input = cinfo->coef->consume_data; +} + + +/* + * Finish up after inputting a compressed-data scan. + * This is called by the coefficient controller after it's read all + * the expected data of the scan. + */ + +METHODDEF(void) +finish_input_pass (j_decompress_ptr cinfo) +{ + cinfo->inputctl->consume_input = consume_markers; +} + + +/* + * Read JPEG markers before, between, or after compressed-data scans. + * Change state as necessary when a new scan is reached. + * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * The consume_input method pointer points either here or to the + * coefficient controller's consume_data routine, depending on whether + * we are reading a compressed data segment or inter-segment markers. + */ + +METHODDEF(int) +consume_markers (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + int val; + + if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ + return JPEG_REACHED_EOI; + + val = (*cinfo->marker->read_markers) (cinfo); + + switch (val) { + case JPEG_REACHED_SOS: /* Found SOS */ + if (inputctl->inheaders) { /* 1st SOS */ + initial_setup(cinfo); + inputctl->inheaders = FALSE; + /* Note: start_input_pass must be called by jdmaster.c + * before any more input can be consumed. jdapimin.c is + * responsible for enforcing this sequencing. + */ + } else { /* 2nd or later SOS marker */ + if (! inputctl->pub.has_multiple_scans) + ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ + start_input_pass(cinfo); + } + break; + case JPEG_REACHED_EOI: /* Found EOI */ + inputctl->pub.eoi_reached = TRUE; + if (inputctl->inheaders) { /* Tables-only datastream, apparently */ + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_NO_SOS); + } else { + /* Prevent infinite loop in coef ctlr's decompress_data routine + * if user set output_scan_number larger than number of scans. + */ + if (cinfo->output_scan_number > cinfo->input_scan_number) + cinfo->output_scan_number = cinfo->input_scan_number; + } + break; + case JPEG_SUSPENDED: + break; + } + + return val; +} + + +/* + * Reset state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + + inputctl->pub.consume_input = consume_markers; + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = TRUE; + /* Reset other modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->marker->reset_marker_reader) (cinfo); + /* Reset progression state -- would be cleaner if entropy decoder did this */ + cinfo->coef_bits = NULL; +} + + +/* + * Initialize the input controller module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl; + + /* Create subobject in permanent pool */ + inputctl = (my_inputctl_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_input_controller)); + cinfo->inputctl = (struct jpeg_input_controller *) inputctl; + /* Initialize method pointers */ + inputctl->pub.consume_input = consume_markers; + inputctl->pub.reset_input_controller = reset_input_controller; + inputctl->pub.start_input_pass = start_input_pass; + inputctl->pub.finish_input_pass = finish_input_pass; + /* Initialize state: can't use reset_input_controller since we don't + * want to try to reset other modules yet. + */ + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = TRUE; +} diff --git a/User/system/lib/lcd/gui/JPEG/jdmainct.c b/User/system/lib/lcd/gui/JPEG/jdmainct.c new file mode 100644 index 0000000..557d64f --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdmainct.c @@ -0,0 +1,512 @@ +/* + * jdmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for decompression. + * The main buffer lies between the JPEG decompressor proper and the + * post-processor; it holds downsampled data in the JPEG colorspace. + * + * Note that this code is bypassed in raw-data mode, since the application + * supplies the equivalent of the main buffer in that case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * In the current system design, the main buffer need never be a full-image + * buffer; any full-height buffers will be found inside the coefficient or + * postprocessing controllers. Nonetheless, the main controller is not + * trivial. Its responsibility is to provide context rows for upsampling/ + * rescaling, and doing this in an efficient fashion is a bit tricky. + * + * Postprocessor input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * sample rows of each component. (We require DCT_scaled_size values to be + * chosen such that these numbers are integers. In practice DCT_scaled_size + * values will likely be powers of two, so we actually have the stronger + * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) + * Upsampling will typically produce max_v_samp_factor pixel rows from each + * row group (times any additional scale factor that the upsampler is + * applying). + * + * The coefficient controller will deliver data to us one iMCU row at a time; + * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or + * exactly min_DCT_scaled_size row groups. (This amount of data corresponds + * to one row of MCUs when the image is fully interleaved.) Note that the + * number of sample rows varies across components, but the number of row + * groups does not. Some garbage sample rows may be included in the last iMCU + * row at the bottom of the image. + * + * Depending on the vertical scaling algorithm used, the upsampler may need + * access to the sample row(s) above and below its current input row group. + * The upsampler is required to set need_context_rows TRUE at global selection + * time if so. When need_context_rows is FALSE, this controller can simply + * obtain one iMCU row at a time from the coefficient controller and dole it + * out as row groups to the postprocessor. + * + * When need_context_rows is TRUE, this controller guarantees that the buffer + * passed to postprocessing contains at least one row group's worth of samples + * above and below the row group(s) being processed. Note that the context + * rows "above" the first passed row group appear at negative row offsets in + * the passed buffer. At the top and bottom of the image, the required + * context rows are manufactured by duplicating the first or last real sample + * row; this avoids having special cases in the upsampling inner loops. + * + * The amount of context is fixed at one row group just because that's a + * convenient number for this controller to work with. The existing + * upsamplers really only need one sample row of context. An upsampler + * supporting arbitrary output rescaling might wish for more than one row + * group of context when shrinking the image; tough, we don't handle that. + * (This is justified by the assumption that downsizing will be handled mostly + * by adjusting the DCT_scaled_size values, so that the actual scale factor at + * the upsample step needn't be much less than one.) + * + * To provide the desired context, we have to retain the last two row groups + * of one iMCU row while reading in the next iMCU row. (The last row group + * can't be processed until we have another row group for its below-context, + * and so we have to save the next-to-last group too for its above-context.) + * We could do this most simply by copying data around in our buffer, but + * that'd be very slow. We can avoid copying any data by creating a rather + * strange pointer structure. Here's how it works. We allocate a workspace + * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number + * of row groups per iMCU row). We create two sets of redundant pointers to + * the workspace. Labeling the physical row groups 0 to M+1, the synthesized + * pointer lists look like this: + * M+1 M-1 + * master pointer --> 0 master pointer --> 0 + * 1 1 + * ... ... + * M-3 M-3 + * M-2 M + * M-1 M+1 + * M M-2 + * M+1 M-1 + * 0 0 + * We read alternate iMCU rows using each master pointer; thus the last two + * row groups of the previous iMCU row remain un-overwritten in the workspace. + * The pointer lists are set up so that the required context rows appear to + * be adjacent to the proper places when we pass the pointer lists to the + * upsampler. + * + * The above pictures describe the normal state of the pointer lists. + * At top and bottom of the image, we diddle the pointer lists to duplicate + * the first or last sample row as necessary (this is cheaper than copying + * sample rows around). + * + * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that + * situation each iMCU row provides only one row group so the buffering logic + * must be different (eg, we must read two iMCU rows before we can emit the + * first row group). For now, we simply do not support providing context + * rows when min_DCT_scaled_size is 1. That combination seems unlikely to + * be worth providing --- if someone wants a 1/8th-size preview, they probably + * want it quick and dirty, so a context-free upsampler is sufficient. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_main_controller pub; /* public fields */ + + /* Pointer to allocated workspace (M or M+2 row groups). */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + + boolean buffer_full; /* Have we gotten an iMCU row from decoder? */ + JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */ + + /* Remaining fields are only used in the context case. */ + + /* These are the master pointers to the funny-order pointer lists. */ + JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */ + + int whichptr; /* indicates which pointer set is now in use */ + int context_state; /* process_data state machine status */ + JDIMENSION rowgroups_avail; /* row groups available to postprocessor */ + JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + +/* context_state values: */ +#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */ +#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */ +#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */ + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +METHODDEF(void) process_data_context_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) process_data_crank_post + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#endif + + +LOCAL(void) +alloc_funny_pointers (j_decompress_ptr cinfo) +/* Allocate space for the funny pointer lists. + * This is done only once, not once per pass. + */ +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + int ci, rgroup; + int M = cinfo->min_DCT_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + /* Get top-level space for component array pointers. + * We alloc both arrays with one call to save a few cycles. + */ + pMain->xbuffer[0] = (JSAMPIMAGE) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); + pMain->xbuffer[1] = pMain->xbuffer[0] + cinfo->num_components; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + /* Get space for pointer lists --- M+4 row groups in each list. + * We alloc both pointer lists with one call to save a few cycles. + */ + xbuf = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); + xbuf += rgroup; /* want one row group at negative offsets */ + pMain->xbuffer[0][ci] = xbuf; + xbuf += rgroup * (M + 4); + pMain->xbuffer[1][ci] = xbuf; + } +} + + +LOCAL(void) +make_funny_pointers (j_decompress_ptr cinfo) +/* Create the funny pointer lists discussed in the comments above. + * The actual workspace is already allocated (in pMain->buffer), + * and the space for the pointer lists is allocated too. + * This routine just fills in the curiously ordered lists. + * This will be repeated at the beginning of each pass. + */ +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY buf, xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + xbuf0 = pMain->xbuffer[0][ci]; + xbuf1 = pMain->xbuffer[1][ci]; + /* First copy the workspace pointers as-is */ + buf = pMain->buffer[ci]; + for (i = 0; i < rgroup * (M + 2); i++) { + xbuf0[i] = xbuf1[i] = buf[i]; + } + /* In the second list, put the last four row groups in swapped order */ + for (i = 0; i < rgroup * 2; i++) { + xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i]; + xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i]; + } + /* The wraparound pointers at top and bottom will be filled later + * (see set_wraparound_pointers, below). Initially we want the "above" + * pointers to duplicate the first actual data line. This only needs + * to happen in xbuffer[0]. + */ + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[0]; + } + } +} + + +LOCAL(void) +set_wraparound_pointers (j_decompress_ptr cinfo) +/* Set up the "wraparound" pointers at top and bottom of the pointer lists. + * This changes the pointer list state from top-of-image to the normal state. + */ +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + xbuf0 = pMain->xbuffer[0][ci]; + xbuf1 = pMain->xbuffer[1][ci]; + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; + xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; + xbuf0[rgroup*(M+2) + i] = xbuf0[i]; + xbuf1[rgroup*(M+2) + i] = xbuf1[i]; + } + } +} + + +LOCAL(void) +set_bottom_pointers (j_decompress_ptr cinfo) +/* Change the pointer lists to duplicate the last sample row at the bottom + * of the image. whichptr indicates which xbuffer holds the final iMCU row. + * Also sets rowgroups_avail to indicate number of nondummy row groups in row. + */ +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + int ci, i, rgroup, iMCUheight, rows_left; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Count sample rows in one iMCU row and in one row group */ + iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size; + rgroup = iMCUheight / cinfo->min_DCT_scaled_size; + /* Count nondummy sample rows remaining for this component */ + rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); + if (rows_left == 0) rows_left = iMCUheight; + /* Count nondummy row groups. Should get same answer for each component, + * so we need only do it once. + */ + if (ci == 0) { + pMain->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); + } + /* Duplicate the last real sample row rgroup*2 times; this pads out the + * last partial rowgroup and ensures at least one full rowgroup of context. + */ + xbuf = pMain->xbuffer[pMain->whichptr][ci]; + for (i = 0; i < rgroup * 2; i++) { + xbuf[rows_left + i] = xbuf[rows_left-1]; + } + } +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->upsample->need_context_rows) { + pMain->pub.process_data = process_data_context_main; + make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ + pMain->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ + pMain->context_state = CTX_PREPARE_FOR_IMCU; + pMain->iMCU_row_ctr = 0; + } else { + /* Simple case with no context needed */ + pMain->pub.process_data = process_data_simple_main; + } + pMain->buffer_full = FALSE; /* Mark buffer empty */ + pMain->rowgroup_ctr = 0; + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_CRANK_DEST: + /* For last pass of 2-pass quantization, just crank the postprocessor */ + pMain->pub.process_data = process_data_crank_post; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This handles the simple case where no context is required. + */ + +METHODDEF(void) +process_data_simple_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + JDIMENSION rowgroups_avail; + + /* Read input data if we haven't filled the main buffer yet */ + if (! pMain->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, pMain->buffer)) + return; /* suspension forced, can do nothing more */ + pMain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + } + + /* There are always min_DCT_scaled_size row groups in an iMCU row. */ + rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size; + /* Note: at the bottom of the image, we may pass extra garbage row groups + * to the postprocessor. The postprocessor has to check for bottom + * of image anyway (at row resolution), so no point in us doing it too. + */ + + /* Feed the postprocessor */ + (*cinfo->post->post_process_data) (cinfo, pMain->buffer, + &pMain->rowgroup_ctr, rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + + /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ + if (pMain->rowgroup_ctr >= rowgroups_avail) { + pMain->buffer_full = FALSE; + pMain->rowgroup_ctr = 0; + } +} + + +/* + * Process some data. + * This handles the case where context rows must be provided. + */ + +METHODDEF(void) +process_data_context_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr pMain = (my_main_ptr) cinfo->main; + + /* Read input data if we haven't filled the main buffer yet */ + if (! pMain->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, + pMain->xbuffer[pMain->whichptr])) + return; /* suspension forced, can do nothing more */ + pMain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + pMain->iMCU_row_ctr++; /* count rows received */ + } + + /* Postprocessor typically will not swallow all the input data it is handed + * in one call (due to filling the output buffer first). Must be prepared + * to exit and restart. This switch lets us keep track of how far we got. + * Note that each case falls through to the next on successful completion. + */ + switch (pMain->context_state) { + case CTX_POSTPONED_ROW: + /* Call postprocessor using previously set pointers for postponed row */ + (*cinfo->post->post_process_data) (cinfo, pMain->xbuffer[pMain->whichptr], + &pMain->rowgroup_ctr, pMain->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (pMain->rowgroup_ctr < pMain->rowgroups_avail) + return; /* Need to suspend */ + pMain->context_state = CTX_PREPARE_FOR_IMCU; + if (*out_row_ctr >= out_rows_avail) + return; /* Postprocessor exactly filled output buf */ + /*FALLTHROUGH*/ + case CTX_PREPARE_FOR_IMCU: + /* Prepare to process first M-1 row groups of this iMCU row */ + pMain->rowgroup_ctr = 0; + pMain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1); + /* Check for bottom of image: if so, tweak pointers to "duplicate" + * the last sample row, and adjust rowgroups_avail to ignore padding rows. + */ + if (pMain->iMCU_row_ctr == cinfo->total_iMCU_rows) + set_bottom_pointers(cinfo); + pMain->context_state = CTX_PROCESS_IMCU; + /*FALLTHROUGH*/ + case CTX_PROCESS_IMCU: + /* Call postprocessor using previously set pointers */ + (*cinfo->post->post_process_data) (cinfo, pMain->xbuffer[pMain->whichptr], + &pMain->rowgroup_ctr, pMain->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (pMain->rowgroup_ctr < pMain->rowgroups_avail) + return; /* Need to suspend */ + /* After the first iMCU, change wraparound pointers to normal state */ + if (pMain->iMCU_row_ctr == 1) + set_wraparound_pointers(cinfo); + /* Prepare to load new iMCU row using other xbuffer list */ + pMain->whichptr ^= 1; /* 0=>1 or 1=>0 */ + pMain->buffer_full = FALSE; + /* Still need to process last row group of this iMCU row, */ + /* which is saved at index M+1 of the other xbuffer */ + pMain->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1); + pMain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2); + pMain->context_state = CTX_POSTPONED_ROW; + } +} + + +/* + * Process some data. + * Final pass of two-pass quantization: just call the postprocessor. + * Source data will be the postprocessor controller's internal buffer. + */ + +#ifdef QUANT_2PASS_SUPPORTED + +METHODDEF(void) +process_data_crank_post (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, + (JDIMENSION *) NULL, (JDIMENSION) 0, + output_buf, out_row_ctr, out_rows_avail); +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr pMain; + int ci, rgroup, ngroups; + jpeg_component_info *compptr; + + pMain = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_d_main_controller *) pMain; + pMain->pub.start_pass = start_pass_main; + + if (need_full_buffer) /* shouldn't happen */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Allocate the workspace. + * ngroups is the number of row groups we need. + */ + if (cinfo->upsample->need_context_rows) { + if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */ + ERREXIT(cinfo, JERR_NOTIMPL); + alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ + ngroups = cinfo->min_DCT_scaled_size + 2; + } else { + ngroups = cinfo->min_DCT_scaled_size; + } + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + pMain->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * compptr->DCT_scaled_size, + (JDIMENSION) (rgroup * ngroups)); + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jdmarker.c b/User/system/lib/lcd/gui/JPEG/jdmarker.c new file mode 100644 index 0000000..087b22e --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdmarker.c @@ -0,0 +1,1360 @@ +/* + * jdmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to decode JPEG datastream markers. + * Most of the complexity arises from our desire to support input + * suspension: if not all of the data for a marker is available, + * we must exit back to the application. On resumption, we reprocess + * the marker. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_reader pub; /* public fields */ + + /* Application-overridable marker processing methods */ + jpeg_marker_parser_method process_COM; + jpeg_marker_parser_method process_APPn[16]; + + /* Limit on marker data length to save for each marker type */ + unsigned int length_limit_COM; + unsigned int length_limit_APPn[16]; + + /* Status of COM/APPn marker saving */ + jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ + unsigned int bytes_read; /* data bytes read so far in marker */ + /* Note: cur_marker is not linked into marker_list until it's all read. */ +} my_marker_reader; + +typedef my_marker_reader * my_marker_ptr; + + +/* + * Macros for fetching data from the data source module. + * + * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect + * the current restart point; we update them only when we have reached a + * suitable place to restart if a suspension occurs. + */ + +/* Declare and initialize local copies of input pointer/count */ +#define INPUT_VARS(cinfo) \ + struct jpeg_source_mgr * datasrc = (cinfo)->src; \ + const JOCTET * next_input_byte = datasrc->next_input_byte; \ + size_t bytes_in_buffer = datasrc->bytes_in_buffer + +/* Unload the local copies --- do this only at a restart boundary */ +#define INPUT_SYNC(cinfo) \ + ( datasrc->next_input_byte = next_input_byte, \ + datasrc->bytes_in_buffer = bytes_in_buffer ) + +/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ +#define INPUT_RELOAD(cinfo) \ + ( next_input_byte = datasrc->next_input_byte, \ + bytes_in_buffer = datasrc->bytes_in_buffer ) + +/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. + * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, + * but we must reload the local copies after a successful fill. + */ +#define MAKE_BYTE_AVAIL(cinfo,action) \ + if (bytes_in_buffer == 0) { \ + if (! (*datasrc->fill_input_buffer) (cinfo)) \ + { action; } \ + INPUT_RELOAD(cinfo); \ + } + +/* Read a byte into variable V. + * If must suspend, take the specified action (typically "return FALSE"). + */ +#define INPUT_BYTE(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = GETJOCTET(*next_input_byte++); ) + +/* As above, but read two bytes interpreted as an unsigned 16-bit integer. + * V should be declared unsigned int or perhaps INT32. + */ +#define INPUT_2BYTES(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ + MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V += GETJOCTET(*next_input_byte++); ) + + +/* + * Routines to process JPEG markers. + * + * Entry condition: JPEG marker itself has been read and its code saved + * in cinfo->unread_marker; input restart point is just after the marker. + * + * Exit: if return TRUE, have read and processed any parameters, and have + * updated the restart point to point after the parameters. + * If return FALSE, was forced to suspend before reaching end of + * marker parameters; restart point has not been moved. Same routine + * will be called again after application supplies more input data. + * + * This approach to suspension assumes that all of a marker's parameters + * can fit into a single input bufferload. This should hold for "normal" + * markers. Some COM/APPn markers might have large parameter segments + * that might not fit. If we are simply dropping such a marker, we use + * skip_input_data to get past it, and thereby put the problem on the + * source manager's shoulders. If we are saving the marker's contents + * into memory, we use a slightly different convention: when forced to + * suspend, the marker processor updates the restart point to the end of + * what it's consumed (ie, the end of the buffer) before returning FALSE. + * On resumption, cinfo->unread_marker still contains the marker code, + * but the data source will point to the next chunk of marker data. + * The marker processor must retain internal state to deal with this. + * + * Note that we don't bother to avoid duplicate trace messages if a + * suspension occurs within marker parameters. Other side effects + * require more care. + */ + + +LOCAL(boolean) +get_soi (j_decompress_ptr cinfo) +/* Process an SOI marker */ +{ + int i; + + TRACEMS(cinfo, 1, JTRC_SOI); + + if (cinfo->marker->saw_SOI) + ERREXIT(cinfo, JERR_SOI_DUPLICATE); + + /* Reset all parameters that are defined to be reset by SOI */ + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + cinfo->restart_interval = 0; + + /* Set initial assumptions for colorspace etc */ + + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ + + cinfo->saw_JFIF_marker = FALSE; + cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; + cinfo->X_density = 1; + cinfo->Y_density = 1; + cinfo->saw_Adobe_marker = FALSE; + cinfo->Adobe_transform = 0; + + cinfo->marker->saw_SOI = TRUE; + + return TRUE; +} + + +LOCAL(boolean) +get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) +/* Process a SOFn marker */ +{ + INT32 length; + int c, ci; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + cinfo->progressive_mode = is_prog; + cinfo->arith_code = is_arith; + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); + INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); + + length -= 8; + + TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, + (int) cinfo->image_width, (int) cinfo->image_height, + cinfo->num_components); + + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_DUPLICATE); + + /* We don't support files in which the image height is initially specified */ + /* as 0 and is later redefined by DNL. As long as we have to check that, */ + /* might as well have a general sanity check. */ + if (cinfo->image_height <= 0 || cinfo->image_width <= 0 + || cinfo->num_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + if (length != (cinfo->num_components * 3)) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + if (cinfo->comp_info == NULL) /* do only once, even if suspend */ + cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * SIZEOF(jpeg_component_info)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->component_index = ci; + INPUT_BYTE(cinfo, compptr->component_id, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + compptr->h_samp_factor = (c >> 4) & 15; + compptr->v_samp_factor = (c ) & 15; + INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); + + TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, + compptr->component_id, compptr->h_samp_factor, + compptr->v_samp_factor, compptr->quant_tbl_no); + } + + cinfo->marker->saw_SOF = TRUE; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_sos (j_decompress_ptr cinfo) +/* Process a SOS marker */ +{ + INT32 length; + int i, ci, n, c, cc; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + if (! cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOS_NO_SOF); + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ + + TRACEMS1(cinfo, 1, JTRC_SOS, n); + + if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + cinfo->comps_in_scan = n; + + /* Collect the component-spec parameters */ + + for (i = 0; i < n; i++) { + INPUT_BYTE(cinfo, cc, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (cc == compptr->component_id) + goto id_found; + } + + ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); + + id_found: + + cinfo->cur_comp_info[i] = compptr; + compptr->dc_tbl_no = (c >> 4) & 15; + compptr->ac_tbl_no = (c ) & 15; + + TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, + compptr->dc_tbl_no, compptr->ac_tbl_no); + } + + /* Collect the additional scan parameters Ss, Se, Ah/Al. */ + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ss = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Se = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ah = (c >> 4) & 15; + cinfo->Al = (c ) & 15; + + TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, + cinfo->Ah, cinfo->Al); + + /* Prepare to scan data & restart markers */ + cinfo->marker->next_restart_num = 0; + + /* Count another SOS marker */ + cinfo->input_scan_number++; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +#ifdef D_ARITH_CODING_SUPPORTED + +LOCAL(boolean) +get_dac (j_decompress_ptr cinfo) +/* Process a DAC marker */ +{ + INT32 length; + int index, val; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + INPUT_BYTE(cinfo, index, return FALSE); + INPUT_BYTE(cinfo, val, return FALSE); + + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_DAC, index, val); + + if (index < 0 || index >= (2*NUM_ARITH_TBLS)) + ERREXIT1(cinfo, JERR_DAC_INDEX, index); + + if (index >= NUM_ARITH_TBLS) { /* define AC table */ + cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; + } else { /* define DC table */ + cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); + cinfo->arith_dc_U[index] = (UINT8) (val >> 4); + if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) + ERREXIT1(cinfo, JERR_DAC_VALUE, val); + } + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + +#else /* ! D_ARITH_CODING_SUPPORTED */ + +#define get_dac(cinfo) skip_variable(cinfo) + +#endif /* D_ARITH_CODING_SUPPORTED */ + + +LOCAL(boolean) +get_dht (j_decompress_ptr cinfo) +/* Process a DHT marker */ +{ + INT32 length; + UINT8 bits[17]; + UINT8 huffval[256]; + int i, index, count; + JHUFF_TBL **htblptr; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 16) { + INPUT_BYTE(cinfo, index, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DHT, index); + + bits[0] = 0; + count = 0; + for (i = 1; i <= 16; i++) { + INPUT_BYTE(cinfo, bits[i], return FALSE); + count += bits[i]; + } + + length -= 1 + 16; + + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[1], bits[2], bits[3], bits[4], + bits[5], bits[6], bits[7], bits[8]); + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[9], bits[10], bits[11], bits[12], + bits[13], bits[14], bits[15], bits[16]); + + /* Here we just do minimal validation of the counts to avoid walking + * off the end of our table space. jdhuff.c will check more carefully. + */ + if (count > 256 || ((INT32) count) > length) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + for (i = 0; i < count; i++) + INPUT_BYTE(cinfo, huffval[i], return FALSE); + + length -= count; + + if (index & 0x10) { /* AC table definition */ + index -= 0x10; + htblptr = &cinfo->ac_huff_tbl_ptrs[index]; + } else { /* DC table definition */ + htblptr = &cinfo->dc_huff_tbl_ptrs[index]; + } + + if (index < 0 || index >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_DHT_INDEX, index); + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dqt (j_decompress_ptr cinfo) +/* Process a DQT marker */ +{ + INT32 length; + int n, i, prec; + unsigned int tmp; + JQUANT_TBL *quant_ptr; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + INPUT_BYTE(cinfo, n, return FALSE); + prec = n >> 4; + n &= 0x0F; + + TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); + + if (n >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, n); + + if (cinfo->quant_tbl_ptrs[n] == NULL) + cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); + quant_ptr = cinfo->quant_tbl_ptrs[n]; + + for (i = 0; i < DCTSIZE2; i++) { + if (prec) + INPUT_2BYTES(cinfo, tmp, return FALSE); + else + INPUT_BYTE(cinfo, tmp, return FALSE); + /* We convert the zigzag-order table to natural array order. */ + quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; + } + + if (cinfo->err->trace_level >= 2) { + for (i = 0; i < DCTSIZE2; i += 8) { + TRACEMS8(cinfo, 2, JTRC_QUANTVALS, + quant_ptr->quantval[i], quant_ptr->quantval[i+1], + quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], + quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], + quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); + } + } + + length -= DCTSIZE2+1; + if (prec) length -= DCTSIZE2; + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dri (j_decompress_ptr cinfo) +/* Process a DRI marker */ +{ + INT32 length; + unsigned int tmp; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + + if (length != 4) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_2BYTES(cinfo, tmp, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DRI, tmp); + + cinfo->restart_interval = tmp; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Routines for processing APPn and COM markers. + * These are either saved in memory or discarded, per application request. + * APP0 and APP14 are specially checked to see if they are + * JFIF and Adobe markers, respectively. + */ + +#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ +#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ +#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ + + +LOCAL(void) +examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP0. + * Take appropriate action if it is a JFIF marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + INT32 totallen = (INT32) datalen + remaining; + + if (datalen >= APP0_DATA_LEN && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x49 && + GETJOCTET(data[3]) == 0x46 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF APP0 marker: save info */ + cinfo->saw_JFIF_marker = TRUE; + cinfo->JFIF_major_version = GETJOCTET(data[5]); + cinfo->JFIF_minor_version = GETJOCTET(data[6]); + cinfo->density_unit = GETJOCTET(data[7]); + cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); + cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); + /* Check version. + * Major version must be 1, anything else signals an incompatible change. + * (We used to treat this as an error, but now it's a nonfatal warning, + * because some bozo at Hijaak couldn't read the spec.) + * Minor version should be 0..2, but process anyway if newer. + */ + if (cinfo->JFIF_major_version != 1) + WARNMS2(cinfo, JWRN_JFIF_MAJOR, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version); + /* Generate trace messages */ + TRACEMS5(cinfo, 1, JTRC_JFIF, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version, + cinfo->X_density, cinfo->Y_density, cinfo->density_unit); + /* Validate thumbnail dimensions and issue appropriate messages */ + if (GETJOCTET(data[12]) | GETJOCTET(data[13])) + TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, + GETJOCTET(data[12]), GETJOCTET(data[13])); + totallen -= APP0_DATA_LEN; + if (totallen != + ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) + TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); + } else if (datalen >= 6 && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x58 && + GETJOCTET(data[3]) == 0x58 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF "JFXX" extension APP0 marker */ + /* The library doesn't actually do anything with these, + * but we try to produce a helpful trace message. + */ + switch (GETJOCTET(data[5])) { + case 0x10: + TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); + break; + case 0x11: + TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); + break; + case 0x13: + TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); + break; + default: + TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, + GETJOCTET(data[5]), (int) totallen); + break; + } + } else { + /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); + } +} + + +LOCAL(void) +examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP14. + * Take appropriate action if it is an Adobe marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + unsigned int version, flags0, flags1, transform; + + if (datalen >= APP14_DATA_LEN && + GETJOCTET(data[0]) == 0x41 && + GETJOCTET(data[1]) == 0x64 && + GETJOCTET(data[2]) == 0x6F && + GETJOCTET(data[3]) == 0x62 && + GETJOCTET(data[4]) == 0x65) { + /* Found Adobe APP14 marker */ + version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); + flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); + flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); + transform = GETJOCTET(data[11]); + TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); + cinfo->saw_Adobe_marker = TRUE; + cinfo->Adobe_transform = (UINT8) transform; + } else { + /* Start of APP14 does not match "Adobe", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); + } +} + + +METHODDEF(boolean) +get_interesting_appn (j_decompress_ptr cinfo) +/* Process an APP0 or APP14 marker without saving it */ +{ + INT32 length; + JOCTET b[APPN_DATA_LEN]; + unsigned int i, numtoread; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + /* get the interesting part of the marker data */ + if (length >= APPN_DATA_LEN) + numtoread = APPN_DATA_LEN; + else if (length > 0) + numtoread = (unsigned int) length; + else + numtoread = 0; + for (i = 0; i < numtoread; i++) + INPUT_BYTE(cinfo, b[i], return FALSE); + length -= numtoread; + + /* process it */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + case M_APP14: + examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + default: + /* can't get here unless jpeg_save_markers chooses wrong processor */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +#ifdef SAVE_MARKERS_SUPPORTED + +METHODDEF(boolean) +save_marker (j_decompress_ptr cinfo) +/* Save an APPn or COM marker into the marker list */ +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + jpeg_saved_marker_ptr cur_marker = marker->cur_marker; + unsigned int bytes_read, data_length; + JOCTET FAR * data; + INT32 length = 0; + INPUT_VARS(cinfo); + + if (cur_marker == NULL) { + /* begin reading a marker */ + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + if (length >= 0) { /* watch out for bogus length word */ + /* figure out how much we want to save */ + unsigned int limit; + if (cinfo->unread_marker == (int) M_COM) + limit = marker->length_limit_COM; + else + limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; + if ((unsigned int) length < limit) + limit = (unsigned int) length; + /* allocate and initialize the marker item */ + cur_marker = (jpeg_saved_marker_ptr) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(struct jpeg_marker_struct) + limit); + cur_marker->next = NULL; + cur_marker->marker = (UINT8) cinfo->unread_marker; + cur_marker->original_length = (unsigned int) length; + cur_marker->data_length = limit; + /* data area is just beyond the jpeg_marker_struct */ + data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); + marker->cur_marker = cur_marker; + marker->bytes_read = 0; + bytes_read = 0; + data_length = limit; + } else { + /* deal with bogus length word */ + bytes_read = data_length = 0; + data = NULL; + } + } else { + /* resume reading a marker */ + bytes_read = marker->bytes_read; + data_length = cur_marker->data_length; + data = cur_marker->data + bytes_read; + } + + while (bytes_read < data_length) { + INPUT_SYNC(cinfo); /* move the restart point to here */ + marker->bytes_read = bytes_read; + /* If there's not at least one byte in buffer, suspend */ + MAKE_BYTE_AVAIL(cinfo, return FALSE); + /* Copy bytes with reasonable rapidity */ + while (bytes_read < data_length && bytes_in_buffer > 0) { + *data++ = *next_input_byte++; + bytes_in_buffer--; + bytes_read++; + } + } + + /* Done reading what we want to read */ + if (cur_marker != NULL) { /* will be NULL if bogus length word */ + /* Add new marker to end of list */ + if (cinfo->marker_list == NULL) { + cinfo->marker_list = cur_marker; + } else { + jpeg_saved_marker_ptr prev = cinfo->marker_list; + while (prev->next != NULL) + prev = prev->next; + prev->next = cur_marker; + } + /* Reset pointer & calc remaining data length */ + data = cur_marker->data; + length = cur_marker->original_length - data_length; + } + /* Reset to initial state for next marker */ + marker->cur_marker = NULL; + + /* Process the marker if interesting; else just make a generic trace msg */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, data, data_length, length); + break; + case M_APP14: + examine_app14(cinfo, data, data_length, length); + break; + default: + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, + (int) (data_length + length)); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +METHODDEF(boolean) +skip_variable (j_decompress_ptr cinfo) +/* Skip over an unknown or uninteresting variable-length marker */ +{ + INT32 length; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); + + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +/* + * Find the next JPEG marker, save it in cinfo->unread_marker. + * Returns FALSE if had to suspend before reaching a marker; + * in that case cinfo->unread_marker is unchanged. + * + * Note that the result might not be a valid marker code, + * but it will never be 0 or FF. + */ + +LOCAL(boolean) +next_marker (j_decompress_ptr cinfo) +{ + int c; + INPUT_VARS(cinfo); + + while(1) { + INPUT_BYTE(cinfo, c, return FALSE); + /* Skip any non-FF bytes. + * This may look a bit inefficient, but it will not occur in a valid file. + * We sync after each discarded byte so that a suspending data source + * can discard the byte from its buffer. + */ + while (c != 0xFF) { + cinfo->marker->discarded_bytes++; + INPUT_SYNC(cinfo); + INPUT_BYTE(cinfo, c, return FALSE); + } + /* This loop swallows any duplicate FF bytes. Extra FFs are legal as + * pad bytes, so don't count them in discarded_bytes. We assume there + * will not be so many consecutive FF bytes as to overflow a suspending + * data source's input buffer. + */ + do { + INPUT_BYTE(cinfo, c, return FALSE); + } while (c == 0xFF); + if (c != 0) + break; /* found a valid marker, exit loop */ + /* Reach here if we found a stuffed-zero data sequence (FF/00). + * Discard it and loop back to try again. + */ + cinfo->marker->discarded_bytes += 2; + INPUT_SYNC(cinfo); + } + + if (cinfo->marker->discarded_bytes != 0) { + WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); + cinfo->marker->discarded_bytes = 0; + } + + cinfo->unread_marker = c; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +first_marker (j_decompress_ptr cinfo) +/* Like next_marker, but used to obtain the initial SOI marker. */ +/* For this marker, we do not allow preceding garbage or fill; otherwise, + * we might well scan an entire input file before realizing it ain't JPEG. + * If an application wants to process non-JFIF files, it must seek to the + * SOI before calling the JPEG library. + */ +{ + int c, c2; + INPUT_VARS(cinfo); + + INPUT_BYTE(cinfo, c, return FALSE); + INPUT_BYTE(cinfo, c2, return FALSE); + if (c != 0xFF || c2 != (int) M_SOI) + ERREXIT2(cinfo, JERR_NO_SOI, c, c2); + + cinfo->unread_marker = c2; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Read markers until SOS or EOI. + * + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + */ + +METHODDEF(int) +read_markers (j_decompress_ptr cinfo) +{ + /* Outer loop repeats once for each marker. */ + while(1) { + /* Collect the marker proper, unless we already did. */ + /* NB: first_marker() enforces the requirement that SOI appear first. */ + if (cinfo->unread_marker == 0) { + if (! cinfo->marker->saw_SOI) { + if (! first_marker(cinfo)) + return JPEG_SUSPENDED; + } else { + if (! next_marker(cinfo)) + return JPEG_SUSPENDED; + } + } + /* At this point cinfo->unread_marker contains the marker code and the + * input point is just past the marker proper, but before any parameters. + * A suspension will cause us to return with this state still true. + */ + switch (cinfo->unread_marker) { + case M_SOI: + if (! get_soi(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_SOF0: /* Baseline */ + case M_SOF1: /* Extended sequential, Huffman */ + if (! get_sof(cinfo, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF2: /* Progressive, Huffman */ + if (! get_sof(cinfo, TRUE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF9: /* Extended sequential, arithmetic */ + if (! get_sof(cinfo, FALSE, TRUE)) + return JPEG_SUSPENDED; + break; + + case M_SOF10: /* Progressive, arithmetic */ + if (! get_sof(cinfo, TRUE, TRUE)) + return JPEG_SUSPENDED; + break; + + /* Currently unsupported SOFn types */ + case M_SOF3: /* Lossless, Huffman */ + case M_SOF5: /* Differential sequential, Huffman */ + case M_SOF6: /* Differential progressive, Huffman */ + case M_SOF7: /* Differential lossless, Huffman */ + case M_JPG: /* Reserved for JPEG extensions */ + case M_SOF11: /* Lossless, arithmetic */ + case M_SOF13: /* Differential sequential, arithmetic */ + case M_SOF14: /* Differential progressive, arithmetic */ + case M_SOF15: /* Differential lossless, arithmetic */ + ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); + break; + + case M_SOS: + if (! get_sos(cinfo)) + return JPEG_SUSPENDED; + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_SOS; + + case M_EOI: + TRACEMS(cinfo, 1, JTRC_EOI); + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_EOI; + + case M_DAC: + if (! get_dac(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DHT: + if (! get_dht(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DQT: + if (! get_dqt(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DRI: + if (! get_dri(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_APP0: + case M_APP1: + case M_APP2: + case M_APP3: + case M_APP4: + case M_APP5: + case M_APP6: + case M_APP7: + case M_APP8: + case M_APP9: + case M_APP10: + case M_APP11: + case M_APP12: + case M_APP13: + case M_APP14: + case M_APP15: + if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ + cinfo->unread_marker - (int) M_APP0]) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_COM: + if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_RST0: /* these are all parameterless */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: + TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); + break; + + case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ + if (! skip_variable(cinfo)) + return JPEG_SUSPENDED; + break; + + default: /* must be DHP, EXP, JPGn, or RESn */ + /* For now, we treat the reserved markers as fatal errors since they are + * likely to be used to signal incompatible JPEG Part 3 extensions. + * Once the JPEG 3 version-number marker is well defined, this code + * ought to change! + */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + /* Successfully processed marker, so reset state variable */ + cinfo->unread_marker = 0; + } /* end loop */ +} + + +/* + * Read a restart marker, which is expected to appear next in the datastream; + * if the marker is not there, take appropriate recovery action. + * Returns FALSE if suspension is required. + * + * This is called by the entropy decoder after it has read an appropriate + * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder + * has already read a marker from the data source. Under normal conditions + * cinfo->unread_marker will be reset to 0 before returning; if not reset, + * it holds a marker which the decoder will be unable to read past. + */ + +METHODDEF(boolean) +read_restart_marker (j_decompress_ptr cinfo) +{ + /* Obtain a marker unless we already did. */ + /* Note that next_marker will complain if it skips any data. */ + if (cinfo->unread_marker == 0) { + if (! next_marker(cinfo)) + return FALSE; + } + + if (cinfo->unread_marker == + ((int) M_RST0 + cinfo->marker->next_restart_num)) { + /* Normal case --- swallow the marker and let entropy decoder continue */ + TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); + cinfo->unread_marker = 0; + } else { + /* Uh-oh, the restart markers have been messed up. */ + /* Let the data source manager determine how to resync. */ + if (! (*cinfo->src->resync_to_restart) (cinfo, + cinfo->marker->next_restart_num)) + return FALSE; + } + + /* Update next-restart state */ + cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; + + return TRUE; +} + + +/* + * This is the default resync_to_restart method for data source managers + * to use if they don't have any better approach. Some data source managers + * may be able to back up, or may have additional knowledge about the data + * which permits a more intelligent recovery strategy; such managers would + * presumably supply their own resync method. + * + * read_restart_marker calls resync_to_restart if it finds a marker other than + * the restart marker it was expecting. (This code is *not* used unless + * a nonzero restart interval has been declared.) cinfo->unread_marker is + * the marker code actually found (might be anything, except 0 or FF). + * The desired restart marker number (0..7) is passed as a parameter. + * This routine is supposed to apply whatever error recovery strategy seems + * appropriate in order to position the input stream to the next data segment. + * Note that cinfo->unread_marker is treated as a marker appearing before + * the current data-source input point; usually it should be reset to zero + * before returning. + * Returns FALSE if suspension is required. + * + * This implementation is substantially constrained by wanting to treat the + * input as a data stream; this means we can't back up. Therefore, we have + * only the following actions to work with: + * 1. Simply discard the marker and let the entropy decoder resume at next + * byte of file. + * 2. Read forward until we find another marker, discarding intervening + * data. (In theory we could look ahead within the current bufferload, + * without having to discard data if we don't find the desired marker. + * This idea is not implemented here, in part because it makes behavior + * dependent on buffer size and chance buffer-boundary positions.) + * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). + * This will cause the entropy decoder to process an empty data segment, + * inserting dummy zeroes, and then we will reprocess the marker. + * + * #2 is appropriate if we think the desired marker lies ahead, while #3 is + * appropriate if the found marker is a future restart marker (indicating + * that we have missed the desired restart marker, probably because it got + * corrupted). + * We apply #2 or #3 if the found marker is a restart marker no more than + * two counts behind or ahead of the expected one. We also apply #2 if the + * found marker is not a legal JPEG marker code (it's certainly bogus data). + * If the found marker is a restart marker more than 2 counts away, we do #1 + * (too much risk that the marker is erroneous; with luck we will be able to + * resync at some future point). + * For any valid non-restart JPEG marker, we apply #3. This keeps us from + * overrunning the end of a scan. An implementation limited to single-scan + * files might find it better to apply #2 for markers other than EOI, since + * any other marker would have to be bogus data in that case. + */ + +GLOBAL(boolean) +jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) +{ + int marker = cinfo->unread_marker; + int action; + + /* Always put up a warning. */ + WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); + + /* Outer loop handles repeated decision after scanning forward. */ + while(1) { + if (marker < (int) M_SOF0) + action = 2; /* invalid marker */ + else if (marker < (int) M_RST0 || marker > (int) M_RST7) + action = 3; /* valid non-restart marker */ + else { + if (marker == ((int) M_RST0 + ((desired+1) & 7)) || + marker == ((int) M_RST0 + ((desired+2) & 7))) + action = 3; /* one of the next two expected restarts */ + else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || + marker == ((int) M_RST0 + ((desired-2) & 7))) + action = 2; /* a prior restart, so advance */ + else + action = 1; /* desired restart or too far away */ + } + TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); + switch (action) { + case 1: + /* Discard marker and let entropy decoder resume processing. */ + cinfo->unread_marker = 0; + return TRUE; + case 2: + /* Scan to the next marker, and repeat the decision loop. */ + if (! next_marker(cinfo)) + return FALSE; + marker = cinfo->unread_marker; + break; + case 3: + /* Return without advancing past this marker. */ + /* Entropy decoder will be forced to process an empty segment. */ + return TRUE; + } + } /* end loop */ +} + + +/* + * Reset marker processing state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + cinfo->comp_info = NULL; /* until allocated by get_sof */ + cinfo->input_scan_number = 0; /* no SOS seen yet */ + cinfo->unread_marker = 0; /* no pending marker */ + marker->pub.saw_SOI = FALSE; /* set internal state too */ + marker->pub.saw_SOF = FALSE; + marker->pub.discarded_bytes = 0; + marker->cur_marker = NULL; +} + + +/* + * Initialize the marker reader module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker; + int i; + + /* Create subobject in permanent pool */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_marker_reader)); + cinfo->marker = (struct jpeg_marker_reader *) marker; + /* Initialize public method pointers */ + marker->pub.reset_marker_reader = reset_marker_reader; + marker->pub.read_markers = read_markers; + marker->pub.read_restart_marker = read_restart_marker; + /* Initialize COM/APPn processing. + * By default, we examine and then discard APP0 and APP14, + * but simply discard COM and all other APPn. + */ + marker->process_COM = skip_variable; + marker->length_limit_COM = 0; + for (i = 0; i < 16; i++) { + marker->process_APPn[i] = skip_variable; + marker->length_limit_APPn[i] = 0; + } + marker->process_APPn[0] = get_interesting_appn; + marker->process_APPn[14] = get_interesting_appn; + /* Reset marker processing state */ + reset_marker_reader(cinfo); +} + + +/* + * Control saving of COM and APPn markers into marker_list. + */ + +#ifdef SAVE_MARKERS_SUPPORTED + +GLOBAL(void) +jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + long maxlength; + jpeg_marker_parser_method processor; + + /* Length limit mustn't be larger than what we can allocate + * (should only be a concern in a 16-bit environment). + */ + maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); + if (((long) length_limit) > maxlength) + length_limit = (unsigned int) maxlength; + + /* Choose processor routine to use. + * APP0/APP14 have special requirements. + */ + if (length_limit) { + processor = save_marker; + /* If saving APP0/APP14, save at least enough for our internal use. */ + if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) + length_limit = APP0_DATA_LEN; + else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) + length_limit = APP14_DATA_LEN; + } else { + processor = skip_variable; + /* If discarding APP0/APP14, use our regular on-the-fly processor. */ + if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) + processor = get_interesting_appn; + } + + if (marker_code == (int) M_COM) { + marker->process_COM = processor; + marker->length_limit_COM = length_limit; + } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { + marker->process_APPn[marker_code - (int) M_APP0] = processor; + marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; + } else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +/* + * Install a special processing method for COM or APPn markers. + */ + +GLOBAL(void) +jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + if (marker_code == (int) M_COM) + marker->process_COM = routine; + else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) + marker->process_APPn[marker_code - (int) M_APP0] = routine; + else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} diff --git a/User/system/lib/lcd/gui/JPEG/jdmaster.c b/User/system/lib/lcd/gui/JPEG/jdmaster.c new file mode 100644 index 0000000..2802c5b --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdmaster.c @@ -0,0 +1,557 @@ +/* + * jdmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG decompressor. + * These routines are concerned with selecting the modules to be executed + * and with determining the number of passes and the work to be done in each + * pass. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_decomp_master pub; /* public fields */ + + int pass_number; /* # of passes completed */ + + boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ + + /* Saved references to initialized quantizer modules, + * in case we need to switch modes. + */ + struct jpeg_color_quantizer * quantizer_1pass; + struct jpeg_color_quantizer * quantizer_2pass; +} my_decomp_master; + +typedef my_decomp_master * my_master_ptr; + + +/* + * Determine whether merged upsample/color conversion should be used. + * CRUCIAL: this must match the actual capabilities of jdmerge.c! + */ + +LOCAL(boolean) +use_merged_upsample (j_decompress_ptr cinfo) +{ +#ifdef UPSAMPLE_MERGING_SUPPORTED + /* Merging is the equivalent of plain box-filter upsampling */ + if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) + return FALSE; + /* jdmerge.c only supports YCC=>RGB color conversion */ + if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || + cinfo->out_color_space != JCS_RGB || + cinfo->out_color_components != RGB_PIXELSIZE) + return FALSE; + /* and it only handles 2h1v or 2h2v sampling ratios */ + if (cinfo->comp_info[0].h_samp_factor != 2 || + cinfo->comp_info[1].h_samp_factor != 1 || + cinfo->comp_info[2].h_samp_factor != 1 || + cinfo->comp_info[0].v_samp_factor > 2 || + cinfo->comp_info[1].v_samp_factor != 1 || + cinfo->comp_info[2].v_samp_factor != 1) + return FALSE; + /* furthermore, it doesn't work if we've scaled the IDCTs differently */ + if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size || + cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size || + cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size) + return FALSE; + /* ??? also need to test for upsample-time rescaling, when & if supported */ + return TRUE; /* by golly, it'll work... */ +#else + return FALSE; +#endif +} + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + * Also note that it may be called before the master module is initialized! + */ + +GLOBAL(void) +jpeg_calc_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; +#endif + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_READY) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + +#ifdef IDCT_SCALING_SUPPORTED + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * 8 <= cinfo->scale_denom) { + /* Provide 1/8 scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, 8L); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, 8L); + cinfo->min_DCT_scaled_size = 1; + } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { + /* Provide 1/4 scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, 4L); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, 4L); + cinfo->min_DCT_scaled_size = 2; + } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { + /* Provide 1/2 scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, 2L); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, 2L); + cinfo->min_DCT_scaled_size = 4; + } else { + /* Provide 1/1 scaling */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + cinfo->min_DCT_scaled_size = DCTSIZE; + } + /* In selecting the actual DCT scaling for each component, we try to + * scale up the chroma components via IDCT scaling rather than upsampling. + * This saves time if the upsampler gets to use 1:1 scaling. + * Note this code assumes that the supported DCT scalings are powers of 2. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + int ssize = cinfo->min_DCT_scaled_size; + while (ssize < DCTSIZE && + (compptr->h_samp_factor * ssize * 2 <= + cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) && + (compptr->v_samp_factor * ssize * 2 <= + cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) { + ssize = ssize * 2; + } + compptr->DCT_scaled_size = ssize; + } + + /* Recompute downsampled dimensions of components; + * application needs to know these if using raw downsampled data. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Size in samples, after IDCT scaling */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * + (long) (compptr->h_samp_factor * compptr->DCT_scaled_size), + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * + (long) (compptr->v_samp_factor * compptr->DCT_scaled_size), + (long) (cinfo->max_v_samp_factor * DCTSIZE)); + } + +#else /* !IDCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ + + /* Report number of components in selected colorspace. */ + /* Probably this should be in the color conversion module... */ + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + break; + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + cinfo->out_color_components = RGB_PIXELSIZE; + break; +#endif /* else share code with YCbCr */ + case JCS_YCbCr: + cinfo->out_color_components = 3; + break; + case JCS_CMYK: + case JCS_YCCK: + cinfo->out_color_components = 4; + break; + default: /* else must be same colorspace as in file */ + cinfo->out_color_components = cinfo->num_components; + break; + } + cinfo->output_components = (cinfo->quantize_colors ? 1 : + cinfo->out_color_components); + + /* See if upsampler will want to emit more than one row at a time */ + if (use_merged_upsample(cinfo)) + cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; + else + cinfo->rec_outbuf_height = 1; +} + + +/* + * Several decompression processes need to range-limit values to the range + * 0..MAXJSAMPLE; the input value may fall somewhat outside this range + * due to noise introduced by quantization, roundoff error, etc. These + * processes are inner loops and need to be as fast as possible. On most + * machines, particularly CPUs with pipelines or instruction prefetch, + * a (subscript-check-less) C table lookup + * x = sample_range_limit[x]; + * is faster than explicit tests + * if (x < 0) x = 0; + * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; + * These processes all use a common table prepared by the routine below. + * + * For most steps we can mathematically guarantee that the initial value + * of x is within MAXJSAMPLE+1 of the legal range, so a table running from + * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial + * limiting step (just after the IDCT), a wildly out-of-range value is + * possible if the input data is corrupt. To avoid any chance of indexing + * off the end of memory and getting a bad-pointer trap, we perform the + * post-IDCT limiting thus: + * x = range_limit[x & MASK]; + * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit + * samples. Under normal circumstances this is more than enough range and + * a correct output will be generated; with bogus input data the mask will + * cause wraparound, and we will safely generate a bogus-but-in-range output. + * For the post-IDCT step, we want to convert the data from signed to unsigned + * representation by adding CENTERJSAMPLE at the same time that we limit it. + * So the post-IDCT limiting table ends up looking like this: + * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, + * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0,1,...,CENTERJSAMPLE-1 + * Negative inputs select values from the upper half of the table after + * masking. + * + * We can save some space by overlapping the start of the post-IDCT table + * with the simpler range limiting table. The post-IDCT table begins at + * sample_range_limit + CENTERJSAMPLE. + * + * Note that the table is allocated in near data space on PCs; it's small + * enough and used often enough to justify this. + */ + +LOCAL(void) +prepare_range_limit_table (j_decompress_ptr cinfo) +/* Allocate and fill in the sample_range_limit table */ +{ + JSAMPLE * table; + int i; + + table = (JSAMPLE *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ + cinfo->sample_range_limit = table; + /* First segment of "simple" table: limit[x] = 0 for x < 0 */ + MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); + /* Main part of "simple" table: limit[x] = x */ + for (i = 0; i <= MAXJSAMPLE; i++) + table[i] = (JSAMPLE) i; + table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ + /* End of simple table, rest of first half of post-IDCT table */ + for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) + table[i] = MAXJSAMPLE; + /* Second half of post-IDCT table */ + MEMZERO(table + (2 * (MAXJSAMPLE+1)), + (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), + cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); +} + + +/* + * Master selection of decompression modules. + * This is done once at jpeg_start_decompress time. We determine + * which modules will be used and give them appropriate initialization calls. + * We also initialize the decompressor input side to begin consuming data. + * + * Since jpeg_read_header has finished, we know what is in the SOF + * and (first) SOS markers. We also have all the application parameter + * settings. + */ + +LOCAL(void) +master_selection (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + boolean use_c_buffer; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + /* Initialize dimensions and other stuff */ + jpeg_calc_output_dimensions(cinfo); + prepare_range_limit_table(cinfo); + + /* Width of an output scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* Initialize my private state */ + master->pass_number = 0; + master->using_merged_upsample = use_merged_upsample(cinfo); + + /* Color quantizer selection */ + master->quantizer_1pass = NULL; + master->quantizer_2pass = NULL; + /* No mode changes if not using buffered-image mode. */ + if (! cinfo->quantize_colors || ! cinfo->buffered_image) { + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + } + if (cinfo->quantize_colors) { + if (cinfo->raw_data_out) + ERREXIT(cinfo, JERR_NOTIMPL); + /* 2-pass quantizer only works in 3-component color space. */ + if (cinfo->out_color_components != 3) { + cinfo->enable_1pass_quant = TRUE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + cinfo->colormap = NULL; + } else if (cinfo->colormap != NULL) { + cinfo->enable_external_quant = TRUE; + } else if (cinfo->two_pass_quantize) { + cinfo->enable_2pass_quant = TRUE; + } else { + cinfo->enable_1pass_quant = TRUE; + } + + if (cinfo->enable_1pass_quant) { +#ifdef QUANT_1PASS_SUPPORTED + jinit_1pass_quantizer(cinfo); + master->quantizer_1pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + + /* We use the 2-pass code to map to external colormaps. */ + if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { +#ifdef QUANT_2PASS_SUPPORTED + jinit_2pass_quantizer(cinfo); + master->quantizer_2pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + /* If both quantizers are initialized, the 2-pass one is left active; + * this is necessary for starting with quantization to an external map. + */ + } + + /* Post-processing: in particular, color conversion first */ + if (! cinfo->raw_data_out) { + if (master->using_merged_upsample) { +#ifdef UPSAMPLE_MERGING_SUPPORTED + jinit_merged_upsampler(cinfo); /* does color conversion too */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + jinit_color_deconverter(cinfo); + jinit_upsampler(cinfo); + } + jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); + } + /* Inverse DCT */ + jinit_inverse_dct(cinfo); + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) { + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); + } else { + if (cinfo->progressive_mode) { +#ifdef D_PROGRESSIVE_SUPPORTED + jinit_phuff_decoder(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else + jinit_huff_decoder(cinfo); + } + + /* Initialize principal buffer controllers. */ + use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; + jinit_d_coef_controller(cinfo, use_c_buffer); + + if (! cinfo->raw_data_out) + jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* If jpeg_start_decompress will read the whole file, initialize + * progress monitoring appropriately. The input step is counted + * as one pass. + */ + if (cinfo->progress != NULL && ! cinfo->buffered_image && + cinfo->inputctl->has_multiple_scans) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); + /* Count the input pass as done */ + master->pass_number++; + } +#endif /* D_MULTISCAN_FILES_SUPPORTED */ +} + + +/* + * Per-pass setup. + * This is called at the beginning of each output pass. We determine which + * modules will be active during this pass and give them appropriate + * start_pass calls. We also set is_dummy_pass to indicate whether this + * is a "real" output pass or a dummy pass for color quantization. + * (In the latter case, jdapistd.c will crank the pass to completion.) + */ + +METHODDEF(void) +prepare_for_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (master->pub.is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Final pass of 2-pass quantization */ + master->pub.is_dummy_pass = FALSE; + (*cinfo->cquantize->start_pass) (cinfo, FALSE); + (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); + (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + if (cinfo->quantize_colors && cinfo->colormap == NULL) { + /* Select new quantization method */ + if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { + cinfo->cquantize = master->quantizer_2pass; + master->pub.is_dummy_pass = TRUE; + } else if (cinfo->enable_1pass_quant) { + cinfo->cquantize = master->quantizer_1pass; + } else { + ERREXIT(cinfo, JERR_MODE_CHANGE); + } + } + (*cinfo->idct->start_pass) (cinfo); + (*cinfo->coef->start_output_pass) (cinfo); + if (! cinfo->raw_data_out) { + if (! master->using_merged_upsample) + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->upsample->start_pass) (cinfo); + if (cinfo->quantize_colors) + (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); + (*cinfo->post->start_pass) (cinfo, + (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + } + } + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->pass_number + + (master->pub.is_dummy_pass ? 2 : 1); + /* In buffered-image mode, we assume one more output pass if EOI not + * yet reached, but no more passes if EOI has been reached. + */ + if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { + cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); + } + } +} + + +/* + * Finish up at end of an output pass. + */ + +METHODDEF(void) +finish_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (cinfo->quantize_colors) + (*cinfo->cquantize->finish_pass) (cinfo); + master->pass_number++; +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Switch to a new external colormap between output passes. + */ + +GLOBAL(void) +jpeg_new_colormap (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_BUFIMAGE) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (cinfo->quantize_colors && cinfo->enable_external_quant && + cinfo->colormap != NULL) { + /* Select 2-pass quantizer for external colormap use */ + cinfo->cquantize = master->quantizer_2pass; + /* Notify quantizer of colormap change */ + (*cinfo->cquantize->new_color_map) (cinfo); + master->pub.is_dummy_pass = FALSE; /* just in case */ + } else + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +/* + * Initialize master decompression control and select active modules. + * This is performed at the start of jpeg_start_decompress. + */ + +GLOBAL(void) +jinit_master_decompress (j_decompress_ptr cinfo) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_decomp_master)); + cinfo->master = (struct jpeg_decomp_master *) master; + master->pub.prepare_for_output_pass = prepare_for_output_pass; + master->pub.finish_output_pass = finish_output_pass; + + master->pub.is_dummy_pass = FALSE; + + master_selection(cinfo); +} diff --git a/User/system/lib/lcd/gui/JPEG/jdmerge.c b/User/system/lib/lcd/gui/JPEG/jdmerge.c new file mode 100644 index 0000000..4445fde --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdmerge.c @@ -0,0 +1,403 @@ +/* + * jdmerge.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains code for merged upsampling/color conversion. + * + * This file combines functions from jdsample.c and jdcolor.c; + * read those files first to understand what's going on. + * + * When the chroma components are to be upsampled by simple replication + * (ie, box filtering), we can save some work in color conversion by + * calculating all the output pixels corresponding to a pair of chroma + * samples at one time. In the conversion equations + * R = Y + K1 * Cr + * G = Y + K2 * Cb + K3 * Cr + * B = Y + K4 * Cb + * only the Y term varies among the group of pixels corresponding to a pair + * of chroma samples, so the rest of the terms can be calculated just once. + * At typical sampling ratios, this eliminates half or three-quarters of the + * multiplications needed for color conversion. + * + * This file currently provides implementations for the following cases: + * YCbCr => RGB color conversion only. + * Sampling ratios of 2h1v or 2h2v. + * No scaling needed at upsample time. + * Corner-aligned (non-CCIR601) sampling alignment. + * Other special cases could be added, but in most applications these are + * the only common cases. (For uncommon cases we fall back on the more + * general code in jdsample.c and jdcolor.c.) + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef UPSAMPLE_MERGING_SUPPORTED + + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Pointer to routine to do actual upsampling/conversion of one row group */ + JMETHOD(void, upmethod, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf)); + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ + + /* For 2:1 vertical sampling, we produce two output rows at a time. + * We need a "spare" row buffer to hold the second output row if the + * application provides just a one-row buffer; we also use the spare + * to discard the dummy last row if the image height is odd. + */ + JSAMPROW spare_row; + boolean spare_full; /* T if spare buffer is occupied */ + + JDIMENSION out_row_width; /* samples per output row */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + * This is taken directly from jdcolor.c; see that file for more info. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int i; + INT32 x; + SHIFT_TEMPS + + upsample->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + upsample->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + upsample->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + upsample->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_merged_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the spare buffer empty */ + upsample->spare_full = FALSE; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * The control routine just handles the row buffering considerations. + */ + +METHODDEF(void) +merged_2v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 2:1 vertical sampling case: may need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPROW work_ptrs[2]; + JDIMENSION num_rows; /* number of rows returned to caller */ + + GUI_USE_PARA(in_row_groups_avail); + if (upsample->spare_full) { + /* If we have a spare row saved from a previous cycle, just return it. */ + jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, + 1, upsample->out_row_width); + num_rows = 1; + upsample->spare_full = FALSE; + } else { + /* Figure number of rows to return to caller. */ + num_rows = 2; + /* Not more than the distance to the end of the image. */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + /* Create output pointer array for upsampler. */ + work_ptrs[0] = output_buf[*out_row_ctr]; + if (num_rows > 1) { + work_ptrs[1] = output_buf[*out_row_ctr + 1]; + } else { + work_ptrs[1] = upsample->spare_row; + upsample->spare_full = TRUE; + } + /* Now do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); + } + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (! upsample->spare_full) + (*in_row_group_ctr)++; +} + + +METHODDEF(void) +merged_1v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 1:1 vertical sampling case: much easier, never need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + GUI_USE_PARA(out_rows_avail); + GUI_USE_PARA(in_row_groups_avail); + /* Just do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, + output_buf + *out_row_ctr); + /* Adjust counts */ + (*out_row_ctr)++; + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by the control routines to do + * the actual upsampling/conversion. One row group is processed per call. + * + * Note: since we may be writing directly into application-supplied buffers, + * we have to be honest about the output width; we can't assume the buffer + * has been rounded up to an even width. + */ + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. + */ + +METHODDEF(void) +h2v1_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr; + JSAMPROW inptr0, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr0 = input_buf[0][in_row_group_ctr]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr = output_buf[0]; + /* Loop for each pair of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 2 Y values and emit 2 pixels */ + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr0); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. + */ + +METHODDEF(void) +h2v2_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr0, outptr1; + JSAMPROW inptr00, inptr01, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr00 = input_buf[0][in_row_group_ctr*2]; + inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr0 = output_buf[0]; + outptr1 = output_buf[1]; + /* Loop for each group of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 4 Y values and emit 4 pixels */ + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr00); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + y = GETJSAMPLE(*inptr01); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Module initialization routine for merged upsampling/color conversion. + * + * NB: this is called under the conditions determined by use_merged_upsample() + * in jdmaster.c. That routine MUST correspond to the actual capabilities + * of this module; no safety checks are made here. + */ + +GLOBAL(void) +jinit_merged_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_merged_upsample; + upsample->pub.need_context_rows = FALSE; + + upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; + + if (cinfo->max_v_samp_factor == 2) { + upsample->pub.upsample = merged_2v_upsample; + upsample->upmethod = h2v2_merged_upsample; + /* Allocate a spare row buffer */ + upsample->spare_row = (JSAMPROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); + } else { + upsample->pub.upsample = merged_1v_upsample; + upsample->upmethod = h2v1_merged_upsample; + /* No spare row needed */ + upsample->spare_row = NULL; + } + + build_ycc_rgb_table(cinfo); +} + +#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jdphuff.c b/User/system/lib/lcd/gui/JPEG/jdphuff.c new file mode 100644 index 0000000..2267809 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdphuff.c @@ -0,0 +1,668 @@ +/* + * jdphuff.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines for progressive JPEG. + * + * Much of the complexity here has to do with supporting input suspension. + * If the data source module demands suspension, we want to be able to back + * up to the start of the current MCU. To do this, we copy state variables + * into local working storage, and update them back to the permanent + * storage only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdhuff.h" /* Declarations shared with jdhuff.c */ + + +#ifdef D_PROGRESSIVE_SUPPORTED + +/* + * Expanded entropy decoder object for progressive Huffman decoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).EOBRUN = (src).EOBRUN, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + /* These fields are loaded into local variables at start of each MCU. + * In case of suspension, we exit WITHOUT updating them. + */ + bitread_perm_state bitstate; /* Bit buffer at start of MCU */ + savable_state saved; /* Other state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; + + d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ +} phuff_entropy_decoder; + +typedef phuff_entropy_decoder * phuff_entropy_ptr; + +/* Forward declarations */ +METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); + + +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_phuff_decoder (j_decompress_ptr cinfo) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + boolean is_DC_band, bad; + int ci, coefi, tbl; + int *coef_bit_ptr; + jpeg_component_info * compptr; + + is_DC_band = (cinfo->Ss == 0); + + /* Validate scan parameters */ + bad = FALSE; + if (is_DC_band) { + if (cinfo->Se != 0) + bad = TRUE; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) + bad = TRUE; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + bad = TRUE; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Al != cinfo->Ah-1) + bad = TRUE; + } + if (cinfo->Al > 13) /* need not check for < 0 */ + bad = TRUE; + /* Arguably the maximum Al value should be less than 13 for 8-bit precision, + * but the spec doesn't say so, and we try to be liberal about what we + * accept. Note: large Al values could result in out-of-range DC + * coefficients during early scans, leading to bizarre displays due to + * overflows in the IDCT math. But we won't crash. + */ + if (bad) + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int cindex = cinfo->cur_comp_info[ci]->component_index; + coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (is_DC_band) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (is_DC_band) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present, and compute derived tables. + * We may build same derived table more than once, but it's not expensive. + */ + if (is_DC_band) { + if (cinfo->Ah == 0) { /* DC refinement needs no table */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->derived_tbls[tbl]); + } + } else { + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->derived_tbls[tbl]); + /* remember the single active table */ + entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->pub.insufficient_data = FALSE; + + /* Initialize private state variables */ + entropy->saved.EOBRUN = 0; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and add will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) + +#else + +#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) + +static const int extend_test[16] = /* entry n is 2**(n-1) */ + { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + +static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ + { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, + ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, + ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, + ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; + +#endif /* AVOID_TABLES */ + + +/* + * Check for a restart marker & resynchronize decoder. + * Returns FALSE if must suspend. + */ + +LOCAL(boolean) +process_restart (j_decompress_ptr cinfo) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int ci; + + /* Throw away any unused bits remaining in bit buffer; */ + /* include any full bytes in next_marker's count of discarded bytes */ + cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; + entropy->bitstate.bits_left = 0; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + return FALSE; + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Re-init EOB run count, too */ + entropy->saved.EOBRUN = 0; + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; + + /* Reset out-of-data flag, unless read_restart_marker left us smack up + * against a marker. In that case we will end up treating the next data + * segment as empty, and we can avoid producing bogus output pixels by + * leaving the flag set. + */ + if (cinfo->unread_marker == 0) + entropy->pub.insufficient_data = FALSE; + + return TRUE; +} + + +/* + * Huffman MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * Huffman-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + * + * We return FALSE if data source requested suspension. In that case no + * changes have been made to permanent state. (Exception: some output + * coefficients may already have been assigned. This is harmless for + * spectral selection, since we'll just re-assign them on the next call. + * Successive approximation AC refinement has to be more careful, however.) + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int Al = cinfo->Al; + register int s, r; + int blkn, ci; + JBLOCKROW block; + BITREAD_STATE_VARS; + savable_state state; + d_derived_tbl * tbl; + jpeg_component_info * compptr; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + tbl = entropy->derived_tbls[compptr->dc_tbl_no]; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, tbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + /* Convert DC difference to actual value, update last_dc_val */ + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (s << Al); + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int Se = cinfo->Se; + int Al = cinfo->Al; + register int s, k, r; + unsigned int EOBRUN; + JBLOCKROW block; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state. + * We can avoid loading/saving bitread state if in an EOB run. + */ + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + + if (EOBRUN > 0) /* if it's a band of zeroes... */ + EOBRUN--; /* ...process it now (we do nothing) */ + else { + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + for (k = cinfo->Ss; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, return FALSE, label2); + r = s >> 4; + s &= 15; + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); + } else { + if (r == 15) { /* ZRL */ + k += 15; /* skip 15 zeroes in band */ + } else { /* EOBr, run length is 2^r + appended bits */ + EOBRUN = 1 << r; + if (r) { /* EOBr, r > 0 */ + CHECK_BIT_BUFFER(br_state, r, return FALSE); + r = GET_BITS(r); + EOBRUN += r; + } + EOBRUN--; /* this band is processed at this moment */ + break; /* force end-of-band */ + } + } + } + + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + } + + /* Completed MCU, so update state */ + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int blkn; + JBLOCKROW block; + BITREAD_STATE_VARS; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* Not worth the cycles to check insufficient_data here, + * since we will not change the data anyway if we read zeroes. + */ + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* Encoded data is simply the next bit of the two's-complement DC value */ + CHECK_BIT_BUFFER(br_state, 1, return FALSE); + if (GET_BITS(1)) + (*block)[0] |= p1; + /* Note: since we use |=, repeating the assignment later is safe */ + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int Se = cinfo->Se; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + register int s, k, r; + unsigned int EOBRUN; + JBLOCKROW block; + JCOEFPTR thiscoef; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + int num_newnz; + int newnz_pos[DCTSIZE2]; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, don't modify the MCU. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + /* If we are forced to suspend, we must undo the assignments to any newly + * nonzero coefficients in the block, because otherwise we'd get confused + * next time about which coefficients were already nonzero. + * But we need not undo addition of bits to already-nonzero coefficients; + * instead, we can test the current bit to see if we already did it. + */ + num_newnz = 0; + + /* initialize coefficient loop counter to start of band */ + k = cinfo->Ss; + + if (EOBRUN == 0) { + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, goto undoit, label3); + r = s >> 4; + s &= 15; + if (s) { + if (s != 1) /* size of new coef should always be 1 */ + WARNMS(cinfo, JWRN_HUFF_BAD_CODE); + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) + s = p1; /* newly nonzero coef is positive */ + else + s = m1; /* newly nonzero coef is negative */ + } else { + if (r != 15) { + EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ + if (r) { + CHECK_BIT_BUFFER(br_state, r, goto undoit); + r = GET_BITS(r); + EOBRUN += r; + } + break; /* rest of block is handled by EOB logic */ + } + /* note s = 0 for processing ZRL */ + } + /* Advance over already-nonzero coefs and r still-zero coefs, + * appending correction bits to the nonzeroes. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + do { + thiscoef = *block + jpeg_natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } else { + if (--r < 0) + break; /* reached target zero coefficient */ + } + k++; + } while (k <= Se); + if (s) { + int pos = jpeg_natural_order[k]; + /* Output newly nonzero coefficient */ + (*block)[pos] = (JCOEF) s; + /* Remember its position in case we have to suspend */ + newnz_pos[num_newnz++] = pos; + } + } + } + + if (EOBRUN > 0) { + /* Scan any remaining coefficient positions after the end-of-band + * (the last newly nonzero coefficient, if any). Append a correction + * bit to each already-nonzero coefficient. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + for (; k <= Se; k++) { + thiscoef = *block + jpeg_natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } + } + /* Count one block completed in EOB run */ + EOBRUN--; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; + +undoit: + /* Re-zero any output coefficients that we made newly nonzero */ + while (num_newnz > 0) + (*block)[newnz_pos[--num_newnz]] = 0; + + return FALSE; +} + + +/* + * Module initialization routine for progressive Huffman entropy decoding. + */ + +GLOBAL(void) +jinit_phuff_decoder (j_decompress_ptr cinfo) +{ + phuff_entropy_ptr entropy; + int *coef_bit_ptr; + int ci, i; + + entropy = (phuff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(phuff_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass_phuff_decoder; + + /* Mark derived tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + } + + /* Create progression status table */ + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; +} + +#endif /* D_PROGRESSIVE_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jdpostct.c b/User/system/lib/lcd/gui/JPEG/jdpostct.c new file mode 100644 index 0000000..4359f2d --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdpostct.c @@ -0,0 +1,295 @@ +/* + * jdpostct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the decompression postprocessing controller. + * This controller manages the upsampling, color conversion, and color + * quantization/reduction steps; specifically, it controls the buffering + * between upsample/color conversion and color quantization/reduction. + * + * If no color quantization/reduction is required, then this module has no + * work to do, and it just hands off to the upsample/color conversion code. + * An integrated upsample/convert/quantize process would replace this module + * entirely. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_post_controller pub; /* public fields */ + + /* Color quantization source buffer: this holds output data from + * the upsample/color conversion step to be passed to the quantizer. + * For two-pass color quantization, we need a full-image buffer; + * for one-pass operation, a strip buffer is sufficient. + */ + jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ + JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ + JDIMENSION strip_height; /* buffer size in rows */ + /* for two-pass mode only: */ + JDIMENSION starting_row; /* row # of first row in current strip */ + JDIMENSION next_row; /* index of next row to fill/empty in strip */ +} my_post_controller; + +typedef my_post_controller * my_post_ptr; + + +/* Forward declarations */ +METHODDEF(void) post_process_1pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) post_process_prepass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +METHODDEF(void) post_process_2pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->quantize_colors) { + /* Single-pass processing with color quantization. */ + post->pub.post_process_data = post_process_1pass; + /* We could be doing buffered-image output before starting a 2-pass + * color quantization; in that case, jinit_d_post_controller did not + * allocate a strip buffer. Use the virtual-array buffer as workspace. + */ + if (post->buffer == NULL) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + (JDIMENSION) 0, post->strip_height, TRUE); + } + } else { + /* For single-pass processing without color quantization, + * I have no work to do; just call the upsampler directly. + */ + post->pub.post_process_data = cinfo->upsample->upsample; + } + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_SAVE_AND_PASS: + /* First pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_prepass; + break; + case JBUF_CRANK_DEST: + /* Second pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_2pass; + break; +#endif /* QUANT_2PASS_SUPPORTED */ + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } + post->starting_row = post->next_row = 0; +} + + +/* + * Process some data in the one-pass (strip buffer) case. + * This is used for color precision reduction as well as one-pass quantization. + */ + +METHODDEF(void) +post_process_1pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Fill the buffer, but not more than what we can dump out in one go. */ + /* Note we rely on the upsampler to detect bottom of image. */ + max_rows = out_rows_avail - *out_row_ctr; + if (max_rows > post->strip_height) + max_rows = post->strip_height; + num_rows = 0; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &num_rows, max_rows); + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer, output_buf + *out_row_ctr, (int) num_rows); + *out_row_ctr += num_rows; +} + + +#ifdef QUANT_2PASS_SUPPORTED + +/* + * Process some data in the first pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_prepass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION old_next_row, num_rows; + + GUI_USE_PARA(out_rows_avail); + GUI_USE_PARA(output_buf); + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, TRUE); + } + + /* Upsample some data (up to a strip height's worth). */ + old_next_row = post->next_row; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &post->next_row, post->strip_height); + + /* Allow quantizer to scan new data. No data is emitted, */ + /* but we advance out_row_ctr so outer loop can tell when we're done. */ + if (post->next_row > old_next_row) { + num_rows = post->next_row - old_next_row; + (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, + (JSAMPARRAY) NULL, (int) num_rows); + *out_row_ctr += num_rows; + } + + /* Advance if we filled the strip. */ + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + + +/* + * Process some data in the second pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_2pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + GUI_USE_PARA(in_row_groups_avail); + GUI_USE_PARA(in_row_group_ctr); + GUI_USE_PARA(input_buf); + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, FALSE); + } + + /* Determine number of rows to emit. */ + num_rows = post->strip_height - post->next_row; /* available in strip */ + max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ + if (num_rows > max_rows) + num_rows = max_rows; + /* We have to check bottom of image here, can't depend on upsampler. */ + max_rows = cinfo->output_height - post->starting_row; + if (num_rows > max_rows) + num_rows = max_rows; + + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer + post->next_row, output_buf + *out_row_ctr, + (int) num_rows); + *out_row_ctr += num_rows; + + /* Advance if we filled the strip. */ + post->next_row += num_rows; + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize postprocessing controller. + */ + +GLOBAL(void) +jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_post_ptr post; + + post = (my_post_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_post_controller)); + cinfo->post = (struct jpeg_d_post_controller *) post; + post->pub.start_pass = start_pass_dpost; + post->whole_image = NULL; /* flag for no virtual arrays */ + post->buffer = NULL; /* flag for no strip buffer */ + + /* Create the quantization buffer, if needed */ + if (cinfo->quantize_colors) { + /* The buffer strip height is max_v_samp_factor, which is typically + * an efficient number of rows for upsampling to return. + * (In the presence of output rescaling, we might want to be smarter?) + */ + post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; + if (need_full_buffer) { + /* Two-pass color quantization: need full-image storage. */ + /* We round up the number of rows to a multiple of the strip height. */ +#ifdef QUANT_2PASS_SUPPORTED + post->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + cinfo->output_width * cinfo->out_color_components, + (JDIMENSION) jround_up((long) cinfo->output_height, + (long) post->strip_height), + post->strip_height); +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + /* One-pass color quantization: just make a strip buffer. */ + post->buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->output_width * cinfo->out_color_components, + post->strip_height); + } + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jdsample.c b/User/system/lib/lcd/gui/JPEG/jdsample.c new file mode 100644 index 0000000..03b4e41 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdsample.c @@ -0,0 +1,486 @@ +/* + * jdsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains upsampling routines. + * + * Upsampling input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * sample rows of each component. Upsampling will normally produce + * max_v_samp_factor pixel rows from each row group (but this could vary + * if the upsampler is applying a scale factor of its own). + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to upsample a single component */ +typedef JMETHOD(void, upsample1_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Color conversion buffer. When using separate upsampling and color + * conversion steps, this buffer holds one upsampled row group until it + * has been color converted and output. + * Note: we do not allocate any storage for component(s) which are full-size, + * ie do not need rescaling. The corresponding entry of color_buf[] is + * simply set to point to the input data array, thereby avoiding copying. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + /* Per-component upsampling method pointers */ + upsample1_ptr methods[MAX_COMPONENTS]; + + int next_row_out; /* counts rows emitted from color_buf */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ + + /* Height of an input row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_expand need not + * recompute them each time. They are unused for other upsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the conversion buffer empty */ + upsample->next_row_out = cinfo->max_v_samp_factor; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * In this version we upsample each component independently. + * We upsample one row group into the conversion buffer, then apply + * color conversion a row at a time. + */ + +METHODDEF(void) +sep_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int ci; + jpeg_component_info * compptr; + JDIMENSION num_rows; + + GUI_USE_PARA(in_row_groups_avail); + /* Fill the conversion buffer, if it's empty */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Invoke per-component upsample method. Notice we pass a POINTER + * to color_buf[ci], so that fullsize_upsample can change it. + */ + (*upsample->methods[ci]) (cinfo, compptr, + input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]), + upsample->color_buf + ci); + } + upsample->next_row_out = 0; + } + + /* Color-convert and emit rows */ + + /* How many we have in the buffer: */ + num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out); + /* Not more than the distance to the end of the image. Need this test + * in case the image height is not a multiple of max_v_samp_factor: + */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + + (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf, + (JDIMENSION) upsample->next_row_out, + output_buf + *out_row_ctr, + (int) num_rows); + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + upsample->next_row_out += num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by sep_upsample to upsample pixel values + * of a single component. One row group is processed per call. + */ + + +/* + * For full-size components, we just make color_buf[ci] point at the + * input buffer, and thus avoid copying any data. Note that this is + * safe only because sep_upsample doesn't declare the input row group + * "consumed" until we are done color converting and emitting it. + */ + +METHODDEF(void) +fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + GUI_USE_PARA(compptr); + GUI_USE_PARA(cinfo); + *output_data_ptr = input_data; +} + + +/* + * This is a no-op version used for "uninteresting" components. + * These components will not be referenced by color conversion. + */ + +METHODDEF(void) +noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + GUI_USE_PARA(cinfo); + GUI_USE_PARA(compptr); + GUI_USE_PARA(input_data); + *output_data_ptr = NULL; /* safety check */ +} + + +/* + * This version handles any integral sampling ratios. + * This is not used for typical JPEG files, so it need not be fast. + * Nor, for that matter, is it particularly accurate: the algorithm is + * simple replication of the input pixel onto the corresponding output + * pixels. The hi-falutin sampling literature refers to this as a + * "box filter". A box filter tends to introduce visible artifacts, + * so if you are actually going to use 3:1 or 4:1 sampling ratios + * you would be well advised to improve this code. + */ + +METHODDEF(void) +int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + register int h; + JSAMPROW outend; + int h_expand, v_expand; + int inrow, outrow; + + h_expand = upsample->h_expand[compptr->component_index]; + v_expand = upsample->v_expand[compptr->component_index]; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + /* Generate one output row with proper horizontal expansion */ + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + for (h = h_expand; h > 0; h--) { + *outptr++ = invalue; + } + } + /* Generate any additional output rows by duplicating the first one */ + if (v_expand > 1) { + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + v_expand-1, cinfo->output_width); + } + inrow++; + outrow += v_expand; + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 1:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int inrow; + + GUI_USE_PARA(compptr); + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + inptr = input_data[inrow]; + outptr = output_data[inrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 2:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int inrow, outrow; + + GUI_USE_PARA(compptr); + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + 1, cinfo->output_width); + inrow++; + outrow += 2; + } +} + + +/* + * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical. + * + * The upsampling algorithm is linear interpolation between pixel centers, + * also known as a "triangle filter". This is a good compromise between + * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 + * of the way between input pixel centers. + * + * A note about the "bias" calculations: when rounding fractional values to + * integer, we do not want to always round 0.5 up to the next integer. + * If we did that, we'd introduce a noticeable bias towards larger values. + * Instead, this code is arranged so that 0.5 will be rounded up or down at + * alternate pixel locations (a simple ordered dither pattern). + */ + +METHODDEF(void) +h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register int invalue; + register JDIMENSION colctr; + int inrow; + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + inptr = input_data[inrow]; + outptr = output_data[inrow]; + /* Special case for first column */ + invalue = GETJSAMPLE(*inptr++); + *outptr++ = (JSAMPLE) invalue; + *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); + + for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { + /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ + invalue = GETJSAMPLE(*inptr++) * 3; + *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2); + *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2); + } + + /* Special case for last column */ + invalue = GETJSAMPLE(*inptr); + *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2); + *outptr = (JSAMPLE) invalue; + } +} + + +/* + * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. + * Again a triangle filter; see comments for h2v1 case, above. + * + * It is OK for us to reference the adjacent input rows because we demanded + * context from the main buffer controller (see initialization code). + */ + +METHODDEF(void) +h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr0, inptr1, outptr; +#if BITS_IN_JSAMPLE == 8 + register int thiscolsum, lastcolsum, nextcolsum; +#else + register INT32 thiscolsum, lastcolsum, nextcolsum; +#endif + register JDIMENSION colctr; + int inrow, outrow, v; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + for (v = 0; v < 2; v++) { + /* inptr0 points to nearest input row, inptr1 points to next nearest */ + inptr0 = input_data[inrow]; + if (v == 0) /* next nearest is row above */ + inptr1 = input_data[inrow-1]; + else /* next nearest is row below */ + inptr1 = input_data[inrow+1]; + outptr = output_data[outrow++]; + + /* Special case for first column */ + thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); + lastcolsum = thiscolsum; thiscolsum = nextcolsum; + + for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { + /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ + /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ + nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); + lastcolsum = thiscolsum; thiscolsum = nextcolsum; + } + + /* Special case for last column */ + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); + *outptr = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4); + } + inrow++; + } +} + + +/* + * Module initialization routine for upsampling. + */ + +GLOBAL(void) +jinit_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + int ci; + jpeg_component_info * compptr; + boolean need_buffer, do_fancy; + int h_in_group, v_in_group, h_out_group, v_out_group; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_upsample; + upsample->pub.upsample = sep_upsample; + upsample->pub.need_context_rows = FALSE; /* until we find out differently */ + + if (cinfo->CCIR601_sampling) /* this isn't supported */ + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1, + * so don't ask for it. + */ + do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1; + + /* Verify we can handle the sampling factors, select per-component methods, + * and create storage as needed. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Compute size of an "input group" after IDCT scaling. This many samples + * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. + */ + h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; + v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; + h_out_group = cinfo->max_h_samp_factor; + v_out_group = cinfo->max_v_samp_factor; + upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ + need_buffer = TRUE; + if (! compptr->component_needed) { + /* Don't bother to upsample an uninteresting component. */ + upsample->methods[ci] = noop_upsample; + need_buffer = FALSE; + } else if (h_in_group == h_out_group && v_in_group == v_out_group) { + /* Fullsize components can be processed without any work. */ + upsample->methods[ci] = fullsize_upsample; + need_buffer = FALSE; + } else if (h_in_group * 2 == h_out_group && + v_in_group == v_out_group) { + /* Special cases for 2h1v upsampling */ + if (do_fancy && compptr->downsampled_width > 2) + upsample->methods[ci] = h2v1_fancy_upsample; + else + upsample->methods[ci] = h2v1_upsample; + } else if (h_in_group * 2 == h_out_group && + v_in_group * 2 == v_out_group) { + /* Special cases for 2h2v upsampling */ + if (do_fancy && compptr->downsampled_width > 2) { + upsample->methods[ci] = h2v2_fancy_upsample; + upsample->pub.need_context_rows = TRUE; + } else + upsample->methods[ci] = h2v2_upsample; + } else if ((h_out_group % h_in_group) == 0 && + (v_out_group % v_in_group) == 0) { + /* Generic integral-factors upsampling method */ + upsample->methods[ci] = int_upsample; + upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group); + upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group); + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + if (need_buffer) { + upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) jround_up((long) cinfo->output_width, + (long) cinfo->max_h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jdtrans.c b/User/system/lib/lcd/gui/JPEG/jdtrans.c new file mode 100644 index 0000000..e0e3f15 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jdtrans.c @@ -0,0 +1,143 @@ +/* + * jdtrans.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding decompression, + * that is, reading raw DCT coefficient arrays from an input JPEG file. + * The routines in jdapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); + + +/* + * Read the coefficient arrays from a JPEG file. + * jpeg_read_header must be completed before calling this. + * + * The entire image is read into a set of virtual coefficient-block arrays, + * one per component. The return value is a pointer to the array of + * virtual-array descriptors. These can be manipulated directly via the + * JPEG memory manager, or handed off to jpeg_write_coefficients(). + * To release the memory occupied by the virtual arrays, call + * jpeg_finish_decompress() when done with the data. + * + * An alternative usage is to simply obtain access to the coefficient arrays + * during a buffered-image-mode decompression operation. This is allowed + * after any jpeg_finish_output() call. The arrays can be accessed until + * jpeg_finish_decompress() is called. (Note that any call to the library + * may reposition the arrays, so don't rely on access_virt_barray() results + * to stay valid across library calls.) + * + * Returns NULL if suspended. This case need be checked only if + * a suspending data source is used. + */ + +GLOBAL(jvirt_barray_ptr *) +jpeg_read_coefficients (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize active modules */ + transdecode_master_selection(cinfo); + cinfo->global_state = DSTATE_RDCOEFS; + } + if (cinfo->global_state == DSTATE_RDCOEFS) { + /* Absorb whole file into the coef buffer */ + while(1) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return NULL; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* startup underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } + /* Set state so that jpeg_finish_decompress does the right thing */ + cinfo->global_state = DSTATE_STOPPING; + } + /* At this point we should be in state DSTATE_STOPPING if being used + * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access + * to the coefficients during a full buffered-image-mode decompression. + */ + if ((cinfo->global_state == DSTATE_STOPPING || + cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { + return cinfo->coef->coef_arrays; + } + /* Oops, improper usage */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return NULL; /* keep compiler happy */ +} + + +/* + * Master selection of decompression modules for transcoding. + * This substitutes for jdmaster.c's initialization of the full decompressor. + */ + +LOCAL(void) +transdecode_master_selection (j_decompress_ptr cinfo) +{ + /* This is effectively a buffered-image operation. */ + cinfo->buffered_image = TRUE; + + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) { + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); + } else { + if (cinfo->progressive_mode) { +#ifdef D_PROGRESSIVE_SUPPORTED + jinit_phuff_decoder(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else + jinit_huff_decoder(cinfo); + } + + /* Always get a full-image coefficient buffer. */ + jinit_d_coef_controller(cinfo, TRUE); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + + /* Initialize progress monitoring. */ + if (cinfo->progress != NULL) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else if (cinfo->inputctl->has_multiple_scans) { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } else { + nscans = 1; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = 1; + } +} diff --git a/User/system/lib/lcd/gui/JPEG/jerror.c b/User/system/lib/lcd/gui/JPEG/jerror.c new file mode 100644 index 0000000..d3d1dd9 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jerror.c @@ -0,0 +1,240 @@ +/* + * jerror.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains simple error-reporting and trace-message routines. + * These are suitable for Unix-like systems and others where writing to + * stderr is the right thing to do. Many applications will want to replace + * some or all of these routines. + * + * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile, + * you get a Windows-specific hack to display error messages in a dialog box. + * It ain't much, but it beats dropping error messages into the bit bucket, + * which is what happens to output to stderr under most Windows C compilers. + * + * These routines are used by both the compression and decompression code. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jversion.h" +#include "jerror.h" + +#ifdef USE_WINDOWS_MESSAGEBOX +#include +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif + + +/* + * Create the message string table. + * We do this from the master message list in jerror.h by re-reading + * jerror.h with a suitable definition for macro JMESSAGE. + * The message table is made an external symbol just in case any applications + * want to refer to it directly. + */ + + +#define JMESSAGE(code,string) string , + +const char * const jpeg_std_message_table[] = { +#include "jerror.h" + NULL +}; + + +/* + * Error exit handler: must not return to caller. + * + * Applications may override this if they want to get control back after + * an error. Typically one would longjmp somewhere instead of exiting. + * The setjmp buffer can be made a private field within an expanded error + * handler object. Note that the info needed to generate an error message + * is stored in the error object, so you can generate the message now or + * later, at your convenience. + * You should make sure that the JPEG object is cleaned up (with jpeg_abort + * or jpeg_destroy) at some point. + */ + +METHODDEF(void) +error_exit (j_common_ptr cinfo) +{ + /* Always display the message */ + (*cinfo->err->output_message) (cinfo); + + /* Let the memory manager delete any temp files before we die */ + jpeg_destroy(cinfo); + + exit(EXIT_FAILURE); +} + + +/* + * Actual output of an error or trace message. + * Applications may override this method to send JPEG messages somewhere + * other than stderr. + * + * On Windows, printing to stderr is generally completely useless, + * so we provide optional code to produce an error-dialog popup. + * Most Windows applications will still prefer to override this routine, + * but if they don't, it'll do something at least marginally useful. + * + * NOTE: to use the library in an environment that doesn't support the + * C stdio library, you may have to delete the call to fprintf() entirely, + * not just not use this routine. + */ + +METHODDEF(void) +output_message (j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + /* Create the message */ + (*cinfo->err->format_message) (cinfo, buffer); + +#ifdef USE_WINDOWS_MESSAGEBOX + /* Display it in a message dialog box */ + MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", + MB_OK | MB_ICONERROR); +#else + /* Send it to stderr, adding a newline */ + /* RS fprintf(stderr, "%s\n", buffer); */ +#endif +} + + +/* + * Decide whether to emit a trace or warning message. + * msg_level is one of: + * -1: recoverable corrupt-data warning, may want to abort. + * 0: important advisory messages (always display to user). + * 1: first level of tracing detail. + * 2,3,...: successively more detailed tracing messages. + * An application might override this method if it wanted to abort on warnings + * or change the policy about which messages to display. + */ + +METHODDEF(void) emit_message (j_common_ptr cinfo, int msg_level) { + struct jpeg_error_mgr * err = cinfo->err; + if (msg_level < 0) { + /* It's a warning message. Since corrupt files may generate many warnings, + * the policy implemented here is to show only the first warning, + * unless trace_level >= 3. + */ + if (err->num_warnings == 0 || err->trace_level >= 3) + (*err->output_message) (cinfo); + /* Always count warnings in num_warnings. */ + err->num_warnings++; + } else { + /* It's a trace message. Show it if trace_level >= msg_level. */ + if (err->trace_level >= msg_level) + (*err->output_message) (cinfo); + } +} + + +/* + * Format a message string for the most recent JPEG error or message. + * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX + * characters. Note that no '\n' character is added to the string. + * Few applications should need to override this method. + */ + +METHODDEF(void) format_message (j_common_ptr cinfo, char * buffer) { + struct jpeg_error_mgr * err = cinfo->err; + int msg_code = err->msg_code; + const char * msgtext = NULL; + const char * msgptr; + char ch; + boolean isstring; + + /* Look up message string in proper table */ + if (msg_code > 0 && msg_code <= err->last_jpeg_message) { + msgtext = err->jpeg_message_table[msg_code]; + } else if (err->addon_message_table != NULL && + msg_code >= err->first_addon_message && + msg_code <= err->last_addon_message) { + msgtext = err->addon_message_table[msg_code - err->first_addon_message]; + } + + /* Defend against bogus message number */ + if (msgtext == NULL) { + err->msg_parm.i[0] = msg_code; + msgtext = err->jpeg_message_table[0]; + } + + /* Check for string parameter, as indicated by %s in the message text */ + isstring = FALSE; + msgptr = msgtext; + while ((ch = *msgptr++) != '\0') { + if (ch == '%') { + if (*msgptr == 's') isstring = TRUE; + break; + } + } + + /* Format the message into the passed buffer */ + if (isstring) + sprintf(buffer, msgtext, err->msg_parm.s); + else + sprintf(buffer, msgtext, + err->msg_parm.i[0], err->msg_parm.i[1], + err->msg_parm.i[2], err->msg_parm.i[3], + err->msg_parm.i[4], err->msg_parm.i[5], + err->msg_parm.i[6], err->msg_parm.i[7]); +} + + +/* + * Reset error state variables at start of a new image. + * This is called during compression startup to reset trace/error + * processing to default state, without losing any application-specific + * method pointers. An application might possibly want to override + * this method if it has additional error processing state. + */ + +METHODDEF(void) reset_error_mgr (j_common_ptr cinfo) { + cinfo->err->num_warnings = 0; + /* trace_level is not reset since it is an application-supplied parameter */ + cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ +} + + +/* + * Fill in the standard error-handling methods in a jpeg_error_mgr object. + * Typical call is: + * struct jpeg_compress_struct cinfo; + * struct jpeg_error_mgr err; + * + * cinfo.err = jpeg_std_error(&err); + * after which the application may override some of the methods. + */ + +GLOBAL(struct jpeg_error_mgr *) jpeg_std_error (struct jpeg_error_mgr * err) { + err->error_exit = error_exit; + err->emit_message = emit_message; + err->output_message = output_message; + err->format_message = format_message; + err->reset_error_mgr = reset_error_mgr; + + err->trace_level = 0; /* default = no tracing */ + err->num_warnings = 0; /* no warnings emitted yet */ + err->msg_code = 0; /* may be useful as a flag for "no error" */ + + /* Initialize message table pointers */ + err->jpeg_message_table = jpeg_std_message_table; + err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; + + err->addon_message_table = NULL; + err->first_addon_message = 0; /* for safety */ + err->last_addon_message = 0; + + return err; +} diff --git a/User/system/lib/lcd/gui/JPEG/jerror.h b/User/system/lib/lcd/gui/JPEG/jerror.h new file mode 100644 index 0000000..fc2fffe --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jerror.h @@ -0,0 +1,291 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_ARITH_NOTIMPL, + "Sorry, there are legal restrictions on arithmetic coding") +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/User/system/lib/lcd/gui/JPEG/jfdctflt.c b/User/system/lib/lcd/gui/JPEG/jfdctflt.c new file mode 100644 index 0000000..8a70468 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jfdctflt.c @@ -0,0 +1,171 @@ +/* + * jfdctflt.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * forward DCT (Discrete Cosine Transform). + * + * This implementation should be more accurate than either of the integer + * DCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_float (FAST_FLOAT * data) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; + FAST_FLOAT *dataptr; + int ctr; + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = tmp10 + tmp11; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#else +void jfdctflt_C(void); +void jfdctflt_C(void) {} /* Avoid empty object files */ +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jfdctfst.c b/User/system/lib/lcd/gui/JPEG/jfdctfst.c new file mode 100644 index 0000000..ccb378a --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jfdctfst.c @@ -0,0 +1,224 @@ +/* + * jfdctfst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jfdctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * Again to save a few shifts, the intermediate results between pass 1 and + * pass 2 are not upscaled, but are represented only to integral precision. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#define CONST_BITS 8 + + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ +#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ +#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ +#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ +#else +#define FIX_0_382683433 FIX(0.382683433) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_707106781 FIX(0.707106781) +#define FIX_1_306562965 FIX(1.306562965) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_ifast (DCTELEM * data) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z1, z2, z3, z4, z5, z11, z13; + DCTELEM *dataptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = tmp10 + tmp11; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jfdctint.c b/User/system/lib/lcd/gui/JPEG/jfdctint.c new file mode 100644 index 0000000..0a78b64 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jfdctint.c @@ -0,0 +1,283 @@ +/* + * jfdctint.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D DCT step produces outputs which are a factor of sqrt(N) + * larger than the true DCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D DCT, + * because the y0 and y4 outputs need not be divided by sqrt(N). + * In the IJG code, this factor of 8 is removed by the quantization step + * (in jcdctmgr.c), NOT in this module. + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (For 12-bit sample data, the intermediate + * array is INT32 anyway.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_islow (DCTELEM * data) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + DCTELEM *dataptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jidctflt.c b/User/system/lib/lcd/gui/JPEG/jidctflt.c new file mode 100644 index 0000000..ccc505b --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jidctflt.c @@ -0,0 +1,245 @@ +/* + * jidctflt.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * This implementation should be more accurate than either of the integer + * IDCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a float result. + */ + +#define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z5, z10, z11, z12, z13; + JCOEFPTR inptr; + FLOAT_MULT_TYPE * quantptr; + FAST_FLOAT * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ + tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = tmp0 + tmp7; + wsptr[DCTSIZE*7] = tmp0 - tmp7; + wsptr[DCTSIZE*1] = tmp1 + tmp6; + wsptr[DCTSIZE*6] = tmp1 - tmp6; + wsptr[DCTSIZE*2] = tmp2 + tmp5; + wsptr[DCTSIZE*5] = tmp2 - tmp5; + wsptr[DCTSIZE*4] = tmp3 + tmp4; + wsptr[DCTSIZE*3] = tmp3 - tmp4; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * And testing floats for zero is relatively expensive, so we don't bother. + */ + + /* Even part */ + + tmp10 = wsptr[0] + wsptr[4]; + tmp11 = wsptr[0] - wsptr[4]; + + tmp13 = wsptr[2] + wsptr[6]; + tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = wsptr[5] + wsptr[3]; + z10 = wsptr[5] - wsptr[3]; + z11 = wsptr[1] + wsptr[7]; + z12 = wsptr[1] - wsptr[7]; + + tmp7 = z11 + z13; + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ + tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#else +void jidctflt_C(void); +void jidctflt_C(void) {} /* Avoid empty object files */ +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jidctfst.c b/User/system/lib/lcd/gui/JPEG/jidctfst.c new file mode 100644 index 0000000..dba4216 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jidctfst.c @@ -0,0 +1,368 @@ +/* + * jidctfst.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jidctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * The dequantized coefficients are not integers because the AA&N scaling + * factors have been incorporated. We represent them scaled up by PASS1_BITS, + * so that the first and second IDCT rounds have the same input scaling. + * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to + * avoid a descaling shift; this compromises accuracy rather drastically + * for small quantization table entries, but it saves a lot of shifts. + * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, + * so we use a much larger scaling factor to preserve accuracy. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 8 +#define PASS1_BITS 2 +#else +#define CONST_BITS 8 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */ +#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */ +#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */ +#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */ +#else +#define FIX_1_082392200 FIX(1.082392200) +#define FIX_1_414213562 FIX(1.414213562) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_2_613125930 FIX(2.613125930) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 + * multiplication will do. For 12-bit data, the multiplier table is + * declared INT32, so a 32-bit multiply will be used. + */ + +#if BITS_IN_JSAMPLE == 8 +#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval)) +#else +#define DEQUANTIZE(coef,quantval) \ + DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS) +#endif + + +/* Like DESCALE, but applies to a DCTELEM and produces an int. + * We assume that int right shift is unsigned if INT32 right shift is. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS DCTELEM ishift_temp; +#if BITS_IN_JSAMPLE == 8 +#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */ +#else +#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */ +#endif +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + +#ifdef USE_ACCURATE_ROUNDING +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n)) +#else +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n)) +#endif + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z5, z10, z11, z12, z13; + JCOEFPTR inptr; + IFAST_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS /* for DESCALE */ + ISHIFT_TEMPS /* for IDESCALE */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (IFAST_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); + wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); + wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); + wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); + wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5); + wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); + wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); + wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); + tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); + + tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); + tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) + - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; + z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; + z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; + z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jidctint.c b/User/system/lib/lcd/gui/JPEG/jidctint.c new file mode 100644 index 0000000..a72b320 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jidctint.c @@ -0,0 +1,389 @@ +/* + * jidctint.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) + * larger than the true IDCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D IDCT, + * because the y0 and y4 inputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data further, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce an int result. In this module, both inputs and result + * are 16 bits or less, so either int or short multiply will work. + */ + +#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS; + tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jidctred.c b/User/system/lib/lcd/gui/JPEG/jidctred.c new file mode 100644 index 0000000..8b45362 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jidctred.c @@ -0,0 +1,401 @@ +/* + * jidctred.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains inverse-DCT routines that produce reduced-size output: + * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block. + * + * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M) + * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step + * with an 8-to-4 step that produces the four averages of two adjacent outputs + * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output). + * These steps were derived by computing the corresponding values at the end + * of the normal LL&M code, then simplifying as much as possible. + * + * 1x1 is trivial: just take the DC coefficient divided by 8. + * + * See jidctint.c for additional comments. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling is the same as in jidctint.c. */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */ +#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */ +#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */ +#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */ +#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */ +#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */ +#else +#define FIX_0_211164243 FIX(0.211164243) +#define FIX_0_509795579 FIX(0.509795579) +#define FIX_0_601344887 FIX(0.601344887) +#define FIX_0_720959822 FIX(0.720959822) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_850430095 FIX(0.850430095) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_061594337 FIX(1.061594337) +#define FIX_1_272758580 FIX(1.272758580) +#define FIX_1_451774981 FIX(1.451774981) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_2_172734803 FIX(2.172734803) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_624509785 FIX(3.624509785) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce an int result. In this module, both inputs and result + * are 16 bits or less, so either int or short multiply will work. + */ + +#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 4x4 output block. + */ + +GLOBAL(void) +jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { + /* Don't bother to process column 4, because second pass won't use it */ + if (ctr == DCTSIZE-4) + continue; + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 && + inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) { + /* AC terms all zero; we need not examine term 4 for 4x4 output */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= (CONST_BITS+1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ + + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ + + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ + + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ + + tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ + + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ + + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ + + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ + + /* Final output stage */ + + wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1); + wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1); + wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1); + wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1); + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + /* It's not clear whether a zero row test is worthwhile here ... */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1); + + tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065) + + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + /* Odd part */ + + z1 = (INT32) wsptr[7]; + z2 = (INT32) wsptr[5]; + z3 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[1]; + + tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ + + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ + + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ + + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ + + tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ + + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ + + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ + + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 2x2 output block. + */ + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10, z1; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE*2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { + /* Don't bother to process columns 2,4,6 */ + if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6) + continue; + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) { + /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + + continue; + } + + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 = z1 << (CONST_BITS+2); + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */ + z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */ + z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */ + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ + + /* Final output stage */ + + wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2); + wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2); + } + + /* Pass 2: process 2 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++) { + outptr = output_buf[ctr] + output_col; + /* It's not clear whether a zero row test is worthwhile here ... */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2); + + /* Odd part */ + + tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */ + + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */ + + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */ + + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3+2) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3+2) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 1x1 output block. + */ + +GLOBAL(void) +jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + int dcval; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* We hardly need an inverse DCT routine for this: just take the + * average pixel value, which is one-eighth of the DC coefficient. + */ + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + dcval = DEQUANTIZE(coef_block[0], quantptr[0]); + dcval = (int) DESCALE((INT32) dcval, 3); + + output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; +} + +#else +void jidctred_C(void); +void jidctred_C(void) {} /* Avoid empty object files */ +#endif /* IDCT_SCALING_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jinclude.h b/User/system/lib/lcd/gui/JPEG/jinclude.h new file mode 100644 index 0000000..ee832e4 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jinclude.h @@ -0,0 +1,89 @@ +/* + * jinclude.h + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file exists to provide a single place to fix any problems with + * including the wrong system include files. (Common problems are taken + * care of by the standard jconfig symbols, but on really weird systems + * you may have to edit this file.) + * + * NOTE: this file is NOT intended to be included by applications using the + * JPEG library. Most applications need only include jpeglib.h. + */ + + +/* Include auto-config file to find out which system include files we need. */ + +#include "jconfig.h" /* auto configuration options */ +#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ + +/* + * We need the NULL macro and size_t typedef. + * On an ANSI-conforming system it is sufficient to include . + * Otherwise, we get them from or ; we may have to + * pull in as well. + * Note that the core JPEG library does not require ; + * only the default error handler and data source/destination modules do. + * But we must pull it in because of the references to FILE in jpeglib.h. + * You can remove those references if you want to compile without . + */ + +#ifdef HAVE_STDDEF_H +#include +#endif + +#include + +#ifdef NEED_SYS_TYPES_H +#include +#endif + +#include + +/* + * We need memory copying and zeroing functions, plus strncpy(). + * ANSI and System V implementations declare these in . + * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). + * Some systems may declare memset and memcpy in . + * + * NOTE: we assume the size parameters to these functions are of type size_t. + * Change the casts in these macros if not! + */ + +#ifdef NEED_BSD_STRINGS + +#include +#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) +#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) + +#else /* not BSD, assume ANSI/SysV string lib */ + +#include +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) + +#endif + +/* + * In ANSI C, and indeed any rational implementation, size_t is also the + * type returned by sizeof(). However, it seems there are some irrational + * implementations out there, in which sizeof() returns an int even though + * size_t is defined as long or unsigned long. To ensure consistent results + * we always use this SIZEOF() macro in place of using sizeof() directly. + */ + +#define SIZEOF(object) ((size_t) sizeof(object)) + +/* + * The modules that use fread() and fwrite() always invoke them through + * these macros. On some systems you may need to twiddle the argument casts. + * CAUTION: argument order is different from underlying functions! + */ + +#define JFREAD(file,buf,sizeofbuf) \ + ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) +#define JFWRITE(file,buf,sizeofbuf) \ + ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) diff --git a/User/system/lib/lcd/gui/JPEG/jmemmgr.c b/User/system/lib/lcd/gui/JPEG/jmemmgr.c new file mode 100644 index 0000000..dab28c4 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jmemmgr.c @@ -0,0 +1,1071 @@ +/* + * jmemmgr.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the JPEG system-independent memory management + * routines. This code is usable across a wide variety of machines; most + * of the system dependencies have been isolated in a separate file. + * The major functions provided here are: + * * pool-based allocation and freeing of memory; + * * policy decisions about how to divide available memory among the + * virtual arrays; + * * control logic for swapping virtual arrays between main memory and + * backing storage. + * The separate system-dependent file provides the actual backing-storage + * access code, and it contains the policy decision about how much total + * main memory to use. + * This file is system-dependent in the sense that some of its functions + * are unnecessary in some systems. For example, if there is enough virtual + * memory so that backing storage will never be used, much of the virtual + * array control logic could be removed. (Of course, if you have that much + * memory then you shouldn't care about a little bit of unused code...) + */ + +#define JPEG_INTERNALS +#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +/* + * Some important notes: + * The allocation routines provided here must never return NULL. + * They should exit to error_exit if unsuccessful. + * + * It's not a good idea to try to merge the sarray and barray routines, + * even though they are textually almost the same, because samples are + * usually stored as bytes while coefficients are shorts or ints. Thus, + * in machines where byte pointers have a different representation from + * word pointers, the resulting machine code could not be the same. + */ + + +/* + * Many machines require storage alignment: longs must start on 4-byte + * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() + * always returns pointers that are multiples of the worst-case alignment + * requirement, and we had better do so too. + * There isn't any really portable way to determine the worst-case alignment + * requirement. This module assumes that the alignment requirement is + * multiples of sizeof(ALIGN_TYPE). + * By default, we define ALIGN_TYPE as double. This is necessary on some + * workstations (where doubles really do need 8-byte alignment) and will work + * fine on nearly everything. If your machine has lesser alignment needs, + * you can save a few bytes by making ALIGN_TYPE smaller. + * The only place I know of where this will NOT work is certain Macintosh + * 680x0 compilers that define double as a 10-byte IEEE extended float. + * Doing 10-byte alignment is counterproductive because longwords won't be + * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have + * such a compiler. + */ + +#ifndef ALIGN_TYPE /* so can override from jconfig.h */ +#define ALIGN_TYPE double +#endif + + +/* + * We allocate objects from "pools", where each pool is gotten with a single + * request to jpeg_get_small() or jpeg_get_large(). There is no per-object + * overhead within a pool, except for alignment padding. Each pool has a + * header with a link to the next pool of the same class. + * Small and large pool headers are identical except that the latter's + * link pointer must be FAR on 80x86 machines. + * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE + * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple + * of the alignment requirement of ALIGN_TYPE. + */ + +typedef union small_pool_struct * small_pool_ptr; + +typedef union small_pool_struct { + struct { + small_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} small_pool_hdr; + +typedef union large_pool_struct FAR * large_pool_ptr; + +typedef union large_pool_struct { + struct { + large_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} large_pool_hdr; + + +/* + * Here is the full definition of a memory manager object. + */ + +typedef struct { + struct jpeg_memory_mgr pub; /* public fields */ + + /* Each pool identifier (lifetime class) names a linked list of pools. */ + small_pool_ptr small_list[JPOOL_NUMPOOLS]; + large_pool_ptr large_list[JPOOL_NUMPOOLS]; + + /* Since we only have one lifetime class of virtual arrays, only one + * linked list is necessary (for each datatype). Note that the virtual + * array control blocks being linked together are actually stored somewhere + * in the small-pool list. + */ + jvirt_sarray_ptr virt_sarray_list; + jvirt_barray_ptr virt_barray_list; + + /* This counts total space obtained from jpeg_get_small/large */ + long total_space_allocated; + + /* alloc_sarray and alloc_barray set this value for use by virtual + * array routines. + */ + JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */ +} my_memory_mgr; + +typedef my_memory_mgr * my_mem_ptr; + + +/* + * The control blocks for virtual arrays. + * Note that these blocks are allocated in the "small" pool area. + * System-dependent info for the associated backing store (if any) is hidden + * inside the backing_store_info struct. + */ + +struct jvirt_sarray_control { + JSAMPARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION samplesperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_sarray_ptr next; /* link to next virtual sarray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + +struct jvirt_barray_control { + JBLOCKARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION blocksperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_barray_ptr next; /* link to next virtual barray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + + +#ifdef MEM_STATS /* optional extra stuff for statistics */ + +LOCAL(void) +print_mem_stats (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + + /* Since this is only a debugging stub, we can cheat a little by using + * fprintf directly rather than going through the trace message code. + * This is helpful because message parm array can't handle longs. + */ + fprintf(stderr, "Freeing pool %d, total space = %ld\n", + pool_id, mem->total_space_allocated); + + for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL; + lhdr_ptr = lhdr_ptr->hdr.next) { + fprintf(stderr, " Large chunk used %ld\n", + (long) lhdr_ptr->hdr.bytes_used); + } + + for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL; + shdr_ptr = shdr_ptr->hdr.next) { + fprintf(stderr, " Small chunk used %ld free %ld\n", + (long) shdr_ptr->hdr.bytes_used, + (long) shdr_ptr->hdr.bytes_left); + } +} + +#endif /* MEM_STATS */ + + +LOCAL(void) +out_of_memory (j_common_ptr cinfo, int which) +/* Report an out-of-memory error and stop execution */ +/* If we compiled MEM_STATS support, report alloc requests before dying */ +{ +#ifdef MEM_STATS + cinfo->err->trace_level = 2; /* force self_destruct to report stats */ +#endif + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which); +} + + +/* + * Allocation of "small" objects. + * + * For these, we use pooled storage. When a new pool must be created, + * we try to get enough space for the current request plus a "slop" factor, + * where the slop will be the amount of leftover space in the new pool. + * The speed vs. space tradeoff is largely determined by the slop values. + * A different slop value is provided for each pool class (lifetime), + * and we also distinguish the first pool of a class from later ones. + * NOTE: the values given work fairly well on both 16- and 32-bit-int + * machines, but may be too small if longs are 64 bits or more. + */ + +static const size_t first_pool_slop[JPOOL_NUMPOOLS] = +{ + 1600, /* first PERMANENT pool */ + 16000 /* first IMAGE pool */ +}; + +static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = +{ + 0, /* additional PERMANENT pools */ + 5000 /* additional IMAGE pools */ +}; + +#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */ + + +METHODDEF(void *) alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "small" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr hdr_ptr, prev_hdr_ptr; + char * data_ptr; + size_t odd_bytes, min_request, slop; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr))) + out_of_memory(cinfo, 1); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* See if space is available in any existing pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + prev_hdr_ptr = NULL; + hdr_ptr = mem->small_list[pool_id]; + while (hdr_ptr != NULL) { + if (hdr_ptr->hdr.bytes_left >= sizeofobject) + break; /* found pool with enough space */ + prev_hdr_ptr = hdr_ptr; + hdr_ptr = hdr_ptr->hdr.next; + } + + /* Time to make a new pool? */ + if (hdr_ptr == NULL) { + /* min_request is what we need now, slop is what will be leftover */ + min_request = sizeofobject + SIZEOF(small_pool_hdr); + if (prev_hdr_ptr == NULL) /* first pool in class? */ + slop = first_pool_slop[pool_id]; + else + slop = extra_pool_slop[pool_id]; + /* Don't ask for more than MAX_ALLOC_CHUNK */ + if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request)) + slop = (size_t) (MAX_ALLOC_CHUNK-min_request); + /* Try to get space, if fail reduce slop and try again */ + while(1) { + hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop); + if (hdr_ptr != NULL) + break; + slop /= 2; + if (slop < MIN_SLOP) /* give up when it gets real small */ + out_of_memory(cinfo, 2); /* jpeg_get_small failed */ + } + mem->total_space_allocated += min_request + slop; + /* Success, initialize the new pool header and add to end of list */ + hdr_ptr->hdr.next = NULL; + hdr_ptr->hdr.bytes_used = 0; + hdr_ptr->hdr.bytes_left = sizeofobject + slop; + if (prev_hdr_ptr == NULL) /* first pool in class? */ + mem->small_list[pool_id] = hdr_ptr; + else + prev_hdr_ptr->hdr.next = hdr_ptr; + } + + /* OK, allocate the object from the current pool */ + data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */ + data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */ + hdr_ptr->hdr.bytes_used += sizeofobject; + hdr_ptr->hdr.bytes_left -= sizeofobject; + + return (void *) data_ptr; +} + + +/* + * Allocation of "large" objects. + * + * The external semantics of these are the same as "small" objects, + * except that FAR pointers are used on 80x86. However the pool + * management heuristics are quite different. We assume that each + * request is large enough that it may as well be passed directly to + * jpeg_get_large; the pool management just links everything together + * so that we can free it all on demand. + * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY + * structures. The routines that create these structures (see below) + * deliberately bunch rows together to ensure a large request size. + */ + +METHODDEF(void FAR *) alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject) /* Allocate a "large" object */ { + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + large_pool_ptr hdr_ptr; + size_t odd_bytes; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr))) { + out_of_memory(cinfo, 3); /* request exceeds malloc's ability */ + } + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) { + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + } + /* Always make a new pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) { + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + } + + hdr_ptr = (large_pool_ptr) jpeg_get_small/*RS: Changed from jpeg_get_large*/ (cinfo, sizeofobject + SIZEOF(large_pool_hdr)); + if (hdr_ptr == NULL) { + out_of_memory(cinfo, 4); /* jpeg_get_large failed */ + } + mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr); + /* Success, initialize the new pool header and add to list */ + hdr_ptr->hdr.next = mem->large_list[pool_id]; + /* We maintain space counts in each pool header for statistical purposes, + * even though they are not needed for allocation. + */ + hdr_ptr->hdr.bytes_used = sizeofobject; + hdr_ptr->hdr.bytes_left = 0; + mem->large_list[pool_id] = hdr_ptr; + + return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */ +} + + +/* + * Creation of 2-D sample arrays. + * The pointers are in near heap, the samples themselves in FAR heap. + * + * To minimize allocation overhead and to allow I/O of large contiguous + * blocks, we allocate the sample rows in groups of as many rows as possible + * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. + * NB: the virtual array control routines, later in this file, know about + * this chunking of rows. The rowsperchunk value is left in the mem manager + * object so that it can be saved away if this sarray is the workspace for + * a virtual array. + */ + +METHODDEF(JSAMPARRAY) alloc_sarray (j_common_ptr cinfo, int pool_id, JDIMENSION samplesperrow, JDIMENSION numrows) { +/* Allocate a 2-D sample array */ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JSAMPARRAY result; + JSAMPROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) samplesperrow * SIZEOF(JSAMPLE)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JSAMPARRAY) alloc_small(cinfo, pool_id, (size_t) (numrows * SIZEOF(JSAMPROW))); + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JSAMPROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow + * SIZEOF(JSAMPLE))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + } + + return result; +} + + +/* + * Creation of 2-D coefficient-block arrays. + * This is essentially the same as the code for sample arrays, above. + */ + +METHODDEF(JBLOCKARRAY) alloc_barray (j_common_ptr cinfo, int pool_id, JDIMENSION blocksperrow, JDIMENSION numrows) { + /* Allocate a 2-D coefficient-block array */ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JBLOCKARRAY result; + JBLOCKROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) blocksperrow * SIZEOF(JBLOCK)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JBLOCKARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JBLOCKROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JBLOCKROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow + * SIZEOF(JBLOCK))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += blocksperrow; + } + } + + return result; +} + + +/* + * About virtual array management: + * + * The above "normal" array routines are only used to allocate strip buffers + * (as wide as the image, but just a few rows high). Full-image-sized buffers + * are handled as "virtual" arrays. The array is still accessed a strip at a + * time, but the memory manager must save the whole array for repeated + * accesses. The intended implementation is that there is a strip buffer in + * memory (as high as is possible given the desired memory limit), plus a + * backing file that holds the rest of the array. + * + * The request_virt_array routines are told the total size of the image and + * the maximum number of rows that will be accessed at once. The in-memory + * buffer must be at least as large as the maxaccess value. + * + * The request routines create control blocks but not the in-memory buffers. + * That is postponed until realize_virt_arrays is called. At that time the + * total amount of space needed is known (approximately, anyway), so free + * memory can be divided up fairly. + * + * The access_virt_array routines are responsible for making a specific strip + * area accessible (after reading or writing the backing file, if necessary). + * Note that the access routines are told whether the caller intends to modify + * the accessed strip; during a read-only pass this saves having to rewrite + * data to disk. The access routines are also responsible for pre-zeroing + * any newly accessed rows, if pre-zeroing was requested. + * + * In current usage, the access requests are usually for nonoverlapping + * strips; that is, successive access start_row numbers differ by exactly + * num_rows = maxaccess. This means we can get good performance with simple + * buffer dump/reload logic, by making the in-memory buffer be a multiple + * of the access height; then there will never be accesses across bufferload + * boundaries. The code will still work with overlapping access requests, + * but it doesn't handle bufferload overlaps very efficiently. + */ + + +METHODDEF(jvirt_sarray_ptr) request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero, JDIMENSION samplesperrow, JDIMENSION numrows, JDIMENSION maxaccess) { + /* Request a virtual 2-D sample array */ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_sarray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) { + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + } + /* get control block */ + result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id, SIZEOF(struct jvirt_sarray_control)); + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->samplesperrow = samplesperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_sarray_list; /* add to list of virtual arrays */ + mem->virt_sarray_list = result; + + return result; +} + + +METHODDEF(jvirt_barray_ptr) request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, JDIMENSION blocksperrow, JDIMENSION numrows, JDIMENSION maxaccess) { + /* Request a virtual 2-D coefficient-block array */ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_barray_ptr result; + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id, SIZEOF(struct jvirt_barray_control)); + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->blocksperrow = blocksperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_barray_list; /* add to list of virtual arrays */ + mem->virt_barray_list = result; + + return result; +} + + +METHODDEF(void) realize_virt_arrays (j_common_ptr cinfo) { +/* Allocate the in-memory buffers for any unrealized virtual arrays */ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + long space_per_minheight, maximum_space/*, avail_mem*/; +/* long minheights, max_minheights;*/ + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + /* Compute the minimum space needed (maxaccess rows in each buffer) + * and the maximum space needed (full image height in each buffer). + * These may be of use to the system-dependent jpeg_mem_available routine. + */ + space_per_minheight = 0; + maximum_space = 0; + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) sptr->maxaccess * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + maximum_space += (long) sptr->rows_in_array * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + } + } + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) bptr->maxaccess * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + maximum_space += (long) bptr->rows_in_array * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + } + } + + if (space_per_minheight <= 0) + return; /* no unrealized arrays, no work */ + +#if 0 /*RS*/ + /* Determine amount of memory to actually use; this is system-dependent. */ + avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space, mem->total_space_allocated); + + /* If the maximum space needed is available, make all the buffers full + * height; otherwise parcel it out with the same number of minheights + * in each buffer. + */ + if (avail_mem >= maximum_space) + max_minheights = 1000000000L; + else { + max_minheights = avail_mem / space_per_minheight; + /* If there doesn't seem to be enough space, try to get the minimum + * anyway. This allows a "stub" implementation of jpeg_mem_available(). + */ + if (max_minheights <= 0) + max_minheights = 1; + } + + /* Allocate the in-memory buffers and initialize backing store as needed. */ + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + sptr->rows_in_mem = sptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess); + jpeg_open_backing_store(cinfo, & sptr->b_s_info, (long) sptr->rows_in_array * (long) sptr->samplesperrow * (long) SIZEOF(JSAMPLE)); + sptr->b_s_open = TRUE; + } + sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE, + sptr->samplesperrow, sptr->rows_in_mem); + sptr->rowsperchunk = mem->last_rowsperchunk; + sptr->cur_start_row = 0; + sptr->first_undef_row = 0; + sptr->dirty = FALSE; + } + } + + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + bptr->rows_in_mem = bptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess); + jpeg_open_backing_store(cinfo, & bptr->b_s_info, + (long) bptr->rows_in_array * + (long) bptr->blocksperrow * + (long) SIZEOF(JBLOCK)); + bptr->b_s_open = TRUE; + } + bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE, + bptr->blocksperrow, bptr->rows_in_mem); + bptr->rowsperchunk = mem->last_rowsperchunk; + bptr->cur_start_row = 0; + bptr->first_undef_row = 0; + bptr->dirty = FALSE; + } + } +# else + ERREXIT(cinfo, JERR_NO_BACKING_STORE); +#endif +} + + +LOCAL(void) do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing) { +/* Do backing store read or write of a virtual sample array */ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +/* Do backing store read or write of a virtual coefficient-block array */ +LOCAL(void) do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing) { + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +/* Access the part of a virtual sample array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +METHODDEF(JSAMPARRAY) access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, JDIMENSION start_row, JDIMENSION num_rows, boolean writable) { + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_sarray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_sarray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +/* Access the part of a virtual block array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +METHODDEF(JBLOCKARRAY) access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, JDIMENSION start_row, JDIMENSION num_rows, boolean writable) { + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_barray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_barray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +/* + * Release all objects belonging to a specified pool. + */ + +METHODDEF(void) +free_pool (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + size_t space_freed; + + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + +#ifdef MEM_STATS + if (cinfo->err->trace_level > 1) + print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */ +#endif + + /* If freeing IMAGE pool, close any virtual arrays first */ + if (pool_id == JPOOL_IMAGE) { + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->b_s_open) { /* there may be no backing store */ + sptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info); + } + } + mem->virt_sarray_list = NULL; + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->b_s_open) { /* there may be no backing store */ + bptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info); + } + } + mem->virt_barray_list = NULL; + } + + /* Release large objects */ + lhdr_ptr = mem->large_list[pool_id]; + mem->large_list[pool_id] = NULL; + + while (lhdr_ptr != NULL) { + large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next; + space_freed = lhdr_ptr->hdr.bytes_used + + lhdr_ptr->hdr.bytes_left + + SIZEOF(large_pool_hdr); + jpeg_free_small/*RS: Changed from jpeg_free_large*/(cinfo, (void FAR *) lhdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + lhdr_ptr = next_lhdr_ptr; + } + + /* Release small objects */ + shdr_ptr = mem->small_list[pool_id]; + mem->small_list[pool_id] = NULL; + + while (shdr_ptr != NULL) { + small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next; + space_freed = shdr_ptr->hdr.bytes_used + + shdr_ptr->hdr.bytes_left + + SIZEOF(small_pool_hdr); + jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + shdr_ptr = next_shdr_ptr; + } +} + + +/* + * Close up shop entirely. + * Note that this cannot be called unless cinfo->mem is non-NULL. + */ + +METHODDEF(void) +self_destruct (j_common_ptr cinfo) +{ + int pool; + + /* Close all backing store, release all memory. + * Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + free_pool(cinfo, pool); + } + + /* Release the memory manager control block too. */ + jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr)); + cinfo->mem = NULL; /* ensures I will be called only once */ + + jpeg_mem_term(cinfo); /* system-dependent cleanup */ +} + + +/* + * Memory manager initialization. + * When this is called, only the error manager pointer is valid in cinfo! + */ + +GLOBAL(void) +jinit_memory_mgr (j_common_ptr cinfo) +{ + my_mem_ptr mem; + long max_to_use; + int pool; + size_t test_mac; + + cinfo->mem = NULL; /* for safety if init fails */ + + /* Check for configuration errors. + * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably + * doesn't reflect any real hardware alignment requirement. + * The test is a little tricky: for X>0, X and X-1 have no one-bits + * in common if and only if X is a power of 2, ie has only one one-bit. + * Some compilers may give an "unreachable code" warning here; ignore it. + */ + if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0) + ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE); + /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be + * a multiple of SIZEOF(ALIGN_TYPE). + * Again, an "unreachable code" warning may be ignored here. + * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK. + */ + test_mac = (size_t) MAX_ALLOC_CHUNK; + if ((long) test_mac != MAX_ALLOC_CHUNK || + (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0) + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + + max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */ + + /* Attempt to allocate memory manager's control block */ + mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr)); + + if (mem == NULL) { + jpeg_mem_term(cinfo); /* system-dependent cleanup */ + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0); + } + + /* OK, fill in the method pointers */ + mem->pub.alloc_small = alloc_small; + mem->pub.alloc_large = alloc_large; + mem->pub.alloc_sarray = alloc_sarray; + mem->pub.alloc_barray = alloc_barray; + mem->pub.request_virt_sarray = request_virt_sarray; + mem->pub.request_virt_barray = request_virt_barray; + mem->pub.realize_virt_arrays = realize_virt_arrays; + mem->pub.access_virt_sarray = access_virt_sarray; + mem->pub.access_virt_barray = access_virt_barray; + mem->pub.free_pool = free_pool; + mem->pub.self_destruct = self_destruct; + + /* Make MAX_ALLOC_CHUNK accessible to other modules */ + mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK; + + /* Initialize working state */ + mem->pub.max_memory_to_use = max_to_use; + + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + mem->small_list[pool] = NULL; + mem->large_list[pool] = NULL; + } + mem->virt_sarray_list = NULL; + mem->virt_barray_list = NULL; + + mem->total_space_allocated = SIZEOF(my_memory_mgr); + + /* Declare ourselves open for business */ + cinfo->mem = & mem->pub; + + /* Check for an environment variable JPEGMEM; if found, override the + * default max_memory setting from jpeg_mem_init. Note that the + * surrounding application may again override this value. + * If your system doesn't support getenv(), define NO_GETENV to disable + * this feature. + */ +#if 0 /* RS ndef NO_GETENV */ + { char * memenv; + + if ((memenv = getenv("JPEGMEM")) != NULL) { + char ch = 'x'; + + if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) { + if (ch == 'm' || ch == 'M') + max_to_use *= 1000L; + mem->pub.max_memory_to_use = max_to_use * 1000L; + } + } + } +#endif + +} diff --git a/User/system/lib/lcd/gui/JPEG/jmemsys.h b/User/system/lib/lcd/gui/JPEG/jmemsys.h new file mode 100644 index 0000000..da6d7ec --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jmemsys.h @@ -0,0 +1,178 @@ +/* + * jmemsys.h + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file defines the interface between the system-independent + * and system-dependent portions of the JPEG memory manager. No other + * modules need include it. (The system-independent portion is jmemmgr.c; + * there are several different versions of the system-dependent portion.) + * + * This file works as-is for the system-dependent memory managers supplied + * in the IJG distribution. You may need to modify it if you write a + * custom memory manager. If system-dependent changes are needed in + * this file, the best method is to #ifdef them based on a configuration + * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR + * and USE_MAC_MEMMGR. + */ + + + +/* + * These two functions are used to allocate and release small chunks of + * memory. (Typically the total amount requested through jpeg_get_small is + * no more than 20K or so; this will be requested in chunks of a few K each.) + * Behavior should be the same as for the standard library functions malloc + * and free; in particular, jpeg_get_small must return NULL on failure. + * On most systems, these ARE malloc and free. jpeg_free_small is passed the + * size of the object being freed, just in case it's needed. + * On an 80x86 machine using small-data memory model, these manage near heap. + */ + +EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); +EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, + size_t sizeofobject)); + +/* + * These two functions are used to allocate and release large chunks of + * memory (up to the total free space designated by jpeg_mem_available). + * The interface is the same as above, except that on an 80x86 machine, + * far pointers are used. On most other machines these are identical to + * the jpeg_get/free_small routines; but we keep them separate anyway, + * in case a different allocation strategy is desirable for large chunks. + */ + +EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, + size_t sizeofobject)); +EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, + size_t sizeofobject)); + +/* + * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may + * be requested in a single call to jpeg_get_large (and jpeg_get_small for that + * matter, but that case should never come into play). This macro is needed + * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. + * On those machines, we expect that jconfig.h will provide a proper value. + * On machines with 32-bit flat address spaces, any large constant may be used. + * + * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type + * size_t and will be a multiple of sizeof(align_type). + */ + +#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ +#define MAX_ALLOC_CHUNK 1000000000L +#endif + +/* + * This routine computes the total space still available for allocation by + * jpeg_get_large. If more space than this is needed, backing store will be + * used. NOTE: any memory already allocated must not be counted. + * + * There is a minimum space requirement, corresponding to the minimum + * feasible buffer sizes; jmemmgr.c will request that much space even if + * jpeg_mem_available returns zero. The maximum space needed, enough to hold + * all working storage in memory, is also passed in case it is useful. + * Finally, the total space already allocated is passed. If no better + * method is available, cinfo->mem->max_memory_to_use - already_allocated + * is often a suitable calculation. + * + * It is OK for jpeg_mem_available to underestimate the space available + * (that'll just lead to more backing-store access than is really necessary). + * However, an overestimate will lead to failure. Hence it's wise to subtract + * a slop factor from the true available space. 5% should be enough. + * + * On machines with lots of virtual memory, any large constant may be returned. + * Conversely, zero may be returned to always use the minimum amount of memory. + */ + +EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, + long min_bytes_needed, + long max_bytes_needed, + long already_allocated)); + + +/* + * This structure holds whatever state is needed to access a single + * backing-store object. The read/write/close method pointers are called + * by jmemmgr.c to manipulate the backing-store object; all other fields + * are private to the system-dependent backing store routines. + */ + +#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ + + +#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ + +typedef unsigned short XMSH; /* type of extended-memory handles */ +typedef unsigned short EMSH; /* type of expanded-memory handles */ + +typedef union { + short file_handle; /* DOS file handle if it's a temp file */ + XMSH xms_handle; /* handle if it's a chunk of XMS */ + EMSH ems_handle; /* handle if it's a chunk of EMS */ +} handle_union; + +#endif /* USE_MSDOS_MEMMGR */ + +#ifdef USE_MAC_MEMMGR /* Mac-specific junk */ +#include +#endif /* USE_MAC_MEMMGR */ + + +typedef struct backing_store_struct * backing_store_ptr; + +typedef struct backing_store_struct { + /* Methods for reading/writing/closing this backing-store object */ + JMETHOD(void, read_backing_store, (j_common_ptr cinfo, backing_store_ptr info, void FAR * buffer_address, long file_offset, long byte_count)); + JMETHOD(void, write_backing_store, (j_common_ptr cinfo, backing_store_ptr info, void FAR * buffer_address, long file_offset, long byte_count)); + JMETHOD(void, close_backing_store, (j_common_ptr cinfo, backing_store_ptr info)); + + /* Private fields for system-dependent backing-store management */ +#ifdef USE_MSDOS_MEMMGR + /* For the MS-DOS manager (jmemdos.c), we need: */ + handle_union handle; /* reference to backing-store storage object */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else +#ifdef USE_MAC_MEMMGR + /* For the Mac manager (jmemmac.c), we need: */ + short temp_file; /* file reference number to temp file */ + FSSpec tempSpec; /* the FSSpec for the temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else + /* For a typical implementation with temp files, we need: */ + /* FILE * temp_file; */ /* stdio reference to temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ +#endif +#endif +} backing_store_info; + + +/* + * Initial opening of a backing-store object. This must fill in the + * read/write/close pointers in the object. The read/write routines + * may take an error exit if the specified maximum file size is exceeded. + * (If jpeg_mem_available always returns a large value, this routine can + * just take an error exit.) + */ + +EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, + backing_store_ptr info, + long total_bytes_needed)); + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. jpeg_mem_init will be called before anything is + * allocated (and, therefore, nothing in cinfo is of use except the error + * manager pointer). It should return a suitable default value for + * max_memory_to_use; this may subsequently be overridden by the surrounding + * application. (Note that max_memory_to_use is only important if + * jpeg_mem_available chooses to consult it ... no one else will.) + * jpeg_mem_term may assume that all requested memory has been freed and that + * all opened backing-store objects have been closed. + */ + +EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); diff --git a/User/system/lib/lcd/gui/JPEG/jmorecfg.h b/User/system/lib/lcd/gui/JPEG/jmorecfg.h new file mode 100644 index 0000000..993e79c --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jmorecfg.h @@ -0,0 +1,312 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 4 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 + /* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + typedef unsigned char JSAMPLE; + #define GETJSAMPLE(value) ((int) (value)) + #define MAXJSAMPLE 255 + #define CENTERJSAMPLE 128 +#elif BITS_IN_JSAMPLE == 12 + /* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + typedef short JSAMPLE; + #define GETJSAMPLE(value) ((int) (value)) + #define MAXJSAMPLE 4095 + #define CENTERJSAMPLE 2048 +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ +typedef unsigned char UINT8; + +/* UINT16 must hold at least the values 0..65535. */ +typedef unsigned short UINT16; +/* INT16 must hold at least the values -32768..32767. */ +typedef short INT16; +/* INT32 must hold at least signed 32-bit values. */ +typedef long INT32; + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#ifdef DCT_FLOAT_SUPPORTED + #undef DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ +#endif + +/* Encoder capability options: */ + +#ifdef C_ARITH_CODING_SUPPORTED + #undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#endif +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#ifdef D_ARITH_CODING_SUPPORTED + #undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#endif +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#ifdef SAVE_MARKERS_SUPPORTED + #undef SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? (Default was on, RS) */ +#endif +#ifdef BLOCK_SMOOTHING_SUPPORTED + #undef BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#endif +#ifdef IDCT_SCALING_SUPPORTED + #undef IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#endif +#ifdef UPSAMPLE_SCALING_SUPPORTED + #undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#endif +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#define FAST_FLOAT float +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/User/system/lib/lcd/gui/JPEG/jpegint.h b/User/system/lib/lcd/gui/JPEG/jpegint.h new file mode 100644 index 0000000..61fd034 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jpegint.h @@ -0,0 +1,357 @@ +/* + * jpegint.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides common declarations for the various JPEG modules. + * These declarations are considered internal to the JPEG library; most + * applications using the library shouldn't need to include this file. + */ + + +/* Declarations for both compression & decompression */ + +typedef enum { /* Operating modes for buffer controllers */ + JBUF_PASS_THRU, /* Plain stripwise operation */ + /* Remaining modes require a full-image buffer to have been created */ + JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ + JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ + JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ +} J_BUF_MODE; + +/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ +#define CSTATE_START 100 /* after create_compress */ +#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ +#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ +#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ +#define DSTATE_START 200 /* after create_decompress */ +#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ +#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ +#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ +#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ +#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ +#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ +#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ +#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ +#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ +#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ + + +/* Declarations for compression modules */ + +/* Master control module */ +struct jpeg_comp_master { + JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); + JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean call_pass_startup; /* True if pass_startup must be called */ + boolean is_last_pass; /* True during last pass */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_c_main_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail)); +}; + +/* Compression preprocessing (downsampling input buffer control) */ +struct jpeg_c_prep_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, + JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_c_coef_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf)); +}; + +/* Colorspace conversion */ +struct jpeg_color_converter { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, color_convert, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows)); +}; + +/* Downsampling */ +struct jpeg_downsampler { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, downsample, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, + JDIMENSION out_row_group_index)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Forward DCT (also controls coefficient quantization) */ +struct jpeg_forward_dct { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + /* perhaps this should be an array??? */ + JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, + jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks)); +}; + +/* Entropy encoding */ +struct jpeg_entropy_encoder { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); + JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); +}; + +/* Marker writing */ +struct jpeg_marker_writer { + JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); + JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); + /* These routines are exported to allow insertion of extra markers */ + /* Probably only COM and APPn markers should be written this way */ + JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, + unsigned int datalen)); + JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); +}; + + +/* Declarations for decompression modules */ + +/* Master control module */ +struct jpeg_decomp_master { + JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ +}; + +/* Input control module */ +struct jpeg_input_controller { + JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); + JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean has_multiple_scans; /* True if file has multiple scans */ + boolean eoi_reached; /* True when EOI has been consumed */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_d_main_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_d_coef_controller { + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); + JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, + JSAMPIMAGE output_buf)); + /* Pointer to array of coefficient virtual arrays, or NULL if none */ + jvirt_barray_ptr *coef_arrays; +}; + +/* Decompression postprocessing (color quantization buffer control) */ +struct jpeg_d_post_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Marker reading & parsing */ +struct jpeg_marker_reader { + JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); + /* Read markers until SOS or EOI. + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + */ + JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); + /* Read a restart marker --- exported for use by entropy decoder only */ + jpeg_marker_parser_method read_restart_marker; + + /* State of marker reader --- nominally internal, but applications + * supplying COM or APPn handlers might like to know the state. + */ + boolean saw_SOI; /* found SOI? */ + boolean saw_SOF; /* found SOF? */ + int next_restart_num; /* next restart number expected (0-7) */ + unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ +}; + +/* Entropy decoding */ +struct jpeg_entropy_decoder { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); + + /* This is here to share code between baseline and progressive decoders; */ + /* other modules probably should not use it */ + boolean insufficient_data; /* set TRUE after emitting warning */ +}; + +/* Inverse DCT (also performs dequantization) */ +typedef JMETHOD(void, inverse_DCT_method_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col)); + +struct jpeg_inverse_dct { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + /* It is useful to allow each component to have a separate IDCT method. */ + inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; +}; + +/* Upsampling (note that upsampler must also call color converter) */ +struct jpeg_upsampler { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, upsample, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Colorspace conversion */ +struct jpeg_color_deconverter { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, color_convert, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows)); +}; + +/* Color quantization or color precision reduction */ +struct jpeg_color_quantizer { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); + JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, + int num_rows)); + JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); +}; + + +/* Miscellaneous useful macros */ + +#ifdef MAX + #undef MAX +#endif +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#ifdef MIN + #undef MIN +#endif +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +/* We assume that right shift corresponds to signed division by 2 with + * rounding towards minus infinity. This is correct for typical "arithmetic + * shift" instructions that shift in copies of the sign bit. But some + * C compilers implement >> with an unsigned shift. For these machines you + * must define RIGHT_SHIFT_IS_UNSIGNED. + * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. + * It is only applied with constant shift counts. SHIFT_TEMPS must be + * included in the variables of any routine using RIGHT_SHIFT. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define SHIFT_TEMPS INT32 shift_temp; +#define RIGHT_SHIFT(x,shft) \ + ((shift_temp = (x)) < 0 ? \ + (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ + (shift_temp >> (shft))) +#else +#define SHIFT_TEMPS +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* Compression module initialization routines */ +EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, + boolean transcode_only)); +EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); +/* Decompression module initialization routines */ +EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); +/* Memory manager initialization */ +EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); + +/* Utility routines in jutils.c */ +EXTERN(long) jdiv_round_up JPP((long a, long b)); +EXTERN(long) jround_up JPP((long a, long b)); +EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols)); +EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks)); +EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); +/* Constant tables in jutils.c */ +#if 0 /* This table is not actually needed in v6a */ +extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ +#endif +extern const int jpeg_natural_order[DCTSIZE2+16]; /* zigzag coef order to natural order */ + +/* Suppress undefined-structure complaints if necessary. */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +#endif +#endif /* INCOMPLETE_TYPES_BROKEN */ diff --git a/User/system/lib/lcd/gui/JPEG/jpeglib.h b/User/system/lib/lcd/gui/JPEG/jpeglib.h new file mode 100644 index 0000000..de360f2 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jpeglib.h @@ -0,0 +1,1034 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +/* Version ID for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". + */ + +#define JPEG_LIB_VERSION 62 /* Version 6b */ + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + * For decompression this is the size of the output from one DCT block, + * reflecting any scaling we choose to apply during the IDCT step. + * Values of 1,2,4,8 are likely to be supported. Note that different + * components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface), thus + * downsampled_width = ceil(image_width * Hi/Hmax) + * and similarly for height. For decompression, IDCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +typedef struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +} jpeg_source_mgr; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#define JPP(arglist) arglist + + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +/* EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); */ +/* EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); */ + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.doc concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/User/system/lib/lcd/gui/JPEG/jquant1.c b/User/system/lib/lcd/gui/JPEG/jquant1.c new file mode 100644 index 0000000..fb1b400 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jquant1.c @@ -0,0 +1,862 @@ +/* + * jquant1.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 1-pass color quantization (color mapping) routines. + * These routines provide mapping to a fixed color map using equally spaced + * color values. Optional Floyd-Steinberg or ordered dithering is available. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_1PASS_SUPPORTED + + +/* + * The main purpose of 1-pass quantization is to provide a fast, if not very + * high quality, colormapped output capability. A 2-pass quantizer usually + * gives better visual quality; however, for quantized grayscale output this + * quantizer is perfectly adequate. Dithering is highly recommended with this + * quantizer, though you can turn it off if you really want to. + * + * In 1-pass quantization the colormap must be chosen in advance of seeing the + * image. We use a map consisting of all combinations of Ncolors[i] color + * values for the i'th component. The Ncolors[] values are chosen so that + * their product, the total number of colors, is no more than that requested. + * (In most cases, the product will be somewhat less.) + * + * Since the colormap is orthogonal, the representative value for each color + * component can be determined without considering the other components; + * then these indexes can be combined into a colormap index by a standard + * N-dimensional-array-subscript calculation. Most of the arithmetic involved + * can be precalculated and stored in the lookup table colorindex[]. + * colorindex[i][j] maps pixel value j in component i to the nearest + * representative value (grid plane) for that component; this index is + * multiplied by the array stride for component i, so that the + * index of the colormap entry closest to a given pixel value is just + * sum( colorindex[component-number][pixel-component-value] ) + * Aside from being fast, this scheme allows for variable spacing between + * representative values with no additional lookup cost. + * + * If gamma correction has been applied in color conversion, it might be wise + * to adjust the color grid spacing so that the representative colors are + * equidistant in linear space. At this writing, gamma correction is not + * implemented by jdcolor, so nothing is done here. + */ + + +/* Declarations for ordered dithering. + * + * We use a standard 16x16 ordered dither array. The basic concept of ordered + * dithering is described in many references, for instance Dale Schumacher's + * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). + * In place of Schumacher's comparisons against a "threshold" value, we add a + * "dither" value to the input pixel and then round the result to the nearest + * output value. The dither value is equivalent to (0.5 - threshold) times + * the distance between output values. For ordered dithering, we assume that + * the output colors are equally spaced; if not, results will probably be + * worse, since the dither may be too much or too little at a given point. + * + * The normal calculation would be to form pixel value + dither, range-limit + * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual. + * We can skip the separate range-limiting step by extending the colorindex + * table in both directions. + */ + +#define ODITHER_SIZE 16 /* dimension of dither matrix */ +/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ +#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */ +#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */ + +typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE]; +typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE]; + +static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = { + /* Bayer's order-4 dither array. Generated by the code given in + * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. + * The values in this array must range from 0 to ODITHER_CELLS-1. + */ + { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, + { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, + { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, + { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, + { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, + { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, + { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, + { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, + { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, + { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, + { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, + { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, + { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, + { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, + { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, + { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } +}; + + +/* Declarations for Floyd-Steinberg dithering. + * + * Errors are accumulated into the array fserrors[], at a resolution of + * 1/16th of a pixel count. The error at a given pixel is propagated + * to its not-yet-processed neighbors using the standard F-S fractions, + * ... (here) 7/16 + * 3/16 5/16 1/16 + * We work left-to-right on even rows, right-to-left on odd rows. + * + * We can get away with a single array (holding one row's worth of errors) + * by using it to store the current row's errors at pixel columns not yet + * processed, but the next row's errors at columns already processed. We + * need only a few extra variables to hold the errors immediately around the + * current column. (If we are lucky, those variables are in registers, but + * even if not, they're probably cheaper to access than array elements are.) + * + * The fserrors[] array is indexed [component#][position]. + * We provide (#columns + 2) entries per component; the extra entry at each + * end saves us from special-casing the first and last pixels. + * + * Note: on a wide image, we might not have enough room in a PC's near data + * segment to hold the error array; so it is allocated with alloc_large. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef INT16 FSERROR; /* 16 bits should be enough */ +typedef int LOCFSERROR; /* use 'int' for calculation temps */ +#else +typedef INT32 FSERROR; /* may need more than 16 bits */ +typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */ +#endif + +typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */ + + +/* Private subobject */ + +#define MAX_Q_COMPS 4 /* max components I can handle */ + +typedef struct { + struct jpeg_color_quantizer pub; /* public fields */ + + /* Initially allocated colormap is saved here */ + JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */ + int sv_actual; /* number of entries in use */ + + JSAMPARRAY colorindex; /* Precomputed mapping for speed */ + /* colorindex[i][j] = index of color closest to pixel value j in component i, + * premultiplied as described above. Since colormap indexes must fit into + * JSAMPLEs, the entries of this array will too. + */ + boolean is_padded; /* is the colorindex padded for odither? */ + + int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */ + + /* Variables for ordered dithering */ + int row_index; /* cur row's vertical index in dither matrix */ + ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */ + + /* Variables for Floyd-Steinberg dithering */ + FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */ + boolean on_odd_row; /* flag to remember which row we are on */ +} my_cquantizer; + +typedef my_cquantizer * my_cquantize_ptr; + + +/* + * Policy-making subroutines for create_colormap and create_colorindex. + * These routines determine the colormap to be used. The rest of the module + * only assumes that the colormap is orthogonal. + * + * * select_ncolors decides how to divvy up the available colors + * among the components. + * * output_value defines the set of representative values for a component. + * * largest_input_value defines the mapping from input values to + * representative values for a component. + * Note that the latter two routines may impose different policies for + * different components, though this is not currently done. + */ + + +LOCAL(int) +select_ncolors (j_decompress_ptr cinfo, int Ncolors[]) +/* Determine allocation of desired colors to components, */ +/* and fill in Ncolors[] array to indicate choice. */ +/* Return value is total number of colors (product of Ncolors[] values). */ +{ + int nc = cinfo->out_color_components; /* number of color components */ + int max_colors = cinfo->desired_number_of_colors; + int total_colors, iroot, i, j; + boolean changed; + long temp; + static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE }; + + /* We can allocate at least the nc'th root of max_colors per component. */ + /* Compute floor(nc'th root of max_colors). */ + iroot = 1; + do { + iroot++; + temp = iroot; /* set temp = iroot ** nc */ + for (i = 1; i < nc; i++) + temp *= iroot; + } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */ + iroot--; /* now iroot = floor(root) */ + + /* Must have at least 2 color values per component */ + if (iroot < 2) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp); + + /* Initialize to iroot color values for each component */ + total_colors = 1; + for (i = 0; i < nc; i++) { + Ncolors[i] = iroot; + total_colors *= iroot; + } + /* We may be able to increment the count for one or more components without + * exceeding max_colors, though we know not all can be incremented. + * Sometimes, the first component can be incremented more than once! + * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) + * In RGB colorspace, try to increment G first, then R, then B. + */ + do { + changed = FALSE; + for (i = 0; i < nc; i++) { + j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i); + /* calculate new total_colors if Ncolors[j] is incremented */ + temp = total_colors / Ncolors[j]; + temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */ + if (temp > (long) max_colors) + break; /* won't fit, done with this pass */ + Ncolors[j]++; /* OK, apply the increment */ + total_colors = (int) temp; + changed = TRUE; + } + } while (changed); + + return total_colors; +} + + +LOCAL(int) +output_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return j'th output value, where j will range from 0 to maxj */ +/* The output values must fall in 0..MAXJSAMPLE in increasing order */ +{ + /* We always provide values 0 and MAXJSAMPLE for each component; + * any additional values are equally spaced between these limits. + * (Forcing the upper and lower values to the limits ensures that + * dithering can't produce a color outside the selected gamut.) + */ + GUI_USE_PARA(cinfo); + GUI_USE_PARA(ci); + return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj); +} + + +LOCAL(int) +largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return largest input value that should map to j'th output value */ +/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */ +{ + GUI_USE_PARA(cinfo); + GUI_USE_PARA(ci); + /* Breakpoints are halfway between values returned by output_value */ + return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj)); +} + + +/* + * Create the colormap. + */ + +LOCAL(void) +create_colormap (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colormap; /* Created colormap */ + int total_colors; /* Number of distinct output colors */ + int i,j,k, nci, blksize, blkdist, ptr, val; + + /* Select number of colors for each component */ + total_colors = select_ncolors(cinfo, cquantize->Ncolors); + + /* Report selected color counts */ + if (cinfo->out_color_components == 3) + TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS, + total_colors, cquantize->Ncolors[0], + cquantize->Ncolors[1], cquantize->Ncolors[2]); + else + TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors); + + /* Allocate and fill in the colormap. */ + /* The colors are ordered in the map in standard row-major order, */ + /* i.e. rightmost (highest-indexed) color changes most rapidly. */ + + colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + /* blkdist is distance between groups of identical entries for a component */ + blkdist = total_colors; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colormap entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blkdist / nci; + for (j = 0; j < nci; j++) { + /* Compute j'th output value (out of nci) for component */ + val = output_value(cinfo, i, j, nci-1); + /* Fill in all colormap entries that have this value of this component */ + for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) { + /* fill in blksize entries beginning at ptr */ + for (k = 0; k < blksize; k++) + colormap[i][ptr+k] = (JSAMPLE) val; + } + } + blkdist = blksize; /* blksize of this color is blkdist of next */ + } + + /* Save the colormap in private storage, + * where it will survive color quantization mode changes. + */ + cquantize->sv_colormap = colormap; + cquantize->sv_actual = total_colors; +} + + +/* + * Create the color index table. + */ + +LOCAL(void) +create_colorindex (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPROW indexptr; + int i,j,k, nci, blksize, val, pad; + + /* For ordered dither, we pad the color index tables by MAXJSAMPLE in + * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE). + * This is not necessary in the other dithering modes. However, we + * flag whether it was done in case user changes dithering mode. + */ + if (cinfo->dither_mode == JDITHER_ORDERED) { + pad = MAXJSAMPLE*2; + cquantize->is_padded = TRUE; + } else { + pad = 0; + cquantize->is_padded = FALSE; + } + + cquantize->colorindex = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (MAXJSAMPLE+1 + pad), + (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + blksize = cquantize->sv_actual; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colorindex entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blksize / nci; + + /* adjust colorindex pointers to provide padding at negative indexes. */ + if (pad) + cquantize->colorindex[i] += MAXJSAMPLE; + + /* in loop, val = index of current output value, */ + /* and k = largest j that maps to current val */ + indexptr = cquantize->colorindex[i]; + val = 0; + k = largest_input_value(cinfo, i, 0, nci-1); + for (j = 0; j <= MAXJSAMPLE; j++) { + while (j > k) /* advance val if past boundary */ + k = largest_input_value(cinfo, i, ++val, nci-1); + /* premultiply so that no multiplication needed in main processing */ + indexptr[j] = (JSAMPLE) (val * blksize); + } + /* Pad at both ends if necessary */ + if (pad) + for (j = 1; j <= MAXJSAMPLE; j++) { + indexptr[-j] = indexptr[0]; + indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE]; + } + } +} + + +/* + * Create an ordered-dither array for a component having ncolors + * distinct output values. + */ + +LOCAL(ODITHER_MATRIX_PTR) +make_odither_array (j_decompress_ptr cinfo, int ncolors) +{ + ODITHER_MATRIX_PTR odither; + int j,k; + INT32 num,den; + + odither = (ODITHER_MATRIX_PTR) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(ODITHER_MATRIX)); + /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). + * Hence the dither value for the matrix cell with fill order f + * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). + * On 16-bit-int machine, be careful to avoid overflow. + */ + den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1)); + for (j = 0; j < ODITHER_SIZE; j++) { + for (k = 0; k < ODITHER_SIZE; k++) { + num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k]))) + * MAXJSAMPLE; + /* Ensure round towards zero despite C's lack of consistency + * about rounding negative values in integer division... + */ + odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den); + } + } + return odither; +} + + +/* + * Create the ordered-dither tables. + * Components having the same number of representative colors may + * share a dither table. + */ + +LOCAL(void) +create_odither_tables (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + ODITHER_MATRIX_PTR odither; + int i, j, nci; + + for (i = 0; i < cinfo->out_color_components; i++) { + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + odither = NULL; /* search for matching prior component */ + for (j = 0; j < i; j++) { + if (nci == cquantize->Ncolors[j]) { + odither = cquantize->odither[j]; + break; + } + } + if (odither == NULL) /* need a new table? */ + odither = make_odither_array(cinfo, nci); + cquantize->odither[i] = odither; + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colorindex = cquantize->colorindex; + register int pixcode, ci; + register JSAMPROW ptrin, ptrout; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + register int nc = cinfo->out_color_components; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = 0; + for (ci = 0; ci < nc; ci++) { + pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); + } + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW ptrin, ptrout; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + int * dither; /* points to active row of dither matrix */ + int row_index, col_index; /* current indexes into dither matrix */ + int nc = cinfo->out_color_components; + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + row_index = cquantize->row_index; + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + colorindex_ci = cquantize->colorindex[ci]; + dither = cquantize->odither[ci][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE, + * select output value, accumulate into output code for this pixel. + * Range-limiting need not be done explicitly, as we have extended + * the colorindex table to produce the right answers for out-of-range + * inputs. The maximum dither is +- MAXJSAMPLE; this sets the + * required amount of padding. + */ + *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]]; + input_ptr += nc; + output_ptr++; + col_index = (col_index + 1) & ODITHER_MASK; + } + } + /* Advance row index for next row */ + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int * dither0; /* points to active row of dither matrix */ + int * dither1; + int * dither2; + int row_index, col_index; /* current indexes into dither matrix */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + row_index = cquantize->row_index; + input_ptr = input_buf[row]; + output_ptr = output_buf[row]; + dither0 = cquantize->odither[0][row_index]; + dither1 = cquantize->odither[1][row_index]; + dither2 = cquantize->odither[2][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + + dither0[col_index]]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + + dither1[col_index]]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + + dither2[col_index]]); + *output_ptr++ = (JSAMPLE) pixcode; + col_index = (col_index + 1) & ODITHER_MASK; + } + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register LOCFSERROR cur; /* current error or pixel value */ + LOCFSERROR belowerr; /* error for pixel below cur */ + LOCFSERROR bpreverr; /* error for below/prev col */ + LOCFSERROR bnexterr; /* error for below/next col */ + LOCFSERROR delta; + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + JSAMPROW colormap_ci; + int pixcode; + int nc = cinfo->out_color_components; + int dir; /* 1 for left-to-right, -1 for right-to-left */ + int dirnc; /* dir * nc */ + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + input_ptr += (width-1) * nc; /* so point to rightmost pixel */ + output_ptr += width-1; + dir = -1; + dirnc = -nc; + errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */ + } else { + /* work left to right in this row */ + dir = 1; + dirnc = nc; + errorptr = cquantize->fserrors[ci]; /* => entry before first column */ + } + colorindex_ci = cquantize->colorindex[ci]; + colormap_ci = cquantize->sv_colormap[ci]; + /* Preset error values: no error propagated to first pixel from left */ + cur = 0; + /* and no error propagated to row below yet */ + belowerr = bpreverr = 0; + + for (col = width; col > 0; col--) { + /* cur holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4); + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE; this sets the required size + * of the range_limit array. + */ + cur += GETJSAMPLE(*input_ptr); + cur = GETJSAMPLE(range_limit[cur]); + /* Select output value, accumulate into output code for this pixel */ + pixcode = GETJSAMPLE(colorindex_ci[cur]); + *output_ptr += (JSAMPLE) pixcode; + /* Compute actual representation error at this pixel */ + /* Note: we can do this even though we don't have the final */ + /* pixel code, because the colormap is orthogonal. */ + cur -= GETJSAMPLE(colormap_ci[pixcode]); + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + bnexterr = cur; + delta = cur * 2; + cur += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr + cur); + cur += delta; /* form error * 5 */ + bpreverr = belowerr + cur; + belowerr = bnexterr; + cur += delta; /* form error * 7 */ + /* At this point cur contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + input_ptr += dirnc; /* advance input ptr to next column */ + output_ptr += dir; /* advance output ptr to next column */ + errorptr += dir; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error value into the + * final fserrors[] entry. Note we need not unload belowerr because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */ + } + cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE); + } +} + + +/* + * Allocate workspace for Floyd-Steinberg errors. + */ + +LOCAL(void) +alloc_fs_workspace (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) { + cquantize->fserrors[i] = (FSERRPTR) + (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + } +} + + +/* + * Initialize for one-pass color quantization. + */ + +METHODDEF(void) +start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + GUI_USE_PARA(is_pre_scan); + /* Install my colormap. */ + cinfo->colormap = cquantize->sv_colormap; + cinfo->actual_number_of_colors = cquantize->sv_actual; + + /* Initialize for desired dithering mode. */ + switch (cinfo->dither_mode) { + case JDITHER_NONE: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = color_quantize3; + else + cquantize->pub.color_quantize = color_quantize; + break; + case JDITHER_ORDERED: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = quantize3_ord_dither; + else + cquantize->pub.color_quantize = quantize_ord_dither; + cquantize->row_index = 0; /* initialize state for ordered dither */ + /* If user changed to ordered dither from another mode, + * we must recreate the color index table with padding. + * This will cost extra space, but probably isn't very likely. + */ + if (! cquantize->is_padded) + create_colorindex(cinfo); + /* Create ordered-dither tables if we didn't already. */ + if (cquantize->odither[0] == NULL) + create_odither_tables(cinfo); + break; + case JDITHER_FS: + cquantize->pub.color_quantize = quantize_fs_dither; + cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */ + /* Allocate Floyd-Steinberg workspace if didn't already. */ + if (cquantize->fserrors[0] == NULL) + alloc_fs_workspace(cinfo); + /* Initialize the propagated errors to zero. */ + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) + jzero_far((void FAR *) cquantize->fserrors[i], arraysize); + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } +} + + +/* + * Finish up at the end of the pass. + */ + +METHODDEF(void) +finish_pass_1_quant (j_decompress_ptr cinfo) +{ + GUI_USE_PARA(cinfo); + /* no work in 1-pass case */ +} + + +/* + * Switch to a new external colormap between output passes. + * Shouldn't get to this module! + */ + +METHODDEF(void) +new_color_map_1_quant (j_decompress_ptr cinfo) +{ + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + + +/* + * Module initialization routine for 1-pass color quantization. + */ + +GLOBAL(void) +jinit_1pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_1_quant; + cquantize->pub.finish_pass = finish_pass_1_quant; + cquantize->pub.new_color_map = new_color_map_1_quant; + cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */ + cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */ + + /* Make sure my internal arrays won't overflow */ + if (cinfo->out_color_components > MAX_Q_COMPS) + ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1)) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1); + + /* Create the colormap and color index table. */ + create_colormap(cinfo); + create_colorindex(cinfo); + + /* Allocate Floyd-Steinberg workspace now if requested. + * We do this now since it is FAR storage and may affect the memory + * manager's space calculations. If the user changes to FS dither + * mode in a later pass, we will allocate the space then, and will + * possibly overrun the max_memory_to_use setting. + */ + if (cinfo->dither_mode == JDITHER_FS) + alloc_fs_workspace(cinfo); +} + +#endif /* QUANT_1PASS_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jquant2.c b/User/system/lib/lcd/gui/JPEG/jquant2.c new file mode 100644 index 0000000..c4f9a98 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jquant2.c @@ -0,0 +1,1312 @@ +/* + * jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 2-pass color quantization (color mapping) routines. + * These routines provide selection of a custom color map for an image, + * followed by mapping of the image to that color map, with optional + * Floyd-Steinberg dithering. + * It is also possible to use just the second pass to map to an arbitrary + * externally-given color map. + * + * Note: ordered dithering is not supported, since there isn't any fast + * way to compute intercolor distances; it's unclear that ordered dither's + * fundamental assumptions even hold with an irregularly spaced color map. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_2PASS_SUPPORTED + + +/* + * This module implements the well-known Heckbert paradigm for color + * quantization. Most of the ideas used here can be traced back to + * Heckbert's seminal paper + * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", + * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. + * + * In the first pass over the image, we accumulate a histogram showing the + * usage count of each possible color. To keep the histogram to a reasonable + * size, we reduce the precision of the input; typical practice is to retain + * 5 or 6 bits per color, so that 8 or 4 different input values are counted + * in the same histogram cell. + * + * Next, the color-selection step begins with a box representing the whole + * color space, and repeatedly splits the "largest" remaining box until we + * have as many boxes as desired colors. Then the mean color in each + * remaining box becomes one of the possible output colors. + * + * The second pass over the image maps each input pixel to the closest output + * color (optionally after applying a Floyd-Steinberg dithering correction). + * This mapping is logically trivial, but making it go fast enough requires + * considerable care. + * + * Heckbert-style quantizers vary a good deal in their policies for choosing + * the "largest" box and deciding where to cut it. The particular policies + * used here have proved out well in experimental comparisons, but better ones + * may yet be found. + * + * In earlier versions of the IJG code, this module quantized in YCbCr color + * space, processing the raw upsampled data without a color conversion step. + * This allowed the color conversion math to be done only once per colormap + * entry, not once per pixel. However, that optimization precluded other + * useful optimizations (such as merging color conversion with upsampling) + * and it also interfered with desired capabilities such as quantizing to an + * externally-supplied colormap. We have therefore abandoned that approach. + * The present code works in the post-conversion color space, typically RGB. + * + * To improve the visual quality of the results, we actually work in scaled + * RGB space, giving G distances more weight than R, and R in turn more than + * B. To do everything in integer math, we must use integer scale factors. + * The 2/3/1 scale factors used here correspond loosely to the relative + * weights of the colors in the NTSC grayscale equation. + * If you want to use this code to quantize a non-RGB color space, you'll + * probably need to change these scale factors. + */ + +#define R_SCALE 2 /* scale R distances by this much */ +#define G_SCALE 3 /* scale G distances by this much */ +#define B_SCALE 1 /* and B by this much */ + +/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined + * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B + * and B,G,R orders. If you define some other weird order in jmorecfg.h, + * you'll get compile errors until you extend this logic. In that case + * you'll probably want to tweak the histogram sizes too. + */ + +#if RGB_RED == 0 +#define C0_SCALE R_SCALE +#endif +#if RGB_BLUE == 0 +#define C0_SCALE B_SCALE +#endif +#if RGB_GREEN == 1 +#define C1_SCALE G_SCALE +#endif +#if RGB_RED == 2 +#define C2_SCALE R_SCALE +#endif +#if RGB_BLUE == 2 +#define C2_SCALE B_SCALE +#endif + + +/* + * First we have the histogram data structure and routines for creating it. + * + * The number of bits of precision can be adjusted by changing these symbols. + * We recommend keeping 6 bits for G and 5 each for R and B. + * If you have plenty of memory and cycles, 6 bits all around gives marginally + * better results; if you are short of memory, 5 bits all around will save + * some space but degrade the results. + * To maintain a fully accurate histogram, we'd need to allocate a "long" + * (preferably unsigned long) for each cell. In practice this is overkill; + * we can get by with 16 bits per cell. Few of the cell counts will overflow, + * and clamping those that do overflow to the maximum value will give close- + * enough results. This reduces the recommended histogram size from 256Kb + * to 128Kb, which is a useful savings on PC-class machines. + * (In the second pass the histogram space is re-used for pixel mapping data; + * in that capacity, each cell must be able to store zero to the number of + * desired colors. 16 bits/cell is plenty for that too.) + * Since the JPEG code is intended to run in small memory model on 80x86 + * machines, we can't just allocate the histogram in one chunk. Instead + * of a true 3-D array, we use a row of pointers to 2-D arrays. Each + * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and + * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that + * on 80x86 machines, the pointer row is in near memory but the actual + * arrays are in far memory (same arrangement as we use for image arrays). + */ + +#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ + +/* These will do the right thing for either R,G,B or B,G,R color order, + * but you may not like the results for other color orders. + */ +#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ +#define HIST_C1_BITS 6 /* bits of precision in G histogram */ +#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ + +/* Number of elements along histogram axes. */ +#define HIST_C0_ELEMS (1<cquantize; + register JSAMPROW ptr; + register histptr histp; + register hist3d histogram = cquantize->histogram; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + GUI_USE_PARA(output_buf); + for (row = 0; row < num_rows; row++) { + ptr = input_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the histogram */ + histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] + [GETJSAMPLE(ptr[1]) >> C1_SHIFT] + [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; + /* increment, check for overflow and undo increment if so. */ + if (++(*histp) <= 0) + (*histp)--; + ptr += 3; + } + } +} + + +/* + * Next we have the really interesting routines: selection of a colormap + * given the completed histogram. + * These routines work with a list of "boxes", each representing a rectangular + * subset of the input color space (to histogram precision). + */ + +typedef struct { + /* The bounds of the box (inclusive); expressed as histogram indexes */ + int c0min, c0max; + int c1min, c1max; + int c2min, c2max; + /* The volume (actually 2-norm) of the box */ + INT32 volume; + /* The number of nonzero histogram cells within this box */ + long colorcount; +} box; + +typedef box * boxptr; + + +LOCAL(boxptr) +find_biggest_color_pop (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest color population */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register long maxc = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; + maxc = boxp->colorcount; + } + } + return which; +} + + +LOCAL(boxptr) +find_biggest_volume (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest (scaled) volume */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register INT32 maxv = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; + maxv = boxp->volume; + } + } + return which; +} + + +LOCAL(void) +update_box (j_decompress_ptr cinfo, boxptr boxp) +/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ +/* and recompute its volume and population */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0min = c0min = c0; + goto have_c0min; + } + } + have_c0min: + if (c0max > c0min) + for (c0 = c0max; c0 >= c0min; c0--) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0max = c0max = c0; + goto have_c0max; + } + } + have_c0max: + if (c1max > c1min) + for (c1 = c1min; c1 <= c1max; c1++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1min = c1min = c1; + goto have_c1min; + } + } + have_c1min: + if (c1max > c1min) + for (c1 = c1max; c1 >= c1min; c1--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1max = c1max = c1; + goto have_c1max; + } + } + have_c1max: + if (c2max > c2min) + for (c2 = c2min; c2 <= c2max; c2++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2min = c2min = c2; + goto have_c2min; + } + } + have_c2min: + if (c2max > c2min) + for (c2 = c2max; c2 >= c2min; c2--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2max = c2max = c2; + goto have_c2max; + } + } + have_c2max: + + /* Update box volume. + * We use 2-norm rather than real volume here; this biases the method + * against making long narrow boxes, and it has the side benefit that + * a box is splittable iff norm > 0. + * Since the differences are expressed in histogram-cell units, + * we have to shift back to JSAMPLE units to get consistent distances; + * after which, we scale according to the selected distance scale factors. + */ + dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; + + /* Now scan remaining volume of box and compute population */ + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++, histp++) + if (*histp != 0) { + ccount++; + } + } + boxp->colorcount = ccount; +} + + +LOCAL(int) +median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, + int desired_colors) +/* Repeatedly select and split the largest box until we have enough boxes */ +{ + int n,lb; + int c0,c1,c2,cmax; + register boxptr b1,b2; + + while (numboxes < desired_colors) { + /* Select box to split. + * Current algorithm: by population for first half, then by volume. + */ + if (numboxes*2 <= desired_colors) { + b1 = find_biggest_color_pop(boxlist, numboxes); + } else { + b1 = find_biggest_volume(boxlist, numboxes); + } + if (b1 == NULL) /* no splittable boxes left! */ + break; + b2 = &boxlist[numboxes]; /* where new box will go */ + /* Copy the color bounds to the new box. */ + b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; + b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; + /* Choose which axis to split the box on. + * Current algorithm: longest scaled axis. + * See notes in update_box about scaling distances. + */ + c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; + c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; + c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; + /* We want to break any ties in favor of green, then red, blue last. + * This code does the right thing for R,G,B or B,G,R color orders only. + */ +#if RGB_RED == 0 + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } +#else + cmax = c1; n = 1; + if (c2 > cmax) { cmax = c2; n = 2; } + if (c0 > cmax) { n = 0; } +#endif + /* Choose split point along selected axis, and update box bounds. + * Current algorithm: split at halfway point. + * (Since the box has been shrunk to minimum volume, + * any split will produce two nonempty subboxes.) + * Note that lb value is max for lower box, so must be < old max. + */ + switch (n) { + case 0: + lb = (b1->c0max + b1->c0min) / 2; + b1->c0max = lb; + b2->c0min = lb+1; + break; + case 1: + lb = (b1->c1max + b1->c1min) / 2; + b1->c1max = lb; + b2->c1min = lb+1; + break; + case 2: + lb = (b1->c2max + b1->c2min) / 2; + b1->c2max = lb; + b2->c2min = lb+1; + break; + } + /* Update stats for boxes */ + update_box(cinfo, b1); + update_box(cinfo, b2); + numboxes++; + } + return numboxes; +} + + +LOCAL(void) +compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) +/* Compute representative color for a box, put it in colormap[icolor] */ +{ + /* Current algorithm: mean weighted by pixels (not colors) */ + /* Note it is important to get the rounding correct! */ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + long count; + long total = 0; + long c0total = 0; + long c1total = 0; + long c2total = 0; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) { + if ((count = *histp++) != 0) { + total += count; + c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; + c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; + c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; + } + } + } + + cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +} + + +LOCAL(void) +select_colors (j_decompress_ptr cinfo, int desired_colors) +/* Master routine for color selection */ +{ + boxptr boxlist; + int numboxes; + int i; + + /* Allocate workspace for box list */ + boxlist = (boxptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box)); + /* Initialize one box containing whole space */ + numboxes = 1; + boxlist[0].c0min = 0; + boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; + boxlist[0].c1min = 0; + boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; + boxlist[0].c2min = 0; + boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; + /* Shrink it to actually-used volume and set its statistics */ + update_box(cinfo, & boxlist[0]); + /* Perform median-cut to produce final box list */ + numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); + /* Compute the representative color for each box, fill colormap */ + for (i = 0; i < numboxes; i++) + compute_color(cinfo, & boxlist[i], i); + cinfo->actual_number_of_colors = numboxes; + TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes); +} + + +/* + * These routines are concerned with the time-critical task of mapping input + * colors to the nearest color in the selected colormap. + * + * We re-use the histogram space as an "inverse color map", essentially a + * cache for the results of nearest-color searches. All colors within a + * histogram cell will be mapped to the same colormap entry, namely the one + * closest to the cell's center. This may not be quite the closest entry to + * the actual input color, but it's almost as good. A zero in the cache + * indicates we haven't found the nearest color for that cell yet; the array + * is cleared to zeroes before starting the mapping pass. When we find the + * nearest color for a cell, its colormap index plus one is recorded in the + * cache for future use. The pass2 scanning routines call fill_inverse_cmap + * when they need to use an unfilled entry in the cache. + * + * Our method of efficiently finding nearest colors is based on the "locally + * sorted search" idea described by Heckbert and on the incremental distance + * calculation described by Spencer W. Thomas in chapter III.1 of Graphics + * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that + * the distances from a given colormap entry to each cell of the histogram can + * be computed quickly using an incremental method: the differences between + * distances to adjacent cells themselves differ by a constant. This allows a + * fairly fast implementation of the "brute force" approach of computing the + * distance from every colormap entry to every histogram cell. Unfortunately, + * it needs a work array to hold the best-distance-so-far for each histogram + * cell (because the inner loop has to be over cells, not colormap entries). + * The work array elements have to be INT32s, so the work array would need + * 256Kb at our recommended precision. This is not feasible in DOS machines. + * + * To get around these problems, we apply Thomas' method to compute the + * nearest colors for only the cells within a small subbox of the histogram. + * The work array need be only as big as the subbox, so the memory usage + * problem is solved. Furthermore, we need not fill subboxes that are never + * referenced in pass2; many images use only part of the color gamut, so a + * fair amount of work is saved. An additional advantage of this + * approach is that we can apply Heckbert's locality criterion to quickly + * eliminate colormap entries that are far away from the subbox; typically + * three-fourths of the colormap entries are rejected by Heckbert's criterion, + * and we need not compute their distances to individual cells in the subbox. + * The speed of this approach is heavily influenced by the subbox size: too + * small means too much overhead, too big loses because Heckbert's criterion + * can't eliminate as many colormap entries. Empirically the best subbox + * size seems to be about 1/512th of the histogram (1/8th in each direction). + * + * Thomas' article also describes a refined method which is asymptotically + * faster than the brute-force method, but it is also far more complex and + * cannot efficiently be applied to small subboxes. It is therefore not + * useful for programs intended to be portable to DOS machines. On machines + * with plenty of memory, filling the whole histogram in one shot with Thomas' + * refined method might be faster than the present code --- but then again, + * it might not be any faster, and it's certainly more complicated. + */ + + +/* log2(histogram cells in update box) for each axis; this can be adjusted */ +#define BOX_C0_LOG (HIST_C0_BITS-3) +#define BOX_C1_LOG (HIST_C1_BITS-3) +#define BOX_C2_LOG (HIST_C2_BITS-3) + +#define BOX_C0_ELEMS (1<actual_number_of_colors; + int maxc0, maxc1, maxc2; + int centerc0, centerc1, centerc2; + int i, x, ncolors; + INT32 minmaxdist, min_dist, max_dist, tdist; + INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ + + /* Compute true coordinates of update box's upper corner and center. + * Actually we compute the coordinates of the center of the upper-corner + * histogram cell, which are the upper bounds of the volume we care about. + * Note that since ">>" rounds down, the "center" values may be closer to + * min than to max; hence comparisons to them must be "<=", not "<". + */ + maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); + centerc0 = (minc0 + maxc0) >> 1; + maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); + centerc1 = (minc1 + maxc1) >> 1; + maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); + centerc2 = (minc2 + maxc2) >> 1; + + /* For each color in colormap, find: + * 1. its minimum squared-distance to any point in the update box + * (zero if color is within update box); + * 2. its maximum squared-distance to any point in the update box. + * Both of these can be found by considering only the corners of the box. + * We save the minimum distance for each color in mindist[]; + * only the smallest maximum distance is of interest. + */ + minmaxdist = 0x7FFFFFFFL; + + for (i = 0; i < numcolors; i++) { + /* We compute the squared-c0-distance term, then add in the other two. */ + x = GETJSAMPLE(cinfo->colormap[0][i]); + if (x < minc0) { + tdist = (x - minc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else if (x > maxc0) { + tdist = (x - maxc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + min_dist = 0; + if (x <= centerc0) { + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[1][i]); + if (x < minc1) { + tdist = (x - minc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc1) { + tdist = (x - maxc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc1) { + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[2][i]); + if (x < minc2) { + tdist = (x - minc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc2) { + tdist = (x - maxc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc2) { + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } + } + + mindist[i] = min_dist; /* save away the results */ + if (max_dist < minmaxdist) + minmaxdist = max_dist; + } + + /* Now we know that no cell in the update box is more than minmaxdist + * away from some colormap entry. Therefore, only colors that are + * within minmaxdist of some part of the box need be considered. + */ + ncolors = 0; + for (i = 0; i < numcolors; i++) { + if (mindist[i] <= minmaxdist) + colorlist[ncolors++] = (JSAMPLE) i; + } + return ncolors; +} + + +LOCAL(void) +find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, + int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) +/* Find the closest colormap entry for each cell in the update box, + * given the list of candidate colors prepared by find_nearby_colors. + * Return the indexes of the closest entries in the bestcolor[] array. + * This routine uses Thomas' incremental distance calculation method to + * find the distance from a colormap entry to successive cells in the box. + */ +{ + int ic0, ic1, ic2; + int i, icolor; + register INT32 * bptr; /* pointer into bestdist[] array */ + JSAMPLE * cptr; /* pointer into bestcolor[] array */ + INT32 dist0, dist1; /* initial distance values */ + register INT32 dist2; /* current distance in inner loop */ + INT32 xx0, xx1; /* distance increments */ + register INT32 xx2; + INT32 inc0, inc1, inc2; /* initial values for increments */ + /* This array holds the distance to the nearest-so-far color for each cell */ + INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Initialize best-distance for each cell of the update box */ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; + + /* For each color selected by find_nearby_colors, + * compute its distance to the center of each cell in the box. + * If that's less than best-so-far, update best distance and color number. + */ + + /* Nominal steps between cell centers ("x" in Thomas article) */ +#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) +#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) +#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) + + for (i = 0; i < numcolors; i++) { + icolor = GETJSAMPLE(colorlist[i]); + /* Compute (square of) distance from minc0/c1/c2 to this color */ + inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; + dist0 = inc0*inc0; + inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; + dist0 += inc1*inc1; + inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; + dist0 += inc2*inc2; + /* Form the initial difference increments */ + inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; + inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; + inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; + /* Now loop over all cells in box, updating distance per Thomas method */ + bptr = bestdist; + cptr = bestcolor; + xx0 = inc0; + for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { + dist1 = dist0; + xx1 = inc1; + for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { + dist2 = dist1; + xx2 = inc2; + for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { + if (dist2 < *bptr) { + *bptr = dist2; + *cptr = (JSAMPLE) icolor; + } + dist2 += xx2; + xx2 += 2 * STEP_C2 * STEP_C2; + bptr++; + cptr++; + } + dist1 += xx1; + xx1 += 2 * STEP_C1 * STEP_C1; + } + dist0 += xx0; + xx0 += 2 * STEP_C0 * STEP_C0; + } + } +} + + +LOCAL(void) +fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) +/* Fill the inverse-colormap entries in the update box that contains */ +/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ +/* we can fill as many others as we wish.) */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int minc0, minc1, minc2; /* lower left corner of update box */ + int ic0, ic1, ic2; + register JSAMPLE * cptr; /* pointer into bestcolor[] array */ + register histptr cachep; /* pointer into main cache array */ + /* This array lists the candidate colormap indexes. */ + JSAMPLE colorlist[MAXNUMCOLORS]; + int numcolors; /* number of candidate colors */ + /* This array holds the actually closest colormap index for each cell. */ + JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Convert cell coordinates to update box ID */ + c0 >>= BOX_C0_LOG; + c1 >>= BOX_C1_LOG; + c2 >>= BOX_C2_LOG; + + /* Compute true coordinates of update box's origin corner. + * Actually we compute the coordinates of the center of the corner + * histogram cell, which are the lower bounds of the volume we care about. + */ + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); + + /* Determine which colormap entries are close enough to be candidates + * for the nearest entry to some cell in the update box. + */ + numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ + find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, + bestcolor); + + /* Save the best color numbers (plus 1) in the main cache array */ + c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ + c1 <<= BOX_C1_LOG; + c2 <<= BOX_C2_LOG; + cptr = bestcolor; + for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { + for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { + cachep = & histogram[c0+ic0][c1+ic1][c2]; + for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { + *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); + } + } + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +pass2_no_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register JSAMPROW inptr, outptr; + register histptr cachep; + register int c0, c1, c2; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the cache */ + c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; + c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; + c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; + cachep = & histogram[c0][c1][c2]; + /* If we have not seen this color before, find nearest colormap entry */ + /* and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, c0,c1,c2); + /* Now emit the colormap index for this cell */ + *outptr++ = (JSAMPLE) (*cachep - 1); + } + } +} + + +METHODDEF(void) +pass2_fs_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ + LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ + LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + JSAMPROW inptr; /* => current input pixel */ + JSAMPROW outptr; /* => current output pixel */ + histptr cachep; + int dir; /* +1 or -1 depending on direction */ + int dir3; /* 3*dir, for advancing inptr & errorptr */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int *error_limit = cquantize->error_limiter; + JSAMPROW colormap0 = cinfo->colormap[0]; + JSAMPROW colormap1 = cinfo->colormap[1]; + JSAMPROW colormap2 = cinfo->colormap[2]; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + inptr += (width-1) * 3; /* so point to rightmost pixel */ + outptr += width-1; + dir = -1; + dir3 = -3; + errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ + cquantize->on_odd_row = FALSE; /* flip for next time */ + } else { + /* work left to right in this row */ + dir = 1; + dir3 = 3; + errorptr = cquantize->fserrors; /* => entry before first real column */ + cquantize->on_odd_row = TRUE; /* flip for next time */ + } + /* Preset error values: no error propagated to first pixel from left */ + cur0 = cur1 = cur2 = 0; + /* and no error propagated to row below yet */ + belowerr0 = belowerr1 = belowerr2 = 0; + bpreverr0 = bpreverr1 = bpreverr2 = 0; + + for (col = width; col > 0; col--) { + /* curN holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); + cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); + cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); + /* Limit the error using transfer function set by init_error_limit. + * See comments with init_error_limit for rationale. + */ + cur0 = error_limit[cur0]; + cur1 = error_limit[cur1]; + cur2 = error_limit[cur2]; + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE (or less with error limiting); + * this sets the required size of the range_limit array. + */ + cur0 += GETJSAMPLE(inptr[0]); + cur1 += GETJSAMPLE(inptr[1]); + cur2 += GETJSAMPLE(inptr[2]); + cur0 = GETJSAMPLE(range_limit[cur0]); + cur1 = GETJSAMPLE(range_limit[cur1]); + cur2 = GETJSAMPLE(range_limit[cur2]); + /* Index into the cache with adjusted pixel value */ + cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; + /* If we have not seen this color before, find nearest colormap */ + /* entry and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); + /* Now emit the colormap index for this cell */ + { register int pixcode = *cachep - 1; + *outptr = (JSAMPLE) pixcode; + /* Compute representation error for this pixel */ + cur0 -= GETJSAMPLE(colormap0[pixcode]); + cur1 -= GETJSAMPLE(colormap1[pixcode]); + cur2 -= GETJSAMPLE(colormap2[pixcode]); + } + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + { register LOCFSERROR bnexterr, delta; + + bnexterr = cur0; /* Process component 0 */ + delta = cur0 * 2; + cur0 += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr0 + cur0); + cur0 += delta; /* form error * 5 */ + bpreverr0 = belowerr0 + cur0; + belowerr0 = bnexterr; + cur0 += delta; /* form error * 7 */ + bnexterr = cur1; /* Process component 1 */ + delta = cur1 * 2; + cur1 += delta; /* form error * 3 */ + errorptr[1] = (FSERROR) (bpreverr1 + cur1); + cur1 += delta; /* form error * 5 */ + bpreverr1 = belowerr1 + cur1; + belowerr1 = bnexterr; + cur1 += delta; /* form error * 7 */ + bnexterr = cur2; /* Process component 2 */ + delta = cur2 * 2; + cur2 += delta; /* form error * 3 */ + errorptr[2] = (FSERROR) (bpreverr2 + cur2); + cur2 += delta; /* form error * 5 */ + bpreverr2 = belowerr2 + cur2; + belowerr2 = bnexterr; + cur2 += delta; /* form error * 7 */ + } + /* At this point curN contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + inptr += dir3; /* Advance pixel pointers to next column */ + outptr += dir; + errorptr += dir3; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error values into the + * final fserrors[] entry. Note we need not unload belowerrN because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ + errorptr[1] = (FSERROR) bpreverr1; + errorptr[2] = (FSERROR) bpreverr2; + } +} + + +/* + * Initialize the error-limiting transfer function (lookup table). + * The raw F-S error computation can potentially compute error values of up to + * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be + * much less, otherwise obviously wrong pixels will be created. (Typical + * effects include weird fringes at color-area boundaries, isolated bright + * pixels in a dark area, etc.) The standard advice for avoiding this problem + * is to ensure that the "corners" of the color cube are allocated as output + * colors; then repeated errors in the same direction cannot cause cascading + * error buildup. However, that only prevents the error from getting + * completely out of hand; Aaron Giles reports that error limiting improves + * the results even with corner colors allocated. + * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty + * well, but the smoother transfer function used below is even better. Thanks + * to Aaron Giles for this idea. + */ + +LOCAL(void) +init_error_limit (j_decompress_ptr cinfo) +/* Allocate and fill in the error_limiter table */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + int * table; + int in, out; + + table = (int *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int)); + table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ + cquantize->error_limiter = table; + +#define STEPSIZE ((MAXJSAMPLE+1)/16) + /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ + out = 0; + for (in = 0; in < STEPSIZE; in++, out++) { + table[in] = out; table[-in] = -out; + } + /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ + for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { + table[in] = out; table[-in] = -out; + } + /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ + for (; in <= MAXJSAMPLE; in++) { + table[in] = out; table[-in] = -out; + } +#undef STEPSIZE +} + + +/* + * Finish up at the end of each pass. + */ + +METHODDEF(void) +finish_pass1 (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Select the representative colors and fill in cinfo->colormap */ + cinfo->colormap = cquantize->sv_colormap; + select_colors(cinfo, cquantize->desired); + /* Force next pass to zero the color index table */ + cquantize->needs_zeroed = TRUE; +} + + +METHODDEF(void) +finish_pass2 (j_decompress_ptr cinfo) +{ + GUI_USE_PARA(cinfo); + /* no work */ +} + + +/* + * Initialize for each processing pass. + */ + +METHODDEF(void) +start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int i; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + if (is_pre_scan) { + /* Set up method pointers */ + cquantize->pub.color_quantize = prescan_quantize; + cquantize->pub.finish_pass = finish_pass1; + cquantize->needs_zeroed = TRUE; /* Always zero histogram */ + } else { + /* Set up method pointers */ + if (cinfo->dither_mode == JDITHER_FS) + cquantize->pub.color_quantize = pass2_fs_dither; + else + cquantize->pub.color_quantize = pass2_no_dither; + cquantize->pub.finish_pass = finish_pass2; + + /* Make sure color count is acceptable */ + i = cinfo->actual_number_of_colors; + if (i < 1) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1); + if (i > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + + if (cinfo->dither_mode == JDITHER_FS) { + size_t arraysize = (size_t) ((cinfo->output_width + 2) * + (3 * SIZEOF(FSERROR))); + /* Allocate Floyd-Steinberg workspace if we didn't already. */ + if (cquantize->fserrors == NULL) + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + /* Initialize the propagated errors to zero. */ + jzero_far((void FAR *) cquantize->fserrors, arraysize); + /* Make the error-limit table if we didn't already. */ + if (cquantize->error_limiter == NULL) + init_error_limit(cinfo); + cquantize->on_odd_row = FALSE; + } + + } + /* Zero the histogram or inverse color map, if necessary */ + if (cquantize->needs_zeroed) { + for (i = 0; i < HIST_C0_ELEMS; i++) { + jzero_far((void FAR *) histogram[i], + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = FALSE; + } +} + + +/* + * Switch to a new external colormap between output passes. + */ + +METHODDEF(void) +new_color_map_2_quant (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Reset the inverse color map */ + cquantize->needs_zeroed = TRUE; +} + + +/* + * Module initialization routine for 2-pass color quantization. + */ + +GLOBAL(void) +jinit_2pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + int i; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_2_quant; + cquantize->pub.new_color_map = new_color_map_2_quant; + cquantize->fserrors = NULL; /* flag optional arrays not allocated */ + cquantize->error_limiter = NULL; + + /* Make sure jdmaster didn't give me a case I can't handle */ + if (cinfo->out_color_components != 3) + ERREXIT(cinfo, JERR_NOTIMPL); + + /* Allocate the histogram/inverse colormap storage */ + cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d)); + for (i = 0; i < HIST_C0_ELEMS; i++) { + cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = TRUE; /* histogram is garbage now */ + + /* Allocate storage for the completed colormap, if required. + * We do this now since it is FAR storage and may affect + * the memory manager's space calculations. + */ + if (cinfo->enable_2pass_quant) { + /* Make sure color count is acceptable */ + int desired = cinfo->desired_number_of_colors; + /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ + if (desired < 8) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (desired > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); + cquantize->desired = desired; + } else + cquantize->sv_colormap = NULL; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + /* Allocate Floyd-Steinberg workspace if necessary. + * This isn't really needed until pass 2, but again it is FAR storage. + * Although we will cope with a later change in dither_mode, + * we do not promise to honor max_memory_to_use if dither_mode changes. + */ + if (cinfo->dither_mode == JDITHER_FS) { + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); + /* Might as well create the error-limiting table too. */ + init_error_limit(cinfo); + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/User/system/lib/lcd/gui/JPEG/jutils.c b/User/system/lib/lcd/gui/JPEG/jutils.c new file mode 100644 index 0000000..d18a955 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jutils.c @@ -0,0 +1,179 @@ +/* + * jutils.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains tables and miscellaneous utility routines needed + * for both compression and decompression. + * Note we prefix all global names with "j" to minimize conflicts with + * a surrounding application. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element + * of a DCT block read in natural order (left to right, top to bottom). + */ + +#if 0 /* This table is not actually needed in v6a */ + +const int jpeg_zigzag_order[DCTSIZE2] = { + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 +}; + +#endif + +/* + * jpeg_natural_order[i] is the natural-order position of the i'th element + * of zigzag order. + * + * When reading corrupted data, the Huffman decoders could attempt + * to reference an entry beyond the end of this array (if the decoded + * zero run length reaches past the end of the block). To prevent + * wild stores without adding an inner-loop test, we put some extra + * "63"s after the real entries. This will cause the extra coefficient + * to be stored in location 63 of the block, not somewhere random. + * The worst case would be a run-length of 15, which means we need 16 + * fake entries. + */ + +const int jpeg_natural_order[DCTSIZE2+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + + +/* + * Arithmetic utilities + */ + +GLOBAL(long) +jdiv_round_up (long a, long b) +/* Compute a/b rounded up to next integer, ie, ceil(a/b) */ +/* Assumes a >= 0, b > 0 */ +{ + return (a + b - 1L) / b; +} + + +GLOBAL(long) +jround_up (long a, long b) +/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */ +/* Assumes a >= 0, b > 0 */ +{ + a += b - 1L; + return a - (a % b); +} + + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) +#endif +#endif + + +GLOBAL(void) +jcopy_sample_rows (JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols) +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas may overlap for duplication. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#else + register JDIMENSION count; +#endif + register int row; + + input_array += source_row; + output_array += dest_row; + + for (row = num_rows; row > 0; row--) { + inptr = *input_array++; + outptr = *output_array++; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = num_cols; count > 0; count--) + *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ +#endif + } +} + + +GLOBAL(void) +jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks) +/* Copy a row of coefficient blocks from one place to another. */ +{ +#ifdef FMEMCOPY + FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); +#else + register JCOEFPTR inptr, outptr; + register long count; + + inptr = (JCOEFPTR) input_row; + outptr = (JCOEFPTR) output_row; + for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) { + *outptr++ = *inptr++; + } +#endif +} + + +GLOBAL(void) +jzero_far (void FAR * target, size_t bytestozero) +/* Zero out a chunk of FAR memory. */ +/* This might be sample-array data, block-array data, or alloc_large data. */ +{ +#ifdef FMEMZERO + FMEMZERO(target, bytestozero); +#else + register char FAR * ptr = (char FAR *) target; + register size_t count; + + for (count = bytestozero; count > 0; count--) { + *ptr++ = 0; + } +#endif +} diff --git a/User/system/lib/lcd/gui/JPEG/jversion.h b/User/system/lib/lcd/gui/JPEG/jversion.h new file mode 100644 index 0000000..6472c58 --- /dev/null +++ b/User/system/lib/lcd/gui/JPEG/jversion.h @@ -0,0 +1,14 @@ +/* + * jversion.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains software version identification. + */ + + +#define JVERSION "6b 27-Mar-1998" + +#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane" diff --git a/User/system/lib/lcd/gui/JPEG/vssver.scc b/User/system/lib/lcd/gui/JPEG/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..3e4d67a846b4a3ecfafef2e8ab2482d3f9e17598 GIT binary patch literal 672 zcmXxeODMwu90%|X<)-`{oQRrI+Bi%};k34clMyB6{k8{V9vfpGxp<~=kdStuG-;tl z9p)!#kC?F}iebNv!C9 z)JR92*5W?8P8VZS0dIxuQ`WHC9<>JU%n&c}UIVXYwdd2d@TqF7fv$r!d-g-R9^N;2 zWpo4lpj1leM);@Lp`x4MwUB(9ZibTsziPS#mOOhxbSvDd(zxh0*jAnQ>h?{hMgMPy z&4rtnbO*ey{ywHV;S`5{oYuk-*NQ;vU}u~(o7TgY-7-IIfJ-u^8*~?}y*PiOyW#ji zYA$Vr{g3u?x(6P=->jm0;q2#Ngf_u5;rVL14;Ces-qQWBNpW*R55QM7ReF8k;) J*tjoz(tjNx&z}GQ literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/LCDDriver/CCLCDDriver.bat b/User/system/lib/lcd/gui/LCDDriver/CCLCDDriver.bat new file mode 100644 index 0000000..1883d30 --- /dev/null +++ b/User/system/lib/lcd/gui/LCDDriver/CCLCDDriver.bat @@ -0,0 +1,7 @@ +@ECHO OFF + +ECHO CCGUILCDDriver.BAT: Compiling GUI\LCDDriver + +CALL CC LCDDummy +CALL CC LCDNull +CALL CC LCDWin diff --git a/User/system/lib/lcd/gui/LCDDriver/LCDDummy.c b/User/system/lib/lcd/gui/LCDDriver/LCDDummy.c new file mode 100644 index 0000000..d47e175 --- /dev/null +++ b/User/system/lib/lcd/gui/LCDDriver/LCDDummy.c @@ -0,0 +1,684 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* �C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDDummy.C +Purpose : Empty driver + This driver does no perform any function, but it can be + used for 2 purposes: + a) Satisfy all externals so an application can be + compiled and linked in target hardware even if the + driver is not already available + b) Template for a starting point for a new driver. +---------------------------------------------------------------------- +Adapting to a new system (creating a new driver): + In this case, the first step is to fill the routines + LCD_L0_GetPixelIndex, LCD_L0_SetPixelIndex and LCD_L0_Init with + functionality, which is sufficient to make the hardware work. + A second (optional) step would be to optimize higher level routines. +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +1.00.00 020417 JE a) Changed to have only to adapt _GetPixelIndex + and _SetPixelIndex +0.90.00 020214 JE a) First release +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Private.h" +#include "GUIDebug.h" + +#include "board.h" // user defined + +// #if (LCD_CONTROLLER == -1) && (!defined(WIN32) | defined(LCD_SIMCONTROLLER)) +#if (LCD_CONTROLLER == -1) + +/********************************************************************* + * + * Defines + * + ********************************************************************** + */ + +#ifndef LCD_INIT_CONTROLLER +#define LCD_INIT_CONTROLLER() +#endif + +/********************************************************************* + * + * Macros for MIRROR_, SWAP_ and LUT_ + */ +#if (!defined(LCD_LUT_COM) && !defined(LCD_LUT_SEG)) +#if (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) x +#define LOG2PHYS_Y(x, y) y +#elif (!LCD_MIRROR_X && !LCD_MIRROR_Y && LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) y +#define LOG2PHYS_Y(x, y) x +#elif (!LCD_MIRROR_X && LCD_MIRROR_Y && !LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) x +#define LOG2PHYS_Y(x, y) LCD_YSIZE - 1 - (y) +#elif (!LCD_MIRROR_X && LCD_MIRROR_Y && LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) y +#define LOG2PHYS_Y(x, y) LCD_XSIZE - 1 - (x) +#elif (LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) LCD_XSIZE - 1 - (x) +#define LOG2PHYS_Y(x, y) y +#elif (LCD_MIRROR_X && !LCD_MIRROR_Y && LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) LCD_YSIZE - 1 - (y) +#define LOG2PHYS_Y(x, y) x +#elif (LCD_MIRROR_X && LCD_MIRROR_Y && !LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) LCD_XSIZE - 1 - (x) +#define LOG2PHYS_Y(x, y) LCD_YSIZE - 1 - (y) +#elif (LCD_MIRROR_X && LCD_MIRROR_Y && LCD_SWAP_XY) +#define LOG2PHYS_X(x, y) LCD_YSIZE - 1 - (y) +#define LOG2PHYS_Y(x, y) LCD_XSIZE - 1 - (x) +#endif +#else +#if (defined(LCD_LUT_COM) && !defined(LCD_LUT_SEG)) +#define LOG2PHYS_X(x, y) x +#define LOG2PHYS_Y(x, y) LCD__aLine2Com0[y] +#elif (!defined(LCD_LUT_COM) && defined(LCD_LUT_SEG)) +#define LOG2PHYS_X(x, y) LCD__aCol2Seg0[x] +#define LOG2PHYS_Y(x, y) y +#elif (defined(LCD_LUT_COM) && defined(LCD_LUT_SEG)) +#define LOG2PHYS_X(x, y) LCD__aCol2Seg0[x] +#define LOG2PHYS_Y(x, y) LCD__aLine2Com0[y] +#endif +#endif + +/********************************************************************* + * + * Static functions + * + ********************************************************************** + */ + +/********************************************************************* + * + * Draw Bitmap 1 BPP + */ +static void _DrawBitLine1BPP(int x, int y, U8 const GUI_UNI_PTR *p, int Diff, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Index0 = *(pTrans + 0); + LCD_PIXELINDEX Index1 = *(pTrans + 1); + x += Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: + do + { + LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0); + if (++Diff == 8) + { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do + { + if (*p & (0x80 >> Diff)) + LCD_L0_SetPixelIndex(x, y, Index1); + x++; + if (++Diff == 8) + { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_XOR:; + do + { + if (*p & (0x80 >> Diff)) + { + int Pixel = LCD_L0_GetPixelIndex(x, y); + LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel); + } + x++; + if (++Diff == 8) + { + Diff = 0; + p++; + } + } while (--xsize); + break; + } +} + +/********************************************************************* + * + * Draw Bitmap 2 BPP + */ +#if (LCD_MAX_LOG_COLORS > 2) +static void _DrawBitLine2BPP(int x, int y, U8 const GUI_UNI_PTR *p, int Diff, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Pixels = *p; + int CurrentPixel = Diff; + x += Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: + if (pTrans) + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + LCD_L0_SetPixelIndex(x++, y, PixelIndex); + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + LCD_L0_SetPixelIndex(x++, y, Index); + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + if (Index) + { + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + LCD_L0_SetPixelIndex(x, y, PixelIndex); + } + x++; + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + if (Index) + { + LCD_L0_SetPixelIndex(x, y, Index); + } + x++; + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + } +} +#endif + +/********************************************************************* + * + * Draw Bitmap 4 BPP + */ +#if (LCD_MAX_LOG_COLORS > 4) +static void _DrawBitLine4BPP(int x, int y, U8 const GUI_UNI_PTR *p, int Diff, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Pixels = *p; + int CurrentPixel = Diff; + x += Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: + if (pTrans) + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + LCD_L0_SetPixelIndex(x++, y, PixelIndex); + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + LCD_L0_SetPixelIndex(x++, y, Index); + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + if (Index) + { + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + LCD_L0_SetPixelIndex(x, y, PixelIndex); + } + x++; + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + if (Index) + { + LCD_L0_SetPixelIndex(x, y, Index); + } + x++; + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + } +} +#endif + +/********************************************************************* + * + * Draw Bitmap 8 BPP + */ +#if (LCD_MAX_LOG_COLORS > 16) +static void _DrawBitLine8BPP(int x, int y, U8 const GUI_UNI_PTR *p, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Pixel; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + Pixel = *p; + LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel)); + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + LCD_L0_SetPixelIndex(x, y, *p); + } + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + Pixel = *p; + if (Pixel) + { + LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel)); + } + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + Pixel = *p; + if (Pixel) + { + LCD_L0_SetPixelIndex(x, y, Pixel); + } + } + } + break; + } +} +#endif + +/********************************************************************* + * + * Draw Bitmap 16 BPP + */ +#if (LCD_BITSPERPIXEL > 8) +static void DrawBitLine16BPP(int x, int y, U16 const GUI_UNI_PTR *p, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX pixel; + if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) + { + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel)); + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + LCD_L0_SetPixelIndex(x, y, *p); + } + } + } + else + { + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + if (pixel) + { + LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel)); + } + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + if (pixel) + { + LCD_L0_SetPixelIndex(x, y, pixel); + } + } + } + } +} +#endif + +/********************************************************************* + * + * Exported functions + * + ********************************************************************** + */ + +/********************************************************************* + * + * LCD_L0_SetPixelIndex + * + * Purpose: + * Sets the index of the given pixel. The upper layers + * calling this routine make sure that the coordinates are in range, so + * that no check on the parameters needs to be performed. + */ +void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) +{ + /* Convert logical into physical coordinates (Dep. on LCDConf.h) */ + // #if LCD_SWAP_XY | LCD_MIRROR_X | LCD_MIRROR_Y + // int xPhys = LOG2PHYS_X(x, y); + // int yPhys = LOG2PHYS_Y(x, y); + // #else + // #define xPhys x + // #define yPhys y + // #endif + // /* Write into hardware ... Adapt to your system */ + // { + // lcd->driver.set_point(lcd, xPhys, yPhys, PixelIndex); + // } + + // xsh: 镜像显示 + + if (lcd->driver.get_dir(lcd) == 0) + { + int xPhys = x; + int yPhys = y; + lcd->driver.set_point(lcd, xPhys, yPhys, PixelIndex); + } + else + { + int xPhys = LCD_XSIZE - 1 - (x); + int yPhys = LCD_YSIZE - 1 - (y); + lcd->driver.set_point(lcd, xPhys, yPhys, PixelIndex); + } +} + +/********************************************************************* + * + * LCD_L0_GetPixelIndex + * + * Purpose: + * Returns the index of the given pixel. The upper layers + * calling this routine make sure that the coordinates are in range, so + * that no check on the parameters needs to be performed. + */ +unsigned int LCD_L0_GetPixelIndex(int x, int y) +{ + LCD_PIXELINDEX PixelIndex; +/* Convert logical into physical coordinates (Dep. on LCDConf.h) */ +#if LCD_SWAP_XY | LCD_MIRROR_X | LCD_MIRROR_Y + int xPhys = LOG2PHYS_X(x, y); + int yPhys = LOG2PHYS_Y(x, y); +#else +#define xPhys x +#define yPhys y +#endif + /* Read from hardware ... Adapt to your system */ + { + PixelIndex = lcd->driver.get_point(lcd, xPhys, yPhys); + } + return PixelIndex; +} + +/********************************************************************* + * + * LCD_L0_XorPixel + */ +void LCD_L0_XorPixel(int x, int y) +{ + LCD_PIXELINDEX PixelIndex = LCD_L0_GetPixelIndex(x, y); + LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - PixelIndex - 1); +} + +/********************************************************************* + * + * LCD_L0_DrawHLine + */ +void LCD_L0_DrawHLine(int x0, int y, int x1) +{ + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) + { + for (; x0 <= x1; x0++) + { + LCD_L0_XorPixel(x0, y); + } + } + else + { + for (; x0 <= x1; x0++) + { + LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX); + } + } +} + +/********************************************************************* + * + * LCD_L0_DrawVLine + */ +void LCD_L0_DrawVLine(int x, int y0, int y1) +{ + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) + { + for (; y0 <= y1; y0++) + { + LCD_L0_XorPixel(x, y0); + } + } + else + { + for (; y0 <= y1; y0++) + { + LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX); + } + } +} + +/********************************************************************* + * + * LCD_L0_FillRect + */ +void LCD_L0_FillRect(int x0, int y0, int x1, int y1) +{ + for (; y0 <= y1; y0++) + { + LCD_L0_DrawHLine(x0, y0, x1); + } +} + +/********************************************************************* + * + * LCD_L0_DrawBitmap + */ +void LCD_L0_DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR *pData, int Diff, + const LCD_PIXELINDEX *pTrans) +{ + int i; + /* Use _DrawBitLineXBPP */ + for (i = 0; i < ysize; i++) + { + switch (BitsPerPixel) + { + case 1: + _DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans); + break; +#if (LCD_MAX_LOG_COLORS > 2) + case 2: + _DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans); + break; +#endif +#if (LCD_MAX_LOG_COLORS > 4) + case 4: + _DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans); + break; +#endif +#if (LCD_MAX_LOG_COLORS > 16) + case 8: + _DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans); + break; +#endif +#if (LCD_BITSPERPIXEL > 8) + case 16: + DrawBitLine16BPP(x0, i + y0, (const U16 *)pData, xsize, pTrans); + break; +#endif + } + pData += BytesPerLine; + } +} + +/********************************************************************* + * + * LCD_L0_SetOrg + */ +void LCD_L0_SetOrg(int x, int y) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y); +} + +/********************************************************************* + * + * LCD_On / LCD_Off + */ +void LCD_On(void) +{ +#ifdef LCD_ON + LCD_ON(); +#endif +} + +void LCD_Off(void) +{ +#ifdef LCD_OFF + LCD_OFF(); +#endif +} + +/********************************************************************* + * + * LCD_L0_Init + * + * Purpose: + * Initialises the LCD-controller. + */ +int LCD_L0_Init(void) +{ + LCD_INIT_CONTROLLER(); + return 0; +} + +/********************************************************************* + * + * LCD_L0_SetLUTEntry + */ +void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) +{ + GUI_USE_PARA(Pos); + GUI_USE_PARA(Color); +} + +#else + +void LCDDummy_c(void); +void LCDDummy_c(void) {} /* avoid empty object files */ + +#endif /* (LCD_CONTROLLER undefined) */ diff --git a/User/system/lib/lcd/gui/LCDDriver/LCDNull.c b/User/system/lib/lcd/gui/LCDDriver/LCDNull.c new file mode 100644 index 0000000..878bb85 --- /dev/null +++ b/User/system/lib/lcd/gui/LCDDriver/LCDNull.c @@ -0,0 +1,168 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDNull.C +Purpose : Empty driver + This driver does no perform any function. It can be + used for measurement purpose. +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +0.90.00 030627 JE a) First release +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LCD_Private.h" /* private modul definitions & config */ +#include "GUI_Private.h" +#include "GUIDebug.h" + +#if (LCD_CONTROLLER == -2) && (!defined(WIN32) | defined(LCD_SIMCONTROLLER)) + +/********************************************************************* + * + * Exported functions + * + ********************************************************************** + */ + +/********************************************************************* + * + * LCD_L0_SetPixelIndex + */ +void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y); + GUI_USE_PARA(PixelIndex); +} + +/********************************************************************* + * + * LCD_L0_GetPixelIndex + */ +unsigned int LCD_L0_GetPixelIndex(int x, int y) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y); + return 0; +} + +/********************************************************************* + * + * LCD_L0_XorPixel + */ +void LCD_L0_XorPixel(int x, int y) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y); +} + +/********************************************************************* + * + * LCD_L0_DrawHLine + */ +void LCD_L0_DrawHLine(int x0, int y, int x1) +{ + GUI_USE_PARA(x0); + GUI_USE_PARA(y); + GUI_USE_PARA(x1); +} + +/********************************************************************* + * + * LCD_L0_DrawVLine + */ +void LCD_L0_DrawVLine(int x, int y0, int y1) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y0); + GUI_USE_PARA(y1); +} + +/********************************************************************* + * + * LCD_L0_FillRect + */ +void LCD_L0_FillRect(int x0, int y0, int x1, int y1) +{ + GUI_USE_PARA(x0); + GUI_USE_PARA(y0); + GUI_USE_PARA(x1); + GUI_USE_PARA(y1); +} + +/********************************************************************* + * + * LCD_L0_DrawBitmap + */ +void LCD_L0_DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 GUI_UNI_PTR *pData, int Diff, + const LCD_PIXELINDEX *pTrans) +{ + GUI_USE_PARA(x0); + GUI_USE_PARA(y0); + GUI_USE_PARA(xsize); + GUI_USE_PARA(ysize); + GUI_USE_PARA(BitsPerPixel); + GUI_USE_PARA(BytesPerLine); + GUI_USE_PARA(pData); + GUI_USE_PARA(Diff); + GUI_USE_PARA(pTrans); +} + +/********************************************************************* + * + * LCD_L0_SetOrg + */ +void LCD_L0_SetOrg(int x, int y) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y); +} + +/********************************************************************* + * + * LCD_On / LCD_Off + */ +void LCD_On(void) {} +void LCD_Off(void) {} + +/********************************************************************* + * + * LCD_L0_Init + */ +int LCD_L0_Init(void) +{ + return 0; +} + +/********************************************************************* + * + * LCD_L0_SetLUTEntry + */ +void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) +{ + GUI_USE_PARA(Pos); + GUI_USE_PARA(Color); +} + +#else + +void LCDNull_c(void); +void LCDNull_c(void) {} /* avoid empty object files */ + +#endif /* (LCD_CONTROLLER == -2) */ diff --git a/User/system/lib/lcd/gui/LCDDriver/LCDWin.c b/User/system/lib/lcd/gui/LCDDriver/LCDWin.c new file mode 100644 index 0000000..04e670a --- /dev/null +++ b/User/system/lib/lcd/gui/LCDDriver/LCDWin.c @@ -0,0 +1,718 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCDWin.C +Purpose : Driver for Simulator under Windows +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +2.00a 031007 JE a) LCD_L0_Init changed, filling not needed at + this point +2.00a 030613 JE a) Parameter of SETPIXEL checked in debug version + b) _DrawBitLine2bpp and _DrawBitLine4bpp reworked +2.00 010402 RS a) LCD_GetDevCaps removed from driver + (now LCD.c) +1.30c 000529 JE a) Interface changed +1.30b 000428 RS a) DIB class eliminated + b) Internal cleanups, support for high color +1.30a 000417 RS a) Major cleanup in DIB class +1.30 000309 RS a) Interface change for emWIn V1.30 + (LCD_L0_SetLUTEntry, LCD_GetDevCap) +1.10a 000121 RS a) RECTHEIGHT, RECTWIDTH modified in order to + fix bug which would at some time prevent + displaying the first line of the display. +1.10.00 000110 RS a) Modifications in order to make it easy to + implement driver in any windows program +1.04.02 991118 RS a) additional assertion added + LCD_MAX_LOG_COLORS +1.04.01 991018 RS a) Support for LCD_FIXEDPALETTE added + with Anitaliasing enabled +1.04.00 991013 JE/RS a) Support for LCD_FIXEDPALETTE added + b) Driver now accepts the same LCDConf.h as + the embedded system + c) Bugfix for .. +1.02.02 990831 RS a) Small optimization added for 16-color bitmaps +1.02.01 990726 RS a) Transparency support for 16-color bitmpas + added +1.02.00 990212 RS a) New interface version 1.02 supported +1.00 990118 RS First release +---------------------------------------------------------------------- +Known problems or limitations with current version +---------------------------------------------------------------------- +---------------------------END-OF-HEADER------------------------------ +*/ + +#if defined(WIN32) && !defined(LCD_SIMCONTROLLER) + +#include +#include "LCD.h" +#include "LCD_Private.h" /* include LCDConf.h */ +#include "LCDSIM.h" +#include "GUI_Private.h" + +#include "memory.h" + +/********************************************************************* + * + * Defines + * + ********************************************************************** + */ + +#if LCD_BITSPERPIXEL <= 8 +#define PIXELINDEX U8 +#else +#define PIXELINDEX WORD +#endif + +#ifdef WIN32 +#ifndef ASSERT +#define ASSERT(Val) \ + if (!(Val)) \ + MessageBox(NULL, "...in file "__FILE__, "Assertion failed...", MB_OK); +#endif +#endif + +#ifdef LCD_ASSERT +#undef LCD_ASSERT +#endif +#define LCD_ASSERT(v) ASSERT(v) + +#ifndef LCD_DISPLAY_INDEX +#define LCD_DISPLAY_INDEX 0 +#endif + +/********************************************************************* + * + * Macros for internal use + */ +#ifdef _DEBUG +static int _CheckBound(unsigned int c) +{ + unsigned int NumColors = LCD_BITSPERPIXEL > 8 ? 0xffff : (1 << LCD_BITSPERPIXEL) - 1; + if (c > NumColors) + { + GUI_DEBUG_ERROROUT("LCDWin::SETPIXEL: parameters out of bounds"); + return 1; + } + return 0; +} + +#define SETPIXEL(x, y, c) \ + if (!_CheckBound(c)) \ + { \ + LCDSIM_SetPixelIndex(x, y, c, LCD_DISPLAY_INDEX); \ + } +#else +#define SETPIXEL(x, y, c) LCDSIM_SetPixelIndex(x, y, c, LCD_DISPLAY_INDEX) +#endif +#define XORPIXEL(x, y) _XorPixel(x, y) + +/********************************************************************* + * + * Static code + * + ********************************************************************** + */ + +/********************************************************************* + * + * _XorPixel + */ +static void _XorPixel(int x, int y) +{ + unsigned int Index = LCD_L0_GetPixelIndex(x, y); + LCDSIM_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Index, LCD_DISPLAY_INDEX); +} + +/********************************************************************* + * + * _DrawBitLine1BPP + */ +static void _DrawBitLine1BPP(int x, int y, U8 const *p, int Diff, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Index0 = *(pTrans + 0); + LCD_PIXELINDEX Index1 = *(pTrans + 1); + x += Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: /* Write mode */ + do + { + LCDSIM_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0, LCD_DISPLAY_INDEX); + if (++Diff == 8) + { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do + { + if (*p & (0x80 >> Diff)) + LCDSIM_SetPixelIndex(x, y, Index1, LCD_DISPLAY_INDEX); + x++; + if (++Diff == 8) + { + Diff = 0; + p++; + } + } while (--xsize); + break; + case LCD_DRAWMODE_XOR:; + do + { + if (*p & (0x80 >> Diff)) + { + int Pixel = LCDSIM_GetPixelIndex(x, y, LCD_DISPLAY_INDEX); + LCDSIM_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel, LCD_DISPLAY_INDEX); + } + x++; + if (++Diff == 8) + { + Diff = 0; + p++; + } + } while (--xsize); + break; + } +} + +/********************************************************************* + * + * _DrawBitLine2BPP + */ +#if (LCD_MAX_LOG_COLORS > 2) +static void _DrawBitLine2BPP(int x, int y, U8 const *p, int Diff, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Pixels = *p; + int CurrentPixel = Diff; + x += Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: + if (pTrans) + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + SETPIXEL(x++, y, PixelIndex); + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + SETPIXEL(x++, y, Index); + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + if (Index) + { + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + SETPIXEL(x, y, PixelIndex); + } + x++; + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (3 - CurrentPixel) << 1; + int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; + if (Index) + { + SETPIXEL(x, y, Index); + } + x++; + if (++CurrentPixel == 4) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + } +} +#endif + +/********************************************************************* + * + * _DrawBitLine4BPP + */ +#if (LCD_MAX_LOG_COLORS > 4) +static void _DrawBitLine4BPP(int x, int y, U8 const *p, int Diff, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX Pixels = *p; + int CurrentPixel = Diff; + x += Diff; + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) + { + case 0: + if (pTrans) + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + SETPIXEL(x++, y, PixelIndex); + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + SETPIXEL(x++, y, Index); + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + case LCD_DRAWMODE_TRANS: + if (pTrans) + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + if (Index) + { + LCD_PIXELINDEX PixelIndex = *(pTrans + Index); + SETPIXEL(x, y, PixelIndex); + } + x++; + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + else + { + do + { + int Shift = (1 - CurrentPixel) << 2; + int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; + if (Index) + { + SETPIXEL(x, y, Index); + } + x++; + if (++CurrentPixel == 2) + { + CurrentPixel = 0; + Pixels = *(++p); + } + } while (--xsize); + } + break; + } +} +#endif + +/********************************************************************* + * + * _DrawBitLine8BPP + */ +#if (LCD_MAX_LOG_COLORS > 16) +static void _DrawBitLine8BPP(int x, int y, U8 const *p, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX pixel; + if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) + { + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + SETPIXEL(x, y, *(pTrans + pixel)); + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + SETPIXEL(x, y, *p); + } + } + } + else + { /* Handle transparent bitmap */ + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + if (pixel) + { + SETPIXEL(x + 0, y, *(pTrans + pixel)); + } + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + if (pixel) + { + SETPIXEL(x + 0, y, pixel); + } + } + } + } +} +#endif + +/********************************************************************* + * + * _DrawBitLine16BPP + */ +#if (LCD_BITSPERPIXEL > 8) +static void _DrawBitLine16BPP(int x, int y, U16 const *p, int xsize, const LCD_PIXELINDEX *pTrans) +{ + LCD_PIXELINDEX pixel; + if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) + { + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + SETPIXEL(x, y, *(pTrans + pixel)); + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + SETPIXEL(x, y, *p); + } + } + } + else + { /* Handle transparent bitmap */ + if (pTrans) + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + if (pixel) + { + SETPIXEL(x + 0, y, *(pTrans + pixel)); + } + } + } + else + { + for (; xsize > 0; xsize--, x++, p++) + { + pixel = *p; + if (pixel) + { + SETPIXEL(x + 0, y, pixel); + } + } + } + } +} +#endif + +/********************************************************************* + * + * Exported code + * + ********************************************************************** + */ + +/********************************************************************* + * + * LCD_L0_DrawPixel + * + * Purpose: Writes 1 pixel into the display. + */ +void LCD_L0_DrawPixel(int x, int y) +{ + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) + { + XORPIXEL(x, y); + } + else + { + SETPIXEL(x, y, LCD_COLORINDEX); + } +} + +/********************************************************************* + * + * LCD_L0_DrawHLine + */ +void LCD_L0_DrawHLine(int x0, int y, int x1) +{ + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) + { + for (; x0 <= x1; x0++) + { + XORPIXEL(x0, y); + } + } + else + { + for (; x0 <= x1; x0++) + { + SETPIXEL(x0, y, LCD_COLORINDEX); + } + } +} + +/********************************************************************* + * + * LCD_L0_DrawVLine + */ +void LCD_L0_DrawVLine(int x, int y0, int y1) +{ + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) + { + while (y0 <= y1) + { + XORPIXEL(x, y0); + y0++; + } + } + else + { + while (y0 <= y1) + { + SETPIXEL(x, y0, LCD_COLORINDEX); + y0++; + } + } +} + +/********************************************************************* + * + * LCD_L0_FillRect + */ +void LCD_L0_FillRect(int x0, int y0, int x1, int y1) +{ + for (; y0 <= y1; y0++) + { + LCD_L0_DrawHLine(x0, y0, x1); + } +} + +/********************************************************************* + * + * LCD_L0_DrawBitmap + */ +void LCD_L0_DrawBitmap(int x0, int y0, + int xsize, int ysize, + int BitsPerPixel, + int BytesPerLine, + const U8 *pData, int Diff, + const LCD_PIXELINDEX *pTrans) +{ + int i; + /* + Use DrawBitLineXBPP + */ + for (i = 0; i < ysize; i++) + { + switch (BitsPerPixel) + { + case 1: + _DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans); + break; +#if (LCD_MAX_LOG_COLORS > 2) + case 2: + _DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans); + break; +#endif +#if (LCD_MAX_LOG_COLORS > 4) + case 4: + _DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans); + break; +#endif +#if (LCD_MAX_LOG_COLORS > 16) + case 8: + _DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans); + break; +#endif +#if (LCD_BITSPERPIXEL > 8) + case 16: + _DrawBitLine16BPP(x0, i + y0, (const U16 *)pData, xsize, pTrans); + break; +#endif + } + pData += BytesPerLine; + } +} + +/********************************************************************* + * + * LCD_L0_DrawBitmap + * + * Purpose: + * Sets the original position of the virtual display. + * Has no function at this point with the PC-driver. + */ +void LCD_L0_SetOrg(int x, int y) +{ + GUI_USE_PARA(x); + GUI_USE_PARA(y); +} + +/********************************************************************* + * + * Support for verification + * + * Purpose: + * The following routines are implemented, but have no functionility + * at this point. The reason is that these functions are supposed + * to supervise the hardware, which for obvious reasons can not be + * done in a simulation. + */ +#if LCD_VERIFY +int LCD_GetErrStat(void) +{ + return 0; +} +void LCD_ClrErrStat(void) +{ +} +int LCD_GetErrCnt(void) +{ + return 0; +} +#endif + +/********************************************************************* + * + * LCD_On + * LCD_Off + * + * (Not supported in Simulation) + */ +void LCD_Off(void) {} +void LCD_On(void) {} + +/********************************************************************* + * + * LCD_L0_SetLUTEntry + */ +void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR color) +{ + LCDSIM_SetLUTEntry(Pos, color, LCD_DISPLAY_INDEX); +} + +/********************************************************************* + * + * LCD_L0_Init + */ +int LCD_L0_Init(void) +{ + return 0; +} + +int LCD_L0_CheckInit(void) +{ + return 0; +} + +/********************************************************************* + * + * LCD_L0_ReInit + * + * Purpose: + * This routine is supplied for compatibility and interchangability of + * "C"-sources with embedded versions of the driver. It has no real + * effect in the PC-version as there is simply no need to re-initialize + * the LCD since it is just simulated anyhow. + */ +void LCD_L0_ReInit(void) {} + +unsigned LCD_L0_GetPixelIndex(int x, int y) +{ + return LCDSIM_GetPixelIndex(x, y, LCD_DISPLAY_INDEX); +} + +/********************************************************************* + * + * LCD_L0_XorPixel + * + * Purpose: + * Inverts 1 pixel of the display. + */ +void LCD_L0_XorPixel(int x, int y) +{ + XORPIXEL(x, y); +} + +/********************************************************************* + * + * LCD_L0_SetPixelIndex + * + * Purpose: + * Writes 1 pixel into the display. + */ +void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) +{ + SETPIXEL(x, y, ColorIndex); +} + +#else +void LCDWin_c(void); +void LCDWin_c(void) {} /* avoid empty object files */ +#endif /* defined(WIN32) && defined(LCD_USE_WINSIM) */ diff --git a/User/system/lib/lcd/gui/LCDDriver/vssver.scc b/User/system/lib/lcd/gui/LCDDriver/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..3a9a19863e5b5651307858f71abc0ca4b9f2289c GIT binary patch literal 96 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WYK7IHt)%FF-;Z9rP9Z?pHCTdUX@fg +#include "GUI_Private.h" +#include "GUIDebug.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* internal routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV__GetRect +*/ +void GUI_MEMDEV__GetRect(GUI_RECT* pRect) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + pRect->x0 = pDev->x0; + pRect->y0 = pDev->y0; + pRect->x1 = pDev->x0 + pDev->XSize-1; + pRect->y1 = pDev->y0 + pDev->YSize-1; +} + +/********************************************************************* +* +* GUI_MEMDEV__Color2Index +*/ +unsigned int GUI_MEMDEV__Color2Index(LCD_COLOR Color) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + return pDev->pfColor2Index(Color); +} + +/********************************************************************* +* +* GUI_MEMDEV__Index2Color +*/ +LCD_COLOR GUI_MEMDEV__Index2Color(int Index) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + return pDev->pfIndex2Color(Index); +} + +/********************************************************************* +* +* GUI_MEMDEV__GetIndexMask +*/ +unsigned int GUI_MEMDEV__GetIndexMask(void) { + GUI_MEMDEV * pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + return pDev->pfGetIndexMask(); +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_Delete +*/ +void GUI_MEMDEV_Delete(GUI_MEMDEV_Handle hMemDev) { +/* Make sure memory device is not used */ + GUI_LOCK(); + if (hMemDev) { + GUI_MEMDEV* pDev; + if (GUI_Context.hDevData == hMemDev) { + GUI_SelectLCD(); + } + pDev = GUI_MEMDEV_H2P(hMemDev); + /* Delete the associated usage device */ + if (pDev->hUsage) + GUI_USAGE_DecUseCnt(pDev->hUsage); + GUI_ALLOC_Free(hMemDev); + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_MEMDEV__CreateFixed +*/ +GUI_MEMDEV_Handle GUI_MEMDEV__CreateFixed(int x0, int y0, int xsize, int ysize, int Flags + ,const tLCDDEV_APIList * pMemDevAPI + ,tLCDDEV_Color2Index* pfColor2Index + ,tLCDDEV_Index2Color* pfIndex2Color + ,tLCDDEV_GetIndexMask* pfGetIndexMask) { + I32 MemSize; + GUI_USAGE_Handle hUsage = 0; + unsigned int BitsPerPixel, BytesPerLine; + GUI_MEMDEV_Handle hMemDev; + BitsPerPixel = pMemDevAPI->BitsPerPixel; + BytesPerLine = (xsize * BitsPerPixel + 7) >> 3; /* Note: This code works with 8 and 16 bit memory devices. If other BPPs are introduced for MemDevs, it needs to be changed */ + /* Calc available MemSize */ + MemSize = GUI_ALLOC_GetMaxSize(); + if (!(Flags & GUI_MEMDEV_NOTRANS)) { + MemSize = (MemSize / 4) * 3; /* We need to reserve some memory for usage object ... TBD: This can be optimized as we do not use memory perfectly. */ + } + if (ysize<=0) { + int MaxLines = (MemSize - sizeof(GUI_MEMDEV)) / BytesPerLine; + ysize = (MaxLines > -ysize) ? -ysize : MaxLines; + } + if (!(Flags & GUI_MEMDEV_NOTRANS)) { + /* Create the usage map */ + hUsage = GUI_USAGE_BM_Create(x0, y0, xsize, ysize, 0); + } + /* Check if we can alloc sufficient memory */ + if (ysize <= 0) { + GUI_DEBUG_WARN("GUI_MEMDEV_Create: Too little memory"); + GUI_UNLOCK(); + return 0; + } + MemSize = ysize * BytesPerLine + sizeof(GUI_MEMDEV); + if (Flags & GUI_MEMDEV_NOTRANS) { + hMemDev = GUI_ALLOC_AllocNoInit(MemSize); + } else { + hMemDev = GUI_ALLOC_AllocZero(MemSize); + } + if (hMemDev) { + GUI_MEMDEV* pDevData; + pDevData = GUI_MEMDEV_H2P(hMemDev); + pDevData->x0 = x0; + pDevData->y0 = y0; + pDevData->XSize = xsize; + pDevData->YSize = ysize; + pDevData->NumColors = + #if GUI_NUM_LAYERS == 1 + LCD_GET_NUMCOLORS(); + #else + LCD_GetNumColorsEx(GUI_Context.SelLayer); + #endif + pDevData->BytesPerLine = BytesPerLine; + pDevData->hUsage = hUsage; + /* Set color conversion routine pointers */ + pDevData->pfColor2Index = pfColor2Index; /* LCD_L0_Color2Index; */ + pDevData->pfIndex2Color = pfIndex2Color; /* LCD_L0_Index2Color; */ + pDevData->pfGetIndexMask= pfGetIndexMask; /* LCD_L0_GetIndexMask */ + + pDevData->pAPIList = pMemDevAPI; + pDevData->BitsPerPixel = BitsPerPixel; + #if (GUI_NUM_LAYERS > 1) /* Size opt., preprocessor not required */ + pDevData->LayerIndex = GUI_Context.SelLayer; + #else + pDevData->LayerIndex = 0; + #endif + } else { + if (hUsage) { + GUI_ALLOC_Free(hUsage); + } + GUI_DEBUG_WARN("GUI_MEMDEV_Create: Alloc failed"); + } + return hMemDev; +} + +/********************************************************************* +* +* GUI_MEMDEV_CreateEx +*/ +GUI_MEMDEV_Handle GUI_MEMDEV_CreateEx(int x0, int y0, int xSize, int ySize, int Flags) { + GUI_MEMDEV_Handle hMemDev; + const tLCDDEV_APIList * pDeviceAPI; + tLCDDEV_Color2Index * pfColor2Index; + tLCDDEV_Index2Color * pfIndex2Color; + tLCDDEV_GetIndexMask * pfGetIndexMask; + GUI_LOCK(); + #if (GUI_NUM_LAYERS > 1) /* Size opt., preprocessor not required */ + pDeviceAPI = LCD_aAPI[GUI_Context.SelLayer]; + #else + pDeviceAPI = LCD_aAPI[0]; + #endif + if (GUI_Context.hDevData == 0) { + pfColor2Index = GUI_Context.pDeviceAPI->pfColor2Index; /* LCD_L0_Color2Index; */ + pfIndex2Color = GUI_Context.pDeviceAPI->pfIndex2Color; /* LCD_L0_Index2Color; */ + pfGetIndexMask= GUI_Context.pDeviceAPI->pfGetIndexMask; /* LCD_L0_GetIndexMask */ + } else { + /* If a memory device is already selected, we create a compatible one by copying its data */ + GUI_MEMDEV* pDevSel; + pDevSel = GUI_MEMDEV_H2P(GUI_Context.hDevData); + pfColor2Index = pDevSel->pfColor2Index; + pfIndex2Color = pDevSel->pfIndex2Color; + pfGetIndexMask= pDevSel->pfGetIndexMask; + } + hMemDev = GUI_MEMDEV__CreateFixed(x0, y0, xSize, ySize, Flags, pDeviceAPI->pMemDevAPI, + pfColor2Index, pfIndex2Color ,pfGetIndexMask); + GUI_UNLOCK(); + return hMemDev; +} +/********************************************************************* +* +* GUI_MEMDEV_Create +*/ +GUI_MEMDEV_Handle GUI_MEMDEV_Create(int x0, int y0, int xsize, int ysize) { + return GUI_MEMDEV_CreateEx(x0, y0, xsize, ysize, GUI_MEMDEV_HASTRANS); +} + +/********************************************************************* +* +* GUI_MEMDEV_Select +*/ +GUI_MEMDEV_Handle GUI_MEMDEV_Select(GUI_MEMDEV_Handle hMem) { + GUI_MEMDEV_Handle r; + GUI_LOCK(); + r = GUI_Context.hDevData; + if (hMem == 0) { + GUI_SelectLCD(); + } else { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(hMem); + #if GUI_WINSUPPORT + WM_Deactivate(); + #endif + /* If LCD was selected Save cliprect */ + if (GUI_Context.hDevData == 0) { + GUI_Context.ClipRectPrev = GUI_Context.ClipRect; + } + GUI_Context.hDevData = hMem; + GUI_Context.pDeviceAPI = pDev->pAPIList; + LCD_SetClipRectMax(); + } + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_MEMDEV__WriteToActiveAt +*/ +void GUI_MEMDEV__WriteToActiveAt(GUI_MEMDEV_Handle hMem,int x, int y) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(hMem); + GUI_USAGE_h hUsage = pDev->hUsage; + GUI_USAGE* pUsage; + int YSize = pDev->YSize; + int yi; + unsigned int BytesPerLine = pDev->BytesPerLine; + unsigned int BitsPerPixel = pDev->BitsPerPixel; + int BytesPerPixel = BitsPerPixel >> 3; + U8* pData = (U8*)(pDev+1); + if (hUsage) { + pUsage = GUI_USAGE_H2P(hUsage); + for (yi = 0; yi < YSize; yi++) { + int xOff = 0; + int XSize; + XSize = GUI_USAGE_GetNextDirty(pUsage, &xOff, yi); + if (XSize == pDev->XSize) { + /* If the entire line is affected, calculate the number of entire lines */ + int y0 = yi; + while ((GUI_USAGE_GetNextDirty(pUsage, &xOff, yi + 1)) == XSize) { + yi++; + } + LCD_DrawBitmap(x, y + y0, pDev->XSize, yi - y0 + 1, 1, 1, BitsPerPixel, BytesPerLine, pData, NULL); + pData += (yi - y0 + 1) * BytesPerLine; + } else { + /* Draw the partial line which needs to be drawn */ + for (; XSize; ) { + LCD_DrawBitmap(x + xOff, y + yi, XSize, 1, 1, 1, BitsPerPixel, BytesPerLine, pData + xOff * BytesPerPixel, NULL); + xOff += XSize; + XSize = GUI_USAGE_GetNextDirty(pUsage, &xOff, yi); + } + pData += BytesPerLine; + } + } + } else { + LCD_DrawBitmap(x, y, pDev->XSize, YSize, 1, 1, BitsPerPixel, BytesPerLine, pData, NULL); + } +} + +/********************************************************************* +* +* GUI_MEMDEV_CopyToLCDAt +*/ +void GUI_MEMDEV_CopyToLCDAt(GUI_MEMDEV_Handle hMem, int x, int y) { + if (hMem) { + GUI_MEMDEV_Handle hMemPrev; + GUI_MEMDEV* pDevData; + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + #if GUI_NUM_LAYERS > 1 + int PrevLayer; + #endif + GUI_LOCK(); + hMemPrev = GUI_Context.hDevData; + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + /* Make sure LCD is selected as device */ + #if GUI_NUM_LAYERS > 1 + PrevLayer = GUI_SelectLayer(pDevData->LayerIndex); + #else + GUI_SelectLCD(); /* Activate LCD */ + #endif + if (x == GUI_POS_AUTO) { + x = pDevData->x0; + y = pDevData->y0; + } + #if (GUI_WINSUPPORT) + /* Calculate rectangle */ + r.x1 = (r.x0 = x) + pDevData->XSize-1; + r.y1 = (r.y0 = y) + pDevData->YSize-1;; + /* Do the drawing. Window manager has to be on */ + WM_Activate(); + WM_ITERATE_START(&r) { + #endif + GUI_MEMDEV__WriteToActiveAt(hMem, x, y); + #if (GUI_WINSUPPORT) + } WM_ITERATE_END(); + #endif + #if GUI_NUM_LAYERS > 1 + GUI_SelectLayer(PrevLayer); + #endif + /* Reactivate previously used device */ + GUI_MEMDEV_Select(hMemPrev); + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* GUI_MEMDEV_CopyToLCD +*/ +void GUI_MEMDEV_CopyToLCD(GUI_MEMDEV_Handle hMem) { + GUI_MEMDEV_CopyToLCDAt(hMem, GUI_POS_AUTO, GUI_POS_AUTO); +} + +#else + +void GUIDEV_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_1.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_1.c new file mode 100644 index 0000000..84fb863 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_1.c @@ -0,0 +1,603 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_1.c +Purpose : Implementation of memory devices + This file handles 1 bit memory devices. +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Macros +* +********************************************************************** +*/ + +#ifndef PIXELINDEX + #define PIXELINDEX U8 + #define BITSPERPIXEL 1 + #define API_LIST GUI_MEMDEV__APIList1 +#endif + +/********************************************************************* +* +* static consts +* +********************************************************************** +*/ +/********************************************************************* +* +* ID translation table +* +* This table serves as translation table for DDBs +*/ +static const LCD_PIXELINDEX aID[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _XY2PTR_BITOFFSET +*/ +static U8* _XY2PTR_BITOFFSET(int x, int y, int* pBitOffset) { + GUI_ALLOC_DATATYPE_U Offset; + GUI_MEMDEV* pDev; + U8* pData; + pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + pData = (U8*)(pDev + 1); + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + if ((x >= pDev->x0+pDev->XSize) | (xx0) | (y >= pDev->y0+pDev->YSize) | (yy0)) { + GUI_DEBUG_ERROROUT2("_XY2PTR: parameters out of bounds", x, y); + } + #endif + x -= pDev->x0; + y -= pDev->y0; + Offset = (GUI_ALLOC_DATATYPE_U)(y) * (GUI_ALLOC_DATATYPE_U)(pDev->BytesPerLine) + (x >> 3); + if (pBitOffset) { + *pBitOffset = 7 - (x & 7); + } + return pData + Offset; +} + +/********************************************************************* +* +* _DrawBitLine1BPP +*/ +static void _DrawBitLine1BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * p, int Diff, unsigned int xsize, + const LCD_PIXELINDEX* pTrans, GUI_MEMDEV* pDev, PIXELINDEX* pDest) +{ + PIXELINDEX pixels; + PIXELINDEX Index1; + unsigned int PixelCnt; + GUI_USE_PARA(pUsage); + PixelCnt = 8 - (Diff & 7); + pixels = (*p) << (Diff & 7); + GUI_DEBUG_ERROROUT3_IF( x < pDev->x0, "GUIDEV.c: DrawBitLine1BPP, Act= %d, Border= %d, Clip= %d" + ,x,pDev->x0, GUI_Context.ClipRect.x0); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + do { + /* Prepare loop */ + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + /* Write as many pixels as we are allowed to and have loaded in this inner loop */ + do { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + ((U8)pixels >> 7))); + pixels <<= 1; + } while (--PixelCnt); + /* Check if an other Source byte needs to be loaded */ + if (xsize == 0) { + return; + } + PixelCnt = 8; + pixels = *(++p); + } while (1); + case LCD_DRAWMODE_TRANS: + Index1 = *(pTrans + 1); + do { + /* Prepare loop */ + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + while (pixels) { + if ((pixels & 0x80)) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, Index1); + } + x++; + pixels <<= 1; + if (--PixelCnt == 0) { + break; + } + } + /* Check if an other Source byte needs to be loaded */ + if (xsize == 0) { + return; + } + x += PixelCnt; + PixelCnt = 8; + pixels = *(++p); + } while (1); + case LCD_DRAWMODE_XOR:; + PixelLoopXor: + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + do { + if ((pixels & 0x80)) { + (*pDev->pAPIList->pfXorPixel)(x, y); + } + x++; + pDest++; + pixels <<= 1; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 8; + pixels = *(++p); + goto PixelLoopXor; + } + break; + } +} + +/********************************************************************* +* +* _DrawBitLine2BPP +*/ +static void _DrawBitLine2BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * p, int Diff, int xsize, + const LCD_PIXELINDEX* pTrans, GUI_MEMDEV* pDev, PIXELINDEX* pDest) +{ + U8 pixels; + U8 PixelCnt; + GUI_USE_PARA(pUsage); + GUI_USE_PARA(pDest); + PixelCnt = 4 - (Diff & 3); + pixels = (*p) << ((Diff & 3) << 1); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + PixelLoopWrite: + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + do { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + (pixels >> 6))); + pixels <<= 2; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 4; + pixels = *(++p); + goto PixelLoopWrite; + } + break; + case LCD_DRAWMODE_TRANS: + PixelLoopTrans: + if (PixelCnt > xsize) + PixelCnt = xsize; + xsize -= PixelCnt; + do { + if (pixels & 0xc0) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, *(pTrans + (pixels >> 6))); + } + x++; + pixels <<= 2; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 4; + pixels = *(++p); + goto PixelLoopTrans; + } + break; + } +} + +/********************************************************************* +* +* _DrawBitLine4BPP +*/ +static void _DrawBitLine4BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * p, int Diff, int xsize, + const LCD_PIXELINDEX* pTrans, GUI_MEMDEV* pDev, PIXELINDEX* pDest) +{ + U8 pixels; + GUI_USE_PARA(pUsage); + GUI_USE_PARA(pDest); + pixels = (*p) << ((Diff & 1) << 2); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { +/* + * Write mode * +*/ + case 0: + /* Draw incomplete bytes to the left of center area */ + if (Diff) { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + (pixels >> 4))); + xsize--; + pixels = *++p; + } + /* Draw center area (2 pixels in one byte) */ + if (xsize >= 2) { + int i = xsize >> 1; + xsize &= 1; + do { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + (pixels >> 4))); + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + (pixels & 15))); + pixels = *++p; + } while (--i); + } + /* Draw incomplete bytes to the right of center area */ + if (xsize) { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + (pixels >> 4))); + } + break; +/* + * Transparent draw mode * +*/ + case LCD_DRAWMODE_TRANS: + /* Draw incomplete bytes to the left of center area */ + if (Diff) { + if (pixels & 0xF0) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, *(pTrans + (pixels >> 4))); + } + x++; + xsize--; + pixels = *++p; + } + /* Draw center area (2 pixels in one byte) */ + while (xsize >= 2) { + /* Draw 1. (left) pixel */ + if (pixels & 0xF0) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, *(pTrans + (pixels >> 4))); + } + /* Draw 2. (right) pixel */ + if (pixels &= 15) { + (*pDev->pAPIList->pfSetPixelIndex)(x + 1, y, *(pTrans + pixels)); + } + x += 2; + xsize -= 2; + pixels = *++p; + } + /* Draw incomplete bytes to the right of center area */ + if (xsize) { + if (pixels >>= 4) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, *(pTrans + pixels)); + } + } + break; + } +} + +/********************************************************************* +* +* _DrawBitLine8BPP +*/ +static void _DrawBitLine8BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * pSrc, int xsize, + const LCD_PIXELINDEX* pTrans, GUI_MEMDEV* pDev, PIXELINDEX* pDest) { + GUI_USE_PARA(pUsage); + GUI_USE_PARA(pDest); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + do { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *(pTrans + *pSrc)); + pSrc++; + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*pSrc) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, *(pTrans + *pSrc)); + } + x++; + pSrc++; + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* _DrawBitLine8BPP_DDB +*/ +static void _DrawBitLine8BPP_DDB(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * pSrc, int xsize, GUI_MEMDEV* pDev, PIXELINDEX* pDest) { + GUI_USE_PARA(pUsage); + GUI_USE_PARA(pDest); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + do { + (*pDev->pAPIList->pfSetPixelIndex)(x++, y, *pSrc); + pSrc++; + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*pSrc) { + (*pDev->pAPIList->pfSetPixelIndex)(x, y, *pSrc); + } + x++; + pSrc++; + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* _DrawBitmap +*/ +static void _DrawBitmap(int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans) +{ + int i; + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE* pUsage = (pDev->hUsage) ? GUI_USAGE_H2P(pDev->hUsage) : 0; + unsigned BytesPerLineDest; + PIXELINDEX* pDest; + BytesPerLineDest = pDev->BytesPerLine; + x0 += Diff; + /* Mark all affected pixels dirty unless transparency is set */ + if (pUsage) { + if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) { + GUI_USAGE_AddRect(pUsage, x0, y0 , xsize, ysize); + } + } + pDest = _XY2PTR_BITOFFSET(x0, y0, 0); +#if BITSPERPIXEL == 16 + /* handle 16 bpp bitmaps in high color modes, but only without palette */ + if (BitsPerPixel == 16) { + for (i = 0; i < ysize; i++) { + _DrawBitLine16BPP_DDB(pUsage, x0, i + y0, (const U16*)pData, xsize, pDev, pDest); + pData += BytesPerLine; + pDest = (PIXELINDEX*)((U8*)pDest + BytesPerLineDest); + } + return; + } +#endif + /* Handle 8 bpp bitmaps seperately as we have different routine bitmaps with or without palette */ + if (BitsPerPixel == 8) { + for (i = 0; i < ysize; i++) { + if (pTrans) { + _DrawBitLine8BPP(pUsage, x0, i + y0, pData, xsize, pTrans, pDev, pDest); + } else { + _DrawBitLine8BPP_DDB(pUsage, x0, i + y0, pData, xsize, pDev, pDest); + } + pData += BytesPerLine; + pDest = (PIXELINDEX*)((U8*)pDest + BytesPerLineDest); + } + return; + } + /* Use aID for bitmaps without palette */ + if (!pTrans) { + pTrans = aID; + } + for (i = 0; i < ysize; i++) { + switch (BitsPerPixel) { + case 1: + _DrawBitLine1BPP(pUsage, x0, i + y0, pData, Diff, xsize, pTrans, pDev, pDest); + break; + case 2: + _DrawBitLine2BPP(pUsage, x0, i + y0, pData, Diff, xsize, pTrans, pDev, pDest); + break; + case 4: + _DrawBitLine4BPP(pUsage, x0, i + y0, pData, Diff, xsize, pTrans, pDev, pDest); + break; + } + pData += BytesPerLine; + pDest = (PIXELINDEX*)((U8*)pDest + BytesPerLineDest); + } +} + +/********************************************************************* +* +* _FillRect +*/ +static void _FillRect(int x0, int y0, int x1, int y1) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + U8* pData; + int Bit, Len; + int RemPixels; + Len = x1 - x0 + 1; + /* Mark rectangle as modified */ + if (pDev->hUsage) { + GUI_USAGE_AddRect(GUI_USAGE_H2P(pDev->hUsage), x0, y0, Len, y1 - y0 + 1); + } + /* Do the drawing */ + for (; y0 <= y1; y0++) { + pData = _XY2PTR_BITOFFSET(x0, y0, &Bit); + RemPixels = Len; + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + if (Bit < 7) { + while ((Bit >= 0) && RemPixels--) { + *pData ^= 1 << (Bit--); + } + pData++; + } + if (RemPixels > 0) { + int NumBytes = RemPixels >> 3; + if (NumBytes > 0) { + RemPixels -= NumBytes << 3; + do { + *pData ^= *pData; + pData++; + } while (--NumBytes); + } + Bit = 7; + while (RemPixels--) { + *pData ^= 1 << (Bit--); + } + } + } else { /* Fill */ + int Color, FillByte; + Color = (LCD_COLORINDEX & 1); + FillByte = (-Color) & 0xFF; + if (Bit < 7) { + while ((Bit >= 0) && RemPixels--) { + *pData &= ~(1 << Bit); + *pData |= Color << (Bit--); + } + pData++; + } + if (RemPixels > 0) { + int NumBytes = RemPixels >> 3; + if (NumBytes > 0) { + GUI_MEMSET(pData, FillByte, NumBytes); + pData += NumBytes; + RemPixels -= NumBytes << 3; + } + Bit = 7; + while (RemPixels--) { + *pData &= ~(1 << Bit); + *pData |= Color << (Bit--); + } + } + } + } +} + +/********************************************************************* +* +* _DrawHLine +*/ +static void _DrawHLine(int x0, int y, int x1) { + _FillRect(x0, y, x1, y); +} + +/********************************************************************* +* +* _DrawVLine +*/ +static void _DrawVLine(int x , int y0, int y1) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE_h hUsage = pDev->hUsage; + GUI_USAGE* pUsage = hUsage ? GUI_USAGE_H2P(hUsage) : NULL; + U8* pData; + int Bit, Mask; + pData = _XY2PTR_BITOFFSET(x, y0, &Bit); + Mask = (1 << Bit); + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + do { + *pData ^= Mask; + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y0); + } + pData += pDev->BytesPerLine; + } while (++y0 <= y1); + } else { + int Pixel; + Pixel = (LCD_COLORINDEX & 1) << Bit; + do { + *pData &= ~Mask; + *pData |= Pixel; + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y0); + } + pData += pDev->BytesPerLine; + } while (++y0 <= y1); + } +} + +/********************************************************************* +* +* _SetPixelIndex +*/ +static void _SetPixelIndex(int x, int y, int Index) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + U8* pData; + int Bit; + pData = _XY2PTR_BITOFFSET(x, y, &Bit); + *pData &= ~(1 << Bit); + *pData |= (Index & 1) << Bit; + if (pDev->hUsage) { + GUI_USAGE_AddPixel(GUI_USAGE_H2P(pDev->hUsage), x, y); + } +} + +/********************************************************************* +* +* _XorPixel +*/ +static void _XorPixel(int x, int y) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + U8* pData; + int Bit; + pData = _XY2PTR_BITOFFSET(x, y, &Bit); + *pData ^= (1 << Bit); + if (pDev->hUsage) { + GUI_USAGE_AddPixel(GUI_USAGE_H2P(pDev->hUsage), x, y); + } +} + +/********************************************************************* +* +* _GetPixelIndex +*/ +static unsigned int _GetPixelIndex(int x, int y) { + U8* pData; + int Bit; + pData = _XY2PTR_BITOFFSET(x, y, &Bit); + return (*pData >> Bit) & 1; +} + +/********************************************************************* +* +* Device structure +* +********************************************************************** +*/ + +const tLCDDEV_APIList API_LIST = { + GUI_MEMDEV__Color2Index, + GUI_MEMDEV__Index2Color, + GUI_MEMDEV__GetIndexMask, + (tLCDDEV_DrawBitmap*)_DrawBitmap, + _DrawHLine, + _DrawVLine, + _FillRect, + _GetPixelIndex, + GUI_MEMDEV__GetRect, + _SetPixelIndex, + _XorPixel, + NULL, /* pfSetLUTEntry */ + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + NULL, /* MemDevAPI */ + BITSPERPIXEL /* BitsPerPixel */ +}; + +#else + +void GUIDEV1_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_16.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_16.c new file mode 100644 index 0000000..6c1086b --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_16.c @@ -0,0 +1,87 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_16.c +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Macros +* +********************************************************************** +*/ + +#define PIXELINDEX U16 +#define BITSPERPIXEL 16 +#define API_LIST GUI_MEMDEV__APIList16 + +/********************************************************************* +* +* _DrawBitLine16BPP_DDB +*/ +static void _DrawBitLine16BPP_DDB(GUI_USAGE* pUsage, int x, int y, const U16 *pSrc, int xsize, PIXELINDEX* pDest) { + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + memcpy(pDest, pSrc, xsize * 2); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*pSrc) { + *pDest = *pSrc; + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + x++; + pDest++; + pSrc++; + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* #include GUIDev code +* +********************************************************************** +* +* The main code is in an other "C" file. +* This has been done to avoid duplication of code. +*/ +#include "GUIDEV_8.c" + +#else + +void GUIDEV16_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_8.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_8.c new file mode 100644 index 0000000..d14509a --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_8.c @@ -0,0 +1,672 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_8.c +Purpose : Implementation of memory devices + This file handles 8 bit memory devices, but also 16 bit + memory devices when included by GUIDEV_16.c +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Macros +* +********************************************************************** +*/ + +#ifndef PIXELINDEX + #define PIXELINDEX U8 + #define BITSPERPIXEL 8 + #define API_LIST GUI_MEMDEV__APIList8 +#endif + + +/********************************************************************* +* +* static consts +* +********************************************************************** +*/ +/********************************************************************* +* +* ID translation table +* +* This table serves as translation table for DDBs +*/ +static const LCD_PIXELINDEX aID[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _XY2PTR +*/ +static PIXELINDEX* _XY2PTR(int x, int y) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + U8 *pData = (U8*)(pDev + 1); + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + if ((x >= pDev->x0+pDev->XSize) | (xx0) | (y >= pDev->y0+pDev->YSize) | (yy0)) { + GUI_DEBUG_ERROROUT2("_XY2PTR: parameters out of bounds",x,y); + } + #endif + pData += (GUI_ALLOC_DATATYPE_U)(y - pDev->y0) * (GUI_ALLOC_DATATYPE_U)pDev->BytesPerLine; + return ((PIXELINDEX*)pData) + x - pDev->x0; +} + +/********************************************************************* +* +* _DrawBitLine1BPP +*/ +static void _DrawBitLine1BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * p, int Diff, unsigned int xsize, + const LCD_PIXELINDEX* pTrans, GUI_MEMDEV* pDev, PIXELINDEX* pDest) +{ + PIXELINDEX Index1; + PIXELINDEX IndexMask; + unsigned pixels; + unsigned PixelCnt; + PixelCnt = 8 - Diff; + pixels = LCD_aMirror[*p] >> Diff; + + GUI_DEBUG_ERROROUT3_IF( x < pDev->x0, "GUIDEV.c: DrawBitLine1BPP, Act= %d, Border= %d, Clip= %d", x,pDev->x0, GUI_Context.ClipRect.x0); + + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + do { + /* Prepare loop */ + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + /* Write as many pixels as we are allowed to and have loaded in this inner loop */ + do { + *pDest++ = *(pTrans + (pixels & 1)); + pixels >>= 1; + } while (--PixelCnt); + /* Check if an other Source byte needs to be loaded */ + if (xsize == 0) { + return; + } + PixelCnt = 8; + pixels = LCD_aMirror[*++p]; + } while (1); + case LCD_DRAWMODE_TRANS: + Index1 = *(pTrans + 1); + do { + /* Prepare loop */ + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + if (pUsage) { + do { + if (pixels == 0) { /* Early out optimization; not required */ + pDest += PixelCnt; + x += PixelCnt; + break; + } + if ((pixels & 1)) { + GUI_USAGE_AddPixel(pUsage, x, y); + *pDest = Index1; + } + x++; + pDest++; + if (--PixelCnt == 0) { + break; + } + pixels >>= 1; + } while (1); + } else { + do { + if (pixels == 0) { /* Early out optimization; not required */ + pDest += PixelCnt; + break; + } + if ((pixels & 1)) { + *pDest = Index1; + } + pDest++; + if (--PixelCnt == 0) { + break; + } + pixels >>= 1; + } while (1); + } + /* Check if an other Source byte needs to be loaded */ + if (xsize == 0) { + return; + } + PixelCnt = 8; + pixels = LCD_aMirror[*(++p)]; + } while (1); + case LCD_DRAWMODE_XOR: + IndexMask = pDev->pfGetIndexMask(); + do { + /* Prepare loop */ + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + /* Write as many pixels as we are allowed to and have loaded in this inner loop */ + do { + if ((pixels & 1)) { + *pDest ^= IndexMask; + } + *pDest++; + pixels >>= 1; + } while (--PixelCnt); + /* Check if an other Source byte needs to be loaded */ + if (xsize == 0) { + return; + } + PixelCnt = 8; + pixels = LCD_aMirror[*(++p)]; + } while (1); + } +} + +/********************************************************************* +* +* _DrawBitLine2BPP +*/ +static void _DrawBitLine2BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * p, int Diff, int xsize, + const LCD_PIXELINDEX* pTrans, PIXELINDEX* pDest) +{ + U8 pixels; + U8 PixelCnt; + PixelCnt = 4 - Diff; + pixels = (*p) << (Diff << 1); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + PixelLoopWrite: + if (PixelCnt > xsize) { + PixelCnt = xsize; + } + xsize -= PixelCnt; + do { + *pDest++ = *(pTrans + (pixels >> 6)); + pixels <<= 2; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 4; + pixels = *(++p); + goto PixelLoopWrite; + } + break; + case LCD_DRAWMODE_TRANS: + PixelLoopTrans: + if (PixelCnt > xsize) + PixelCnt = xsize; + xsize -= PixelCnt; + do { + if (pixels & 0xc0) { + *pDest = *(pTrans + (pixels >> 6)); + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + pDest++; + x++; + pixels <<= 2; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 4; + pixels = *(++p); + goto PixelLoopTrans; + } + break; + case LCD_DRAWMODE_XOR:; + PixelLoopXor: + if (PixelCnt > xsize) + PixelCnt = xsize; + xsize -= PixelCnt; + do { + if ((pixels & 0xc0)) + *pDest ^= 255; + pDest++; + pixels <<= 2; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 4; + pixels = *(++p); + goto PixelLoopXor; + } + break; + } +} + +/********************************************************************* +* +* _DrawBitLine4BPP +*/ +static void _DrawBitLine4BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * p, int Diff, int xsize, + const LCD_PIXELINDEX* pTrans, PIXELINDEX* pDest) +{ + U8 pixels; + U8 PixelCnt; + PixelCnt = 2 - Diff; + pixels = (*p) << (Diff << 2); + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { +/* + * Write mode * +*/ + case 0: + /* Draw incomplete bytes to the left of center area */ + if (Diff) { + *pDest = *(pTrans + (pixels >> 4)); + pDest++; + xsize--; + pixels = *++p; + } + /* Draw center area (2 pixels in one byte) */ + if (xsize >= 2) { + int i = xsize >> 1; + xsize &= 1; + do { + *pDest = *(pTrans + (pixels >> 4)); /* Draw 1. (left) pixel */ + *(pDest+1) = *(pTrans + (pixels & 15)); /* Draw 2. (right) pixel */ + pDest += 2; + pixels = *++p; + } while (--i); + } + /* Draw incomplete bytes to the right of center area */ + if (xsize) { + *pDest = * (pTrans + (pixels >> 4)); + } + break; +/* + * Transparent draw mode * +*/ + case LCD_DRAWMODE_TRANS: + /* Draw incomplete bytes to the left of center area */ + if (Diff) { + if (pixels & 0xF0) { + *pDest = *(pTrans + (pixels >> 4)); + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + pDest++; + x++; + xsize--; + pixels = *++p; + } + /* Draw center area (2 pixels in one byte) */ + while (xsize >= 2) { + /* Draw 1. (left) pixel */ + if (pixels & 0xF0) { + *pDest = *(pTrans + (pixels >> 4)); + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + /* Draw 2. (right) pixel */ + if (pixels &= 15) { + *(pDest + 1) = *(pTrans + pixels); + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x + 1, y); + } + } + pDest += 2; + x += 2; + xsize -= 2; + pixels = *++p; + } + /* Draw incomplete bytes to the right of center area */ + if (xsize) { + if (pixels >>= 4) { + *pDest = *(pTrans + pixels); + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + } + break; + case LCD_DRAWMODE_XOR:; + PixelLoopXor: + if (PixelCnt > xsize) + PixelCnt = xsize; + xsize -= PixelCnt; + do { + if ((pixels & 0xc0)) { + *pDest ^= 255; + } + pDest++; + pixels <<= 4; + } while (--PixelCnt); + if (xsize) { + PixelCnt = 2; + pixels = *(++p); + goto PixelLoopXor; + } + break; + } +} + +/********************************************************************* +* +* _DrawBitLine8BPP +*/ +static void _DrawBitLine8BPP(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * pSrc, int xsize, + const LCD_PIXELINDEX* pTrans, PIXELINDEX* pDest) { + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + do { + *pDest = *(pTrans + *pSrc); + pDest++; + pSrc++; + } while (--xsize); + break; + case LCD_DRAWMODE_TRANS: + do { + if (*pSrc) { + *pDest = *(pTrans + *pSrc); + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + x++; + pDest++; + pSrc++; + } while (--xsize); + break; + } +} + +#if GUI_UNI_PTR_USED +/********************************************************************* +* +* _Memcopy +*/ +static void _Memcopy(PIXELINDEX * pDest, const U8 GUI_UNI_PTR * pSrc, int NumBytes) { + while(NumBytes--) { + *pDest++ = *pSrc++; + } +} +#endif + +/********************************************************************* +* +* _DrawBitLine8BPP_DDB +*/ +static void _DrawBitLine8BPP_DDB(GUI_USAGE* pUsage, int x, int y, const U8 GUI_UNI_PTR * pSrc, int xsize, PIXELINDEX* pDest) { + switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { + case 0: /* Write mode */ + #if GUI_UNI_PTR_USED + _Memcopy(pDest, pSrc, xsize); + #else + memcpy(pDest, pSrc, xsize); + #endif + break; + case LCD_DRAWMODE_TRANS: + do { + if (*pSrc) { + *pDest = *pSrc; + if (pUsage) { + GUI_USAGE_AddPixel(pUsage, x, y); + } + } + x++; + pDest++; + pSrc++; + } while (--xsize); + break; + } +} + +/********************************************************************* +* +* _DrawBitmap +*/ +static void _DrawBitmap(int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans) +{ + int i; + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE* pUsage = (pDev->hUsage) ? GUI_USAGE_H2P(pDev->hUsage) : 0; + unsigned BytesPerLineDest; + PIXELINDEX* pDest; + BytesPerLineDest = pDev->BytesPerLine; + x0 += Diff; + /* Mark all affected pixels dirty unless transparency is set */ + if (pUsage) { + if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) { + GUI_USAGE_AddRect(pUsage, x0, y0 , xsize, ysize); + } + } + pDest = _XY2PTR(x0, y0); +#if BITSPERPIXEL == 16 + /* handle 16 bpp bitmaps in high color modes, but only without palette */ + if (BitsPerPixel == 16) { + for (i = 0; i < ysize; i++) { + _DrawBitLine16BPP_DDB(pUsage, x0, i + y0, (const U16*)pData, xsize, pDest); + pData += BytesPerLine; + pDest = (PIXELINDEX*)((U8*)pDest + BytesPerLineDest); + } + return; + } +#endif + /* Handle 8 bpp bitmaps seperately as we have different routine bitmaps with or without palette */ + if (BitsPerPixel == 8) { + for (i = 0; i < ysize; i++) { + if (pTrans) { + _DrawBitLine8BPP(pUsage, x0, i + y0, pData, xsize, pTrans, pDest); + } else { + _DrawBitLine8BPP_DDB(pUsage, x0, i + y0, pData, xsize, pDest); + } + pData += BytesPerLine; + pDest = (PIXELINDEX*)((U8*)pDest + BytesPerLineDest); + } + return; + } + /* Use aID for bitmaps without palette */ + if (!pTrans) { + pTrans = aID; + } + for (i = 0; i < ysize; i++) { + switch (BitsPerPixel) { + case 1: + _DrawBitLine1BPP(pUsage, x0, i + y0, pData, Diff, xsize, pTrans, pDev, pDest); + break; + case 2: + _DrawBitLine2BPP(pUsage, x0, i + y0, pData, Diff, xsize, pTrans, pDest); + break; + case 4: + _DrawBitLine4BPP(pUsage, x0, i + y0, pData, Diff, xsize, pTrans, pDest); + break; + } + pData += BytesPerLine; + pDest = (PIXELINDEX*)((U8*)pDest + BytesPerLineDest); + } +} + +/********************************************************************* +* +* _FillRect +*/ +static void _FillRect(int x0, int y0, int x1, int y1) { + unsigned BytesPerLine; + int Len; + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + PIXELINDEX* pData = _XY2PTR(x0, y0); + BytesPerLine = pDev->BytesPerLine; + Len = x1 - x0 + 1; + /* Mark rectangle as modified */ + if (pDev->hUsage) { + GUI_USAGE_AddRect(GUI_USAGE_H2P(pDev->hUsage), x0, y0, Len, y1 - y0 + 1); + } + /* Do the drawing */ + for (; y0 <= y1; y0++) { + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + int RemPixels; + PIXELINDEX* pDest; + PIXELINDEX IndexMask; + RemPixels = Len; + pDest = pData; + IndexMask = pDev->pfGetIndexMask(); + do { + *pDest = *pDest ^ IndexMask; + pDest++; + } while (--RemPixels); + } else { /* Fill */ + #if BITSPERPIXEL == 8 + GUI_MEMSET(pData, LCD_COLORINDEX, Len); + #elif BITSPERPIXEL == 16 + GUI__memset16(pData, LCD_COLORINDEX, Len); + #else + #error Unsupported + #endif + } + pData = (PIXELINDEX*)((U8*)pData + BytesPerLine); + } +} + +/********************************************************************* +* +* _DrawHLine +*/ +static void _DrawHLine(int x0, int y, int x1) { + _FillRect(x0, y, x1, y); +} + +/********************************************************************* +* +* _DrawVLine +*/ +static void _DrawVLine(int x , int y0, int y1) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE_h hUsage = pDev->hUsage; + GUI_USAGE* pUsage = hUsage ? GUI_USAGE_H2P(hUsage) : NULL; + PIXELINDEX* pData = _XY2PTR(x, y0); + unsigned BytesPerLine = pDev->BytesPerLine; + + if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { + PIXELINDEX IndexMask; + IndexMask = pDev->pfGetIndexMask(); + do { + if (hUsage) { + GUI_USAGE_AddPixel(pUsage, x, y0); + } + *pData = *pData ^ IndexMask; + pData = (PIXELINDEX*)((U8*)pData + pDev->BytesPerLine); /* Same as "pData += pDev->BytesPerLine >> 1;", Just more efficient */ + } while (++y0 <= y1); + } else { + if (hUsage) { + do { + GUI_USAGE_AddPixel(pUsage, x, y0); + *pData = LCD_COLORINDEX; + pData = (PIXELINDEX*)((U8*)pData + BytesPerLine); /* Same as "pData += pDev->BytesPerLine >> 1;", Just more efficient */ + } while (++y0 <= y1); + } else { + unsigned NumPixels; + NumPixels = y1 - y0 + 1; + do { + *pData = LCD_COLORINDEX; + pData = (PIXELINDEX*)((U8*)pData + BytesPerLine); /* Same as "pData += pDev->BytesPerLine >> 1;", Just more efficient */ + } while (--NumPixels); + } + } +} + +/********************************************************************* +* +* _SetPixelIndex +*/ +static void _SetPixelIndex(int x, int y, int Index) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE_h hUsage = pDev->hUsage; + PIXELINDEX* pData = _XY2PTR(x, y); + *pData = Index; + if (hUsage) { + GUI_USAGE_AddPixel(GUI_USAGE_H2P(hUsage), x, y); + } +} + +/********************************************************************* +* +* _XorPixel +*/ +static void _XorPixel(int x, int y) { + PIXELINDEX IndexMask; + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE_h hUsage = pDev->hUsage; + PIXELINDEX* pData = _XY2PTR(x, y); + IndexMask = pDev->pfGetIndexMask(); + *pData = *pData ^ IndexMask; + if (hUsage) { + GUI_USAGE_AddPixel(GUI_USAGE_H2P(hUsage), x, y); + } +} + +/********************************************************************* +* +* _GetPixelIndex +*/ +static unsigned int _GetPixelIndex(int x, int y) { + PIXELINDEX* pData = _XY2PTR(x, y); + return *pData; +} + +/********************************************************************* +* +* Device structure +* +********************************************************************** +*/ + +const tLCDDEV_APIList API_LIST = { + GUI_MEMDEV__Color2Index, + GUI_MEMDEV__Index2Color, + GUI_MEMDEV__GetIndexMask, + (tLCDDEV_DrawBitmap*)_DrawBitmap, + _DrawHLine, + _DrawVLine, + _FillRect, + _GetPixelIndex, + GUI_MEMDEV__GetRect, + _SetPixelIndex, + _XorPixel, + NULL, /* pfSetLUTEntry */ + NULL, /* pfFillPolygon */ + NULL, /* pfFillPolygonAA */ + NULL, /* MemDevAPI */ + BITSPERPIXEL /* BitsPerPixel */ +}; + +#else + +void GUIDEV8_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_AA.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_AA.c new file mode 100644 index 0000000..1c91936 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_AA.c @@ -0,0 +1,161 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_AA.c +Purpose : Memory device drawing with Antialiasing +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +1.02 000804 RS LCD_CopyFromLCDAA added +1.00a 000804 RS Fix for odd X-sizes +1.00 000728 RS First release +---------------------------------------------------------------------- +Known problems or limitations with current version +---------------------------------------------------------------------- +None. +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define SETPIXEL(x,y,colorindex) _SetPixel(x,y,colorindex); +#define BKCOLORINDEX GUI_Context.pDevData->aColorIndex[0] +#define COLORINDEX GUI_Context.pDevData->aColorIndex[1] + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_CopyToLCDAA +*/ +void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem) { + GUI_LOCK(); + /* Make sure memory handle is valid */ + if (hMem) { + GUI_MEMDEV_Handle hMemPrev; + #if GUI_NUM_LAYERS > 1 + int PrevLayer; + #endif + int x, y; + GUI_MEMDEV* pDev = (GUI_MEMDEV*)GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + LCD_PIXELINDEX* pData0 = (LCD_PIXELINDEX*)(pDev+1); + int LineOff = pDev->XSize; + int x0 = pDev->x0; + int y0 = pDev->y0; + int XMax = pDev->XSize / 2; + int YMax = pDev->YSize / 2; + hMemPrev = GUI_Context.hDevData; + #if GUI_NUM_LAYERS > 1 + PrevLayer = GUI_SelectLayer(pDev->LayerIndex); /* Should not we switch back to the orig. layer when done ? */ + #else + GUI_SelectLCD(); /* Activate LCD */ + #endif + for (y = 0; y < YMax; y++) { + LCD_PIXELINDEX* pData = pData0; + for (x = 0; x < XMax; x++) { + LCD_PIXELINDEX PixelIndex; + int ColorSep[3]; + U32 Color = LCD_Index2Color(*pData); + ColorSep[0] = Color&255; + ColorSep[1] = (Color>>8) &255; + ColorSep[2] = (Color>>16) &255; + Color = LCD_Index2Color(*(pData+1)); + ColorSep[0] += Color&255; + ColorSep[1] += (Color>>8) &255; + ColorSep[2] += (Color>>16) &255; + Color = LCD_Index2Color(*(pData+LineOff)); + ColorSep[0] += Color&255; + ColorSep[1] += (Color>>8) &255; + ColorSep[2] += (Color>>16) &255; + Color = LCD_Index2Color(*(pData+LineOff+1)); + ColorSep[0] += Color&255; + ColorSep[1] += (Color>>8) &255; + ColorSep[2] += (Color>>16) &255; + Color = (ColorSep[0]+2)>>2; + Color |= ((ColorSep[1]+2)>>2)<<8; + Color |= ((U32)((ColorSep[2]+2)>>2))<<16; + PixelIndex = LCD_Color2Index(Color); + LCD_SetPixelIndex(x+x0, y+y0, PixelIndex); + pData += 2; + } + pData0 += 2 * LineOff; + } + #if GUI_NUM_LAYERS > 1 + GUI_SelectLayer(PrevLayer); + #endif + /* Reactivate previously used device */ + GUI_MEMDEV_Select(hMemPrev); + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_MEMDEV_CopyFromLCDAA +*/ +void GUI_MEMDEV_CopyFromLCDAA(GUI_MEMDEV_Handle hMem) { + /* Make sure memory handle is valid */ + if (!hMem) { + hMem = GUI_Context.hDevData; + } + if (hMem) { + int x, y; + GUI_MEMDEV* pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + GUI_USAGE* pUsage = 0; + int x0 = pDevData->x0; + int y0 = pDevData->y0; + int XMax = pDevData->XSize/2; + int YMax = pDevData->YSize/2; + LCD_PIXELINDEX* pData = (LCD_PIXELINDEX*)(pDevData+1); + int LineOff = pDevData->BytesPerLine; + if (pDevData->hUsage) + pUsage = GUI_USAGE_H2P(pDevData->hUsage); + for (y=0; y< YMax; y++) { + if (pUsage) { + GUI_USAGE_AddHLine(pUsage, 0, y*2, pDevData->XSize); + GUI_USAGE_AddHLine(pUsage, 0, y*2+1, pDevData->XSize); + } + for (x=0; x< XMax; x++) { + *pData = *(pData+1) = *(pData+LineOff) = *(pData+LineOff+1) = LCD_GetPixelIndex(x+x0,y+y0); + pData+=2; + } + pData += LineOff + (pDevData->XSize&1); + } + } +} + +#else + +void GUIDEV_AA(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_Auto.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_Auto.c new file mode 100644 index 0000000..9e50a70 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_Auto.c @@ -0,0 +1,100 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_Auto.c +Purpose : Implementation of automatic banding memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled. */ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_CreateAuto +*/ +int GUI_MEMDEV_CreateAuto(GUI_AUTODEV* pAutoDev) { + pAutoDev->FirstCall = 1; + return 0; +} + +/********************************************************************* +* +* GUI_MEMDEV_DeleteAuto +*/ +void GUI_MEMDEV_DeleteAuto(GUI_AUTODEV* pAutoDev) { + GUI_USE_PARA(pAutoDev); +} + +/********************************************************************* +* +* GUI_MEMDEV_DrawAuto +*/ +int GUI_MEMDEV_DrawAuto(GUI_AUTODEV* pAutoDev, GUI_AUTODEV_INFO* pAutoDevInfo, GUI_CALLBACK_VOID_P* pfDraw, void* pData) { + GUI_RECT rTemp; + GUI_HMEM hMem = GUI_MEASDEV_Create(); + if (!hMem) { + return 1; + } + GUI_MEASDEV_Select(hMem); + /* Measure area to draw */ + if (pAutoDev->FirstCall) { + /* Measure complete area */ + pAutoDevInfo->DrawFixed = 1; + pfDraw(pData); + GUI_MEASDEV_GetRect(hMem, &pAutoDev->rView); + /* Measure variable area only */ + GUI_MEASDEV_ClearRect(hMem); + pAutoDevInfo->DrawFixed = 0; + pfDraw(pData); + GUI_MEASDEV_GetRect(hMem, &pAutoDev->rPrev); + } else { + /* Measure variable area only */ + pfDraw(pData); + GUI_MEASDEV_GetRect(hMem, &pAutoDev->rView); + rTemp = pAutoDev->rView; + GUI_MergeRect(&pAutoDev->rView, &pAutoDev->rView, &pAutoDev->rPrev); + pAutoDev->rPrev = rTemp; + } + GUI_MEASDEV_Delete(hMem); + /* Do the actual drawing */ + pAutoDevInfo->DrawFixed = 1; + if (GUI_MEMDEV_Draw(&pAutoDev->rView, pfDraw, pData, 0, GUI_MEMDEV_NOTRANS)) { + return 1; + } + pAutoDevInfo->DrawFixed = 0; + pAutoDev->FirstCall = 0; + return 0; +} + +#else + +void GUIDEV_Auto(void) {} /* avoid empty object files */ + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_Banding.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_Banding.c new file mode 100644 index 0000000..02ee541 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_Banding.c @@ -0,0 +1,143 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_Banding.c +Purpose : Implementation of banding memory devices +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- + 010830 RS GUI_MEMDEV_Draw now limits rectangle to + LCD area in order to avoid wasting computation time + 001109 RS Bugfix: x0 was changed to 0 when moving the + active area. Fixed. +1.00 001015 RS First release +0.00.00 00 RS Initial version for internal tests +---------------------------------------------------------------------- +Known problems or limitations with current version +---------------------------------------------------------------------- +None +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled. */ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Min +*/ +static int _Min(int v0, int v1) { + if (v0 <= v1) { + return v0; + } + return v1; +} + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_Draw +* +* This routine uses a banding memory device to draw the +* given area flicker free. It not only draws, but also +* automatically calculates the size of, creates, moves +* and then destroys the memory device. +*/ +int GUI_MEMDEV_Draw(GUI_RECT* pRect, GUI_CALLBACK_VOID_P* pfDraw, void* pData, int NumLines, int Flags) { + int x0, y0, x1, y1, xsize, ysize; + GUI_MEMDEV_Handle hMD; + if (pRect) { + x0 = (pRect->x0 < 0) ? 0 : pRect->x0; + y0 = (pRect->y0 < 0) ? 0 : pRect->y0; + #if GUI_NUM_LAYERS == 1 + x1 = _Min(pRect->x1, LCD_GET_XSIZE() - 1); + y1 = _Min(pRect->y1, LCD_GET_YSIZE() - 1); + #else + x1 = _Min(pRect->x1, LCD_GetXSizeEx(GUI_Context.SelLayer) - 1); + y1 = _Min(pRect->y1, LCD_GetYSizeEx(GUI_Context.SelLayer) - 1); + #endif + xsize = x1 - x0 + 1; + ysize = y1 - y0 + 1; + } else { + x0 = 0; + y0 = 0; + #if GUI_NUM_LAYERS == 1 + xsize = LCD_GET_XSIZE(); + ysize = LCD_GET_YSIZE(); + #else + xsize = LCD_GetXSizeEx(GUI_Context.SelLayer); + ysize = LCD_GetYSizeEx(GUI_Context.SelLayer); + #endif + } + if (NumLines == 0) { + NumLines = -ysize; /* Request lines ... Less is o.k. */ + } + if ((xsize <= 0) || (ysize <= 0)) + return 0; /* Nothing to do ... */ +/* Create memory device */ + hMD = GUI_MEMDEV_CreateEx(x0, y0, xsize, NumLines, Flags); + if (!hMD) { + GUI_DEBUG_ERROROUT("GUI_MEMDEV_Draw() Not enough memory ..."); /* Not enough memory ! */ + pfDraw(pData); + return 1; + } + NumLines = GUI_MEMDEV_GetYSize(hMD); + GUI_MEMDEV_Select(hMD); +/* Start drawing ... */ + { + int i; + for (i = 0; i < ysize; i += NumLines) { + int RemLines = ysize - i; + if (RemLines < NumLines) { + GUI_MEMDEV_ReduceYSize(hMD, RemLines); + } + if (i) { + GUI_MEMDEV_SetOrg(hMD, x0, y0 + i); + GUI_MEMDEV_Clear(hMD); + } + pfDraw(pData); + GUI_MEMDEV_CopyToLCD(hMD); + } + } + GUI_MEMDEV_Delete(hMD); + GUI_MEMDEV_Select(0); + return 0; /* Success ! */ +} + +#else + +void GUIDEV_Banding(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_Clear.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_Clear.c new file mode 100644 index 0000000..e36dcb2 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_Clear.c @@ -0,0 +1,66 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_Clear.c +Purpose : Implementation of memory devices, add. module +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include + +/* Memory device capabilities are compiled only if support for them is enabled. */ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_Clear +*/ +void GUI_MEMDEV_Clear(GUI_MEMDEV_Handle hMem) { + if (!hMem) { + if ((hMem = GUI_Context.hDevData) == 0) { + return; + } + } + { + GUI_MEMDEV* pDev; + GUI_USAGE_h hUsage; + GUI_LOCK(); + pDev = GUI_MEMDEV_H2P(hMem); /* Convert to pointer */ + hUsage = pDev->hUsage; + if (hUsage) { + GUI_USAGE* pUsage = GUI_USAGE_H2P(hUsage); + GUI_USAGE_Clear(pUsage); + } + GUI_UNLOCK(); + } +} + +#else + +void GUIDEV_Clear(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_CmpWithLCD.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_CmpWithLCD.c new file mode 100644 index 0000000..c7af2af --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_CmpWithLCD.c @@ -0,0 +1,115 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_CmpWithLCD.c +Purpose : Implementation of Checking for memory devices +---------------------------------------------------------------------- +Version-Date---Author-Explanation +---------------------------------------------------------------------- +1.00 000418 RS First version for release (all tests O.K.) +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled. */ + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_CompareWithLCD +*/ +int GUI_MEMDEV_CompareWithLCD(GUI_MEMDEV_Handle hMem, int*px, int*py, int *pExp, int*pAct) { + int Ret = 0; + /* Make sure memory handle is valid */ + if (!hMem) { + hMem = GUI_Context.hDevData; + } + if (!hMem) { + return 1; + } + GUI_LOCK(); + { + GUI_MEMDEV * pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + int y = pDevData->y0; + int x0 = pDevData->x0; + int XMax = pDevData->XSize + x0; + int YMax = pDevData->YSize + y; + int Max; + int MagX = LCD_GetXMag(); + int MagY = LCD_GetYMag(); + /* Calculate limits */ + if (y < 0) { + y = 0; + } + if (x0 < 0) { + x0 = 0; + } + Max = LCD_GET_YSIZE(); + if (YMax > Max) { + YMax = Max; + } + Max = LCD_GET_XSIZE(); + if (XMax > Max) { + XMax = Max; + } + for (; y < YMax; y++) { + int x = x0; + U8 * pData = (U8 *)GUI_MEMDEV__XY2PTR(x, y); + for (x = x0; x < XMax; x++) { + int Exp = *pData++; + int Act = LCD_L0_GetPixelIndex(x * MagX, y * MagY); + #if (GUI_NUM_LAYERS > 1) + if (LCD_GetBitsPerPixelEx(GUI_Context.SelLayer) > 8) + #else + if (LCD_GetBitsPerPixel() > 8) + #endif + { + Exp |= (*pData++) << 8; + } + if (Act != Exp) { + *px = x; + *py = y; + *pAct = Act; + *pExp = Exp; + Ret = 1; + goto Skip; + } + } + } + } +Skip: + GUI_UNLOCK(); + return Ret; +} + +#else + +void GUIDEV_CmpWithLCD(void) {} /* avoid empty object files */ + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_CopyFromLCD.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_CopyFromLCD.c new file mode 100644 index 0000000..6dffe17 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_CopyFromLCD.c @@ -0,0 +1,92 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_CopyFromLCD.c +Purpose : Implementation of memory devices +---------------------------------------------------------------------- +*/ + +#include "GUI_Private.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled. */ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define LCD_LIMIT(Var, Op, Limit) if (Var Op Limit) Var = Limit + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_CopyFromLCD +*/ +void GUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle hMem) { + /* Make sure memory handle is valid */ + if (!hMem) { + hMem = GUI_Context.hDevData; + } + if (!hMem) { + return; + } + { + GUI_MEMDEV* pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + LCD_RECT r; + int y; + int XMax; + GUI_USAGE* pUsage = 0; + GUI_MEMDEV_Handle hMemOld = GUI_Context.hDevData; + GUI_MEMDEV_Select(hMem); + if (pDevData->hUsage) + pUsage = GUI_USAGE_H2P(pDevData->hUsage); + /* Get bounding rectangle */ + r.y0 = pDevData->y0; + r.x0 = pDevData->x0; + r.x1 = pDevData->x0 + pDevData->XSize - 1; + r.y1 = pDevData->y0 + pDevData->YSize - 1; + /* Make sure bounds are within LCD area so we can call driver directly */ + LCD_LIMIT(r.x0, <, 0); + LCD_LIMIT(r.y0, <, 0); + LCD_LIMIT(r.x1, >, LCD_GET_XSIZE() - 1); + LCD_LIMIT(r.y1, >, LCD_GET_YSIZE() - 1); + XMax = r.x1; + for (y = r.y0; y <= r.y1; y++) { + int x = r.x0; + LCD_PIXELINDEX* pData = (LCD_PIXELINDEX*)GUI_MEMDEV__XY2PTR(x,y); + if (pUsage) + GUI_USAGE_AddHLine(pUsage, x, y, r.x1 - r.x0 + 1); + for (; x <= XMax; x++) { + *pData++ = LCD_L0_GetPixelIndex(x, y); + } + } + GUI_MEMDEV_Select(hMemOld); + } +} + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_CreateFixed.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_CreateFixed.c new file mode 100644 index 0000000..1b60f24 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_CreateFixed.c @@ -0,0 +1,56 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_CreateFixed.c +Purpose : Implementation of GUI_MEMDEV_CreateFixed +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ + +GUI_MEMDEV_Handle GUI_MEMDEV_CreateFixed(int x0, int y0, + int xsize, int ysize, int Flags, + const tLCDDEV_APIList * pMemDevAPI, + const LCD_API_COLOR_CONV * pColorConvAPI) { + GUI_MEMDEV_Handle hMemDev; + GUI_LOCK(); + hMemDev = GUI_MEMDEV__CreateFixed(x0, y0, xsize, ysize, Flags, pMemDevAPI, + pColorConvAPI->pfColor2Index, + pColorConvAPI->pfIndex2Color, + pColorConvAPI->pfGetIndexMask); + GUI_UNLOCK(); + return hMemDev; +} + +#else + +void GUIDEV_CreateFixed_C(void); +void GUIDEV_CreateFixed_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_GetDataPtr.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_GetDataPtr.c new file mode 100644 index 0000000..1c09da0 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_GetDataPtr.c @@ -0,0 +1,54 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_GetDataPtr.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_GetDataPtr +*/ +void* GUI_MEMDEV_GetDataPtr(GUI_MEMDEV_Handle hMem) { + GUI_MEMDEV* pDev; + void *pData; + GUI_LOCK(); /* Needed so the memory management does not complain */ + pDev = GUI_MEMDEV_H2P(hMem); + GUI_UNLOCK(); + pData = (void*)(pDev + 1); + return pData; +} + + +#else + +void GUI_MEMDEV_GetDataPtr_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_GetXSize.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_GetXSize.c new file mode 100644 index 0000000..b74083b --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_GetXSize.c @@ -0,0 +1,61 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_GetXSize.C +Purpose : Implementation of memory devices, add. module +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled. */ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_GetXSize +*/ +int GUI_MEMDEV_GetXSize(GUI_MEMDEV_Handle hMem) { + int r = 0; + GUI_MEMDEV* pDevData; + GUI_LOCK(); + if (hMem == 0) { + hMem = GUI_Context.hDevData; + } + if (hMem) { + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + r = pDevData->XSize; + } + GUI_UNLOCK(); + return r; +} + +#else + +void GUIDEV_GetXSize_C(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_GetYSize.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_GetYSize.c new file mode 100644 index 0000000..d8a65b3 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_GetYSize.c @@ -0,0 +1,62 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_GetYSize.c +Purpose : Implementation of memory devices, add. module +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled. */ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_GetYSize +*/ +int GUI_MEMDEV_GetYSize(GUI_MEMDEV_Handle hMem) { + int r = 0; + GUI_MEMDEV* pDevData; + GUI_LOCK(); + if (hMem == 0) { + hMem = GUI_Context.hDevData; + } + if (hMem) { + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + r = pDevData->YSize; + } + GUI_UNLOCK(); + return r; +} + +#else + +void GUIDEV_GetYSize(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_Measure.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_Measure.c new file mode 100644 index 0000000..fffdd97 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_Measure.c @@ -0,0 +1,389 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_Measure.c +Purpose : Implementation of measurement devices + The purpose of a measurement device is to find out the + area (Rectangle) affected by a sequence of drawing + operations. +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" +#if GUI_WINSUPPORT + #include "WM.h" +#endif + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* typedefs +* +********************************************************************** +*/ + +typedef struct { + GUI_RECT rUsed; + tLCDDEV_Color2Index* pfColor2Index; + tLCDDEV_Index2Color* pfIndex2Color; + tLCDDEV_GetIndexMask* pfGetIndexMask; +} GUI_MEASDEV; + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define GUI_MEASDEV_H2P(h) ((GUI_MEASDEV*)GUI_ALLOC_h2p(h)) + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _MarkPixel +*/ +static void _MarkPixel(int x, int y) { + GUI_MEASDEV* pDev = (GUI_MEASDEV*)(GUI_MEMDEV_H2P(GUI_Context.hDevData)); + if (x < pDev->rUsed.x0) + pDev->rUsed.x0 = x; + if (x > pDev->rUsed.x1) + pDev->rUsed.x1 = x; + if (y < pDev->rUsed.y0) + pDev->rUsed.y0 = y; + if (y > pDev->rUsed.y1) + pDev->rUsed.y1 = y; +} + +/********************************************************************* +* +* _MarkRect +*/ +static void _MarkRect(int x0, int y0, int x1, int y1) { + GUI_MEASDEV* pDev = (GUI_MEASDEV*)(GUI_MEMDEV_H2P(GUI_Context.hDevData)); + if (x0 < pDev->rUsed.x0) + pDev->rUsed.x0 = x0; + if (x1 > pDev->rUsed.x1) + pDev->rUsed.x1 = x1; + if (y1 < pDev->rUsed.y0) + pDev->rUsed.y0 = y0; + if (y1 > pDev->rUsed.y1) + pDev->rUsed.y1 = y1; +} + +/********************************************************************* +* +* _DrawBitmap +*/ +static void _DrawBitmap(int x0, int y0, int xsize, int ysize, + int BitsPerPixel, int BytesPerLine, + const U8 GUI_UNI_PTR * pData, int Diff, + const LCD_PIXELINDEX* pTrans) +{ + GUI_USE_PARA(BitsPerPixel); + GUI_USE_PARA(BytesPerLine); + GUI_USE_PARA(pData); + GUI_USE_PARA(Diff); + GUI_USE_PARA(pTrans); + _MarkRect(x0, y0, x0 + xsize - 1, y0 + ysize - 1); +} + +/********************************************************************* +* +* _DrawHLine +*/ +static void _DrawHLine(int x0, int y, int x1) { + _MarkRect(x0, y, x1, y); +} + +/********************************************************************* +* +* _DrawVLine +*/ +static void _DrawVLine(int x , int y0, int y1) { + _MarkRect(x, y0, x, y1); +} + +/********************************************************************* +* +* _SetPixelIndex +*/ +static void _SetPixelIndex(int x, int y, int Index) { + GUI_USE_PARA(Index); + _MarkPixel(x, y); +} + +/********************************************************************* +* +* _XorPixel +*/ +static void _XorPixel(int x, int y) { + _MarkPixel(x, y); +} + +/********************************************************************* +* +* _GetPixelIndex +*/ +static unsigned int _GetPixelIndex(int x, int y) { + GUI_USE_PARA(x); + GUI_USE_PARA(y); + return 0; +} + +/********************************************************************* +* +* _FillRect +*/ +static void _FillRect(int x0, int y0, int x1, int y1) { + _MarkRect(x0, y0, x1, y1); +} + +/********************************************************************* +* +* _GetRect +*/ +static void _GetRect(LCD_RECT* pRect) { + pRect->x0 = pRect->y0 = -4095; + pRect->x1 = pRect->y1 = 4095; +} + +/********************************************************************* +* +* _Color2Index +*/ +static unsigned int _Color2Index(LCD_COLOR Color) { + GUI_MEASDEV* pDev = GUI_MEASDEV_H2P(GUI_Context.hDevData); + return pDev->pfColor2Index(Color); +} + +/********************************************************************* +* +* _Index2Color +*/ +static LCD_COLOR _Index2Color(int Index) { + GUI_MEASDEV* pDev = GUI_MEASDEV_H2P(GUI_Context.hDevData); + return pDev->pfIndex2Color(Index); +} + +/********************************************************************* +* +* _GetIndexMask +*/ +static unsigned int _GetIndexMask(void) { + GUI_MEASDEV* pDev = GUI_MEASDEV_H2P(GUI_Context.hDevData); + return pDev->pfGetIndexMask(); +} + +/********************************************************************* +* +* _CalcPolyRect +*/ +static void _CalcPolyRect(GUI_RECT *pr, const GUI_POINT* paPoint, int NumPoints) { + int i; + int xMin, xMax, yMin, yMax; + xMin = GUI_XMAX; + yMin = GUI_YMAX; + xMax = GUI_XMIN; + yMax = GUI_YMIN; + for (i = 0; i x; + int y = paPoint->y; + if (xMin > x) + xMin = x; + if (xMax < x) + xMax = x; + if (yMin > y) + yMin = y; + if (yMax < y) + yMax = y; + paPoint++; + } + pr->x0 = xMin; + pr->x1 = xMax; + pr->y0 = yMin; + pr->y1 = yMax; +} + +/********************************************************************* +* +* _FillPolygon +*/ +static void _FillPolygon(const GUI_POINT* paPoint, int NumPoints, int x0, int y0) { + GUI_RECT r; + _CalcPolyRect(&r, paPoint, NumPoints); + GUI_MoveRect(&r, x0, y0); + _MarkRect(r.x0, r.y0, r.x1, r.y1); +} + +/********************************************************************* +* +* _FillPolygonAA +*/ +static void _FillPolygonAA(const GUI_POINT* paPoint, int NumPoints, int x0, int y0) { + #if GUI_SUPPORT_AA + GUI_RECT r; + _CalcPolyRect(&r, paPoint, NumPoints); + GUI_MoveRect(&r, x0, y0); + if (GUI_Context.AA_HiResEnable) { + r.x0 /= GUI_Context.AA_Factor; + r.y0 /= GUI_Context.AA_Factor; + r.x1 = (r.x1 + GUI_Context.AA_Factor - 1) / GUI_Context.AA_Factor; + r.y1 = (r.y1 + GUI_Context.AA_Factor - 1) / GUI_Context.AA_Factor; + } + _MarkRect(r.x0, r.y0, r.x1, r.y1); + #else + GUI_USE_PARA(paPoint); + GUI_USE_PARA(NumPoints); + GUI_USE_PARA(x0); + GUI_USE_PARA(y0); + #endif +} + +/********************************************************************* +* +* Device structure +*/ +static const tLCDDEV_APIList _APIList = { + _Color2Index, + _Index2Color, + _GetIndexMask, + (tLCDDEV_DrawBitmap*)_DrawBitmap, + _DrawHLine, + _DrawVLine, + _FillRect, + _GetPixelIndex, + _GetRect, + _SetPixelIndex, + _XorPixel, + NULL, + _FillPolygon, + _FillPolygonAA +}; + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEASDEV_Delete +*/ +void GUI_MEASDEV_Delete(GUI_MEASDEV_Handle hMemDev) { + /* Make sure memory device is not used */ + if ((GUI_Context.hDevData = hMemDev) != 0) { + GUI_SelectLCD(); + } + GUI_ALLOC_Free(hMemDev); +} + +/********************************************************************* +* +* GUI_MEASDEV_ClearRect +*/ +void GUI_MEASDEV_ClearRect(GUI_MEASDEV_Handle hMemDev) { + if (hMemDev) { + GUI_MEASDEV* pDevData; + GUI_LOCK(); + pDevData = (GUI_MEASDEV*)GUI_ALLOC_h2p(hMemDev); + pDevData->rUsed.x0 = GUI_XMAX; + pDevData->rUsed.y0 = GUI_YMAX; + pDevData->rUsed.x1 = GUI_XMIN; + pDevData->rUsed.y1 = GUI_YMIN; + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* GUI_MEASDEV_Create +*/ +GUI_MEASDEV_Handle GUI_MEASDEV_Create(void) { + int MemSize; + GUI_MEASDEV_Handle hMemDev; + MemSize = sizeof(GUI_MEASDEV); + hMemDev = GUI_ALLOC_AllocZero(MemSize); + if (hMemDev) { + GUI_MEASDEV* pDevData; + GUI_LOCK(); + pDevData = (GUI_MEASDEV*)GUI_ALLOC_h2p(hMemDev); + pDevData->pfColor2Index = GUI_Context.pDeviceAPI->pfColor2Index; + pDevData->pfIndex2Color = GUI_Context.pDeviceAPI->pfIndex2Color; + GUI_MEASDEV_ClearRect(hMemDev); + GUI_UNLOCK(); + } else { + GUI_DEBUG_WARN("GUI_MEASDEV_Create: Alloc failed"); + } + return hMemDev; +} + +/********************************************************************* +* +* GUI_MEASDEV_Select +*/ +void GUI_MEASDEV_Select(GUI_MEASDEV_Handle hMem) { + if (hMem == 0) { + GUI_SelectLCD(); + } else { + #if GUI_WINSUPPORT + WM_Deactivate(); + #endif + GUI_Context.hDevData = hMem; + GUI_Context.pDeviceAPI = &_APIList; + GUI_Context.pClipRect_HL = NULL; + LCD_SetClipRectMax(); + } +} + +/********************************************************************* +* +* GUI_MEASDEV_GetRect +*/ +void GUI_MEASDEV_GetRect(GUI_MEASDEV_Handle hMem, GUI_RECT* pRect) { + if (hMem) { + GUI_MEASDEV* pDev; + GUI_LOCK(); + pDev = (GUI_MEASDEV*)GUI_ALLOC_h2p(hMem); + if (pRect) { + pRect->x0 = pDev->rUsed.x0; + pRect->y0 = pDev->rUsed.y0; + pRect->x1 = pDev->rUsed.x1; + pRect->y1 = pDev->rUsed.y1; + } + GUI_UNLOCK(); + } +} + +#else + +void GUIDEV_Measure(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_ReduceYSize.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_ReduceYSize.c new file mode 100644 index 0000000..b3623b7 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_ReduceYSize.c @@ -0,0 +1,64 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_ReduceYSize.c +Purpose : Implementation of memory devices, add. module +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include + +/* Memory device capabilities are compiled only if support for them is enabled. */ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_ReduceYSize +*/ +void GUI_MEMDEV_ReduceYSize(GUI_MEMDEV_Handle hMem, int YSize) { + /* Make sure memory handle is valid */ + if (!hMem) + hMem = GUI_Context.hDevData; + if (!hMem) + return; + { + GUI_MEMDEV * pDevData; + GUI_LOCK(); + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + if (YSize < pDevData->YSize) { + pDevData->YSize = YSize; + } + GUI_UNLOCK(); + } +} + +#else + +void GUIDEV_ReduceYSize(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_SetOrg.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_SetOrg.c new file mode 100644 index 0000000..686eccd --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_SetOrg.c @@ -0,0 +1,72 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_SetOrg.c +Purpose : Implementation of memory devices, add. module +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include "GUI_Protected.h" +#include "GUIDebug.h" +#include + +/* Memory device capabilities are compiled only if support for them is enabled. */ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_SetOrg +*/ +void GUI_MEMDEV_SetOrg(GUI_MEMDEV_Handle hMem, int x0, int y0) { + /* Make sure memory handle is valid */ + if (!hMem) { + if ((hMem = GUI_Context.hDevData) ==0) { + return; + } + } + GUI_LOCK(); + { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(hMem); /* Convert to pointer */ + pDev->y0 = y0; + pDev->x0 = x0; + LCD_SetClipRectMax(); + /* Move usage along */ + if (pDev->hUsage) { + GUI_USAGE* pUsage = GUI_USAGE_H2P(pDev->hUsage); + if (((pUsage->XSize = pDev->XSize) != 0) && ((pUsage->YSize = pDev->YSize) != 0)) { + pUsage->x0 = x0; + pUsage->y0 = y0; + } + } + } + GUI_UNLOCK(); +} + +#else + +void GUIDEV_SetOrg(void) {} /* avoid empty object files */ + +#endif /* GUI_MEMDEV_SUPPORT */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_Usage.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_Usage.c new file mode 100644 index 0000000..7bee8c6 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_Usage.c @@ -0,0 +1,85 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_Usage.C +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_USAGE_Select +*/ +void GUI_USAGE_Select(GUI_USAGE_Handle hUsage) { + GUI_MEMDEV * pDev; + GUI_LOCK(); + pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + pDev->hUsage = hUsage; + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_USAGE_DecUseCnt +* +* Purpose: Decrements the usage count and deletes the usage object if +* the counter reaches 0. +*/ +void GUI_USAGE_DecUseCnt(GUI_USAGE_Handle hUsage) { + GUI_USAGE* pThis; + GUI_LOCK(); + pThis = GUI_USAGE_H2P(hUsage); + if (--pThis->UseCnt == 0) { + GUI_ALLOC_Free(hUsage); + } + GUI_UNLOCK(); +} + +/********************************************************************* +* +* GUI_USAGE_AddRect +* +* Parameters: +* hUsage: Handle to usage object. May not be 0 ! +*/ +void GUI_USAGE_AddRect(GUI_USAGE* pUsage, int x0, int y0, int xSize, int ySize) { + do { + GUI_USAGE_AddHLine(pUsage, x0, y0++, xSize); + } while (--ySize); +} + +#else + +void GUIDEV_Usage(void) {} /* avoid empty object files */ + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_UsageBM.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_UsageBM.c new file mode 100644 index 0000000..15eaf13 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_UsageBM.c @@ -0,0 +1,250 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_UsageBM.C +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Protected.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* GUI_USAGE_BM structure +* +********************************************************************** +*/ + +typedef struct { + GUI_USAGE Public; + struct { + int BytesPerLine; + } Private; +} GUI_USAGE_BM; + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_USAGE_BM_AddPixel +*/ +static void GUI_USAGE_BM_AddPixel(GUI_USAGE* p, int x, int y) { + U8* pData; + GUI_USAGE_BM * pThis = (GUI_USAGE_BM*)p; + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + if ((x >= pThis->Public.x0 + pThis->Public.XSize) | (x < pThis->Public.x0) + | (y >= pThis->Public.y0 + pThis->Public.YSize) | (y < pThis->Public.y0)) + { + GUI_DEBUG_ERROROUT2("GUI_USAGE_BM_AddPixel: parameters out of bounds",x,y); + } + #endif + x -= pThis->Public.x0; + pData = (U8*)(pThis+1); + pData += (y-pThis->Public.y0) * pThis->Private.BytesPerLine; + pData += x>>3; + *pData|= 0x80>>(x&7); +} + +/********************************************************************* +* +* GUI_USAGE_BM_AddHLine +*/ +static void GUI_USAGE_BM_AddHLine(GUI_USAGE* p, int x, int y, int len) { +#if 0 /* Enable for the slower, but smaller version ... xxx*/ + while (len-- >0) + GUI_USAGE_BM_AddPixel(h, x++,y); +#else + U8* pData; + GUI_USAGE_BM * pThis = (GUI_USAGE_BM*)p; + /* Asserts */ + GUI_DEBUG_ERROROUT3_IF( xPublic.x0, "GUIDEV.c: MarkPixels: negative x offset, Act= %d, Border= %d, Clip= %d" + ,x, pThis->Public.x0, GUI_Context.ClipRect.x0); + /* Calculate pointers */ + x -= pThis->Public.x0; + pData = (U8*)(pThis+1); + pData += (y-pThis->Public.y0) * pThis->Private.BytesPerLine; + pData += x>>3; + /* Set bits */ + { + int x1 = x+len-1; /* last pixel */ + int NumBytes = (x1>>3) - (x>>3); + U8 Mask0 = 0xff >> (x&7); + U8 Mask1 = 0xff << (7-(x1&7)); + if (NumBytes ==0) { + *pData |= (Mask0&Mask1); + } else { + *pData++ |= Mask0; /* Mark first byte */ + /* Mark middle bytes */ + if (--NumBytes > 0) { + memset (pData, 0xff, NumBytes); + pData += NumBytes; + } + *pData |= Mask1; /* Mark last bytes */ + } + } +#endif +} + +/********************************************************************* +* +* GUI_USAGE_BM_Clear +*/ +static void GUI_USAGE_BM_Clear(GUI_USAGE* p) { + GUI_USAGE_BM * pThis = (GUI_USAGE_BM*) p; + memset (pThis+1, 0, pThis->Public.YSize * pThis->Private.BytesPerLine); +} + +/********************************************************************* +* +* GUI_USAGE_BM_GetNextDirty +*/ +static int GUI_USAGE_BM_GetNextDirty(GUI_USAGE* p, int *pxOff, int yOff) { + int x = *pxOff; + int xEnd; + GUI_USAGE_BM * pThis = (GUI_USAGE_BM*)p; + int xSize = pThis->Public.XSize; + U8* pData = (U8*)(pThis+1); + if (yOff >= pThis->Public.YSize) { + return 0; + } + pData += yOff * pThis->Private.BytesPerLine; + pData += (x>>3); + if (x>=xSize) + return 0; + { +/* Find first bit */ + int BytesLeft = ((xSize-1) >>3) - (x>>3); + /* Check first byte */ + U8 Data = (*pData++) << (x&7); + while (Data == 0) { + if (BytesLeft ==0) + return 0; + Data = *pData++; + BytesLeft--; + x= (x+8) & ~7; + } + while ((Data&0x80) ==0) { + Data<<=1; + x++; + } +/* Find last cleared byte */ + if (Data != 0xff) { /* This line is simply a speed-opt and may be eliminated */ + xEnd =x; + while (Data&0x40) { + Data<<=1; + xEnd++; + } + } else { + xEnd =x+7; + } + if ((xEnd&7) ==7) { + while (--BytesLeft >= 0) { + if ((Data = *pData++) == 0xff) { + xEnd+=8; + } else { + while (Data&0x80) { + Data<<=1; + xEnd++; + } + break; + } + } + } + + } + *pxOff =x; + return xEnd-x+1; +} + +/********************************************************************* +* +* Delete +*/ +static void _GUI_USAGE_BM_Delete(GUI_MEMDEV_Handle hDevUsage) { + GUI_ALLOC_Free(hDevUsage); +} + +/********************************************************************* +* +* API List +*/ +static const tUSAGE_APIList API = { + GUI_USAGE_BM_AddPixel, /* tUSAGE_AddPixel* */ + GUI_USAGE_BM_AddHLine, /* tUSAGE_AddHLine* */ + GUI_USAGE_BM_Clear, /* tUSAGE_Clear* */ + 0, /* tUSAGE_CreateCompatible* */ + _GUI_USAGE_BM_Delete, /* tUSAGE_Delete* */ + GUI_USAGE_BM_GetNextDirty /* tUSAGE_GetNextDirty* */ + +}; + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_USAGE_BM_Create +*/ +GUI_USAGE_Handle GUI_USAGE_BM_Create(int x0, int y0, int xsize, int ysize, int Flags) { + int MemSize; + int BytesPerLine; + GUI_USAGE_Handle hMem; + GUI_USE_PARA(Flags); + BytesPerLine = ((xsize+15) >>4)<<1; /* 2 byte alignment */ + MemSize = ysize*BytesPerLine +sizeof(GUI_USAGE_BM); + hMem = GUI_ALLOC_AllocZero(MemSize); + /* Check if we can alloc sufficient memory */ + if (!hMem) { + GUI_DEBUG_ERROROUT("GUI_USAGE_BM_Create: Too little memory"); + return 0; + } + { + GUI_USAGE_BM * pUsage; + GUI_LOCK(); + pUsage = (GUI_USAGE_BM*)GUI_ALLOC_h2p(hMem); + pUsage->Public.x0 = x0; + pUsage->Public.y0 = y0; + pUsage->Public.XSize = xsize; + pUsage->Public.YSize = ysize; + pUsage->Public.pAPI = &API; + pUsage->Public.UseCnt= 1; + pUsage->Private.BytesPerLine= BytesPerLine; + GUI_UNLOCK(); + } + return hMem; +} + +#else + +void GUIDEV_UsageBM(void) {} /* avoid empty object files */ + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_Write.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_Write.c new file mode 100644 index 0000000..0fcafb7 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_Write.c @@ -0,0 +1,81 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDev.C +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_WriteAt +*/ +void GUI_MEMDEV_WriteAt(GUI_MEMDEV_Handle hMem, int x, int y) { + if (hMem) { + GUI_MEMDEV* pDevData; + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + if (x == GUI_POS_AUTO) { + x = pDevData->x0; + y = pDevData->y0; + } + #if (GUI_WINSUPPORT) + /* Calculate rectangle */ + r.x1 = (r.x0 = x) + pDevData->XSize-1; + r.y1 = (r.y0 = y) + pDevData->YSize-1;; + /* Do the drawing. WIndow manager has to be on */ + WM_ITERATE_START(&r) { + GUI_MEMDEV__WriteToActiveAt(hMem,x,y); + } WM_ITERATE_END(); + #else + GUI_MEMDEV__WriteToActiveAt(hMem,x,y); + #endif + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* GUI_MEMDEV_Write +*/ +void GUI_MEMDEV_Write(GUI_MEMDEV_Handle hMem) { + GUI_MEMDEV_WriteAt(hMem, GUI_POS_AUTO, GUI_POS_AUTO); +} + +#else + +void GUIDEV_Write_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_WriteAlpha.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_WriteAlpha.c new file mode 100644 index 0000000..e0f981a --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_WriteAlpha.c @@ -0,0 +1,132 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_WriteAlpha.C +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _WriteAlphaToActiveAt +*/ +static void _WriteAlphaToActiveAt(GUI_MEMDEV_Handle hMem, int Intens, int x, int y) { + /* Make sure the memory handle is valid */ + if (hMem) { + GUI_MEMDEV * pDev = GUI_MEMDEV_H2P(hMem); + GUI_USAGE_h hUsage = pDev->hUsage; + GUI_USAGE* pUsage; + int YSize = pDev->YSize; + int yi; + if (hUsage) { + pUsage = GUI_USAGE_H2P(hUsage); + for (yi = 0; yi < YSize; yi++) { + int xOff = 0; + int XSize; + XSize = GUI_USAGE_GetNextDirty(pUsage, &xOff, yi); + /* Draw the partial line which needs to be drawn */ + for (; XSize; ) { + U8* pData; + pData = (U8*)GUI_MEMDEV__XY2PTREx(pDev, xOff, yi); + do { + LCD_COLOR Color, BkColor; + int xPos, yPos, Index; + if (pDev->BitsPerPixel == 8) { + Index = *pData++; + } else { + Index = *(U16*)pData; + pData += 2; + } + Color = LCD_Index2Color(Index); + xPos = xOff + x; + yPos = yi +y; + BkColor = LCD_GetPixelColor(xPos, yPos); + Color = LCD_MixColors256(Color, BkColor, Intens); + Index = LCD_Color2Index(Color); + LCD_SetPixelIndex(xPos, yPos, Index); + xOff++; + } while (--XSize); + XSize = GUI_USAGE_GetNextDirty(pUsage, &xOff, yi); + } + } + } + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_WriteAlphaAt +*/ +void GUI_MEMDEV_WriteAlphaAt(GUI_MEMDEV_Handle hMem, int Alpha, int x, int y) { + if (hMem) { + GUI_MEMDEV* pDevData; + #if (GUI_WINSUPPORT) + GUI_RECT r; + #endif + GUI_LOCK(); + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); /* Convert to pointer */ + if (x == GUI_POS_AUTO) { + x = pDevData->x0; + y = pDevData->y0; + } + #if (GUI_WINSUPPORT) + r.x1 = (r.x0 = x) + pDevData->XSize-1; + r.y1 = (r.y0 = y) + pDevData->YSize-1;; + WM_ITERATE_START(&r) { + _WriteAlphaToActiveAt(hMem, Alpha, x,y); + } WM_ITERATE_END(); + #else + _WriteAlphaToActiveAt(hMem, Alpha, x,y); + #endif + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* GUI_MEMDEV_WriteAlpha +*/ +void GUI_MEMDEV_WriteAlpha(GUI_MEMDEV_Handle hMem, int Alpha) { + GUI_MEMDEV_WriteAlphaAt(hMem, Alpha, GUI_POS_AUTO, GUI_POS_AUTO); +} + +#else + +void GUIDEV_WriteAlpha_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_WriteEx.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_WriteEx.c new file mode 100644 index 0000000..e89105b --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_WriteEx.c @@ -0,0 +1,272 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_WriteEx.C +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include "GUI_Private.h" +#include "GUIDebug.h" + +/* Memory device capabilities are compiled only if support for them is enabled.*/ +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetPixelIndex +* +*/ +static int _GetPixelIndex(const U8* pData, int x, int y, int bpp, int BytesPerLine) { + if (bpp == 8) { + return (int)(*(pData + (y * BytesPerLine) + x)); + } else { + return (int)(*(const U16*)(pData + (y * BytesPerLine) + (x << 1))); + } +} + +/********************************************************************* +* +* _DrawHLineAlpha +*/ +static void _DrawHLineAlpha(int x0, int y, int x1, int Intens) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + GUI_USAGE_h hUsage = pDev->hUsage; + LCD_COLOR Color1, Color2; + int Len = x1 - x0 + 1; + if (hUsage) { + GUI_USAGE_AddHLine(GUI_USAGE_H2P(hUsage), x0, y, Len); + } + Color1 = LCD_Index2Color(LCD_COLORINDEX); + if (pDev->BitsPerPixel == 8) { + U8* pData; + pData = (U8*) GUI_MEMDEV__XY2PTR(x0, y); + while (Len--) { + Color2 = LCD_Index2Color(*(pData)); + Color2 = LCD_MixColors256(Color1, Color2, Intens); + *(pData++) = LCD_Color2Index(Color2); + } + } else { + U16* pData; + pData = (U16*) GUI_MEMDEV__XY2PTR(x0, y); + while (Len--) { + Color2 = LCD_Index2Color(*(pData)); + Color2 = LCD_MixColors256(Color1, Color2, Intens); + *(pData++) = LCD_Color2Index(Color2); + } + } +} + +/********************************************************************* +* +* _DrawBitmapLineEx +*/ +static void _DrawBitmapLineEx(int x0, int y0, int xOff, int yOff, int xSize, int xMag, int Alpha, + int bpp, int BytesPerLine, const U8* pData) { + int x, xi, xAct, xStart, xMagAbs, xiMag, xMin, xMax, Cached; + LCD_PIXELINDEX Index = 0, IndexPrev = 0; + /* Use clipping rect */ + xMin = GUI_Context.ClipRect.x0 - x0; + xMax = GUI_Context.ClipRect.x1 - x0; + /* Init some values */ + xMagAbs = (xMag > 0) ? xMag : -xMag; + x = (xOff * xMagAbs) / 1000; + xiMag = (xOff * xMagAbs) % 1000; + xStart = -1; + Cached = 0; + for (xi = 0; xi < xSize; xi++) { + xiMag += xMagAbs; + if (xiMag >= 1000) { + if (x <= xMax) { + xAct = (xMag > 0) ? xi : xSize - xi - 1; + Index = _GetPixelIndex(pData, xOff + xAct, yOff, bpp, BytesPerLine); + if ((Index != IndexPrev) || (xStart == -1)) { + if ((xStart != -1) && (x > xMin)) { + /* Clear cache */ + if (xStart < xMin) { + xStart = xMin; + } + LCD_SetColorIndex(IndexPrev); + if (Alpha == 256 || !GUI_Context.hDevData) { + LCDDEV_L0_DrawHLine(x0 + xStart, y0, x0 + x - 1); + } else { + _DrawHLineAlpha(x0 + xStart, y0, x0 + x - 1, Alpha); + } + } + IndexPrev = Index; + xStart = x; + Cached = 1; + } + do { + x++; + xiMag -= 1000; + } while (xiMag >= 1000); + } else { + x = xMax + 1; + break; + } + } + } + if (Cached && (x > xMin)) { + /* Clear cache */ + if (xStart < xMin) { + xStart = xMin; + } + LCD_SetColorIndex(Index); + if (Alpha == 256 || !GUI_Context.hDevData) { + LCDDEV_L0_DrawHLine(x0 + xStart, y0, x0 + x - 1); + } else { + _DrawHLineAlpha(x0 + xStart, y0, x0 + x - 1, Alpha); + } + } +} + +/********************************************************************* +* +* _DrawBitmapEx +*/ +static void _DrawBitmapEx(int x0, int y0, int xOff, int yOff, int xSize, int ySize, int xMag, int yMag, + int Alpha, int BmpSizeX, int BmpSizeY, int bpp, int BytesPerLine, const U8* pData) { + int y, yi, yMin, yMax, yEnd, yPrev; + yMin = GUI_Context.ClipRect.y0; + yMax = GUI_Context.ClipRect.y1; + if (xMag < 0) { + x0 -= (BmpSizeX - (xOff << 1) - xSize) * xMag / 1000; + } + if (yMag < 0) { + y0 -= (BmpSizeY - 1) * yMag / 1000; + } + yEnd = y0 + GUI__DivideRound32(((I32)(yOff) * yMag), 1000); + yPrev = yEnd + 1; + for (yi = yOff; yi < (yOff + ySize); yi++) { + y = yEnd; + yEnd = y0 + GUI__DivideRound32(((I32)(yi + 1) * yMag), 1000); + if (y != yPrev) { + yPrev = y; + do { + if ((y >= yMin) && (y <= yMax)) { + _DrawBitmapLineEx(x0, y, xOff, yi, xSize, xMag, Alpha, bpp, BytesPerLine, pData); + } + } while ((yMag < 0) ? (--y > yEnd) : (++y < yEnd)); + } + } +} + +/********************************************************************* +* +* _WriteExToActiveAt +*/ +static void _WriteExToActiveAt(GUI_MEMDEV_Handle hMem, int x, int y, int xMag, int yMag, int Alpha) { + GUI_MEMDEV* pDev; + GUI_USAGE_h hUsage; + GUI_USAGE* pUsage; + U8* pData; + int yAct, yPrev, ySize, yi; + int BytesPerLine, bpp; + pDev = GUI_MEMDEV_H2P(hMem); + hUsage = pDev->hUsage; + ySize = pDev->YSize; + BytesPerLine = pDev->BytesPerLine; + pData = (U8*)(pDev + 1); + bpp = pDev->BitsPerPixel; + yPrev = y + 1; + if (hUsage) { + int xOff, xSize, y0; + pUsage = GUI_USAGE_H2P(hUsage); + for (yi = 0; yi < ySize; yi++) { + yAct = y + GUI__DivideRound32(((I32)(yi) * yMag), 1000); + if (yAct != yPrev) { + xOff = 0; + xSize = GUI_USAGE_GetNextDirty(pUsage, &xOff, yi); + if (xSize == pDev->XSize) { + /* If the entire line is affected, calculate the number of entire lines */ + y0 = yi; + while (GUI_USAGE_GetNextDirty(pUsage, &xOff, yi + 1) == xSize) { + yi++; + } + _DrawBitmapEx(x, y, 0, y0, pDev->XSize, yi - y0 + 1, xMag, yMag, Alpha, + pDev->XSize, pDev->YSize, bpp, BytesPerLine, pData); + yPrev = y + GUI__DivideRound32(((I32)(yi) * yMag), 1000); + } else { + /* Draw the partial line which needs to be drawn */ + while (xSize) { + _DrawBitmapEx(x, y, xOff, yi, xSize, 1, xMag, yMag, Alpha, + pDev->XSize, pDev->YSize, bpp, BytesPerLine, pData); + xOff += xSize; + xSize = GUI_USAGE_GetNextDirty(pUsage, &xOff, yi); + } + yPrev = yAct; + } + } + } + } else { + _DrawBitmapEx(x, y, 0, 0, pDev->XSize, ySize, xMag, yMag, Alpha, + pDev->XSize, pDev->YSize, bpp, BytesPerLine, pData); + } +} + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV_WriteExAt +*/ +void GUI_MEMDEV_WriteExAt(GUI_MEMDEV_Handle hMem, int x, int y, int xMag, int yMag, int Alpha) { + if (hMem) { + GUI_MEMDEV* pDevData; + GUI_RECT ClipRectPrev; + GUI_LOCK(); + pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem); + if (x == GUI_POS_AUTO) { + x = pDevData->x0; + y = pDevData->y0; + } + ClipRectPrev = GUI_Context.ClipRect; + LCD_SetClipRectMax(); + _WriteExToActiveAt(hMem, x, y, xMag, yMag, Alpha); + GUI_Context.ClipRect = ClipRectPrev; + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* GUI_MEMDEV_WriteEx +*/ +void GUI_MEMDEV_WriteEx(GUI_MEMDEV_Handle hMem, int xMag, int yMag, int Alpha) { + GUI_MEMDEV_WriteExAt(hMem, GUI_POS_AUTO, GUI_POS_AUTO, xMag, yMag, Alpha); +} + +#else + +void GUIDEV_WriteEx_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MemDev/GUIDEV_XY2PTR.c b/User/system/lib/lcd/gui/MemDev/GUIDEV_XY2PTR.c new file mode 100644 index 0000000..8751348 --- /dev/null +++ b/User/system/lib/lcd/gui/MemDev/GUIDEV_XY2PTR.c @@ -0,0 +1,66 @@ +/********************************************************************* +* SEGGER MICROCONTROLLER SYSTEME GmbH * +* Solutions for real time microcontroller applications * +********************************************************************** +* * +* (c) 1996 - 2004 SEGGER Microcontroller Systeme GmbH * +* * +* Internet: www.segger.com Support: support@segger.com * +* * +********************************************************************** + +***** emWin - Graphical user interface for embedded applications ***** +emWin is protected by international copyright laws. Knowledge of the +source code may not be used to write a similar product. This file may +only be used in accordance with a license and should not be re- +distributed in any way. We appreciate your understanding and fairness. +---------------------------------------------------------------------- +File : GUIDEV_XY2PTR.c +Purpose : Implementation of memory devices +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Private.h" +#include "GUIDebug.h" + +#if GUI_SUPPORT_MEMDEV + +/********************************************************************* +* +* modul internal routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_MEMDEV__XY2PTR +*/ +void* GUI_MEMDEV__XY2PTR(int x, int y) { + GUI_MEMDEV* pDev = GUI_MEMDEV_H2P(GUI_Context.hDevData); + U8 *pData = (U8*)(pDev + 1); + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + if ((x >= pDev->x0+pDev->XSize) | (xx0) | (y >= pDev->y0+pDev->YSize) | (yy0)) { + GUI_DEBUG_ERROROUT2("GUI_MEMDEV__XY2PTR: parameters out of bounds",x,y); + } + #endif + pData += (y - pDev->y0) * pDev->BytesPerLine; + return pData + (x - pDev->x0) * (pDev->BitsPerPixel / 8); +} + +/********************************************************************* +* +* GUI_MEMDEV__XY2PTREx +*/ +void* GUI_MEMDEV__XY2PTREx(GUI_MEMDEV* pDev, int x, int y) { + U8 *pData = (U8*)(pDev + 1); + pData += y * pDev->BytesPerLine; + return pData + x * (pDev->BitsPerPixel / 8); +} + +#else + +void GUIDEV_XY2PTR_C(void) {} + +#endif /* GUI_SUPPORT_MEMDEV */ + +/*************************** end of file ****************************/ diff --git a/User/system/lib/lcd/gui/MultiLayer/CCGUIMultiLayer.bat b/User/system/lib/lcd/gui/MultiLayer/CCGUIMultiLayer.bat new file mode 100644 index 0000000..43387f3 --- /dev/null +++ b/User/system/lib/lcd/gui/MultiLayer/CCGUIMultiLayer.bat @@ -0,0 +1,6 @@ +@ECHO OFF +ECHO CCGUIMultiLayer.BAT: Compiling GUI\MultiLayer +CALL CC LCD_1 +CALL CC LCD_2 +CALL CC LCD_3 +CALL CC LCD_4 diff --git a/User/system/lib/lcd/gui/MultiLayer/LCD_1.c b/User/system/lib/lcd/gui/MultiLayer/LCD_1.c new file mode 100644 index 0000000..7ba35bb --- /dev/null +++ b/User/system/lib/lcd/gui/MultiLayer/LCD_1.c @@ -0,0 +1,183 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_1.C +Purpose : Glue code for second display in a multi-controller + environment +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD_Private.h" /* private modul definitions & config */ + +#define LCD_1_C + +#if GUI_NUM_LAYERS > 1 + + +/********************************************************************* +* +* Map the defines for this controller +* +* #define LCD_ LCD__1 +* +********************************************************************** +*/ + +#undef LCD_CONTROLLER +#define LCD_CONTROLLER LCD_CONTROLLER_1 + +#undef LCD_XSIZE +#define LCD_XSIZE LCD_XSIZE_1 + +#undef LCD_YSIZE +#define LCD_YSIZE LCD_YSIZE_1 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_1 + +#undef LCD_VYSIZE +#define LCD_VYSIZE LCD_VYSIZE_1 + +#undef LCD_MIRROR_X +#define LCD_MIRROR_X LCD_MIRROR_X_1 + +#undef LCD_MIRROR_Y +#define LCD_MIRROR_Y LCD_MIRROR_Y_1 + +#undef LCD_SWAP_XY +#define LCD_SWAP_XY LCD_SWAP_XY_1 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_1 + +/* Optional defines */ + +#ifdef LCD_CACHE_1 + #ifdef LCD_CACHE + #undef LCD_CACHE + #endif + #define LCD_CACHE LCD_CACHE_1 +#endif + +#ifdef LCD_CACHE_CONTROL_1 + #ifdef LCD_CACHE_CONTROL + #undef LCD_CACHE_CONTROL + #endif + #define LCD_CACHE_CONTROL LCD_CACHE_CONTROL_1 +#endif + +#ifdef LCD_CHECKBUSY_1 + #ifdef LCD_CHECKBUSY + #undef LCD_CHECKBUSY + #endif + #define LCD_CHECKBUSY LCD_CHECKBUSY_1 +#endif + +#ifdef LCD_FIRSTSEG0_1 + #undef LCD_FIRSTSEG0 + #define LCD_FIRSTSEG0 LCD_FIRSTSEG0_1 +#endif + +#ifdef LCD_LASTSEG0_1 + #undef LCD_LASTSEG0 + #define LCD_LASTSEG0 LCD_LASTSEG0_1 +#endif + +#ifdef LCD_FIRSTCOM0_1 + #undef LCD_FIRSTCOM0 + #define LCD_FIRSTCOM0 LCD_FIRSTCOM0_1 +#endif + +#ifdef LCD_LASTCOM0_1 + #undef LCD_LASTCOM0 + #define LCD_LASTCOM0 LCD_LASTCOM0_1 +#endif + +#ifdef LCD_XORG0_1 + #undef LCD_XORG0 + #define LCD_XORG0 LCD_XORG0_1 +#endif + +#ifdef LCD_YORG0_1 + #undef LCD_YORG0 + #define LCD_YORG0 LCD_YORG0_1 +#endif + +#ifdef LCD_SWAP_RB_1 + #undef LCD_SWAP_RB + #define LCD_SWAP_RB LCD_SWAP_RB_1 +#endif + +#ifdef LCD_FIXEDPALETTE_1 + #undef LCD_FIXEDPALETTE + #define LCD_FIXEDPALETTE LCD_FIXEDPALETTE_1 +#endif + +#ifdef LCD_DELTA_MODE_1 + #undef LCD_DELTA_MODE + #define LCD_DELTA_MODE LCD_DELTA_MODE_1 +#endif + +#ifdef LCD_BITSPERPIXEL_L0_1 + #undef LCD_BITSPERPIXEL_L0 + #define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL_1 +#endif + +/********************************************************************* +* +* Rename identifiers +* +********************************************************************** +*/ +#define LCD_L0_Color2Index LCD_L0_1_Color2Index +#define LCD_L0_ControlCache LCD_L0_1_ControlCache +#define LCD_L0_DrawBitmap LCD_L0_1_DrawBitmap +#define LCD_L0_DrawHLine LCD_L0_1_DrawHLine +#define LCD_L0_DrawVLine LCD_L0_1_DrawVLine +#define LCD_L0_DrawPixel LCD_L0_1_DrawPixel +#define LCD_L0_FillRect LCD_L0_1_FillRect +#define LCD_L0_GetPixelIndex LCD_L0_1_GetPixelIndex +#define LCD_L0_GetRect LCD_L0_1_GetRect +#define LCD_L0_Index2Color LCD_L0_1_Index2Color +#define LCD_L0_Init LCD_L0_1_Init +#define LCD_L0_Off LCD_L0_1_Off +#define LCD_L0_On LCD_L0_1_On +#define LCD_L0_ReInit LCD_L0_1_ReInit +#define LCD_L0_Refresh LCD_L0_1_Refresh +#define LCD_L0_SetLUTEntry LCD_L0_1_SetLUTEntry +#define LCD_L0_SetOrg LCD_L0_1_SetOrg +#define LCD_L0_SetPixelIndex LCD_L0_1_SetPixelIndex +#define LCD_L0_XorPixel LCD_L0_1_XorPixel +#define LCD_L0_CheckInit LCD_L0_1_CheckInit +#define LCD_L0_GetIndexMask LCD_L0_1_GetIndexMask + +#define LCD_PhysColors LCD_PhysColors_1 +#define LCD_PhysPal LCD_PhysPal_1 + +/********************************************************************* +* +* Include the generic part & driver +* +********************************************************************** +*/ + +#define LCD_DISPLAY_INDEX 1 +#include "LCD_IncludeDriver.h" + +#else + void LCD_1_c(void); + void LCD_1_c(void) {} /* avoid empty object files */ +#endif + diff --git a/User/system/lib/lcd/gui/MultiLayer/LCD_2.c b/User/system/lib/lcd/gui/MultiLayer/LCD_2.c new file mode 100644 index 0000000..3f8f4da --- /dev/null +++ b/User/system/lib/lcd/gui/MultiLayer/LCD_2.c @@ -0,0 +1,183 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_2.C +Purpose : Glue code for second display in a multi-controller + environment +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD_Private.h" /* private modul definitions & config */ + +#define LCD_2_C + +#if GUI_NUM_LAYERS > 2 + + +/********************************************************************* +* +* Map the defines for this controller +* +* #define LCD_ LCD__2 +* +********************************************************************** +*/ + +#undef LCD_CONTROLLER +#define LCD_CONTROLLER LCD_CONTROLLER_2 + +#undef LCD_XSIZE +#define LCD_XSIZE LCD_XSIZE_2 + +#undef LCD_YSIZE +#define LCD_YSIZE LCD_YSIZE_2 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_2 + +#undef LCD_VYSIZE +#define LCD_VYSIZE LCD_VYSIZE_2 + +#undef LCD_MIRROR_X +#define LCD_MIRROR_X LCD_MIRROR_X_2 + +#undef LCD_MIRROR_Y +#define LCD_MIRROR_Y LCD_MIRROR_Y_2 + +#undef LCD_SWAP_XY +#define LCD_SWAP_XY LCD_SWAP_XY_2 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_2 + +/* Optional defines */ + +#ifdef LCD_CACHE_2 + #ifdef LCD_CACHE + #undef LCD_CACHE + #endif + #define LCD_CACHE LCD_CACHE_2 +#endif + +#ifdef LCD_CACHE_CONTROL_2 + #ifdef LCD_CACHE_CONTROL + #undef LCD_CACHE_CONTROL + #endif + #define LCD_CACHE_CONTROL LCD_CACHE_CONTROL_2 +#endif + +#ifdef LCD_CHECKBUSY_2 + #ifdef LCD_CHECKBUSY + #undef LCD_CHECKBUSY + #endif + #define LCD_CHECKBUSY LCD_CHECKBUSY_2 +#endif + +#ifdef LCD_FIRSTSEG0_2 + #undef LCD_FIRSTSEG0 + #define LCD_FIRSTSEG0 LCD_FIRSTSEG0_2 +#endif + +#ifdef LCD_LASTSEG0_2 + #undef LCD_LASTSEG0 + #define LCD_LASTSEG0 LCD_LASTSEG0_2 +#endif + +#ifdef LCD_FIRSTCOM0_2 + #undef LCD_FIRSTCOM0 + #define LCD_FIRSTCOM0 LCD_FIRSTCOM0_2 +#endif + +#ifdef LCD_LASTCOM0_2 + #undef LCD_LASTCOM0 + #define LCD_LASTCOM0 LCD_LASTCOM0_2 +#endif + +#ifdef LCD_XORG0_2 + #undef LCD_XORG0 + #define LCD_XORG0 LCD_XORG0_2 +#endif + +#ifdef LCD_YORG0_2 + #undef LCD_YORG0 + #define LCD_YORG0 LCD_YORG0_2 +#endif + +#ifdef LCD_SWAP_RB_2 + #undef LCD_SWAP_RB + #define LCD_SWAP_RB LCD_SWAP_RB_2 +#endif + +#ifdef LCD_FIXEDPALETTE_2 + #undef LCD_FIXEDPALETTE + #define LCD_FIXEDPALETTE LCD_FIXEDPALETTE_2 +#endif + +#ifdef LCD_DELTA_MODE_2 + #undef LCD_DELTA_MODE + #define LCD_DELTA_MODE LCD_DELTA_MODE_2 +#endif + +#ifdef LCD_BITSPERPIXEL_L0_2 + #undef LCD_BITSPERPIXEL_L0 + #define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL_2 +#endif + +/********************************************************************* +* +* Rename identifiers +* +********************************************************************** +*/ +#define LCD_L0_Color2Index LCD_L0_2_Color2Index +#define LCD_L0_ControlCache LCD_L0_2_ControlCache +#define LCD_L0_DrawBitmap LCD_L0_2_DrawBitmap +#define LCD_L0_DrawHLine LCD_L0_2_DrawHLine +#define LCD_L0_DrawVLine LCD_L0_2_DrawVLine +#define LCD_L0_DrawPixel LCD_L0_2_DrawPixel +#define LCD_L0_FillRect LCD_L0_2_FillRect +#define LCD_L0_GetPixelIndex LCD_L0_2_GetPixelIndex +#define LCD_L0_GetRect LCD_L0_2_GetRect +#define LCD_L0_Index2Color LCD_L0_2_Index2Color +#define LCD_L0_Init LCD_L0_2_Init +#define LCD_L0_Off LCD_L0_2_Off +#define LCD_L0_On LCD_L0_2_On +#define LCD_L0_ReInit LCD_L0_2_ReInit +#define LCD_L0_Refresh LCD_L0_2_Refresh +#define LCD_L0_SetLUTEntry LCD_L0_2_SetLUTEntry +#define LCD_L0_SetOrg LCD_L0_2_SetOrg +#define LCD_L0_SetPixelIndex LCD_L0_2_SetPixelIndex +#define LCD_L0_XorPixel LCD_L0_2_XorPixel +#define LCD_L0_CheckInit LCD_L0_2_CheckInit +#define LCD_L0_GetIndexMask LCD_L0_2_GetIndexMask + +#define LCD_PhysColors LCD_PhysColors_2 +#define LCD_PhysPal LCD_PhysPal_2 + +/********************************************************************* +* +* Include the generic part & driver +* +********************************************************************** +*/ + +#define LCD_DISPLAY_INDEX 2 +#include "LCD_IncludeDriver.h" + +#else + void LCD_2_c(void); + void LCD_2_c(void) {} /* avoid empty object files */ +#endif + diff --git a/User/system/lib/lcd/gui/MultiLayer/LCD_3.c b/User/system/lib/lcd/gui/MultiLayer/LCD_3.c new file mode 100644 index 0000000..be47c43 --- /dev/null +++ b/User/system/lib/lcd/gui/MultiLayer/LCD_3.c @@ -0,0 +1,183 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_3.C +Purpose : Glue code for fourth display in a multi-controller + environment +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD_Private.h" /* private modul definitions & config */ + +#define LCD_3_C + +#if GUI_NUM_LAYERS > 3 + + +/********************************************************************* +* +* Map the defines for this controller +* +* #define LCD_ LCD__3 +* +********************************************************************** +*/ + +#undef LCD_CONTROLLER +#define LCD_CONTROLLER LCD_CONTROLLER_3 + +#undef LCD_XSIZE +#define LCD_XSIZE LCD_XSIZE_3 + +#undef LCD_YSIZE +#define LCD_YSIZE LCD_YSIZE_3 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_3 + +#undef LCD_VYSIZE +#define LCD_VYSIZE LCD_VYSIZE_3 + +#undef LCD_MIRROR_X +#define LCD_MIRROR_X LCD_MIRROR_X_3 + +#undef LCD_MIRROR_Y +#define LCD_MIRROR_Y LCD_MIRROR_Y_3 + +#undef LCD_SWAP_XY +#define LCD_SWAP_XY LCD_SWAP_XY_3 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_3 + +/* Optional defines */ + +#ifdef LCD_CACHE_3 + #ifdef LCD_CACHE + #undef LCD_CACHE + #endif + #define LCD_CACHE LCD_CACHE_3 +#endif + +#ifdef LCD_CACHE_CONTROL_3 + #ifdef LCD_CACHE_CONTROL + #undef LCD_CACHE_CONTROL + #endif + #define LCD_CACHE_CONTROL LCD_CACHE_CONTROL_3 +#endif + +#ifdef LCD_CHECKBUSY_3 + #ifdef LCD_CHECKBUSY + #undef LCD_CHECKBUSY + #endif + #define LCD_CHECKBUSY LCD_CHECKBUSY_3 +#endif + +#ifdef LCD_FIRSTSEG0_3 + #undef LCD_FIRSTSEG0 + #define LCD_FIRSTSEG0 LCD_FIRSTSEG0_3 +#endif + +#ifdef LCD_LASTSEG0_3 + #undef LCD_LASTSEG0 + #define LCD_LASTSEG0 LCD_LASTSEG0_3 +#endif + +#ifdef LCD_FIRSTCOM0_3 + #undef LCD_FIRSTCOM0 + #define LCD_FIRSTCOM0 LCD_FIRSTCOM0_3 +#endif + +#ifdef LCD_LASTCOM0_3 + #undef LCD_LASTCOM0 + #define LCD_LASTCOM0 LCD_LASTCOM0_3 +#endif + +#ifdef LCD_XORG0_3 + #undef LCD_XORG0 + #define LCD_XORG0 LCD_XORG0_3 +#endif + +#ifdef LCD_YORG0_3 + #undef LCD_YORG0 + #define LCD_YORG0 LCD_YORG0_3 +#endif + +#ifdef LCD_SWAP_RB_3 + #undef LCD_SWAP_RB + #define LCD_SWAP_RB LCD_SWAP_RB_3 +#endif + +#ifdef LCD_FIXEDPALETTE_3 + #undef LCD_FIXEDPALETTE + #define LCD_FIXEDPALETTE LCD_FIXEDPALETTE_3 +#endif + +#ifdef LCD_DELTA_MODE_3 + #undef LCD_DELTA_MODE + #define LCD_DELTA_MODE LCD_DELTA_MODE_3 +#endif + +#ifdef LCD_BITSPERPIXEL_L0_3 + #undef LCD_BITSPERPIXEL_L0 + #define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL_3 +#endif + +/********************************************************************* +* +* Rename identifiers +* +********************************************************************** +*/ +#define LCD_L0_Color2Index LCD_L0_3_Color2Index +#define LCD_L0_ControlCache LCD_L0_3_ControlCache +#define LCD_L0_DrawBitmap LCD_L0_3_DrawBitmap +#define LCD_L0_DrawHLine LCD_L0_3_DrawHLine +#define LCD_L0_DrawVLine LCD_L0_3_DrawVLine +#define LCD_L0_DrawPixel LCD_L0_3_DrawPixel +#define LCD_L0_FillRect LCD_L0_3_FillRect +#define LCD_L0_GetPixelIndex LCD_L0_3_GetPixelIndex +#define LCD_L0_GetRect LCD_L0_3_GetRect +#define LCD_L0_Index2Color LCD_L0_3_Index2Color +#define LCD_L0_Init LCD_L0_3_Init +#define LCD_L0_Off LCD_L0_3_Off +#define LCD_L0_On LCD_L0_3_On +#define LCD_L0_ReInit LCD_L0_3_ReInit +#define LCD_L0_Refresh LCD_L0_3_Refresh +#define LCD_L0_SetLUTEntry LCD_L0_3_SetLUTEntry +#define LCD_L0_SetOrg LCD_L0_3_SetOrg +#define LCD_L0_SetPixelIndex LCD_L0_3_SetPixelIndex +#define LCD_L0_XorPixel LCD_L0_3_XorPixel +#define LCD_L0_CheckInit LCD_L0_3_CheckInit +#define LCD_L0_GetIndexMask LCD_L0_3_GetIndexMask + +#define LCD_PhysColors LCD_PhysColors_3 +#define LCD_PhysPal LCD_PhysPal_3 + +/********************************************************************* +* +* Include the generic part & driver +* +********************************************************************** +*/ + +#define LCD_DISPLAY_INDEX 3 +#include "LCD_IncludeDriver.h" + +#else + void LCD_3_c(void); + void LCD_3_c(void) {} /* avoid empty object files */ +#endif + diff --git a/User/system/lib/lcd/gui/MultiLayer/LCD_4.c b/User/system/lib/lcd/gui/MultiLayer/LCD_4.c new file mode 100644 index 0000000..23951b5 --- /dev/null +++ b/User/system/lib/lcd/gui/MultiLayer/LCD_4.c @@ -0,0 +1,183 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_4.C +Purpose : Glue code for fiveth display in a multi-controller + environment +---------------------------END-OF-HEADER------------------------------ +*/ + +#include /* needed for definition of NULL */ +#include "LCD_Private.h" /* private modul definitions & config */ + +#define LCD_4_C + +#if GUI_NUM_LAYERS > 4 + + +/********************************************************************* +* +* Map the defines for this controller +* +* #define LCD_ LCD__4 +* +********************************************************************** +*/ + +#undef LCD_CONTROLLER +#define LCD_CONTROLLER LCD_CONTROLLER_4 + +#undef LCD_XSIZE +#define LCD_XSIZE LCD_XSIZE_4 + +#undef LCD_YSIZE +#define LCD_YSIZE LCD_YSIZE_4 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_4 + +#undef LCD_VYSIZE +#define LCD_VYSIZE LCD_VYSIZE_4 + +#undef LCD_MIRROR_X +#define LCD_MIRROR_X LCD_MIRROR_X_4 + +#undef LCD_MIRROR_Y +#define LCD_MIRROR_Y LCD_MIRROR_Y_4 + +#undef LCD_SWAP_XY +#define LCD_SWAP_XY LCD_SWAP_XY_4 + +#undef LCD_BITSPERPIXEL +#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_4 + +/* Optional defines */ + +#ifdef LCD_CACHE_4 + #ifdef LCD_CACHE + #undef LCD_CACHE + #endif + #define LCD_CACHE LCD_CACHE_4 +#endif + +#ifdef LCD_CACHE_CONTROL_4 + #ifdef LCD_CACHE_CONTROL + #undef LCD_CACHE_CONTROL + #endif + #define LCD_CACHE_CONTROL LCD_CACHE_CONTROL_4 +#endif + +#ifdef LCD_CHECKBUSY_4 + #ifdef LCD_CHECKBUSY + #undef LCD_CHECKBUSY + #endif + #define LCD_CHECKBUSY LCD_CHECKBUSY_4 +#endif + +#ifdef LCD_FIRSTSEG0_4 + #undef LCD_FIRSTSEG0 + #define LCD_FIRSTSEG0 LCD_FIRSTSEG0_4 +#endif + +#ifdef LCD_LASTSEG0_4 + #undef LCD_LASTSEG0 + #define LCD_LASTSEG0 LCD_LASTSEG0_4 +#endif + +#ifdef LCD_FIRSTCOM0_4 + #undef LCD_FIRSTCOM0 + #define LCD_FIRSTCOM0 LCD_FIRSTCOM0_4 +#endif + +#ifdef LCD_LASTCOM0_4 + #undef LCD_LASTCOM0 + #define LCD_LASTCOM0 LCD_LASTCOM0_4 +#endif + +#ifdef LCD_XORG0_4 + #undef LCD_XORG0 + #define LCD_XORG0 LCD_XORG0_4 +#endif + +#ifdef LCD_YORG0_4 + #undef LCD_YORG0 + #define LCD_YORG0 LCD_YORG0_4 +#endif + +#ifdef LCD_SWAP_RB_4 + #undef LCD_SWAP_RB + #define LCD_SWAP_RB LCD_SWAP_RB_4 +#endif + +#ifdef LCD_FIXEDPALETTE_4 + #undef LCD_FIXEDPALETTE + #define LCD_FIXEDPALETTE LCD_FIXEDPALETTE_4 +#endif + +#ifdef LCD_DELTA_MODE_4 + #undef LCD_DELTA_MODE + #define LCD_DELTA_MODE LCD_DELTA_MODE_4 +#endif + +#ifdef LCD_BITSPERPIXEL_L0_4 + #undef LCD_BITSPERPIXEL_L0 + #define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL_4 +#endif + +/********************************************************************* +* +* Rename identifiers +* +********************************************************************** +*/ +#define LCD_L0_Color2Index LCD_L0_4_Color2Index +#define LCD_L0_ControlCache LCD_L0_4_ControlCache +#define LCD_L0_DrawBitmap LCD_L0_4_DrawBitmap +#define LCD_L0_DrawHLine LCD_L0_4_DrawHLine +#define LCD_L0_DrawVLine LCD_L0_4_DrawVLine +#define LCD_L0_DrawPixel LCD_L0_4_DrawPixel +#define LCD_L0_FillRect LCD_L0_4_FillRect +#define LCD_L0_GetPixelIndex LCD_L0_4_GetPixelIndex +#define LCD_L0_GetRect LCD_L0_4_GetRect +#define LCD_L0_Index2Color LCD_L0_4_Index2Color +#define LCD_L0_Init LCD_L0_4_Init +#define LCD_L0_Off LCD_L0_4_Off +#define LCD_L0_On LCD_L0_4_On +#define LCD_L0_ReInit LCD_L0_4_ReInit +#define LCD_L0_Refresh LCD_L0_4_Refresh +#define LCD_L0_SetLUTEntry LCD_L0_4_SetLUTEntry +#define LCD_L0_SetOrg LCD_L0_4_SetOrg +#define LCD_L0_SetPixelIndex LCD_L0_4_SetPixelIndex +#define LCD_L0_XorPixel LCD_L0_4_XorPixel +#define LCD_L0_CheckInit LCD_L0_4_CheckInit +#define LCD_L0_GetIndexMask LCD_L0_4_GetIndexMask + +#define LCD_PhysColors LCD_PhysColors_4 +#define LCD_PhysPal LCD_PhysPal_4 + +/********************************************************************* +* +* Include the generic part & driver +* +********************************************************************** +*/ + +#define LCD_DISPLAY_INDEX 4 +#include "LCD_IncludeDriver.h" + +#else + void LCD_4_c(void); + void LCD_4_c(void) {} /* avoid empty object files */ +#endif + diff --git a/User/system/lib/lcd/gui/MultiLayer/LCD_IncludeDriver.h b/User/system/lib/lcd/gui/MultiLayer/LCD_IncludeDriver.h new file mode 100644 index 0000000..e00423a --- /dev/null +++ b/User/system/lib/lcd/gui/MultiLayer/LCD_IncludeDriver.h @@ -0,0 +1,97 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LCD_IncludeDriver.h +Purpose : Glue code for including the configured driver +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef LCD_INCLUDEDRIVER_H +#define LCD_INCLUDEDRIVER_H + + +/********************************************************************* +* +* Some error checking +* +********************************************************************** +*/ +#ifndef LCD_CONTROLLER + #error LCD_CONTROLLER not defined ! +#endif + +/********************************************************************* +* +* Color conversion routines for layer +* +********************************************************************** +*/ + +#include "LCD_L0_Generic.c" + +/********************************************************************* +* +* Driver for layer +* +********************************************************************** +*/ + +#if !defined(WIN32) | defined(LCD_SIMCONTROLLER) + #if (LCD_CONTROLLER == -2) + #include "LCDNull.c" /* Empty driver, no output to LCD */ + #elif (LCD_CONTROLLER == -1) + #include "LCDDummy.c" /* Empty driver, no output to LCD */ + #elif (LCD_CONTROLLER == 0) + #if ((LCD_BITSPERPIXEL == 1) | (LCD_BITSPERPIXEL == 2)) + #include "LCDMem.c" + #elif ((LCD_BITSPERPIXEL == 3) | (LCD_BITSPERPIXEL == 6)) + #include "LCDMemC.c" + #else + #error LCD Config error ! + #endif + #elif (LCD_CONTROLLER / 100 == 4) + #include "LCDColorOnMono.c" + #elif (LCD_CONTROLLER / 100 == 5) + #include "LCD501.c" + #elif (LCD_CONTROLLER / 100 == 7) + #include "LCD07X1.c" + #elif (LCD_CONTROLLER / 100 == 13) + #include "LCDLin.c" + #elif (LCD_CONTROLLER / 100 == 15) + #include "LCDPage1bpp.c" + #include "LCDPage1bpp_1.c" + #elif (LCD_CONTROLLER / 100 == 16) + #include "LCD159A.c" + #elif (LCD_CONTROLLER / 100 == 17) + #include "LCD15E05.c" + #elif (LCD_CONTROLLER / 100 == 18) + #include "LCD1611.c" + #elif (LCD_CONTROLLER / 100 == 32) + #include "LCDLin32.c" + #elif (LCD_CONTROLLER / 100 == 69) + #include "LCDSLin.c" + #elif (LCD_CONTROLLER / 100 == 87) + #include "LCDFujitsu.c" + #elif (LCD_CONTROLLER / 100 == 63) + #include "LCD6331.c" + #elif (LCD_CONTROLLER / 100 == 664) + #include "LCD6642X.c" + #else + #error LCD Config error ! + #endif +#else + #include "LCDWin.c" +#endif + +#endif /* LCD_INCLUDEDRIVER_H */ diff --git a/User/system/lib/lcd/gui/MultiLayer/vssver.scc b/User/system/lib/lcd/gui/MultiLayer/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..3ca1ca498536e2e4fdeae2a328c1f869f3cd8def GIT binary patch literal 128 zcmXpJVr0l)E%%9!#nz*3P2a|^>!WW!?2}sA#moQ(-9Wl`o%#AbkJ}X(fg(LX{ /* needed for definition of NULL */ +#include /* required for memset */ + +#define WM_C +#include "WM_Intern_ConfDep.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define ASSIGN_IF_LESS(v0,v1) if (v1pNext) { + if (pCH->hWin == hWin) { + pCH->hWin = 0; + } + } +} + +/********************************************************************* +* +* _DesktopHandle2Index +* +* Function: +* Convert the given desktop window into the display index. +* +* Return value: +* Desktop index if window handle is valid. +* else: -1 +*/ +static int _DesktopHandle2Index(WM_HWIN hDesktop) { +#if GUI_NUM_LAYERS > 1 + int i; + for (i = 0; i < GUI_NUM_LAYERS; i++) { + if (hDesktop == WM__ahDesktopWin[i]) { + return i; + } + } +#else + if (hDesktop == WM__ahDesktopWin[0]) { + return 0; + } +#endif + return -1; +} + +/********************************************************************* +* +* _Invalidate1Abs +* +* Invalidate given window, using absolute coordinates +*/ +static void _Invalidate1Abs(WM_HWIN hWin, const GUI_RECT*pRect) { + GUI_RECT r; + WM_Obj* pWin; + int Status; + pWin = WM_H2P(hWin); + Status = pWin->Status; + if ((Status & WM_SF_ISVIS) == 0) { + return; /* Window is not visible... we are done */ + } + if ((Status & (WM_SF_HASTRANS | WM_SF_CONST_OUTLINE)) == WM_SF_HASTRANS) { + return; /* Window is transparent; transparency may change... we are done, since background will be invalidated */ + } + if (WM__RectIsNZ(pRect) == 0) { + return; /* Nothing to do ... */ + } + /* Calc affected area */ + GUI__IntersectRects(&r, pRect, &pWin->Rect); + if (WM__RectIsNZ(&r)) { + #if WM_SUPPORT_NOTIFY_VIS_CHANGED + WM__SendMsgNoData(hWin, WM_NOTIFY_VIS_CHANGED); /* Notify window that visibility may have changed */ + #endif + + if (pWin->Status & WM_SF_INVALID) { + GUI_MergeRect(&pWin->InvalidRect, &pWin->InvalidRect, &r); + } else { + pWin->InvalidRect = r; + pWin->Status |= WM_SF_INVALID; + WM__NumInvalidWindows++; + /* Optional code: Call external routine to notify that drawing is required */ + #ifdef GUI_X_REDRAW + { + GUI_RECT r; + r = pWin->Rect; + if (WM__ClipAtParentBorders(&r, hWin)) { + GUI_X_REDRAW(); /* Call hook function to signal an invalidation */ + } + } + #endif + GUI_X_SIGNAL_EVENT(); + } + /* Debug code: shows invalid areas */ + #if (WM_SUPPORT_DIAG) + if (WM__pfShowInvalid) { + (WM__pfShowInvalid)(hWin); + } + #endif + } +} + +/********************************************************************* +* +* _GetTopLevelWindow +*/ +#if GUI_NUM_LAYERS > 1 +static WM_HWIN _GetTopLevelWindow(WM_HWIN hWin) { + WM_Obj* pWin; + WM_HWIN hTop; + while (hTop = hWin, pWin = WM_H2P(hWin), (hWin = pWin->hParent) != 0) { + } + return hTop; +} +#endif + +/********************************************************************* +* +* ResetNextDrawWin + + When drawing, we have to start at the bottom window ! +*/ +static void ResetNextDrawWin(void) { + NextDrawWin = WM_HWIN_NULL; +} + + +/********************************************************************* +* +* _GethDrawWin +* +* Return Window being drawn. +* Normally same as pAWin, except if overlaying transparent window is drawn +* +*/ +static WM_HWIN _GethDrawWin(void) { + WM_HWIN h; + #if WM_SUPPORT_TRANSPARENCY + if (WM__hATransWindow) { + h = WM__hATransWindow; + } else + #endif + { + h = GUI_Context.hAWin; + } + return h; +} + + + + + +/********************************************************************* +* +* _SetClipRectUserIntersect +*/ +static void _SetClipRectUserIntersect(const GUI_RECT* prSrc) { + if (GUI_Context.WM__pUserClipRect == NULL) { + LCD_SetClipRectEx(prSrc); + } else { + GUI_RECT r; + r = *GUI_Context.WM__pUserClipRect; + WM__Client2Screen(WM_H2P(_GethDrawWin()), &r); /* Convert User ClipRect into screen coordinates */ + /* Set intersection as clip rect */ + GUI__IntersectRect(&r, prSrc); + LCD_SetClipRectEx(&r); + } +} + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__ClipAtParentBorders +* +* Function: +* Iterates over the window itself and all its ancestors. +* Intersects all rectangles to +* find out which part is actually visible. +* Reduces the rectangle to the visible area. +* This routines takes into account both the rectangles of the +* ancestors as well as the WM_SF_ISVIS flag. +* +* Parameters +* hWin Obvious +* pRect Pointer to the rectangle to be clipped. May not be NULL. +* The parameter is IN/OUT. +* Note that the rectangle is clipped only if the return +* value indicates a valid rectangle remains. +* +* Return value: +* 1: Something is or may be visible. +* 0: Nothing is visible (outside of ancestors, no desktop, hidden) +*/ +int WM__ClipAtParentBorders(GUI_RECT* pRect, WM_HWIN hWin) { + WM_Obj* pWin; + + /* Iterate up the window hierarchy. + If the window is invisible, we are done. + Clip at parent boarders. + We are done with iterating if hWin has no parent. + */ + do { + pWin = WM_H2P(hWin); + if ((pWin->Status & WM_SF_ISVIS) == 0) { + return 0; /* Invisible */ + } + GUI__IntersectRect(pRect, &pWin->Rect); /* And clip on borders */ + if (pWin->hParent == 0) { + break; /* hWin is now the top level window which has no parent */ + } + hWin = pWin->hParent; /* Go one level up (parent)*/ + } while (1); /* Only way out is in the loop. Required for efficiency, no bug, even though some compilers may complain. */ + + /* Now check if the top level window is a desktop window. If it is not, + then the window is not visible. + */ + if (_DesktopHandle2Index(hWin) < 0) { + return 0; /* No desktop - (unattached) - Nothing to draw */ + } + return 1; /* Something may be visible */ +} + +/********************************************************************* +* +* WM__ActivateClipRect +*/ +void WM__ActivateClipRect(void) { + if (WM_IsActive) { + _SetClipRectUserIntersect(&_ClipContext.CurRect); + } else { /* Window manager disabled, typically because meory device is active */ + GUI_RECT r; + WM_Obj *pAWin; + pAWin = WM_H2P(GUI_Context.hAWin); + r = pAWin->Rect; + #if WM_SUPPORT_TRANSPARENCY + if (WM__hATransWindow) { + WM__ClipAtParentBorders(&r, WM__hATransWindow); + } + #endif + /* Take UserClipRect into account */ + _SetClipRectUserIntersect(&r); + } +} + + + + +/********************************************************************* +* +* WM__InsertWindowIntoList +* +* Routine describtion +* This routine inserts the window in the list of child windows for +* a particular parent window. +* The window is placed on top of all siblings with the same level. +*/ +void WM__InsertWindowIntoList(WM_HWIN hWin, WM_HWIN hParent) { + int OnTop; + WM_HWIN hi; + WM_Obj * pWin; + WM_Obj * pParent; + WM_Obj * pi; + + if (hParent) { + pWin = WM_H2P(hWin); + pWin->hNext = 0; + pWin->hParent = hParent; + pParent = WM_H2P(hParent); + OnTop = pWin->Status & WM_CF_STAYONTOP; + hi = pParent->hFirstChild; + /* Put it at beginning of the list if there is no child */ + if (hi == 0) { /* No child yet ... Makes things easy ! */ + pParent->hFirstChild = hWin; + return; /* Early out ... We are done */ + } + /* Put it at beginning of the list if first child is a TOP window and new one is not */ + pi = WM_H2P(hi); + if (!OnTop) { + if (pi->Status & WM_SF_STAYONTOP) { + pWin->hNext = hi; + pParent->hFirstChild = hWin; + return; /* Early out ... We are done */ + } + } + /* Put it at the end of the list or before the last non "STAY-ON-TOP" child */ + do { + WM_Obj* pNext; + WM_HWIN hNext; + if ((hNext = pi->hNext) == 0) { /* End of sibling list ? */ + pi->hNext = hWin; /* Then modify this last element to point to new one and we are done */ + break; + } + pNext = WM_H2P(hNext); + if (!OnTop) { + if (pNext->Status & WM_SF_STAYONTOP) { + pi->hNext = hWin; + pWin->hNext = hNext; + break; + } + } + pi = pNext; + } while (1); + #if WM_SUPPORT_NOTIFY_VIS_CHANGED + WM__NotifyVisChanged(hWin, &pWin->Rect); + #endif + } +} + +/********************************************************************* +* +* WM__RemoveWindowFromList +*/ +void WM__RemoveWindowFromList(WM_HWIN hWin) { + WM_HWIN hi, hParent; + WM_Obj * pWin, * pParent, * pi; + + pWin = WM_H2P(hWin); + hParent = pWin->hParent; + if (hParent) { + pParent = WM_H2P(hParent); + hi = pParent->hFirstChild; + if (hi == hWin) { + pi = WM_H2P(hi); + pParent->hFirstChild = pi->hNext; + } else { + while (hi) { + pi = WM_H2P(hi); + if (pi->hNext == hWin) { + pi->hNext = pWin->hNext; + break; + } + hi = pi->hNext; + } + } + } +} + +/********************************************************************* +* +* WM__DetachWindow +* +* Detaches the given window. The window still exists, it keeps all +* children, but it is no longer visible since it is taken out of +* the tree of the desktop window. +*/ +void WM__DetachWindow(WM_HWIN hWin) { + WM_Obj* pWin; + WM_HWIN hParent; + pWin = WM_H2P(hWin); + hParent = pWin->hParent; + if (hParent) { + WM__RemoveWindowFromList(hWin); + /* Clear area used by this window */ + WM_InvalidateArea(&pWin->Rect); + pWin->hParent = 0; + } +} + + +/********************************************************************* +* +* _DeleteAllChildren +*/ +static void _DeleteAllChildren(WM_HWIN hChild) { + while (hChild) { + WM_Obj* pChild = WM_H2P(hChild); + WM_HWIN hNext = pChild->hNext; + WM_DeleteWindow(hChild); + hChild = hNext; + } +} + +/********************************************************************* +* +* Module internal routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__Client2Screen +*/ +void WM__Client2Screen(const WM_Obj* pWin, GUI_RECT *pRect) { + GUI_MoveRect(pRect, pWin->Rect.x0, pWin->Rect.y0); +} + +/********************************************************************* +* +* WM__IsWindow +*/ +int WM__IsWindow(WM_HWIN hWin) { + WM_HWIN iWin; + for (iWin = WM__FirstWin; iWin; iWin = WM_H2P(iWin)->hNextLin) { + if (iWin == hWin) { + return 1; + } + } + return 0; +} + +/********************************************************************* +* +* WM__InvalidateAreaBelow + + Params: pRect Rectangle in Absolute coordinates +*/ +void WM__InvalidateAreaBelow(const GUI_RECT* pRect, WM_HWIN StopWin) { + GUI_USE_PARA(StopWin); + WM_InvalidateArea(pRect); /* Can be optimized to spare windows above */ +} + +/********************************************************************* +* +* WM_RemoveFromLinList +*/ +void WM__RemoveFromLinList(WM_HWIN hWin) { + WM_Obj* piWin; + WM_HWIN hiWin; + WM_HWIN hNext; + for (hiWin = WM__FirstWin; hiWin; ) { + piWin = WM_H2P(hiWin); + hNext = piWin->hNextLin; + if (hNext == hWin) { + piWin->hNextLin = WM_H2P(hWin)->hNextLin; + break; + } + hiWin = hNext; + } +} + +/********************************************************************* +* +* _AddToLinList +*/ +static void _AddToLinList(WM_HWIN hNew) { + WM_Obj* pFirst; + WM_Obj* pNew; + if (WM__FirstWin) { + pFirst = WM_H2P(WM__FirstWin); + pNew = WM_H2P(hNew); + pNew->hNextLin = pFirst->hNextLin; + pFirst->hNextLin = hNew; + } else { + WM__FirstWin = hNew; + } +} + +/********************************************************************* +* +* WM__RectIsNZ +* + Check if the rectangle has some content (is non-zero) + Returns 0 if the Rectangle has no content, else 1. +*/ +int WM__RectIsNZ(const GUI_RECT* pr) { + if (pr->x0 > pr->x1) + return 0; + if (pr->y0 > pr->y1) + return 0; + return 1; +} + +/********************************************************************* +* +* _Findy1 +* +*/ +static void _Findy1(WM_HWIN iWin, GUI_RECT* pRect, GUI_RECT* pParentRect) { + WM_Obj* pWin; + for (; iWin; iWin = pWin->hNext) { + int Status = (pWin = WM_H2P(iWin))->Status; + /* Check if this window affects us at all */ + if (Status & WM_SF_ISVIS) { + GUI_RECT rWinClipped; /* Window rect, clipped to part inside of ancestors */ + if (pParentRect) { + GUI__IntersectRects(&rWinClipped, &pWin->Rect, pParentRect); + } else { + rWinClipped = pWin->Rect; + } + /* Check if this window affects us at all */ + if (GUI_RectsIntersect(pRect, &rWinClipped)) { + if ((Status & WM_SF_HASTRANS) == 0) { + if (pWin->Rect.y0 > pRect->y0) { + ASSIGN_IF_LESS(pRect->y1, rWinClipped.y0 - 1); /* Check upper border of window */ + } else { + ASSIGN_IF_LESS(pRect->y1, rWinClipped.y1); /* Check lower border of window */ + } + } else { + /* Check all children*/ + WM_HWIN hChild; + WM_Obj* pChild; + for (hChild = pWin->hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + _Findy1(hChild, pRect, &rWinClipped); + } + } + } + } + } +} + +/********************************************************************* +* +* _Findx0 +*/ +static int _Findx0(WM_HWIN hWin, GUI_RECT* pRect, GUI_RECT* pParentRect) { + WM_Obj* pWin; + int r = 0; + for (; hWin; hWin = pWin->hNext) { + int Status = (pWin = WM_H2P(hWin))->Status; + if (Status & WM_SF_ISVIS) { /* If window is not visible, it can be safely ignored */ + GUI_RECT rWinClipped; /* Window rect, clipped to part inside of ancestors */ + if (pParentRect) { + GUI__IntersectRects(&rWinClipped, &pWin->Rect, pParentRect); + } else { + rWinClipped = pWin->Rect; + } + /* Check if this window affects us at all */ + if (GUI_RectsIntersect(pRect, &rWinClipped)) { + if ((Status & WM_SF_HASTRANS) == 0) { + pRect->x0 = rWinClipped.x1+1; + r = 1; + } else { + /* Check all children */ + WM_HWIN hChild; + WM_Obj* pChild; + for (hChild = pWin->hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + if (_Findx0(hChild, pRect, &rWinClipped)) { + r = 1; + } + } + } + } + } + } + return r; +} + +/********************************************************************* +* +* _Findx1 +*/ +static void _Findx1(WM_HWIN hWin, GUI_RECT* pRect, GUI_RECT* pParentRect) { + WM_Obj* pWin; + for (; hWin; hWin = pWin->hNext) { + int Status = (pWin = WM_H2P(hWin))->Status; + if (Status & WM_SF_ISVIS) { /* If window is not visible, it can be safely ignored */ + GUI_RECT rWinClipped; /* Window rect, clipped to part inside of ancestors */ + if (pParentRect) { + GUI__IntersectRects(&rWinClipped, &pWin->Rect, pParentRect); + } else { + rWinClipped = pWin->Rect; + } + /* Check if this window affects us at all */ + if (GUI_RectsIntersect(pRect, &rWinClipped)) { + if ((Status & WM_SF_HASTRANS) == 0) { + pRect->x1 = rWinClipped.x0-1; + } else { + /* Check all children */ + WM_HWIN hChild; + WM_Obj* pChild; + for (hChild = pWin->hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + _Findx1(hChild, pRect, &rWinClipped); + } + } + } + } + } +} + +/********************************************************************* +* +* Sending messages +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SendMessage +*/ +void WM_SendMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) { + if (hWin) { + WM_Obj* pWin; + WM_LOCK(); + pWin = WM_H2P(hWin); + if (pWin->cb != NULL) { + pMsg->hWin = hWin; + (*pWin->cb)(pMsg); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* WM__SendMsgNoData +*/ +void WM__SendMsgNoData(WM_HWIN hWin, U8 MsgId) { + WM_MESSAGE Msg; + Msg.hWin = hWin; + Msg.MsgId = MsgId; + WM_SendMessage(hWin, &Msg); +} + +/********************************************************************* +* +* WM__GetClientRectWin +* + Get client rectangle in windows coordinates. This means that the + upper left corner is always at (0,0). +*/ +void WM__GetClientRectWin(const WM_Obj* pWin, GUI_RECT* pRect) { + pRect->x0 = pRect->y0 = 0; + pRect->x1 = pWin->Rect.x1 - pWin->Rect.x0; + pRect->y1 = pWin->Rect.y1 - pWin->Rect.y0; +} + +/********************************************************************* +* +* WM__GetInvalidRectAbs +*/ +static void WM__GetInvalidRectAbs(WM_Obj* pWin, GUI_RECT* pRect) { + *pRect = pWin->InvalidRect; +} + +/********************************************************************* +* +* Invalidation functions +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_InvalidateRect +* +* Invalidate a section of the window. The optional rectangle +* contains client coordinates, which are independent of the +* position of the window on the logical desktop area. +*/ +void WM_InvalidateRect(WM_HWIN hWin, const GUI_RECT*pRect) { + GUI_RECT r; + WM_Obj* pWin; + int Status; + if (hWin) { + WM_LOCK(); + pWin = WM_H2P(hWin); + Status = pWin->Status; + if (Status & WM_SF_ISVIS) { + r = pWin->Rect; + if (pRect) { + GUI_RECT rPara; + rPara = *pRect; + WM__Client2Screen(pWin, &rPara); + GUI__IntersectRect(&r, &rPara); + } + if (WM__ClipAtParentBorders(&r, hWin)) { /* Optimization that saves invalidation if window area is not visible ... Not required */ + if ((Status & (WM_SF_HASTRANS | WM_SF_CONST_OUTLINE)) == WM_SF_HASTRANS) { + WM__InvalidateAreaBelow(&r, hWin); /* Can be optimized to spare windows above */ + } else { + _Invalidate1Abs(hWin, &r); + } + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* WM_InvalidateWindow +* + Invalidates an entire window. +*/ +void WM_InvalidateWindow(WM_HWIN hWin) { + WM_InvalidateRect(hWin, NULL); +} + +/********************************************************************* +* +* WM_InvalidateArea + + Invalidate a certain section of the display. One main reason for this is + that the top window has been moved or destroyed. + The coordinates given are absolute coordinates (desktop coordinates) +*/ +void WM_InvalidateArea(const GUI_RECT* pRect) { + WM_HWIN hWin; + WM_LOCK(); + /* Iterate over all windows */ + for (hWin = WM__FirstWin; hWin; hWin = WM_H2P(hWin)->hNextLin) { + _Invalidate1Abs(hWin, pRect); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* manage windows stack +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_CreateWindowAsChild +*/ +WM_HWIN WM_CreateWindowAsChild( int x0, int y0, int width, int height + ,WM_HWIN hParent, U16 Style, WM_CALLBACK* cb + ,int NumExtraBytes) { + WM_Obj* pWin; + WM_HWIN hWin; + WM_ASSERT_NOT_IN_PAINT(); + WM_LOCK(); + Style |= WM__CreateFlags; + /* Default parent is Desktop 0 */ + if (!hParent) { + if (WM__NumWindows) { + #if GUI_NUM_LAYERS == 1 + hParent = WM__ahDesktopWin[0]; + #else + hParent = WM__ahDesktopWin[GUI_Context.SelLayer]; + #endif + } + } + if (hParent == WM_UNATTACHED) { + hParent = WM_HWIN_NULL; + } + if (hParent) { + WM_Obj* pParent = WM_H2P(hParent); + x0 += pParent->Rect.x0; + y0 += pParent->Rect.y0; + if (width==0) { + width = pParent->Rect.x1 - pParent->Rect.x0+1; + } + if (height==0) { + height = pParent->Rect.y1 - pParent->Rect.y0+1; + } + } + if ((hWin = (WM_HWIN) GUI_ALLOC_AllocZero(NumExtraBytes + sizeof(WM_Obj))) == 0) { + GUI_DEBUG_ERROROUT("WM_CreateWindow: No memory to create window"); + } else { + WM__NumWindows++; + pWin = WM_H2P(hWin); + pWin->Rect.x0 = x0; + pWin->Rect.y0 = y0; + pWin->Rect.x1 = x0 + width - 1; + pWin->Rect.y1 = y0 + height - 1; + pWin->cb = cb; + /* Copy the flags which can simply be accepted */ + pWin->Status |= (Style & (WM_CF_SHOW | + WM_SF_MEMDEV | + WM_CF_MEMDEV_ON_REDRAW | + WM_SF_STAYONTOP | + WM_SF_CONST_OUTLINE | + WM_SF_HASTRANS | + WM_CF_ANCHOR_RIGHT | + WM_CF_ANCHOR_BOTTOM | + WM_CF_ANCHOR_LEFT | + WM_CF_ANCHOR_TOP | + WM_CF_LATE_CLIP)); + /* Add to linked lists */ + _AddToLinList(hWin); + WM__InsertWindowIntoList(hWin, hParent); + /* Activate window if WM_CF_ACTIVATE is specified */ + if (Style & WM_CF_ACTIVATE) { + WM_SelectWindow(hWin); /* This is not needed if callbacks are being used, but it does not cost a lot and makes life easier ... */ + } + /* Handle the Style flags, one at a time */ + #if WM_SUPPORT_TRANSPARENCY + if (Style & WM_SF_HASTRANS) { + WM__TransWindowCnt++; /* Increment counter for transparency windows */ + } + #endif + if (Style & WM_CF_BGND) { + WM_BringToBottom(hWin); + } + if (Style & WM_CF_SHOW) { + pWin->Status |= WM_SF_ISVIS; /* Set Visibility flag */ + WM_InvalidateWindow(hWin); /* Mark content as invalid */ + } + WM__SendMsgNoData(hWin, WM_CREATE); + } + WM_UNLOCK(); + return hWin; +} + +/********************************************************************* +* +* WM_CreateWindow +*/ +WM_HWIN WM_CreateWindow(int x0, int y0, int width, int height, U16 Style, WM_CALLBACK* cb, int NumExtraBytes) { + return WM_CreateWindowAsChild(x0,y0,width,height, 0 /* No parent */, Style, cb, NumExtraBytes); +} + +/********************************************************************* +* +* Delete window +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_DeleteWindow +*/ +void WM_DeleteWindow (WM_HWIN hWin) { + WM_Obj* pWin; + if (!hWin) { + return; + } + WM_ASSERT_NOT_IN_PAINT(); + WM_LOCK(); + if (WM__IsWindow(hWin)) { + pWin = WM_H2P(hWin); + ResetNextDrawWin(); /* Make sure the window will no longer receive drawing messages */ + /* Make sure that focus is set to an existing window */ + if (WM__hWinFocus == hWin) { + WM__hWinFocus = 0; + } + if (WM__hCapture == hWin) { + WM__hCapture = 0; + } + /* check if critical handles are affected. If so, reset the window handle to 0 */ + _CheckCriticalHandles(hWin); + /* Inform parent */ + WM_NotifyParent(hWin, WM_NOTIFICATION_CHILD_DELETED); + /* Delete all children */ + _DeleteAllChildren(pWin->hFirstChild); + #if WM_SUPPORT_NOTIFY_VIS_CHANGED + WM__SendMsgNoData(hWin, WM_NOTIFY_VIS_CHANGED); /* Notify window that visibility may have changed */ + #endif + /* Send WM_DELETE message to window in order to inform window itself */ + WM__SendMsgNoData(hWin, WM_DELETE); /* tell window about it */ + WM__DetachWindow(hWin); + /* Remove window from window stack */ + WM__RemoveFromLinList(hWin); + /* Handle transparency counter if necessary */ + #if WM_SUPPORT_TRANSPARENCY + if (pWin->Status & WM_SF_HASTRANS) { + WM__TransWindowCnt--; + } + #endif + /* Make sure window is no longer counted as invalid */ + if (pWin->Status & WM_SF_INVALID) { + WM__NumInvalidWindows--; + } + /* Free window memory */ + WM__NumWindows--; + GUI_ALLOC_Free(hWin); + /* Select a valid window */ + WM_SelectWindow(WM__FirstWin); + } else { + GUI_DEBUG_WARN("WM_DeleteWindow: Invalid handle"); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_SelectWindow +* +* Sets the active Window. The active Window is the one that is used for all +* drawing (and text) operations. +*/ +WM_HWIN WM_SelectWindow(WM_HWIN hWin) { + WM_HWIN hWinPrev; + WM_Obj* pObj; + + WM_ASSERT_NOT_IN_PAINT(); + WM_LOCK(); + hWinPrev = GUI_Context.hAWin; + if (hWin == 0) { + hWin = WM__FirstWin; + } + /* Select new window */ + GUI_Context.hAWin = hWin; + #if GUI_NUM_LAYERS > 1 + { + WM_HWIN hTop; + int LayerIndex; + hTop = _GetTopLevelWindow(hWin); + LayerIndex = _DesktopHandle2Index(hTop); + if (LayerIndex >= 0) { + GUI_SelectLayer(LayerIndex); + } + } + #endif + pObj = WM_H2P(hWin); + LCD_SetClipRectMax(); /* Drawing operations will clip ... If WM is deactivated, allow all */ + GUI_Context.xOff = pObj->Rect.x0; + GUI_Context.yOff = pObj->Rect.y0; + WM_UNLOCK(); + return hWinPrev; +} + +/********************************************************************* +* +* WM_GetActiveWindow +*/ +WM_HWIN WM_GetActiveWindow(void) { + return GUI_Context.hAWin; +} + + +/********************************************************************* +* +* IVR calculation +* +********************************************************************** + +IVRs are invalid rectangles. When redrawing, only the portion of the +window which is + a) within the window-rectangle + b) not covered by an other window + c) marked as invalid + is actually redrawn. Unfortunately, this section is not always + rectangular. If the window is partially covered by an other window, + it consists of the sum of multiple rectangles. In all drawing + operations, we have to iterate over every one of these rectangles in + order to make sure the window is drawn completly. +Function works as follows: + STEP 1: - Set upper left coordinates to next pixel. If end of line (right border), goto next line -> (r.x0, r.y0) + STEP 2: - Check if we are done, return if we are. + STEP 3: - If we are at the left border, find max. heigtht (r.y1) by iterating over windows above + STEP 4: - Find x0 for the given y0, y1 by iterating over windows above + STEP 5: - If r.x0 out of right border, this stripe is done. Set next stripe and goto STEP 2 + STEP 6: - Find r.x1. We have to Iterate over all windows which are above +*/ + +/********************************************************************* +* +* _FindNext_IVR +*/ +#if WM_SUPPORT_OBSTRUCT +static int _FindNext_IVR(void) { + WM_HMEM hParent; + GUI_RECT r; + WM_Obj* pAWin; + WM_Obj* pParent; + r = _ClipContext.CurRect; /* temps so we do not have to work with pointers too much */ + /* + STEP 1: + Set the next position which could be part of the next IVR + This will be the first unhandle pixel in reading order, i.e. next one to the right + or next one down if we are at the right border. + */ + if (_ClipContext.Cnt == 0) { /* First IVR starts in upper left */ + r.x0 = _ClipContext.ClientRect.x0; + r.y0 = _ClipContext.ClientRect.y0; + } else { + r.x0 = _ClipContext.CurRect.x1+1; + r.y0 = _ClipContext.CurRect.y0; + if (r.x0 > _ClipContext.ClientRect.x1) { +NextStripe: /* go down to next stripe */ + r.x0 = _ClipContext.ClientRect.x0; + r.y0 = _ClipContext.CurRect.y1+1; + } + } + /* + STEP 2: + Check if we are done completely. + */ + if (r.y0 >_ClipContext.ClientRect.y1) { + return 0; + } + /* STEP 3: + Find out the max. height (r.y1) if we are at the left border. + Since we are using the same height for all IVRs at the same y0, + we do this only for the leftmost one. + */ + pAWin = WM_H2P(GUI_Context.hAWin); + if (r.x0 == _ClipContext.ClientRect.x0) { + r.y1 = _ClipContext.ClientRect.y1; + r.x1 = _ClipContext.ClientRect.x1; + /* Iterate over all windows which are above */ + /* Check all siblings above (Iterate over Parents and top siblings (hNext) */ + for (hParent = GUI_Context.hAWin; hParent; hParent = pParent->hParent) { + pParent = WM_H2P(hParent); + _Findy1(pParent->hNext, &r, NULL); + } + /* Check all children */ + _Findy1(pAWin->hFirstChild, &r, NULL); + } + /* + STEP 4 + Find out x0 for the given y0, y1 by iterating over windows above. + if we find one that intersects, adjust x0 to the right. + */ +Find_x0: + r.x1 = r.x0; + /* Iterate over all windows which are above */ + /* Check all siblings above (siblings of window, siblings of parents, etc ...) */ + #if 0 /* This is a planned, but not yet released optimization */ + if (Status & WM_SF_DONT_CLIP_SIBLINGS) + { + hParent = pAWin->hParent; + } else + #endif + { + hParent = GUI_Context.hAWin; + } + for (; hParent; hParent = pParent->hParent) { + pParent = WM_H2P(hParent); + if (_Findx0(pParent->hNext, &r, NULL)) { + goto Find_x0; + } + } + /* Check all children */ + if (_Findx0(pAWin->hFirstChild, &r, NULL)) { + goto Find_x0; + } + /* + STEP 5: + If r.x0 out of right border, this stripe is done. Set next stripe and goto STEP 2 + Find out x1 for the given x0, y0, y1 + */ + r.x1 = _ClipContext.ClientRect.x1; + if (r.x1 < r.x0) {/* horizontal border reached ? */ + _ClipContext.CurRect = r; + goto NextStripe; + } + /* + STEP 6: + Find r.x1. We have to Iterate over all windows which are above + */ + /* Check all siblings above (Iterate over Parents and top siblings (hNext) */ + #if 0 /* This is a planned, but not yet released optimization */ + if (Status & WM_SF_DONT_CLIP_SIBLINGS) + { + hParent = pAWin->hParent; + } else + #endif + { + hParent = GUI_Context.hAWin; + } + for (; hParent; hParent = pParent->hParent) { + pParent = WM_H2P(hParent); + _Findx1(pParent->hNext, &r, NULL); + } + /* Check all children */ + _Findx1(pAWin->hFirstChild, &r, NULL); + /* We are done. Return the rectangle we found in the _ClipContext. */ + if (_ClipContext.Cnt >200) { + return 0; /* error !!! This should not happen !*/ + } + _ClipContext.CurRect = r; + return 1; /* IVR is valid ! */ +} + +#else + +static int _FindNext_IVR(void) { + if (_ClipContext.Cnt ==0) { + _ClipContext.CurRect = GUI_Context.pAWin->Rect; + return 1; /* IVR is valid ! */ + } + return 0; /* Nothing left to draw */ +} +#endif + +/********************************************************************* +* +* WM_GetNextIVR + + Sets the next clipping rectangle. If a valid one has + been found (and set), 1 is returned in order to indicate + that the drawing operation needs to be executed. + Returning 0 signals that we have iterated over all + rectangles. + + Returns: 0 if no valid rectangle is found + 1 if rectangle has been found +*/ +int WM__GetNextIVR(void) { + #if GUI_SUPPORT_CURSOR + static char _CursorHidden; + #endif + /* If WM is not active, we have no rectangles to return */ + if (WM_IsActive==0) { + return 0; + } + if (_ClipContext.EntranceCnt > 1) { + _ClipContext.EntranceCnt--; + return 0; + } + #if GUI_SUPPORT_CURSOR + if (_CursorHidden) { + _CursorHidden = 0; + (*GUI_CURSOR_pfTempUnhide) (); + } + #endif + ++_ClipContext.Cnt; + /* Find next rectangle and use it as ClipRect */ + if (!_FindNext_IVR()) { + _ClipContext.EntranceCnt--; /* This search is over ! */ + return 0; /* Could not find an other one ! */ + } + WM__ActivateClipRect(); + /* Hide cursor if necessary */ + #if GUI_SUPPORT_CURSOR + if (GUI_CURSOR_pfTempHide) { + _CursorHidden = (*GUI_CURSOR_pfTempHide) ( &_ClipContext.CurRect); + } + #endif + return 1; +} + +/********************************************************************* +* +* WM__InitIVRSearch + + This routine is called from the clipping level + (the WM_ITERATE_START macro) when starting an iteration over the + visible rectangles. + + Return value: + 0 : There is no valid rectangle (nothing to do ...) + 1 : There is a valid rectangle +*/ +int WM__InitIVRSearch(const GUI_RECT* pMaxRect) { + GUI_RECT r; + WM_Obj* pAWin; + GUI_ASSERT_LOCK(); /* GUI_LOCK must have been "called" before entering this (normally done indrawing routine) */ + /* If WM is not active -> nothing to do, leave cliprect alone */ + if (WM_IsActive==0) { + WM__ActivateClipRect(); + return 1; + } + /* If we entered multiple times, leave Cliprect alone */ + if (++_ClipContext.EntranceCnt > 1) + return 1; + pAWin = WM_H2P(GUI_Context.hAWin); + _ClipContext.Cnt = -1; + /* When using callback mechanism, it is legal to reduce drawing + area to the invalid area ! */ + if (WM__PaintCallbackCnt) { + WM__GetInvalidRectAbs(pAWin, &r); + } else { /* Not using callback mechanism, therefor allow entire rectangle */ + if (pAWin->Status & WM_SF_ISVIS) { + r = pAWin->Rect; + } else { + --_ClipContext.EntranceCnt; + return 0; /* window is not even visible ! */ + } + } + /* If the drawing routine has specified a rectangle, use it to reduce the rectangle */ + if (pMaxRect) { + GUI__IntersectRect(&r, pMaxRect); + } + /* If user has reduced the cliprect size, reduce the rectangle */ + if (GUI_Context.WM__pUserClipRect) { + WM_Obj* pWin = pAWin; + GUI_RECT rUser = *(GUI_Context.WM__pUserClipRect); + #if WM_SUPPORT_TRANSPARENCY + if (WM__hATransWindow) { + pWin = WM_H2P(WM__hATransWindow); + } + #endif + WM__Client2Screen(pWin, &rUser); + GUI__IntersectRect(&r, &rUser); + } + /* For transparent windows, we need to further reduce the rectangle */ + #if WM_SUPPORT_TRANSPARENCY + if (WM__hATransWindow) { + if (WM__ClipAtParentBorders(&r, WM__hATransWindow) == 0) { + --_ClipContext.EntranceCnt; + return 0; /* Nothing to draw */ + } + } + #endif + /* Iterate over all ancestors and clip at their borders. If there is no visible part, we are done */ + if (WM__ClipAtParentBorders(&r, GUI_Context.hAWin) == 0) { + --_ClipContext.EntranceCnt; + return 0; /* Nothing to draw */ + } + /* Store the rectangle and find the first rectangle of the area */ + _ClipContext.ClientRect = r; + return WM__GetNextIVR(); +} + +/********************************************************************* +* +* WM_SetDefault +* + This routine sets the defaults for WM and the layers below. + It is used before a drawing routine is called in order to + make sure that defaults are set (in case the default settings + had been altered before by the application) +*/ +void WM_SetDefault(void) { + GL_SetDefault(); + GUI_Context.WM__pUserClipRect = NULL; /* No add. clipping */ +} + +/********************************************************************* +* +* _Paint1 +*/ +static void _Paint1(WM_HWIN hWin, WM_Obj* pWin) { + int Status = pWin->Status; + /* Send WM_PAINT if window is visible and a callback is defined */ + if ((pWin->cb != NULL) && (Status & WM_SF_ISVIS)) { + WM_MESSAGE Msg; + WM__PaintCallbackCnt++; + if (Status & WM_SF_LATE_CLIP) { + Msg.hWin = hWin; + Msg.MsgId = WM_PAINT; + Msg.Data.p = (GUI_RECT*)&pWin->InvalidRect; + WM_SetDefault(); + WM_SendMessage(hWin, &Msg); + } else { + WM_ITERATE_START(&pWin->InvalidRect) { + Msg.hWin = hWin; + Msg.MsgId = WM_PAINT; + Msg.Data.p = (GUI_RECT*)&pWin->InvalidRect; + WM_SetDefault(); + WM_SendMessage(hWin, &Msg); + } WM_ITERATE_END(); + } + WM__PaintCallbackCnt--; + } +} +/********************************************************************* +* +* _Paint1Trans +* +* Purpose: +* Draw a transparent window as part of an other one (the active window: pAWin). +* This is required because transparent windows are drawn as part of their +* non-transparent parents. +* Return value: +* 0 if nothing was drawn (no invalid rect) +* 1 if something was drawn (invalid rect exists) +* Add. info: +* It is important to restore the modified settings, especially the invalid rectangle +* of the window. The invalid rectangle needs to be set, as it is passed as add. info +* to the callback on WM_PAINT. +* On traditional transparent windows, the transparent window is never drawn on its own, +* so there is no need to restore the invalid rectangle. +* However, with WM_SF_CONST_OUTLINE, the window itself may need to be redrawn because it +* can be invalid. Modifying the invalid rectangle would lead to not updating the window +* in the worst case. +*/ + +#if WM_SUPPORT_TRANSPARENCY +static int _Paint1Trans(WM_HWIN hWin, WM_Obj* pWin) { + int xPrev, yPrev; + WM_Obj* pAWin = WM_H2P(GUI_Context.hAWin); + /* Check if we need to do any drawing */ + if (GUI_RectsIntersect(&pAWin->InvalidRect, &pWin->Rect)) { + /* Save old values */ + xPrev = GUI_Context.xOff; + yPrev = GUI_Context.yOff; + /* Set values for the current (transparent) window, rather than the one below */ + GUI__IntersectRects(&pWin->InvalidRect, &pWin->Rect, &pAWin->InvalidRect); + WM__hATransWindow = hWin; + GUI_Context.xOff = pWin->Rect.x0; + GUI_Context.yOff = pWin->Rect.y0; + /* Do the actual drawing ... */ + _Paint1(hWin, pWin); + /* Restore settings */ + WM__hATransWindow = 0; + GUI_Context.xOff = xPrev; + GUI_Context.yOff = yPrev; + return 1; /* Some drawing took place */ + } + return 0; /* No invalid area, so nothing was drawn */ +} +#endif + +/********************************************************************* +* +* _PaintTransChildren +* +* Purpose: +* Paint transparent children. This function is obviously required +* only if there are transparent windows. +* Function: Obvious +* Parameter: Obvious +* Returns: --- +*/ +#if WM_SUPPORT_TRANSPARENCY +static void _PaintTransChildren(WM_Obj* pWin) { + WM_HWIN hChild; + WM_Obj* pChild; + if (pWin->Status & WM_SF_ISVIS) { + for (hChild = pWin->hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + if ((pChild->Status & (WM_SF_HASTRANS | WM_SF_ISVIS)) /* Transparent & visible ? */ + == (WM_SF_HASTRANS | WM_SF_ISVIS)) { + /* Set invalid area of the window to draw */ + if (GUI_RectsIntersect(&pChild->Rect, &pWin->InvalidRect)) { + GUI_RECT InvalidRectPrev; + InvalidRectPrev = pWin->InvalidRect; + if(_Paint1Trans(hChild, pChild)) { + _PaintTransChildren(pChild); + } + pWin->InvalidRect = InvalidRectPrev; + } + } + } + } +} +#endif + +/********************************************************************* +* +* _PaintTransTopSiblings +* +* Purpose: +* Paint transparent top siblings. This function is obviously required +* only if there are transparent windows. +* Function: Obvious +* Parameter: Obvious +* Returns: --- +*/ +#if WM_SUPPORT_TRANSPARENCY +static void _PaintTransTopSiblings(WM_HWIN hWin, WM_Obj* pWin) { + WM_HWIN hParent; + WM_Obj* pParent; + hParent = pWin->hParent; + hWin = pWin->hNext; + while (hParent) { /* Go hierarchy up to desktop window */ + for (; hWin; hWin = pWin->hNext) { + pWin = WM_H2P(hWin); + /* paint window if it is transparent & visible */ + if ((pWin->Status & (WM_SF_HASTRANS | WM_SF_ISVIS)) == (WM_SF_HASTRANS | WM_SF_ISVIS)) { + _Paint1Trans(hWin, pWin); + } + /* paint transparent & visible children */ + _PaintTransChildren(pWin); + } + pParent = WM_H2P(hParent); + hWin = pParent->hNext; + hParent = pParent->hParent; + } +} +#endif + +/********************************************************************* +* +* Callback for Paint message +* +* This callback is used by the window manger in conjunction with +* banding memory devices. A pointer to this routine is given to +* the banding memory device. This callback in turn will send the +* paint message to the window. +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM__PaintWinAndOverlays +* +* Purpose +* Paint the given window and all overlaying windows +* (transparent children and transparent top siblings) +*/ +void WM__PaintWinAndOverlays(WM_PAINTINFO* pInfo) { + WM_HWIN hWin; + WM_Obj* pWin; + hWin = pInfo->hWin; + pWin = pInfo->pWin; + #if WM_SUPPORT_TRANSPARENCY + /* Transparent windows without const outline are drawn as part of the background and can be skipped. */ + if ((pWin->Status & (WM_SF_HASTRANS | WM_SF_CONST_OUTLINE)) != WM_SF_HASTRANS) { + #endif + _Paint1(hWin, pWin); /* Draw the window itself */ + #if WM_SUPPORT_TRANSPARENCY + } + if (WM__TransWindowCnt != 0) { + _PaintTransChildren(pWin); /* Draw all transparent children */ + _PaintTransTopSiblings(hWin, pWin); /* Draw all transparent top level siblings */ + } + #endif +} + +/********************************************************************* +* +* _cbPaintMemDev +* +* Purpose: +* This is the routine called by the banding memory device. It calls +* the same _cbPaint Routine which is also used when drawing directly; +* the only add. work done is adjustment of the invalid rectangle. +* This way the invalid rectangle visible by the window callback function +* is limited to the current band, allowing the callback to optimize +* better. +*/ +#if GUI_SUPPORT_MEMDEV +static void _cbPaintMemDev(void* p) { + GUI_RECT Rect; + WM_Obj* pWin = WM_H2P(GUI_Context.hAWin); + Rect = pWin->InvalidRect; + pWin->InvalidRect = GUI_Context.ClipRect; + WM__PaintWinAndOverlays((WM_PAINTINFO*)p); + pWin->InvalidRect = Rect; +} +#endif + +/********************************************************************* +* +* _Paint + Returns: + 1: a window has been redrawn + 0: No window has been drawn +*/ +static int _Paint(WM_HWIN hWin, WM_Obj* pWin) { + int Ret = 0; + if (pWin->Status & WM_SF_INVALID) { + if (pWin->cb) { + if (WM__ClipAtParentBorders(&pWin->InvalidRect, hWin)) { + WM_PAINTINFO Info; + Info.hWin = hWin; + Info.pWin = pWin; + WM_SelectWindow(hWin); + #if GUI_SUPPORT_MEMDEV + if (pWin->Status & WM_SF_MEMDEV) { + int Flags; + GUI_RECT r = pWin->InvalidRect; + Flags = (pWin->Status & WM_SF_HASTRANS) ? GUI_MEMDEV_HASTRANS : GUI_MEMDEV_NOTRANS; + /* + * Currently we treat a desktop window as transparent, because per default it does not repaint itself. + */ + if (pWin->hParent == 0) { + Flags = GUI_MEMDEV_HASTRANS; + } + GUI_MEMDEV_Draw(&r, _cbPaintMemDev, &Info, 0, Flags); + } else + #endif + { + WM__PaintWinAndOverlays(&Info); + Ret = 1; /* Something has been done */ + } + } + } + /* We purposly clear the invalid flag after painting so we can still query the invalid rectangle while painting */ + pWin->Status &= ~WM_SF_INVALID; /* Clear invalid flag */ + if (pWin->Status & WM_CF_MEMDEV_ON_REDRAW) { + pWin->Status |= WM_CF_MEMDEV; + } + WM__NumInvalidWindows--; + } + return Ret; /* Nothing done */ +} + +/********************************************************************* +* +* _DrawNext +*/ +static void _DrawNext(void) { + int UpdateRem = 1; + WM_HWIN iWin = (NextDrawWin == WM_HWIN_NULL) ? WM__FirstWin : NextDrawWin; + GUI_CONTEXT ContextOld; + GUI_SaveContext(&ContextOld); + /* Make sure the next window to redraw is valid */ + for (; iWin && UpdateRem; ) { + WM_Obj* pWin = WM_H2P(iWin); + if (_Paint(iWin, pWin)) { + UpdateRem--; /* Only the given number of windows at a time ... */ + } + iWin = pWin->hNextLin; + } + NextDrawWin = iWin; /* Remember the window */ + GUI_RestoreContext(&ContextOld); +} + +/********************************************************************* +* +* WM_Exec1 +*/ +int WM_Exec1(void) { + /* Poll PID if necessary */ + if (WM_pfPollPID) { + WM_pfPollPID(); + } + if (WM_pfHandlePID) { + if (WM_pfHandlePID()) + return 1; /* We have done something ... */ + } + if (GUI_PollKeyMsg()) { + return 1; /* We have done something ... */ + } + if (WM_IsActive && WM__NumInvalidWindows) { + WM_LOCK(); + _DrawNext(); + WM_UNLOCK(); + return 1; /* We have done something ... */ + } + return 0; /* There was nothing to do ... */ +} + +/********************************************************************* +* +* WM_Exec +*/ +int WM_Exec(void) { + int r = 0; + while (WM_Exec1()) { + r = 1; /* We have done something */ + } + return r; +} + +/********************************************************************* +* +* cbBackWin +* +* Purpose +* Callback for background window +* +*/ +static void cbBackWin( WM_MESSAGE* pMsg) { + const WM_KEY_INFO* pKeyInfo; + switch (pMsg->MsgId) { + case WM_KEY: + pKeyInfo = (const WM_KEY_INFO*)pMsg->Data.p; + if (pKeyInfo->PressedCnt == 1) { + GUI_StoreKey(pKeyInfo->Key); + } + break; + case WM_PAINT: + { + int LayerIndex; + #if GUI_NUM_LAYERS > 1 + LayerIndex = _DesktopHandle2Index(pMsg->hWin); + #else + LayerIndex = 0; + #endif + if (WM__aBkColor[LayerIndex] != GUI_INVALID_COLOR) { + GUI_SetBkColor(WM__aBkColor[LayerIndex]); + GUI_Clear(); + } + } + default: + WM_DefaultProc(pMsg); + } +} + +/********************************************************************* +* +* WM_Activate +*/ +void WM_Activate(void) { + WM_IsActive = 1; /* Running */ +} + +/********************************************************************* +* +* WM_Deactivate +*/ +void WM_Deactivate(void) { + WM_IsActive = 0; /* No clipping performed by WM */ + WM_LOCK(); + LCD_SetClipRectMax(); + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_DefaultProc +* +* Purpose +* Default callback for windows +* Any window should call this routine in the "default" part of the +* its callback function for messages it does not handle itself. +* +*/ +void WM_DefaultProc(WM_MESSAGE* pMsg) { + WM_HWIN hWin = pMsg->hWin; + const void *p = pMsg->Data.p; + WM_Obj* pWin = WM_H2P(hWin); + /* Exec message */ + switch (pMsg->MsgId) { + case WM_GET_INSIDE_RECT: /* return client window in absolute (screen) coordinates */ + WM__GetClientRectWin(pWin, (GUI_RECT*)p); + break; + case WM_GET_CLIENT_WINDOW: /* return handle to client window. For most windows, there is no seperate client window, so it is the same handle */ + pMsg->Data.v = (int)hWin; + return; /* Message handled */ + case WM_KEY: + WM_SendToParent(hWin, pMsg); + return; /* Message handled */ + case WM_GET_BKCOLOR: + pMsg->Data.Color = GUI_INVALID_COLOR; + return; /* Message handled */ + case WM_NOTIFY_ENABLE: + WM_InvalidateWindow(hWin); + return; /* Message handled */ + } + /* Message not handled. If it queries something, we return 0 to be on the safe side. */ + pMsg->Data.v = 0; + pMsg->Data.p = 0; +} + +/********************************************************************* +* +* WM_Init +*/ +void WM_Init(void) { + if (!_IsInited) { + NextDrawWin = WM__FirstWin = WM_HWIN_NULL; + GUI_Context.WM__pUserClipRect = NULL; + WM__NumWindows = WM__NumInvalidWindows =0; + /* Make sure we have at least one window. This greatly simplifies the + drawing routines as they do not have to check if the window is valid. + */ + #if GUI_NUM_LAYERS == 1 + WM__ahDesktopWin[0] = WM_CreateWindow(0, 0, GUI_XMAX, GUI_YMAX, WM_CF_SHOW, cbBackWin, 0); + WM__aBkColor[0] = GUI_INVALID_COLOR; + WM_InvalidateWindow(WM__ahDesktopWin[0]); /* Required because a desktop window has no parent. */ + #else + { + int i; + for (i = 0; i < GUI_NUM_LAYERS; i++) { + WM__ahDesktopWin[i] = WM_CreateWindowAsChild(0, 0, GUI_XMAX, GUI_YMAX, WM_UNATTACHED, WM_CF_SHOW, cbBackWin, 0); + WM__aBkColor[i] = GUI_INVALID_COLOR; + WM_InvalidateWindow(WM__ahDesktopWin[i]); /* Required because a desktop window has no parent. */ + } + } + #endif + /* Register the critical handles ... Note: This could be moved into the module setting the Window handle */ + WM__AddCriticalHandle(&WM__CHWinModal); + WM__AddCriticalHandle(&WM__CHWinLast); + + WM_SelectWindow(WM__ahDesktopWin[0]); + WM_Activate(); + _IsInited =1; + } +} + + +#else + void WM(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/WM/WM.h b/User/system/lib/lcd/gui/WM/WM.h new file mode 100644 index 0000000..f3c5234 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM.h @@ -0,0 +1,537 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM.h +Purpose : Windows manager include +---------------------------------------------------------------------- +*/ + +#ifndef WM_H /* Make sure we only include it once */ +#define WM_H + + +#include "GUI_ConfDefaults.h" +#include "GUIType.h" /* Needed because of typedefs only */ +#include "WM_GUI.h" /* Some functions needed by GUI routines */ + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/* Support for transparency. Switching it off makes Wm smaller and faster */ +#ifndef WM_SUPPORT_TRANSPARENCY + #define WM_SUPPORT_TRANSPARENCY 1 /* Should be defined outside of GUI_WINSUPPORT because of "#if GUI_WINSUPPORT && WM_SUPPORT_TRANSPARENCY" in some files */ +#endif + +/* This is for tests only. It will fill the invalid area of a window. + Can be used for debugging. */ +#ifndef WM_SUPPORT_DIAG + #ifdef WIN32 /* In simulation */ + #define WM_SUPPORT_DIAG GUI_WINSUPPORT + #else + #define WM_SUPPORT_DIAG 0 + #endif +#endif + +/* Make sure we actually have configured windows. If we have not, + there is no point for a windows manager and it will therefor not + generate any code ! +*/ + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Config defaults +* +********************************************************************** +*/ + +#ifndef WM_ASSERT + #define WM_ASSERT(expr) GUI_DEBUG_ASSERT(expr) +#endif + +#ifndef WM_SUPPORT_TOUCH + #define WM_SUPPORT_TOUCH GUI_SUPPORT_TOUCH +#endif + +#ifndef WM_SUPPORT_OBSTRUCT + #define WM_SUPPORT_OBSTRUCT 1 +#endif + +/* Allow older API calls */ +#ifndef WM_COMPATIBLE_MODE + #define WM_COMPATIBLE_MODE 1 +#endif + +/* Send a message if visibility of a window has changed */ +#ifndef WM_SUPPORT_NOTIFY_VIS_CHANGED + #define WM_SUPPORT_NOTIFY_VIS_CHANGED 0 +#endif + + +/* + ************************************************************* + * * + * Configuration check * + * * + ************************************************************* +*/ + +/* + ************************************************************* + * * + * Locking macros * + * * + ************************************************************* + For performance reasons, the windows manager uses the same locking mechanisms + as the GUI layer. The advantage is that wiht a single call to GUI_LOCK both + the graphic level and the WM level are covered. +*/ + +#define WM_LOCK() GUI_LOCK() +#define WM_UNLOCK() GUI_UNLOCK() + +/************************************************************ +* +* Data types +* +************************************************************* +*/ + +typedef struct { + int Key, PressedCnt; +} WM_KEY_INFO; + +typedef struct { + int NumItems, v, PageSize; +} WM_SCROLL_STATE; + +typedef struct { + int Done; + int ReturnValue; +} WM_DIALOG_STATUS; + +typedef struct { + int x,y; + U8 State; + U8 StatePrev; +} WM_PID_STATE_CHANGED_INFO; + + + +/********************************************************************* +* +* Messages Ids + +The following is the list of windows messages. +*/ + + +#define WM_CREATE 0x0001 /* The first message received, right after client has actually been created */ +#define WM_MOVE 0x0003 /* window has been moved (Same as WIN32) */ + +#define WM_SIZE 0x0005 /* Is sent to a window after its size has changed (Same as WIN32, do not change !) */ + +#define WM_DELETE 11 /* Delete (Destroy) command: This tells the client to free its data strutures since the window + it is associates with no longer exists.*/ +#define WM_TOUCH 12 /* Touch screen message */ +#define WM_TOUCH_CHILD 13 /* Touch screen message to ancestors */ +#define WM_KEY 14 /* Key has been pressed */ + +#define WM_PAINT 0x000F /* Repaint window (because content is (partially) invalid */ + +#if GUI_SUPPORT_MOUSE +#define WM_MOUSEOVER 16 /* Mouse has moved, no key pressed */ +#endif + +#define WM_PID_STATE_CHANGED 17 /* Pointer input device state has changed */ + +#define WM_GET_INSIDE_RECT 20 /* get inside rectangle: client rectangle minus pixels lost to effect */ +#define WM_GET_ID 21 /* Get id of widget */ +#define WM_SET_ID 22 /* Set id of widget */ +#define WM_GET_CLIENT_WINDOW 23 /* Get window handle of client window. Default is the same as window */ +#define WM_CAPTURE_RELEASED 24 /* Let window know that mouse capture is over */ + +#define WM_INIT_DIALOG 30 /* Inform dialog that it is ready for init */ + +#define WM_SET_FOCUS 31 /* Inform window that it has gotten or lost the focus */ +#define WM_GET_ACCEPT_FOCUS 32 /* Find out if window can accept the focus */ +#define WM_NOTIFY_CHILD_HAS_FOCUS 33 + +#define WM_GET_BKCOLOR 34 /* Return back ground color (only frame window and similar) */ +#define WM_GET_SCROLL_STATE 35 /* Query state of scroll bar */ + +#define WM_SET_SCROLL_STATE 36 /* Set scroll info ... only effective for scrollbars */ + +#define WM_NOTIFY_CLIENTCHANGE 37 /* Client area may have changed */ +#define WM_NOTIFY_PARENT 38 /* Notify parent. Information is detailed as notification code */ +#define WM_NOTIFY_PARENT_REFLECTION 39 /* Notify parent reflection. + Sometimes send back as a result of the WM_NOTIFY_PARENT message + to let child react on behalf of its parent. + Information is detailed as notification code */ +#define WM_NOTIFY_ENABLE 40 /* Enable or disable widget */ +#define WM_NOTIFY_VIS_CHANGED 41 /* Visibility of a window has or may have changed */ + +#define WM_HANDLE_DIALOG_STATUS 42 /* Set or get dialog status */ +#define WM_GET_RADIOGROUP 43 /* Send to all siblings and children of a radio control when + selection changed */ +#define WM_MENU 44 /* Send to owner window of menu widget */ + +#define WM_TIMER 0x0113 /* Timer has expired (Keep the same as WIN32) */ +#define WM_WIDGET 0x0300 /* 256 messages reserved for Widget messages */ +#define WM_USER 0x0400 /* Reserved for user messages ... (Keep the same as WIN32) */ + + +/********************************************************************* +* +* Notification codes +* +* The following is the list of notification codes send +* with the WM_NOTIFY_PARENT message +*/ +#define WM_NOTIFICATION_CLICKED 1 +#define WM_NOTIFICATION_RELEASED 2 +#define WM_NOTIFICATION_MOVED_OUT 3 +#define WM_NOTIFICATION_SEL_CHANGED 4 +#define WM_NOTIFICATION_VALUE_CHANGED 5 +#define WM_NOTIFICATION_SCROLLBAR_ADDED 6 /* Scroller added */ +#define WM_NOTIFICATION_CHILD_DELETED 7 /* Inform window that child is about to be deleted */ +#define WM_NOTIFICATION_GOT_FOCUS 8 +#define WM_NOTIFICATION_LOST_FOCUS 9 +#define WM_NOTIFICATION_SCROLL_CHANGED 10 + +#define WM_NOTIFICATION_WIDGET 11 /* Space for widget defined notifications */ +#define WM_NOTIFICATION_USER 16 /* Space for application (user) defined notifications */ +/********************************************************************* +* +* Memory management +*/ + +#define WM_HWIN GUI_HWIN +#define WM_HWIN_NULL GUI_HMEM_NULL +#define WM_HMEM GUI_HMEM +#define WM_HMEM_NULL GUI_HMEM_NULL + +/********************************************************************* +* +* Window defines +*/ +#define WM_HBKWIN WM_GetDesktopWindow() /* Handle of background window */ +#define WM_UNATTACHED ((WM_HMEM)-1) /* Do not attach to a window */ + + +/********************************************************************* +* +* Window create flags. +* These flags can be passed to the create window +* function as flag-parameter. The flags are combinable using the +* binary or operator. +*/ + +#define WM_CF_HASTRANS (1<<0) /* Has transparency. Needs to be defined for windows which do not fill the entire + section of their (client) rectangle. */ +#define WM_CF_HIDE (0<<1) /* Hide window after creation (default !) */ +#define WM_CF_SHOW (1<<1) /* Show window after creation */ +#define WM_CF_MEMDEV (1<<2) /* Use memory device for redraws */ +#define WM_CF_STAYONTOP (1<<3) /* Stay on top */ +#define WM_CF_DISABLED (1<<4) /* Disabled: Does not receive PID (mouse & touch) input */ +/* Create only flags ... Not available as status flags */ +#define WM_CF_ACTIVATE (1<<5) /* If automatic activation upon creation of window is desired */ +#define WM_CF_FGND (0<<6) /* Put window in foreground after creation (default !) */ +#define WM_CF_BGND (1<<6) /* Put window in background after creation */ + +/* Anchor flags */ +#define WM_CF_ANCHOR_RIGHT (1<<7) /* Right anchor ... If parent is resized, distance to right will remain const (left is default) */ +#define WM_CF_ANCHOR_BOTTOM (1<<8) /* Bottom anchor ... If parent is resized, distance to bottom will remain const (top is default) */ +#define WM_CF_ANCHOR_LEFT (1<<9) /* Left anchor ... If parent is resized, distance to left will remain const (left is default) */ +#define WM_CF_ANCHOR_TOP (1<<10) /* Top anchor ... If parent is resized, distance to top will remain const (top is default) */ + +#define WM_CF_CONST_OUTLINE (1<<11) /* Constant outline. This is relevant for transparent windows only. If a window is transparent + and does not have a constant outline, its background is invalided instead of the window itself. + This causes add. computation time when redrawing. */ +#define WM_CF_LATE_CLIP (1<<12) +#define WM_CF_MEMDEV_ON_REDRAW (1<<13) +#define WM_CF_RESERVED3 (1<<14) +#define WM_CF_RESERVED4 (1<<15) + +/********************************************************************* +* +* Window manager types +*/ + +typedef struct { + int MsgId; /* type of message */ + WM_HWIN hWin; /* Destination window */ + WM_HWIN hWinSrc; /* Source window */ + union { + const void* p; /* Some messages need more info ... Pointer is declared "const" because some systems (M16C) have 4 byte const, byte 2 byte default ptrs */ + int v; + GUI_COLOR Color; + } Data; +} WM_MESSAGE; + +typedef void WM_CALLBACK( WM_MESSAGE* pMsg); + +typedef struct { + GUI_RECT Rect; /* outer dimensions of window */ + GUI_RECT InvalidRect; /* invalid rectangle */ + WM_CALLBACK* cb; /* ptr to notification callback */ + WM_HWIN hNextLin; /* Next window in linear list */ + WM_HWIN hParent; + WM_HWIN hFirstChild; + WM_HWIN hNext; + U16 Status; /* Some status flags */ +} WM_Obj; + +typedef void WM_tfPollPID(void); +typedef void WM_tfForEach(WM_HWIN hWin, void * pData); + +/* +********************************************************************** +* +* General control routines +* +********************************************************************** +*/ + + +void WM_Activate (void); +void WM_Deactivate(void); +void WM_Init (void); +int WM_Exec (void); /* Execute all jobs ... Return 0 if nothing was done. */ +int WM_Exec1 (void); /* Execute one job ... Return 0 if nothing was done. */ +U16 WM_SetCreateFlags(U16 Flags); +WM_tfPollPID* WM_SetpfPollPID(WM_tfPollPID* pf); +void WM_SetCapture(WM_HWIN hObj, int AutoRelease); +void WM_SetCaptureMove(WM_HWIN hWin, const GUI_PID_STATE* pState, int MinVisibility); /* Not yet documented */ +void WM_ReleaseCapture(void); + +/********************************************************************* +* +* Window manager interface +* +********************************************************************** +*/ + +void WM_AttachWindow (WM_HWIN hWin, WM_HWIN hParent); +void WM_AttachWindowAt (WM_HWIN hWin, WM_HWIN hParent, int x, int y); +int WM_CheckScrollPos (WM_SCROLL_STATE* pScrollState, int Pos, int LowerDist, int UpperDist); /* not to be documented (may change in future version) */ +void WM_ClrHasTrans (WM_HWIN hWin); +WM_HWIN WM_CreateWindow (int x0, int y0, int xSize, int ySize, U16 Style, WM_CALLBACK* cb, int NumExtraBytes); +WM_HWIN WM_CreateWindowAsChild (int x0, int y0, int xSize, int ySize, WM_HWIN hWinParent, U16 Style, WM_CALLBACK* cb, int NumExtraBytes); +void WM_DeleteWindow (WM_HWIN hWin); +void WM_DetachWindow (WM_HWIN hWin); +int WM_GetHasTrans (WM_HWIN hWin); +WM_HWIN WM_GetFocussedWindow (void); +void WM_HideWindow (WM_HWIN hWin); +void WM_InvalidateArea (const GUI_RECT* pRect); +void WM_InvalidateRect (WM_HWIN hWin, const GUI_RECT*pRect); +void WM_InvalidateWindow (WM_HWIN hWin); +void WM_InvalidateWindowDescs (WM_HWIN hWin); /* not to be documented (may change in future version) */ +int WM_IsEnabled (WM_HWIN hObj); +int WM_IsFocussable (WM_HWIN hWin); +int WM_IsVisible (WM_HWIN hWin); +int WM_IsWindow (WM_HWIN hWin); /* Check validity */ +char WM_IsCompletelyVisible (WM_HWIN hWin); /* Is the window completely visible ? */ +void WM_SetHasTrans (WM_HWIN hWin); +void WM_SetId (WM_HWIN hObj, int Id); +void WM_SetTransState (WM_HWIN hWin, unsigned State); +void WM_ShowWindow (WM_HWIN hWin); +void WM_ValidateRect (WM_HWIN hWin, const GUI_RECT*pRect); +void WM_ValidateWindow (WM_HWIN hWin); +int WM_GetInvalidRect (WM_HWIN hWin, GUI_RECT * pRect); +void WM_SetStayOnTop (WM_HWIN hWin, int OnOff); +int WM_GetStayOnTop (WM_HWIN hWin); +void WM_SetAnchor (WM_HWIN hWin, U16 AnchorFlags); + +/* Move/resize windows */ +void WM_MoveWindow (WM_HWIN hWin, int dx, int dy); +void WM_ResizeWindow (WM_HWIN hWin, int dx, int dy); +void WM_MoveTo (WM_HWIN hWin, int x, int y); +void WM_MoveChildTo (WM_HWIN hWin, int x, int y); +void WM_SetSize (WM_HWIN hWin, int XSize, int YSize); +int WM_SetXSize (WM_HWIN hWin, int xSize); +int WM_SetYSize (WM_HWIN hWin, int ySize); +int WM_CreateTimer (WM_HWIN hWin, int UserID, int Period, int Mode); /* not to be documented (may change in future version) */ +void WM_DeleteTimer (WM_HWIN hWin, int UserId); /* not to be documented (may change in future version) */ +int WM_SetScrollbarH (WM_HWIN hWin, int OnOff); /* not to be documented (may change in future version) */ +int WM_SetScrollbarV (WM_HWIN hWin, int OnOff); /* not to be documented (may change in future version) */ + + +/* Diagnostics */ +int WM_GetNumWindows(void); +int WM_GetNumInvalidWindows(void); + +/* Scroll state related functions */ +int WM_SetScrollValue (WM_SCROLL_STATE* pScrollState, int v); /* not to be documented (may change in future version) */ +void WM_CheckScrollBounds(WM_SCROLL_STATE* pScrollState); /* not to be documented (may change in future version) */ + + +/* Set (new) callback function */ +WM_CALLBACK* WM_SetCallback (WM_HWIN Win, WM_CALLBACK* cb); + +/* Get size/origin of a window */ +void WM_GetClientRect (GUI_RECT* pRect); +void WM_GetClientRectEx (WM_HWIN hWin, GUI_RECT* pRect); +void WM_GetInsideRect (GUI_RECT* pRect); +void WM_GetInsideRectEx (WM_HWIN hWin, GUI_RECT* pRect); +void WM_GetInsideRectExScrollbar (WM_HWIN hWin, GUI_RECT* pRect); /* not to be documented (may change in future version) */ +void WM_GetWindowRect (GUI_RECT* pRect); +void WM_GetWindowRectEx (WM_HWIN hWin, GUI_RECT* pRect); +int WM_GetOrgX (void); +int WM_GetOrgY (void); +int WM_GetWindowOrgX (WM_HWIN hWin); +int WM_GetWindowOrgY (WM_HWIN hWin); +int WM_GetWindowSizeX (WM_HWIN hWin); +int WM_GetWindowSizeY (WM_HWIN hWin); +WM_HWIN WM_GetFirstChild (WM_HWIN hWin); +WM_HWIN WM_GetNextSibling (WM_HWIN hWin); +WM_HWIN WM_GetParent (WM_HWIN hWin); +WM_HWIN WM_GetPrevSibling (WM_HWIN hWin); +int WM_GetId (WM_HWIN hWin); +WM_HWIN WM_GetScrollbarV (WM_HWIN hWin); +WM_HWIN WM_GetScrollbarH (WM_HWIN hWin); +WM_HWIN WM_GetScrollPartner (WM_HWIN hWin); +WM_HWIN WM_GetClientWindow (WM_HWIN hObj); +GUI_COLOR WM_GetBkColor (WM_HWIN hObj); + +/* Change Z-Order of windows */ +void WM_BringToBottom(WM_HWIN hWin); +void WM_BringToTop(WM_HWIN hWin); + +GUI_COLOR WM_SetDesktopColor(GUI_COLOR Color); +GUI_COLOR WM_SetDesktopColorEx(GUI_COLOR Color, unsigned int LayerIndex); +void WM_SetDesktopColors(GUI_COLOR Color); + +/* Select window used for drawing operations */ +WM_HWIN WM_SelectWindow (WM_HWIN hWin); +WM_HWIN WM_GetActiveWindow (void); +void WM_Paint (WM_HWIN hObj); + +/* Get foreground/background windows */ +WM_HWIN WM_GetDesktopWindow (void); +WM_HWIN WM_GetDesktopWindowEx (unsigned int LayerIndex); + +/* Reduce clipping area of a window */ +const GUI_RECT* WM_SetUserClipRect(const GUI_RECT* pRect); +void WM_SetDefault (void); + +/* Use of memory devices */ +void WM_EnableMemdev (WM_HWIN hWin); +void WM_DisableMemdev (WM_HWIN hWin); + +int WM_OnKey(int Key, int Pressed); +void WM_MakeModal(WM_HWIN hWin); + + +/****************************************************************** +* +* Message related funcions +* +******************************************************************* + Please note that some of these functions do not yet show up in the + documentation, as they should not be required by application program. +*/ + +void WM_NotifyParent (WM_HWIN hWin, int Notification); +void WM_SendMessage (WM_HWIN hWin, WM_MESSAGE* p); +void WM_SendMessageNoPara (WM_HWIN hWin, int MsgId); /* not to be documented (may change in future versionumented */ +void WM_DefaultProc (WM_MESSAGE* pMsg); +int WM_BroadcastMessage (WM_MESSAGE* pMsg); +void WM_SetScrollState (WM_HWIN hWin, const WM_SCROLL_STATE* pState); +void WM_SetEnableState (WM_HWIN hItem, int State); +void WM_SendToParent (WM_HWIN hWin, WM_MESSAGE* pMsg); +int WM_HasCaptured (WM_HWIN hWin); +int WM_HasFocus (WM_HWIN hWin); +int WM_SetFocus (WM_HWIN hWin); +WM_HWIN WM_SetFocusOnNextChild (WM_HWIN hParent); /* Set the focus to the next child */ +WM_HWIN WM_SetFocusOnPrevChild (WM_HWIN hParent); /* Set the focus to the previous child */ +WM_HWIN WM_GetDialogItem (WM_HWIN hWin, int Id); +void WM_EnableWindow (WM_HWIN hWin); +void WM_DisableWindow (WM_HWIN hWin); +void WM_GetScrollState (WM_HWIN hObj, WM_SCROLL_STATE* pScrollState); +int WM_GetUserData (WM_HWIN hWin, void* pDest, int SizeOfBuffer); +int WM_SetUserData (WM_HWIN hWin, const void* pSrc, int SizeOfBuffer); + + +/********************************************************************* +* +* Misc routines +*/ + +int WM_HandlePID (void); +WM_HWIN WM_Screen2hWin (int x, int y); +WM_HWIN WM_Screen2hWinEx (WM_HWIN hStop, int x, int y); +void WM_ForEachDesc (WM_HWIN hWin, WM_tfForEach * pcb, void * pData); + +/********************************************************************* +* +* Diagnostics routines +*/ +#if (WM_SUPPORT_DIAG) +void WM_DIAG_EnableInvalidationColoring(int OnOff); +#endif + +/* + ************************************************* + * * + * Macros for compatibility with older versions * + * * + ************************************************* +*/ + +#if WM_COMPATIBLE_MODE + #define HBWIN WM_HWIN + #define HBWIN_NULL WM_HWIN_NULL + + #define WM_HideWin WM_HideWindow + #define WM_ShowWin WM_ShowWindow + #define WM_GetKey GUI_GetKey + #define WM_WaitKey GUI_WaitKey + + #define WM_ExecIdle WM_Exec + #define WM_ExecIdle1 WM_Exec1 + + #define WM_Invalidate WM_InvalidateWindow + #define WM_GetWinRect WM_GetWindowRect + #define WM_GetWinOrgX WM_GetWindowOrgX + #define WM_GetWinOrgY WM_GetWindowOrgY + #define WM_GetWinSizeX WM_GetWindowSizeX + #define WM_GetWinSizeY WM_GetWindowSizeY + #define WM_GetXSize WM_GetWindowSizeX + #define WM_GetYSize WM_GetWindowSizeY + #define WM_SelWin WM_SelectWindow + #define WM_GetBackgroundWindow WM_GetDesktopWindow + #define WM_GetForegroundWindow 0 + #define WM_SetForegroundWindow WM_BringToTop + #define WM_SetUserClipArea WM_SetUserClipRect + + + #define WM_Start() + #define WM_Stop() + #define WM_SetBkWindowColor(Color) WM_SetDesktopColor(Color) + +#endif + + +#endif /* GUI_WINSUPPORT */ + +#if defined(__cplusplus) +} +#endif + +#endif /* WM_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WMMemDev.c b/User/system/lib/lcd/gui/WM/WMMemDev.c new file mode 100644 index 0000000..e009435 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WMMemDev.c @@ -0,0 +1,73 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WMMemDev.C +Purpose : Windows manager add on, support for memory devices +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" +#include "GUIDebug.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_EnableMemdev +*/ +void WM_EnableMemdev (WM_HWIN hWin) { + GUI_USE_PARA(hWin); + #if GUI_SUPPORT_MEMDEV + if (hWin) { + WM_Obj * pWin; + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + pWin->Status |= (WM_SF_MEMDEV); + WM_UNLOCK(); + } + #else + GUI_DEBUG_WARN("WM_EnableMemdev: No effect because disabled in GUIConf.h (GUI_SUPPORT_MEMDEV == 0)"); + #endif +} + +/********************************************************************* +* +* WM_DisableMemdev +*/ +void WM_DisableMemdev(WM_HWIN hWin) { + GUI_USE_PARA(hWin); + #if GUI_SUPPORT_MEMDEV + if (hWin) { + WM_Obj * pWin; + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + pWin->Status &= ~(WM_SF_MEMDEV | WM_SF_MEMDEV_ON_REDRAW); + WM_UNLOCK(); + } + #else + GUI_DEBUG_WARN("WM_EnableMemdev: No effect because disabled in GUIConf.h (GUI_SUPPORT_MEMDEV == 0)"); + #endif +} + +#else + void WM_MemDev(void) {} /* avoid empty object files */ +#endif /* GUI_WIN_SUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WMTouch.c b/User/system/lib/lcd/gui/WM/WMTouch.c new file mode 100644 index 0000000..ee4af3d --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WMTouch.c @@ -0,0 +1,245 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WMTouch.c +Purpose : Windows manager, touch support +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" +#include "GUIDebug.h" + +#if (GUI_WINSUPPORT) + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + +WM_CRITICAL_HANDLE WM__CHWinModal; +WM_CRITICAL_HANDLE WM__CHWinLast; + +/********************************************************************* +* +* Modul internal routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__IsInModalArea +*/ +int WM__IsInModalArea(WM_HWIN hWin) { + if ((WM__CHWinModal.hWin == 0) || WM__IsAncestor(hWin, WM__CHWinModal.hWin) || (hWin == WM__CHWinModal.hWin)) { + return 1; + } + return 0; +} + +/********************************************************************* +* +* WM__SendPIDMessage +* +* Purpose: +* Sends a PID -type message to the affected window. +* All ancestors are notified of this by sending a WM_TOUCH_CHILD +* message. +* +*/ +void WM__SendPIDMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) { + WM_MESSAGE Msg; + /* Send message to the affected window */ + Msg = *pMsg; /* Save message as it may be modified in callback (as return value) */ + WM__SendMessageIfEnabled(hWin, &Msg); + /* Send notification to all ancestors. + We need to check if the window which has received the last message still exists, + since it may have deleted itself and its parent as result of the message. + */ + Msg.hWinSrc = hWin; + Msg.MsgId = WM_TOUCH_CHILD; + while (WM_IsWindow(hWin)) { + hWin = WM_GetParent(hWin); + if (hWin) { + Msg.Data.p = pMsg; /* Needs to be set for each window, as callback is allowed to modify it */ + WM__SendMessageIfEnabled(hWin, &Msg); /* Send message to the ancestors */ + } + } +} + +/********************************************************************* +* +* WM__SendTouchMessage +*/ +void WM__SendTouchMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) { + GUI_PID_STATE* pState; + pState = (GUI_PID_STATE*)pMsg->Data.p; + if (pState) { + WM_Obj* pWin; + pWin = WM_H2P(hWin); + pState->x -= pWin->Rect.x0; + pState->y -= pWin->Rect.y0; + } + WM__SendPIDMessage(hWin, pMsg); +} + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Screen2Win +*/ +static WM_HWIN _Screen2Win(GUI_PID_STATE* pState) { + if (WM__hCapture == 0) { + return WM_Screen2hWin(pState->x, pState->y); + } + return WM__hCapture; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_HandlePID +* +* Polls the touch screen. If something has changed, +* sends a message to the concerned window. +* +* Return value: +* 0 if nothing has been done +* 1 if touch message has been sent +*/ +int WM_HandlePID(void) { + int r = 0; + WM_MESSAGE Msg; + WM_CRITICAL_HANDLE CHWin; + GUI_PID_STATE State, StateNew; + GUI_PID_GetState(&StateNew); + WM_LOCK(); + WM__AddCriticalHandle(&CHWin); + if ((WM_PID__StateLast.x != StateNew.x) || (WM_PID__StateLast.y != StateNew.y) || (WM_PID__StateLast.Pressed != StateNew.Pressed)) { + #if GUI_SUPPORT_CURSOR + GUI_CURSOR_SetPosition(StateNew.x, StateNew.y); + #endif + CHWin.hWin = _Screen2Win(&StateNew); + if (WM__IsInModalArea(CHWin.hWin)) { + /* + * Send WM_PID_STATE_CHANGED message if state has changed (just pressed or just released) + */ + if ((WM_PID__StateLast.Pressed != StateNew.Pressed) && CHWin.hWin) { + WM_PID_STATE_CHANGED_INFO Info; + WM_Obj* pWin; + pWin = WM_H2P(CHWin.hWin); + Info.State = StateNew.Pressed; + Info.StatePrev = WM_PID__StateLast.Pressed; + Info.x = StateNew.x - pWin->Rect.x0; + Info.y = StateNew.y - pWin->Rect.y0; + Msg.Data.p = &Info; + Msg.MsgId = WM_PID_STATE_CHANGED; + WM__SendMessageIfEnabled(CHWin.hWin, &Msg); + } + /* + * Send WM_TOUCH message(s) + * Note that we may have to send 2 touch messages. + */ + if (WM_PID__StateLast.Pressed | StateNew.Pressed) { /* Only if pressed or just released */ + Msg.MsgId = WM_TOUCH; + r = 1; + /* + * Tell window if it is no longer pressed + * This happens for 2 possible reasons: + * a) PID is released + * b) PID is moved out + */ + if (WM__CHWinLast.hWin != CHWin.hWin) { + if (WM__CHWinLast.hWin != 0) { + if (StateNew.Pressed) { + /* Moved out -> no longer in this window + * Send a NULL pointer as data + */ + Msg.Data.p = NULL; + } else { + /* Last window needs to know that it has been "Released" + * Send last coordinates + */ + State.x = WM_PID__StateLast.x; + State.y = WM_PID__StateLast.y; + State.Pressed = 0; + Msg.Data.p = (void*)&State; + } + GUI_DEBUG_LOG1 ("\nSending WM_Touch to LastWindow %d (out of area)", WM__CHWinLast.hWin); + WM__SendTouchMessage(WM__CHWinLast.hWin, &Msg); + WM__CHWinLast.hWin = 0; + } + } + /* Sending WM_Touch to current window */ + if (CHWin.hWin) { + /* convert screen into window coordinates */ + State = StateNew; + /* Remember window */ + if (State.Pressed) { + WM__CHWinLast.hWin = CHWin.hWin; + } else { + /* Handle automatic capture release */ + if (WM__CaptureReleaseAuto) { + WM_ReleaseCapture(); + } + WM__CHWinLast.hWin = 0; + } + Msg.Data.p = (void*)&State; + WM__SendTouchMessage(CHWin.hWin, &Msg); + } + } + /* + * Send WM_MOUSEOVER message + */ + #if GUI_SUPPORT_MOUSE + else { + /* Send WM_MOUSEOVER Message */ + if (CHWin.hWin) { + /* Do not send messages to disabled windows */ + if (WM__IsEnabled(CHWin.hWin)) { + State = StateNew; + Msg.MsgId = WM_MOUSEOVER; + Msg.Data.p = (void*)&State; + WM__SendTouchMessage(CHWin.hWin, &Msg); + } + } + } + #endif + } + /* Store the new state */ + WM_PID__StateLast = StateNew; + } + WM__RemoveCriticalHandle(&CHWin); + WM_UNLOCK(); + return r; +} + +#else + void WM_Touch_c(void) {} /* avoid empty object files */ +#endif /* (GUI_WINSUPPORT & GUI_SUPPORT_TOUCH) */ + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/WM/WM_AttachWindow.c b/User/system/lib/lcd/gui/WM/WM_AttachWindow.c new file mode 100644 index 0000000..050efdc --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_AttachWindow.c @@ -0,0 +1,86 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_AttachWindow.c +Purpose : Windows manager routines +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_DetachWindow +*/ +void WM_DetachWindow(WM_HWIN hWin) { + if (hWin) { + WM_HWIN hParent; + WM_Obj* pWin; + WM_LOCK(); + pWin = WM_H2P(hWin); + hParent = pWin->hParent; + if (hParent) { + WM_Obj* pParent; + WM__DetachWindow(hWin); + pParent = WM_H2P(hParent); + WM_MoveWindow(hWin, -pParent->Rect.x0, -pParent->Rect.y0); /* Convert screen coordinates -> parent coordinates */ + /* ToDo: Invalidate. If Parent window is located at (0,0). */ + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* WM_AttachWindow +*/ +void WM_AttachWindow(WM_HWIN hWin, WM_HWIN hParent) { + WM_LOCK(); + if (hParent && (hParent != hWin)) { + WM_Obj* pWin = WM_H2P(hWin); + WM_Obj* pParent = WM_H2P(hParent); + if (pWin->hParent != hParent) { + WM_DetachWindow(hWin); + WM__InsertWindowIntoList(hWin, hParent); + WM_MoveWindow(hWin, pParent->Rect.x0, pParent->Rect.y0); /* Convert parent coordinates -> screen coordinates */ + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_AttachWindowAt +*/ +void WM_AttachWindowAt(WM_HWIN hWin, WM_HWIN hParent, int x, int y) { + WM_DetachWindow(hWin); + WM_MoveTo(hWin, x, y); + WM_AttachWindow(hWin, hParent); +} + + +#else + void WM_AttachWindow_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/WM/WM_BringToBottom.c b/User/system/lib/lcd/gui/WM/WM_BringToBottom.c new file mode 100644 index 0000000..e0af450 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_BringToBottom.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_BringToBottom.c +Purpose : Window manager routine +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_BringToBottom +*/ +void WM_BringToBottom(WM_HWIN hWin) { + WM_HWIN hParent; + WM_HWIN hPrev; + WM_Obj* pWin; + WM_Obj* pPrev; + WM_Obj* pParent; + WM_LOCK(); + if (hWin) { + pWin = WM_H2P(hWin); + hPrev = WM__GetPrevSibling(hWin); + if (hPrev) { /* If there is no previous one, there is nothing to do ! */ + hParent = WM_GetParent(hWin); + pParent = WM_H2P(hParent); + /* unlink hWin */ + pPrev = WM_H2P(hPrev); + pPrev->hNext = pWin->hNext; + /* Link from parent (making it the first child) */ + pWin->hNext = pParent->hFirstChild; + pParent->hFirstChild = hWin; + /* Send message in order to make sure top window will be drawn */ + WM_InvalidateArea(&pWin->Rect); + } + } + WM_UNLOCK(); +} + +#else + void WM_BringToBottom_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_BringToTop.c b/User/system/lib/lcd/gui/WM/WM_BringToTop.c new file mode 100644 index 0000000..89f10a7 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_BringToTop.c @@ -0,0 +1,109 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_BringToTop.c +Purpose : Windows manager routine +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Data types +* +********************************************************************** +*/ + +typedef struct { + GUI_RECT Rect; +} VCDATA; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +/********************************************************************* +* +* _cbInvalidateOne +*/ +static void _cbInvalidateOne(WM_HWIN hWin, void * p) { + GUI_USE_PARA(p); + WM_InvalidateWindow(hWin); +} + +/********************************************************************* +* +* _InvalidateWindowAndDescs +*/ +static void _InvalidateWindowAndDescs(WM_HWIN hWin) { + WM_InvalidateWindow(hWin); + WM_ForEachDesc(hWin, _cbInvalidateOne, 0); +} + +/********************************************************************* +* +* _BringToTop +*/ +static void _BringToTop(WM_HWIN hWin) { + WM_HWIN hNext, hParent; + WM_Obj * pWin, * pNext; + if (hWin) { + pWin = WM_H2P(hWin); + hNext = pWin->hNext; + /* Is window alread on top ? If so, we are done. (Not required, just an optimization) */ + if (hNext == 0) { + return; + } + /* For non-top windows, it is good enough if the next one is a stay-on-top-window (Not required, just an optimization) */ + if ((pWin->Status & WM_SF_STAYONTOP) == 0) { + pNext = WM_H2P(hNext); + if (pNext->Status & WM_SF_STAYONTOP) { + return; + } + } + hParent = pWin->hParent; + WM__RemoveWindowFromList(hWin); + WM__InsertWindowIntoList(hWin, hParent); + _InvalidateWindowAndDescs(hWin); + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_BringToTop +*/ +void WM_BringToTop(WM_HWIN hWin) { + WM_LOCK(); + _BringToTop(hWin); + WM_UNLOCK(); +} + +#else + void WM_BringToTop_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Broadcast.c b/User/system/lib/lcd/gui/WM/WM_Broadcast.c new file mode 100644 index 0000000..e6e61a6 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Broadcast.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Broadcast.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Broadcast message +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_BroadcastMessage +*/ +int WM_BroadcastMessage( WM_MESSAGE* pMsg) { + WM_HWIN hWin; + WM_LOCK(); + for (hWin = WM__FirstWin; hWin; ) { + WM_SendMessage(hWin, pMsg); + hWin = WM_H2P(hWin)->hNextLin; + } + WM_UNLOCK(); + return 0; +} + +#else + void WM_Broadcast(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_CheckScrollPos.c b/User/system/lib/lcd/gui/WM/WM_CheckScrollPos.c new file mode 100644 index 0000000..51b1ef0 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_CheckScrollPos.c @@ -0,0 +1,95 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetScrollPos.c +Purpose : Windows manager, optional routines +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + + + +/********************************************************************* +* +* WM_CheckScrollBounds +* +*/ +void WM_CheckScrollBounds(WM_SCROLL_STATE* pScrollState) { + int Max; + Max = pScrollState->NumItems - pScrollState->PageSize; + if (Max < 0) { + Max = 0; + } + /* Make sure scroll pos is in bounds */ + if (pScrollState->v < 0) { + pScrollState->v = 0; + } + if (pScrollState->v > Max) { + pScrollState->v = Max; + } +} + + +/********************************************************************* +* +* WM_CheckScrollPos +* +* Return value: Difference between old an new Scroll value. +* Therefor 0 if settings have not changed. +*/ +int WM_CheckScrollPos(WM_SCROLL_STATE* pScrollState, int Pos, int LowerDist, int UpperDist) { + int vOld; + vOld = pScrollState->v; + /* Check upper limit */ + if (Pos > pScrollState->v + pScrollState->PageSize - 1) { + pScrollState->v = Pos - (pScrollState->PageSize - 1) + UpperDist; + } + /* Check lower limit */ + if (Pos < pScrollState->v) { + pScrollState->v = Pos - LowerDist; + } + WM_CheckScrollBounds(pScrollState); + return pScrollState->v - vOld; +} + +/********************************************************************* +* +* WM_SetScrollValue +* +* Return value: Difference between old an new Scroll value. +* Therefor 0 if settings have not changed. +*/ +int WM_SetScrollValue(WM_SCROLL_STATE* pScrollState, int v) { + int vOld; + vOld = pScrollState->v; + pScrollState->v = v; + WM_CheckScrollBounds(pScrollState); + return pScrollState->v - vOld; +} + +#else + void WM_CheckScrollPos_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_CriticalHandle.c b/User/system/lib/lcd/gui/WM/WM_CriticalHandle.c new file mode 100644 index 0000000..8c5b286 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_CriticalHandle.c @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_CriticalHandle.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__AddCriticalHandle +*/ +void WM__AddCriticalHandle(WM_CRITICAL_HANDLE* pCriticalHandle) { + pCriticalHandle->pNext = WM__pFirstCriticalHandle; + WM__pFirstCriticalHandle = pCriticalHandle; +} + +/********************************************************************* +* +* WM__RemoveCriticalHandle +*/ +void WM__RemoveCriticalHandle(WM_CRITICAL_HANDLE* pCriticalHandle) { + if (WM__pFirstCriticalHandle) { + WM_CRITICAL_HANDLE *pCH, *pLast = 0; + for (pCH = WM__pFirstCriticalHandle; pCH; pCH = pCH->pNext) { + if (pCH == pCriticalHandle) { + if (pLast) { + pLast->pNext = pCH->pNext; + } else if (pCH->pNext) { + WM__pFirstCriticalHandle = pCH->pNext; + } else { + WM__pFirstCriticalHandle = 0; + } + break; + } + pLast = pCH; + } + } +} + +#else + void WM_CriticalHandle_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_DIAG.c b/User/system/lib/lcd/gui/WM/WM_DIAG.c new file mode 100644 index 0000000..e33d8f8 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_DIAG.c @@ -0,0 +1,88 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_DIAG.c +Purpose : Implementation of WM_DIAG_ ... functions +---------------------------------------------------------------------- +*/ + +#include +#include "WM_Intern.h" + +#if defined (__WATCOMC__) + #define Sleep() +#else + #if GUI_WINSUPPORT + #if WM_SUPPORT_DIAG /* Only defined if GUI_WINSUPPORT >= 0 */ + #include "windows.h" /* Required for sleep only */ + #endif + #endif +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* _ShowInvalid +* +* Function: +* Debug code: shows invalid areas +*/ +#if (WM_SUPPORT_DIAG) +static void _ShowInvalid(WM_HWIN hWin) { + GUI_CONTEXT Context = GUI_Context; + GUI_RECT rClient; + WM_Obj * pWin; + pWin = WM_H2P(hWin); + rClient = pWin->InvalidRect; + GUI_MoveRect(&rClient, -pWin->Rect.x0, -pWin->Rect.y0); + WM_SelectWindow(hWin); + GUI_SetColor(GUI_GREEN); + GUI_SetBkColor(GUI_GREEN); + GUI_FillRect(rClient.x0, rClient.y0, rClient.x1, rClient.y1); + Sleep(20); + GUI_Context = Context; +} +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_DIAG_EnableInvalidationColoring +*/ +#if (WM_SUPPORT_DIAG) +void WM_DIAG_EnableInvalidationColoring(int OnOff) { + if (OnOff) { + WM__pfShowInvalid = _ShowInvalid; + } else { + WM__pfShowInvalid = NULL; + } +} + +#else + void WM_DIAG_C(void); /* Avoid "no prototype" warnings */ + void WM_DIAG_C(void) {} /* Avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_EnableWindow.c b/User/system/lib/lcd/gui/WM/WM_EnableWindow.c new file mode 100644 index 0000000..c7eb34b --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_EnableWindow.c @@ -0,0 +1,75 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_EnableWindow.c +Purpose : Implementation of WM_EnableWindow, WM_DisableWindow +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM_SetEnableState +*/ +void WM_SetEnableState(WM_HWIN hWin, int State) { + WM_Obj* pWin; + U16 Status; + WM_LOCK(); + pWin = WM_H2P(hWin); + Status = pWin->Status; + if (State) { + Status &= ~WM_SF_DISABLED; + } else { + Status |= WM_SF_DISABLED; + } + if (pWin->Status != Status) { + WM_MESSAGE Msg; + pWin->Status = Status; + Msg.MsgId = WM_NOTIFY_ENABLE; + Msg.Data.v = State; + WM_SendMessage(hWin, &Msg); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_EnableWindow +*/ +void WM_EnableWindow(WM_HWIN hWin) { + WM_SetEnableState(hWin, 1); +} + +/********************************************************************* +* +* WM_DisableWindow +*/ +void WM_DisableWindow(WM_HWIN hWin) { + WM_SetEnableState(hWin, 0); +} +#else + void WM_EnableWindow_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_ForEachDesc.c b/User/system/lib/lcd/gui/WM/WM_ForEachDesc.c new file mode 100644 index 0000000..30594df --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_ForEachDesc.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_ForEachDesc.c +Purpose : Implementation of WM_ForEachDesc +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM_ForEachDesc +*/ +void WM_ForEachDesc(WM_HWIN hWin, WM_tfForEach * pcb, void * pData) { + WM_LOCK(); + WM__ForEachDesc(hWin, pcb, pData); + WM_UNLOCK(); +} + +#else + void WM_ForEachDesc_C(void); + void WM_ForEachDesc_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GUI.h b/User/system/lib/lcd/gui/WM/WM_GUI.h new file mode 100644 index 0000000..cd89e5f --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GUI.h @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GUI.h +Purpose : Windows manager include for low level GUI routines +---------------------------------------------------------------------- +*/ + +#ifndef WM_GUI_H /* Make sure we only include it once */ +#define WM_GUI_H + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +int WM__InitIVRSearch(const GUI_RECT* pMaxRect); +int WM__GetNextIVR (void); +int WM__GetOrgX_AA(void); +int WM__GetOrgY_AA(void); + +#define WM_ITERATE_START(pRect) \ + { \ + if (WM__InitIVRSearch(pRect)) \ + do { + +#define WM_ITERATE_END() \ + } while (WM__GetNextIVR()); \ + } + +#define WM_ADDORGX(x) x += GUI_Context.xOff +#define WM_ADDORGY(y) y += GUI_Context.yOff +#define WM_ADDORG(x0,y0) WM_ADDORGX(x0); WM_ADDORGY(y0) +#define WM_ADDORGX_AA(x) x += WM__GetOrgX_AA() +#define WM_ADDORGY_AA(y) y += WM__GetOrgY_AA() +#define WM_ADDORG_AA(x0,y0) WM_ADDORGX_AA(x0); WM_ADDORGY_AA(y0) +#define WM_SUBORGX(x) x -= GUI_Context.xOff +#define WM_SUBORGY(y) y -= GUI_Context.yOff +#define WM_SUBORG(x0,y0) WM_SUBORGX(x0); WM_SUBORGY(y0) + +#if defined(__cplusplus) + } +#endif + + +#endif /* Avoid multiple inclusion */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetBkColor.c b/User/system/lib/lcd/gui/WM/WM_GetBkColor.c new file mode 100644 index 0000000..9e1404b --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetBkColor.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetBkColor.c +Purpose : Windows manager, submodule +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetBkColor +* + Purpose: + Return the clients background color. + If a window does not define a background color, the default + procedure returns GUI_INVALID_COLOR +*/ +GUI_COLOR WM_GetBkColor(WM_HWIN hObj) { + if (hObj) { + WM_MESSAGE Msg; + Msg.MsgId = WM_GET_BKCOLOR; + WM_SendMessage(hObj, &Msg); + return Msg.Data.Color; + } + return GUI_INVALID_COLOR; +} + +#else + void WM_GetBkColor_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetClientRect.c b/User/system/lib/lcd/gui/WM/WM_GetClientRect.c new file mode 100644 index 0000000..0a1a882 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetClientRect.c @@ -0,0 +1,73 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetClientRect.c +Purpose : Windows manager, submodule +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetClientRectEx +* + Purpose: + Return the client rectangle in client coordinates. + This means for all windows that + x0 = y0 = 0 + x1 = width - 1 + y1 = height - 1 +*/ +void WM_GetClientRectEx(WM_HWIN hWin, GUI_RECT* pRect) { + WM_Obj *pWin; + WM_LOCK(); + if (hWin) { + if (pRect) { + pWin = WM_H2P(hWin); + WM__GetClientRectWin(pWin, pRect); + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_GetClientRect +*/ +void WM_GetClientRect(GUI_RECT* pRect) { + WM_HWIN hWin; + WM_LOCK(); + #if WM_SUPPORT_TRANSPARENCY + hWin = WM__hATransWindow ? WM__hATransWindow : GUI_Context.hAWin; + #else + hWin = GUI_Context.hAWin; + #endif + WM_GetClientRectEx(hWin, pRect); + WM_UNLOCK(); +} + +#else + void WM_GetClientRect_Dummy(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetClientWindow.c b/User/system/lib/lcd/gui/WM/WM_GetClientWindow.c new file mode 100644 index 0000000..1da79ce --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetClientWindow.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetClientWindow.c +Purpose : Implementation of WM_GetClientWindow +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetClientWindow +*/ +WM_HWIN WM_GetClientWindow(WM_HWIN hObj) { + WM_MESSAGE Msg; + Msg.Data.v = 0; + Msg.MsgId = WM_GET_CLIENT_WINDOW; + WM_SendMessage(hObj, &Msg); + return (WM_HWIN)Msg.Data.v; + +} + +#else /* Avoid problems with empty object modules */ + void WM_GETCLIENTWINDOW_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetDesktopWindow.c b/User/system/lib/lcd/gui/WM/WM_GetDesktopWindow.c new file mode 100644 index 0000000..0abb899 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetDesktopWindow.c @@ -0,0 +1,42 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetDesktopWindow.c +Purpose : Implementation of WM_GetDesktopWindow +---------------------------------------------------------------------- +*/ + +#include "WM_Intern_ConfDep.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetDesktopWindow +*/ +WM_HWIN WM_GetDesktopWindow(void) { + return WM__ahDesktopWin[0]; +} + +#else + void WM_GetDesktopWindow_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetDesktopWindowEx.c b/User/system/lib/lcd/gui/WM/WM_GetDesktopWindowEx.c new file mode 100644 index 0000000..acb347d --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetDesktopWindowEx.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetDesktopWindowEx.c +Purpose : Implementation of WM_GetDesktopWindowEx +---------------------------------------------------------------------- +*/ + +#include "WM_Intern_ConfDep.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetDesktopWindowEx +*/ +WM_HWIN WM_GetDesktopWindowEx(unsigned int LayerIndex) { + WM_HWIN r = WM_HWIN_NULL; + if (LayerIndex < GUI_NUM_LAYERS) { + r = WM__ahDesktopWin[LayerIndex]; + } + return r; +} + + +#else + void WM_GetDesktopWindowEx_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetDiagInfo.c b/User/system/lib/lcd/gui/WM/WM_GetDiagInfo.c new file mode 100644 index 0000000..0bf97b4 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetDiagInfo.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetDiagInfo.c +Purpose : Implementation of diagnostics info +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetNumWindows +* +*/ + +int WM_GetNumWindows(void) { + return WM__NumWindows; +} + +/********************************************************************* +* +* WM_GetNumInvalidWindows +* +*/ +int WM_GetNumInvalidWindows(void) { + return WM__NumInvalidWindows; +} + + + + +#else + void WM_GetDiagInfo_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetDialogItem.c b/User/system/lib/lcd/gui/WM/WM_GetDialogItem.c new file mode 100644 index 0000000..2c6ddc7 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetDialogItem.c @@ -0,0 +1,74 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetParent.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/******************************************************************* +* +* Public code +* +******************************************************************** +*/ +/******************************************************************* +* +* WM__GetDialogItem + + Recursively scan window and its child windows until dialog item is + found or all children have been scanned. +*/ +static WM_HWIN _GetDialogItem(WM_HWIN hWin, int Id) { + WM_HWIN hi; + WM_HWIN r =0; + WM_Obj* pWin = WM_H2P(hWin); + hi = pWin->hFirstChild; + while (hi) { + /* This windows Id matching ? */ + if (WM_GetId(hi) == Id) { + return hi; + } + /* Any child windows Id matching ? */ + if ((r = _GetDialogItem(hi, Id)) != 0) { + break; + } + hi = WM_HANDLE2PTR(hi)->hNext; + } + return r; +} + +/********************************************************************* +* +* WM_GetDialogItem +*/ +WM_HWIN WM_GetDialogItem(WM_HWIN hWin, int Id) { + WM_HWIN r = 0; + if (hWin) { + WM_LOCK(); + r = _GetDialogItem(hWin, Id); + WM_UNLOCK(); + } + return r; +} + +#else /* Avoid empty object files */ + void WM_DialogItem_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetFirstChild.c b/User/system/lib/lcd/gui/WM/WM_GetFirstChild.c new file mode 100644 index 0000000..82b21b0 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetFirstChild.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetFirstChild.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetFirstChild +*/ +WM_HWIN WM_GetFirstChild(WM_HWIN hWin) { + if (hWin) { + WM_LOCK(); + hWin = WM_H2P(hWin)->hFirstChild; + WM_UNLOCK(); + } + return hWin; +} + +#else /* Avoid empty object files */ + void WM_GetFirstChild_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetFlags.c b/User/system/lib/lcd/gui/WM/WM_GetFlags.c new file mode 100644 index 0000000..d6b8c44 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetFlags.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetFlags.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetFlags +*/ +U16 WM_GetFlags(WM_HWIN hWin) { + U16 r = 0; + if (hWin) { + WM_LOCK(); + r = WM_H2P(hWin)->Status; + WM_UNLOCK(); + } + return r; +} + +#else /* Avoid empty object files */ + void WM_GetFlags_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetFocussedWindow.c b/User/system/lib/lcd/gui/WM/WM_GetFocussedWindow.c new file mode 100644 index 0000000..e68d018 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetFocussedWindow.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetFocussedWindow.c +Purpose : Implementation of said function +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetFocussedWindow +*/ +WM_HWIN WM_GetFocussedWindow(void) { + WM_HWIN r; + WM_LOCK(); + r = WM__hWinFocus; + WM_UNLOCK(); + return r; +} + +#else + void WM_GetFocussedWindow_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetId.c b/User/system/lib/lcd/gui/WM/WM_GetId.c new file mode 100644 index 0000000..1a2fa81 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetId.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetId.c +Purpose : Implementation of WM_GetId +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetId +*/ +int WM_GetId(WM_HWIN hObj) { + WM_MESSAGE Msg; + Msg.MsgId = WM_GET_ID; + WM_SendMessage(hObj, &Msg); + return Msg.Data.v; +} + +#else + void WM_GetId_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetInsideRect.c b/User/system/lib/lcd/gui/WM/WM_GetInsideRect.c new file mode 100644 index 0000000..7540713 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetInsideRect.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetInsideRect.c +Purpose : Windows manager, submodule +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetInsideRectEx +* + Purpose: + Return the inside rectangle in client coordinates. + The inside rectangle is the client rectangle minus the effect, + which typically reduces the rectangle by 0 - 3 pixels on either side + (2 for the standard 3D effect). +*/ +void WM_GetInsideRectEx(WM_HWIN hWin, GUI_RECT* pRect) { + WM_MESSAGE Msg; + Msg.Data.p = pRect; + Msg.MsgId = WM_GET_INSIDE_RECT; + WM_SendMessage(hWin, &Msg); +} + +/********************************************************************* +* +* WM_GetInsideRect +*/ +void WM_GetInsideRect(GUI_RECT* pRect) { + WM_GetInsideRectEx(GUI_Context.hAWin, pRect); +} + +#else + void WM_GetInsideRect_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetInsideRectExScrollbar.c b/User/system/lib/lcd/gui/WM/WM_GetInsideRectExScrollbar.c new file mode 100644 index 0000000..28970a0 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetInsideRectExScrollbar.c @@ -0,0 +1,75 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetInsideRect.c +Purpose : Windows manager, submodule +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetInsideRectExScrollbar +* + Purpose: + Return the inside rectangle in client coordinates. + The inside rectangle is the client rectangle minus the effect, + which typically reduces the rectangle by 0 - 3 pixels on either side + (2 for the standard 3D effect). +*/ +void WM_GetInsideRectExScrollbar(WM_HWIN hWin, GUI_RECT* pRect) { + GUI_RECT rWin, rInside, rScrollbar; + WM_HWIN hBarV, hBarH; + U16 WinFlags; + if (hWin) { + if (pRect) { + hBarH = WM_GetDialogItem(hWin, GUI_ID_HSCROLL); + hBarV = WM_GetDialogItem(hWin, GUI_ID_VSCROLL); + WM_GetWindowRectEx(hWin, &rWin); /* The entire window in screen coordinates */ + WM_GetInsideRectEx(hWin, &rInside); + if (hBarV) { + WM_GetWindowRectEx(hBarV, &rScrollbar); + GUI_MoveRect(&rScrollbar, -rWin.x0, -rWin.y0); + WinFlags = WM_GetFlags(hBarV); + if ((WinFlags & WM_SF_ANCHOR_RIGHT) && (WinFlags & WM_SF_ISVIS)) { + rInside.x1 = rScrollbar.x0 - 1; + } + } + if (hBarH) { + WM_GetWindowRectEx(hBarH, &rScrollbar); + GUI_MoveRect(&rScrollbar, -rWin.x0, -rWin.y0); + WinFlags = WM_GetFlags(hBarH); + if ((WinFlags & WM_SF_ANCHOR_BOTTOM) && (WinFlags & WM_SF_ISVIS)) { + rInside.y1 = rScrollbar.y0 - 1; + } + } + *pRect = rInside; + } + } +} + +#else + void WM_GetInsideRectExScrollbar(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetInvalidRect.c b/User/system/lib/lcd/gui/WM/WM_GetInvalidRect.c new file mode 100644 index 0000000..32102c6 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetInvalidRect.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetInvalidRect.c +Purpose : Windows manager, submodule +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM_GetInvalidRect +* +* Return value: +* 0 if window is valid (there is no invalid rectangle) +* 1 if there is an invalid rectangle +* +*/ +int WM_GetInvalidRect(WM_HWIN hWin, GUI_RECT * pRect) { + int IsInvalid = 0; + if (hWin) { + WM_Obj * pWin; + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + if (pWin->Status & WM_SF_INVALID) { + IsInvalid = 1; + *pRect = pWin->InvalidRect; + } + WM_UNLOCK(); + } + return IsInvalid; +} + +#else + void WM_GetInvalidRect_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetNextSibling.c b/User/system/lib/lcd/gui/WM/WM_GetNextSibling.c new file mode 100644 index 0000000..ed596b7 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetNextSibling.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetNextSibling.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetNextSibling +*/ +WM_HWIN WM_GetNextSibling(WM_HWIN hWin) { + WM_LOCK(); + if (hWin) { + hWin = WM_H2P(hWin)->hNext; + } + WM_UNLOCK(); + return hWin; +} + +#else /* Avoid empty object files */ + void WM_GetNextSibling_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetOrg.c b/User/system/lib/lcd/gui/WM/WM_GetOrg.c new file mode 100644 index 0000000..21650df --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetOrg.c @@ -0,0 +1,79 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetOrg.c +Purpose : Implementation of WM_GetOrg and related functions +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetWindowOrgX +*/ +int WM_GetWindowOrgX(WM_HWIN hWin) { + int r = 0; + if (hWin) { + WM_LOCK(); + r = WM_HANDLE2PTR(hWin)->Rect.x0; + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* WM_GetWindowOrgY +*/ +int WM_GetWindowOrgY(WM_HWIN hWin) { + int r = 0; + if (hWin) { + WM_LOCK(); + r = WM_HANDLE2PTR(hWin)->Rect.y0; + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* WM_GetOrgX +*/ +int WM_GetOrgX(void) { + return WM_GetWindowOrgX(GUI_Context.hAWin); +} + +/********************************************************************* +* +* WM_GetOrgY +*/ +int WM_GetOrgY(void) { + return WM_GetWindowOrgY(GUI_Context.hAWin); +} + + +#else + void WM_GetOrg_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetParent.c b/User/system/lib/lcd/gui/WM/WM_GetParent.c new file mode 100644 index 0000000..06ddf65 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetParent.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetParent.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetParent +*/ +WM_HWIN WM_GetParent(WM_HWIN hWin) { + if (hWin) { + WM_LOCK(); + hWin = WM_H2P(hWin)->hParent; + WM_UNLOCK(); + } + return hWin; +} + +#else /* Avoid empty object files */ + void WM_GetParent_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetPrevSibling.c b/User/system/lib/lcd/gui/WM/WM_GetPrevSibling.c new file mode 100644 index 0000000..db0cfe5 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetPrevSibling.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetPrevSibling.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetPrevSibling +*/ +WM_HWIN WM_GetPrevSibling(WM_HWIN hWin) { + WM_HWIN hPrev = 0; + WM_LOCK(); + if (hWin) { + hPrev = WM__GetPrevSibling(hWin); + } + WM_UNLOCK(); + return hPrev; +} + +#else /* Avoid empty object files */ + void WM_GetPrevSibling_C(void); + void WM_GetPrevSibling_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetScrollPartner.c b/User/system/lib/lcd/gui/WM/WM_GetScrollPartner.c new file mode 100644 index 0000000..936cbd1 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetScrollPartner.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetScrollPartner.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetScrollPartner +*/ +WM_HWIN WM_GetScrollPartner(WM_HWIN hScroll) { + int Id = WM_GetId(hScroll); + if (Id == GUI_ID_HSCROLL) { + Id = GUI_ID_VSCROLL; + } else if (Id == GUI_ID_VSCROLL) { + Id = GUI_ID_HSCROLL; + } + return WM_GetDialogItem(WM_GetParent(hScroll), Id); + +} + +#else /* Avoid empty object files */ + void WM_GetScrollPartner_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetScrollState.c b/User/system/lib/lcd/gui/WM/WM_GetScrollState.c new file mode 100644 index 0000000..945316f --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetScrollState.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetScrollState.c +Purpose : Implementation of WM_GetScrollState +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetScrollState +*/ +void WM_GetScrollState(WM_HWIN hObj, WM_SCROLL_STATE* pScrollState) { + WM_MESSAGE Msg; + Msg.MsgId = WM_GET_SCROLL_STATE; + Msg.Data.p = pScrollState; + WM_SendMessage(hObj, &Msg); +} + +#else + void WM_GetScrollState_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetScrollbar.c b/User/system/lib/lcd/gui/WM/WM_GetScrollbar.c new file mode 100644 index 0000000..8829b5b --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetScrollbar.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetScrollbar.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetScrollbarH +*/ +WM_HWIN WM_GetScrollbarH(WM_HWIN hWin) { + return WM_GetDialogItem(hWin, GUI_ID_HSCROLL); +} + +/********************************************************************* +* +* WM_GetScrollbarV +*/ +WM_HWIN WM_GetScrollbarV(WM_HWIN hWin) { + return WM_GetDialogItem(hWin, GUI_ID_VSCROLL); +} + +#else /* Avoid empty object files */ + void WM_GetScrollbar_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetWindowRect.c b/User/system/lib/lcd/gui/WM/WM_GetWindowRect.c new file mode 100644 index 0000000..59fed51 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetWindowRect.c @@ -0,0 +1,75 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetWindowRect.C +Purpose : Windows manager, submodule +---------------------------------------------------------------------- +*/ + +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" +#define WM_DEBUG_LEVEL 1 + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetWindowRect +* +* Returns the window rect in screen (desktop) coordinates. +*/ +void WM_GetWindowRect(GUI_RECT* pRect) { + WM_HWIN hWin; + WM_LOCK(); + if (pRect) { + WM_Obj* pWin; + #if WM_SUPPORT_TRANSPARENCY + hWin = WM__hATransWindow ? WM__hATransWindow : GUI_Context.hAWin; + #else + hWin = GUI_Context.hAWin; + #endif + pWin = WM_HANDLE2PTR(hWin); + *pRect = pWin->Rect; + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_GetWindowRectEx +*/ +void WM_GetWindowRectEx(WM_HWIN hWin, GUI_RECT * pRect) { + if (hWin && pRect) { + WM_Obj * pWin; + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + if (pWin) { + *pRect = pWin->Rect; + } + WM_UNLOCK(); + } +} + +#else + void WM_GetWindowRect(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_GetWindowSize.c b/User/system/lib/lcd/gui/WM/WM_GetWindowSize.c new file mode 100644 index 0000000..d77ca72 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_GetWindowSize.c @@ -0,0 +1,113 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_GetWindowSize.c +Purpose : Implementation of WM_GetWindowSizeX,Y +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetDefaultWin + + When drawing, we have to start at the bottom window ! +*/ +static WM_HWIN _GetDefaultWin(WM_HWIN hWin) { + if (!hWin) + hWin = WM_GetActiveWindow(); + return hWin; +} + +/********************************************************************* +* +* Module internal routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__GetWindowSizeX + + Return width of window in pixels +*/ +int WM__GetWindowSizeX(const WM_Obj* pWin) { + return pWin->Rect.x1 - pWin->Rect.x0 +1; +} + +/********************************************************************* +* +* WM__GetWindowSizeY + + Return height of window in pixels +*/ +int WM__GetWindowSizeY(const WM_Obj* pWin) { + return pWin->Rect.y1 - pWin->Rect.y0 +1; +} + +/********************************************************************* +* +* Public API code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetWindowSizeX + + Return width of window in pixels +*/ +int WM_GetWindowSizeX(WM_HWIN hWin) { + int r; + WM_Obj* pWin; + WM_LOCK(); + hWin = _GetDefaultWin(hWin); + pWin = WM_H2P(hWin); + r = WM__GetWindowSizeX(pWin); + WM_UNLOCK(); + return r; +} + +/********************************************************************* +* +* WM_GetWindowSizeY + + Return height of window in pixels +*/ +int WM_GetWindowSizeY(WM_HWIN hWin) { + int r; + WM_Obj* pWin; + WM_LOCK(); + hWin = _GetDefaultWin(hWin); + pWin = WM_H2P(hWin); + r = WM__GetWindowSizeY(pWin); + WM_UNLOCK(); + return r; +} + + +#else + void WM_GetWindowSize_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_HasCaptured.c b/User/system/lib/lcd/gui/WM/WM_HasCaptured.c new file mode 100644 index 0000000..42c47b0 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_HasCaptured.c @@ -0,0 +1,42 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_HasCaptured.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_HasCaptured +*/ +int WM_HasCaptured(WM_HWIN hWin) { + return hWin == WM__hCapture; +} + +#else + void WM_HasCaptured_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_HasFocus.c b/User/system/lib/lcd/gui/WM/WM_HasFocus.c new file mode 100644 index 0000000..77cf4bb --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_HasFocus.c @@ -0,0 +1,42 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_HasFocus.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_HasFocus +*/ +int WM_HasFocus(WM_HWIN hWin) { + return hWin == WM__hWinFocus; +} + +#else + void WM_HasFocus_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Hide.c b/User/system/lib/lcd/gui/WM/WM_Hide.c new file mode 100644 index 0000000..97e84c0 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Hide.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Hide.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" +#define WM_DEBUG_LEVEL 1 + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_HideWindow +*/ +void WM_HideWindow(WM_HWIN hWin) { + if (hWin) { + WM_Obj *pWin; + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + /* First check if this is necessary at all */ + if (pWin->Status & WM_SF_ISVIS) { + /* Clear Visibility flag */ + pWin->Status &= ~WM_SF_ISVIS; + /* Mark content as invalid */ + WM__InvalidateAreaBelow(&WM_HANDLE2PTR(hWin)->Rect, hWin); + #if WM_SUPPORT_NOTIFY_VIS_CHANGED + WM__SendMsgNoData(hWin, WM_NOTIFY_VIS_CHANGED); /* Notify window that visibility may have changed */ + #endif + } + WM_UNLOCK(); + } +} + +#else + void WM_Hide(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Intern.h b/User/system/lib/lcd/gui/WM/WM_Intern.h new file mode 100644 index 0000000..4a009f6 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Intern.h @@ -0,0 +1,197 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Intern.h +Purpose : Windows manager internal include +---------------------------------------------------------------------- +*/ + +#ifndef WM_INTERN_H /* Make sure we only include it once */ +#define WM_INTERN_H /* Make sure we only include it once */ + +#include "WM.h" +#include "GUI_Protected.h" /* For GUI_Context */ + + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* defines +* +********************************************************************** + + The following could be placed in a file of its own as it is not + used outside of the window manager + +*/ +/* Basic Windows status flags. + For module-internally use only ! +*/ +#define WM_SF_HASTRANS WM_CF_HASTRANS +#define WM_SF_MEMDEV WM_CF_MEMDEV +#define WM_SF_MEMDEV_ON_REDRAW WM_CF_MEMDEV_ON_REDRAW +#define WM_SF_DISABLED WM_CF_DISABLED /* Disabled: Does not receive PID (mouse & touch) input */ +#define WM_SF_ISVIS WM_CF_SHOW /* Is visible flag */ + +#define WM_SF_STAYONTOP WM_CF_STAYONTOP +#define WM_SF_LATE_CLIP WM_CF_LATE_CLIP +#define WM_SF_ANCHOR_RIGHT WM_CF_ANCHOR_RIGHT +#define WM_SF_ANCHOR_BOTTOM WM_CF_ANCHOR_BOTTOM +#define WM_SF_ANCHOR_LEFT WM_CF_ANCHOR_LEFT +#define WM_SF_ANCHOR_TOP WM_CF_ANCHOR_TOP + +#define WM_SF_INVALID WM_CF_ACTIVATE /* We reuse this flag, as it is create only and Invalid is status only */ + +#define WM_SF_CONST_OUTLINE WM_CF_CONST_OUTLINE /* Constant outline.*/ + +#define WM_HANDLE2PTR(hWin) ((WM_Obj*)GUI_ALLOC_h2p(hWin)) /* older form ... to be eliminated */ +#define WM_H2P(hWin) ((WM_Obj*)GUI_ALLOC_h2p(hWin)) + + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_WARNINGS + #define WM_ASSERT_NOT_IN_PAINT() { if (WM__PaintCallbackCnt) \ + GUI_DEBUG_ERROROUT("Function may not be called from within a paint event"); \ + } +#else + #define WM_ASSERT_NOT_IN_PAINT() +#endif + +/********************************************************************* +* +* Data types & structures +* +********************************************************************** +*/ +typedef struct { + WM_HWIN hWin; + WM_Obj* pWin; +} WM_PAINTINFO; + +typedef struct { + WM_HWIN hOld; + WM_HWIN hNew; +} WM_NOTIFY_CHILD_HAS_FOCUS_INFO; + +typedef struct WM_CRITICAL_HANDLE { + struct WM_CRITICAL_HANDLE * pNext; + volatile WM_HWIN hWin; +} WM_CRITICAL_HANDLE; + +/********************************************************************* +* +* Data (extern) +* +********************************************************************** +*/ +extern U16 WM__CreateFlags; +extern WM_HWIN WM__hCapture; +extern WM_HWIN WM__hWinFocus; +extern char WM__CaptureReleaseAuto; +extern WM_tfPollPID* WM_pfPollPID; +extern U8 WM__PaintCallbackCnt; /* Public for assertions only */ +extern GUI_PID_STATE WM_PID__StateLast; + +#if WM_SUPPORT_TRANSPARENCY + extern int WM__TransWindowCnt; + extern WM_HWIN WM__hATransWindow; +#endif + +#if WM_SUPPORT_DIAG + extern void (*WM__pfShowInvalid)(WM_HWIN hWin); +#endif + +extern WM_CRITICAL_HANDLE WM__CHWinModal; +extern WM_CRITICAL_HANDLE WM__CHWinLast; + +#ifdef WM_C + #define GUI_EXTERN +#else + #define GUI_EXTERN extern +#endif + +GUI_EXTERN U16 WM__NumWindows; +GUI_EXTERN U16 WM__NumInvalidWindows; +GUI_EXTERN WM_HWIN WM__FirstWin; +GUI_EXTERN WM_CRITICAL_HANDLE* WM__pFirstCriticalHandle; +#undef GUI_EXTERN + +/********************************************************************* +* +* Prototypes +* +********************************************************************** +*/ + +void WM__ActivateClipRect (void); +int WM__ClipAtParentBorders (GUI_RECT* pRect, WM_HWIN hWin); +void WM__Client2Screen (const WM_Obj* pWin, GUI_RECT *pRect); +void WM__DetachWindow (WM_HWIN hChild); +void WM__ForEachDesc(WM_HWIN hWin, WM_tfForEach * pcb, void * pData); +void WM__GetClientRectWin (const WM_Obj* pWin, GUI_RECT* pRect); +WM_HWIN WM__GetFirstSibling (WM_HWIN hWin); +WM_HWIN WM__GetFocussedChild (WM_HWIN hWin); +int WM__GetHasFocus (WM_HWIN hWin); +WM_HWIN WM__GetLastSibling (WM_HWIN hWin); +WM_HWIN WM__GetPrevSibling (WM_HWIN hWin); +int WM__GetWindowSizeX (const WM_Obj* pWin); +int WM__GetWindowSizeY (const WM_Obj* pWin); +void WM__InsertWindowIntoList (WM_HWIN hWin, WM_HWIN hParent); +void WM__InvalidateAreaBelow (const GUI_RECT* pRect, WM_HWIN StopWin); +void WM__InvalidateTransAreaAbove(const GUI_RECT* pRect, WM_HWIN StopWin); +int WM__IntersectRect (GUI_RECT* pDest, const GUI_RECT* pr0, const GUI_RECT* pr1); +int WM__IsAncestor (WM_HWIN hChild, WM_HWIN hParent); +int WM__IsAncestorOrSelf (WM_HWIN hChild, WM_HWIN hParent); +int WM__IsChild (WM_HWIN hWin, WM_HWIN hParent); +int WM__IsEnabled (WM_HWIN hWin); +int WM__IsInModalArea (WM_HWIN hWin); +int WM__IsInWindow (WM_Obj * pWin, int x, int y); +int WM__IsWindow (WM_HWIN hWin); +void WM__LeaveIVRSearch (void); +void WM__MoveTo (WM_HWIN hWin, int x, int y); +void WM__MoveWindow (WM_HWIN hWin, int dx, int dy); +void WM__NotifyVisChanged (WM_HWIN hWin, GUI_RECT * pRect); +int WM__RectIsNZ (const GUI_RECT* pr); +void WM__RemoveWindowFromList (WM_HWIN hWin); +void WM__RemoveFromLinList (WM_HWIN hWin); +void WM__Screen2Client (const WM_Obj* pWin, GUI_RECT *pRect); +void WM__SendMsgNoData (WM_HWIN hWin, U8 MsgId); +void WM__SendMessage (WM_HWIN hWin, WM_MESSAGE* pm); +void WM__SendMessageIfEnabled (WM_HWIN hWin, WM_MESSAGE* pm); +void WM__SendMessageNoPara (WM_HWIN hWin, int MsgId); +void WM__SendPIDMessage (WM_HWIN hWin, WM_MESSAGE* pMsg); +int WM__SetScrollbarH (WM_HWIN hWin, int OnOff); +int WM__SetScrollbarV (WM_HWIN hWin, int OnOff); +void WM__UpdateChildPositions (WM_Obj* pObj, int dx0, int dy0, int dx1, int dy1); +void WM_PID__GetPrevState (GUI_PID_STATE* pPrevState); +void WM__SendTouchMessage (WM_HWIN hWin, WM_MESSAGE* pMsg); + +U16 WM_GetFlags(WM_HWIN hWin); +void WM__PaintWinAndOverlays (WM_PAINTINFO* pInfo); +void WM__AddCriticalHandle (WM_CRITICAL_HANDLE* pCH); +void WM__RemoveCriticalHandle (WM_CRITICAL_HANDLE* pCH); + +#endif /* GUI_WINSUPPORT */ + +#if defined(__cplusplus) + } +#endif + +#endif /* WM_INTERN_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Intern_ConfDep.h b/User/system/lib/lcd/gui/WM/WM_Intern_ConfDep.h new file mode 100644 index 0000000..95e1d15 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Intern_ConfDep.h @@ -0,0 +1,43 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Intern_ConfDep.h +Purpose : Windows manager internal include, dependent on LCDConf.h +---------------------------------------------------------------------- +*/ + +#ifndef WM_INTERN_CONFDEP_H /* Make sure we only include it once */ +#define WM_INTERN_CONFDEP_H /* Make sure we only include it once */ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + + +#ifdef WM_C + #define GUI_EXTERN +#else + #define GUI_EXTERN extern +#endif + +GUI_EXTERN WM_HWIN WM__ahDesktopWin[GUI_NUM_LAYERS]; /* No longer depends on LCDConf.h ... Can be moved to an other file */ +GUI_EXTERN GUI_COLOR WM__aBkColor[GUI_NUM_LAYERS]; /* No longer depends on LCDConf.h ... Can be moved to an other file */ + +#undef GUI_EXTERN + +#endif /* GUI_WINSUPPORT */ + +#endif /* WM_INTERN_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_IsCompletelyVisible.c b/User/system/lib/lcd/gui/WM/WM_IsCompletelyVisible.c new file mode 100644 index 0000000..67ae376 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_IsCompletelyVisible.c @@ -0,0 +1,160 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_IsCompletelyVisible.c +Purpose : Windows manager, implementation of said function +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + + +/********************************************************************* +* +* _IsEqualRect +* +*/ +static char _CompareRect(const GUI_RECT * pRect0, const GUI_RECT * pRect1 ) { + if (pRect0->x0 != pRect1->x0) { + return 1; /* Not equal */ + } + if (pRect0->x1 != pRect1->x1) { + return 1; /* Not equal */ + } + if (pRect0->y0 != pRect1->y0) { + return 1; /* Not equal */ + } + if (pRect0->y1 != pRect1->y1) { + return 1; /* Not equal */ + } + return 0; /* Equal */ +} + +/********************************************************************* +* +* _WindowSiblingsOverlapRect +* +*/ +static char _WindowSiblingsOverlapRect(WM_HWIN iWin, GUI_RECT* pRect) { + WM_Obj* pWin; + for (; iWin; iWin = pWin->hNext) { + int Status = (pWin = WM_H2P(iWin))->Status; + /* Check if this window affects us at all */ + if (Status & WM_SF_ISVIS) { + /* Check if this window affects us at all */ + if (GUI_RectsIntersect(pRect, &pWin->Rect)) { + return 1; + } + } + } + return 0; +} + + +/********************************************************************* +* +* _HasOverlap +*/ +static int _HasOverlap(WM_Obj * pWin, GUI_RECT * pRect) { + WM_Obj * pParent; + WM_HMEM hParent; + /* Step 1: + Check if there are any visible children. If this is so, then the + window has an overlap. + */ + /* Check all children */ + if (_WindowSiblingsOverlapRect(pWin->hFirstChild, pRect)) { + return 1; + } + + /* STEP 2: + Find out the max. height (r.y1) if we are at the left border. + Since we are using the same height for all IVRs at the same y0, + we do this only for the leftmost one. + */ + + /* Iterate over all windows which are above */ + /* Check all siblings above (Iterate over Parents and top siblings (hNext) */ + for (hParent = pWin->hParent; hParent; hParent = pParent->hParent) { + pParent = WM_H2P(hParent); + if (_WindowSiblingsOverlapRect(pParent->hNext, pRect)) { + return 1; + } + } + return 0; +} + +/********************************************************************* +* +* _IsCompletelyVisible +* +*/ +static char _IsCompletelyVisible(WM_HWIN hWin) { + WM_Obj * pWin; + GUI_RECT Rect; + + pWin = WM_H2P(hWin); + Rect = pWin->Rect; + if (WM__ClipAtParentBorders(&Rect, hWin) == 0) { + return 0; /* Nothing is left */ + } + /* Check if the window is still the original one */ + if (_CompareRect(&Rect, &pWin->Rect)) { + return 0; /* Not completely visible */ + } + /* Now the difficult part ... + Find the rectangles. + */ + if (_HasOverlap(pWin, &Rect)) { + return 0; + } + return 1; /* Is completely visible */ +} + + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_IsCompletelyVisible +* +*/ +char WM_IsCompletelyVisible(WM_HWIN hWin) { + int r = 0; + if (hWin) { + WM_LOCK(); + r = _IsCompletelyVisible(hWin); + WM_UNLOCK(); + } + return r; +} + +#else + void WM_IsCompletelyVisible_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_IsEnabled.c b/User/system/lib/lcd/gui/WM/WM_IsEnabled.c new file mode 100644 index 0000000..fb75c10 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_IsEnabled.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_IsEnabled.c +Purpose : Windows manager function +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_IsEnabled +*/ +int WM_IsEnabled(WM_HWIN hObj) { + int r = 0; + if (hObj) { + WM_LOCK(); + r = WM__IsEnabled(hObj); + WM_UNLOCK(); + } + return r; +} + +#else + void WM_IsEnabled_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_IsFocussable.c b/User/system/lib/lcd/gui/WM/WM_IsFocussable.c new file mode 100644 index 0000000..64086c8 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_IsFocussable.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_IsFocussable.c +Purpose : Windows manager, implementation of WM_IsFocussable +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_IsFocussable +*/ +int WM_IsFocussable(WM_HWIN hWin) { + int r = 0; + if (hWin) { + WM_MESSAGE Msg; + Msg.Data.v = 0; + Msg.MsgId = WM_GET_ACCEPT_FOCUS; + WM_SendMessage(hWin, &Msg); + r = Msg.Data.v; + } + return r; +} + +#else + void WM_IsFocussable_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_IsVisible.c b/User/system/lib/lcd/gui/WM/WM_IsVisible.c new file mode 100644 index 0000000..a43fc3e --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_IsVisible.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_IsVisible.c +Purpose : Windows manager, implementation of said function +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_IsVisible +* +*/ +int WM_IsVisible(WM_HWIN hWin) { + int r = 0; + if (hWin) { + WM_Obj * pWin; + WM_LOCK(); + pWin = WM_H2P(hWin); + if (pWin->Status & WM_SF_ISVIS) { + r = 1; + } + WM_UNLOCK(); + } + return r; +} + +#else + void WM_IsVisible_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_IsWindow.c b/User/system/lib/lcd/gui/WM/WM_IsWindow.c new file mode 100644 index 0000000..8085b56 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_IsWindow.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_IsWindow.c +Purpose : Windows manager, implementation of WM_IsWindow +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_IsWindow +*/ +int WM_IsWindow(WM_HWIN hWin) { + int r; + WM_LOCK(); + r = WM__IsWindow(hWin); + WM_UNLOCK(); + return r; +} + +#else + void WM_IsWindow_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_MakeModal.c b/User/system/lib/lcd/gui/WM/WM_MakeModal.c new file mode 100644 index 0000000..836389f --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_MakeModal.c @@ -0,0 +1,64 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_MakeModal.c +Purpose : Windows manager, modal windows +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" +#include "GUIDebug.h" + +#if (GUI_WINSUPPORT) + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_MakeModal +* +* Purpose: +* Makes the window modal. +* We also need to send a message to the window which has received +* the last "pressed" message +* +* Return value: +*/ +void WM_MakeModal(WM_HWIN hWin) { + WM_LOCK(); + WM__CHWinModal.hWin = hWin; + /* Send a message to the window that it is no longer pressed (WM_TOUCH(0)) + if it is outside the modal area, because otherwise it will not receive this message any more. + */ + if (WM__CHWinLast.hWin) { + if (!WM__IsInModalArea(WM__CHWinLast.hWin)) { + WM_MESSAGE Msg = {0}; + Msg.MsgId = WM_TOUCH; + WM__SendPIDMessage(WM__CHWinLast.hWin, &Msg); + WM__CHWinLast.hWin = 0; + } + } + WM_UNLOCK(); +} + +#else + void WM_MakeModal_c(void) {} /* avoid empty object files */ +#endif /* (GUI_WINSUPPORT & GUI_SUPPORT_TOUCH) */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Move.c b/User/system/lib/lcd/gui/WM/WM_Move.c new file mode 100644 index 0000000..78dc65d --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Move.c @@ -0,0 +1,127 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Move.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + + +/********************************************************************* +* +* _MoveDescendents +* +* Description +* Moves _MoveDescendents. +* Since the parent has already been moved, there is no need to +* take care of invalidation. +* +* Parameters +* hWin The first of all descendents to be moved (first child) +*/ +static void _MoveDescendents(WM_HWIN hWin, int dx, int dy) { + WM_Obj* pWin; + + for (;hWin; hWin = pWin->hNext) { + pWin = WM_HANDLE2PTR(hWin); + GUI_MoveRect(&pWin->Rect, dx, dy); + GUI_MoveRect(&pWin->InvalidRect, dx, dy); + _MoveDescendents(pWin->hFirstChild, dx, dy); /* Children need to be moved along ...*/ + WM__SendMsgNoData(hWin, WM_MOVE); + } +} + +/********************************************************************* +* +* Public module internal code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__MoveWindow +*/ +void WM__MoveWindow(WM_HWIN hWin, int dx, int dy) { + GUI_RECT r; + WM_Obj* pWin; + if (hWin) { + pWin = WM_HANDLE2PTR(hWin); + r = pWin->Rect; + GUI_MoveRect(&pWin->Rect, dx, dy); + GUI_MoveRect(&pWin->InvalidRect, dx, dy); + _MoveDescendents(pWin->hFirstChild, dx, dy); /* Children need to be moved along ...*/ + /* Invalidate old and new area ... */ + if (pWin->Status & WM_SF_ISVIS) { + WM_InvalidateArea(&pWin->Rect); /* Invalidate new area */ + WM_InvalidateArea(&r) ; /* Invalidate old area */ + } + WM__SendMsgNoData(hWin, WM_MOVE); /* Notify window it has been moved */ + } +} + +/********************************************************************* +* +* WM__MoveTo +*/ +void WM__MoveTo(WM_HWIN hWin, int x, int y) { + if (hWin) { + WM_Obj* pWin = WM_HANDLE2PTR(hWin); + x -= pWin->Rect.x0; + y -= pWin->Rect.y0; + WM__MoveWindow(hWin, x, y); + } +} + +/********************************************************************* +* +* Public API code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_MoveWindow +*/ +void WM_MoveWindow(WM_HWIN hWin, int dx, int dy) { + WM_LOCK(); { + WM__MoveWindow(hWin, dx, dy); + } WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_MoveTo +*/ +void WM_MoveTo(WM_HWIN hWin, int x, int y) { + WM_LOCK(); { + WM__MoveTo(hWin, x, y); + } WM_UNLOCK(); +} + +#else + void WM_Move_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_MoveChildTo.c b/User/system/lib/lcd/gui/WM/WM_MoveChildTo.c new file mode 100644 index 0000000..47bf546 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_MoveChildTo.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_MoveChildTo.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public API code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_MoveChildTo +*/ +void WM_MoveChildTo(WM_HWIN hWin, int x, int y) { + if (hWin) { + WM_HWIN hParent; + WM_LOCK(); + hParent = WM_GetParent(hWin); + if (hParent) { + WM_Obj * pParent, * pWin; + pParent = WM_HANDLE2PTR(hParent); + pWin = WM_HANDLE2PTR(hWin); + x -= pWin->Rect.x0 - pParent->Rect.x0; + y -= pWin->Rect.y0 - pParent->Rect.y0; + WM__MoveWindow(hWin, x, y); + } + WM_UNLOCK(); + } +} + +#else + void WM_MoveChildTo_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_NotifyParent.c b/User/system/lib/lcd/gui/WM/WM_NotifyParent.c new file mode 100644 index 0000000..98112d9 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_NotifyParent.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_NotifyParent.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_NotifyParent +*/ +void WM_NotifyParent(WM_HWIN hWin, int Notification) { + WM_MESSAGE Msg; + Msg.MsgId = WM_NOTIFY_PARENT; + Msg.Data.v = Notification; + WM_SendToParent(hWin, &Msg); +} + +#else + void WM_NotifyParent_C(void) {} /* Avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_OnKey.c b/User/system/lib/lcd/gui/WM/WM_OnKey.c new file mode 100644 index 0000000..17a8e95 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_OnKey.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_OnKey.c +Purpose : Implementation of WM_OnKey +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_OnKey + + Returns: + 0 if message could not be handled +*/ +int WM_OnKey(int Key, int Pressed) { + int r = 0; + WM_MESSAGE Msg; + WM_LOCK(); + if (WM__hWinFocus != 0) { + WM_KEY_INFO Info; + Info.Key = Key; + Info.PressedCnt = Pressed; + Msg.MsgId = WM_KEY; + Msg.Data.p = &Info; + WM__SendMessage(WM__hWinFocus, &Msg); + r = 1; + } + WM_UNLOCK(); + return r; +} + +#else + void WM_OnKey_c(void); + void WM_OnKey_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_PID__GetPrevState.c b/User/system/lib/lcd/gui/WM/WM_PID__GetPrevState.c new file mode 100644 index 0000000..8b45e10 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_PID__GetPrevState.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_PID__GetPrevState.c +Purpose : Touch support +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + +#if (GUI_WINSUPPORT) + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_PID__GetPrevState +*/ +void WM_PID__GetPrevState(GUI_PID_STATE* pPrevState) { + *pPrevState = WM_PID__StateLast; +} + +#else + void WM_PID__GetPrevState_c(void) {} /* avoid empty object files */ +#endif /* (GUI_WINSUPPORT) */ + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/WM/WM_Paint.c b/User/system/lib/lcd/gui/WM/WM_Paint.c new file mode 100644 index 0000000..940e5c8 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Paint.c @@ -0,0 +1,64 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Paint.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM_Paint +*/ + +void WM_Paint(WM_HWIN hWin) { + GUI_CONTEXT Context; + WM_PAINTINFO PaintInfo; + WM_Obj* pWin; + + WM_ASSERT_NOT_IN_PAINT(); + if (hWin) { + WM_LOCK(); + GUI_SaveContext(&Context); + pWin = WM_H2P(hWin); + WM_SelectWindow(hWin); + WM_SetDefault(); + WM_InvalidateWindow(hWin); /* Important ... Window procedure is informed about invalid rect and may optimize */ + /* Paint the window and its overlaying transparent windows */ + PaintInfo.hWin = hWin; + PaintInfo.pWin = pWin; + WM__PaintWinAndOverlays(&PaintInfo); + WM_ValidateWindow(hWin); + GUI_RestoreContext(&Context); + WM_UNLOCK(); + } +} + +#else + void WM_Paint(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_ResizeWindow.c b/User/system/lib/lcd/gui/WM/WM_ResizeWindow.c new file mode 100644 index 0000000..e76d32e --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_ResizeWindow.c @@ -0,0 +1,74 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_ResizeWindow.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" +#define WM_DEBUG_LEVEL 1 + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_ResizeWindow +*/ +void WM_ResizeWindow(WM_HWIN hWin, int dx, int dy) { + GUI_RECT rOld, rNew, rMerge; + WM_Obj* pWin; + if (((dx | dy) == 0) || (hWin == 0)){ /* Early out if there is nothing to do */ + return; + } + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + rOld = pWin->Rect; + rNew = rOld; + if (dx) { + if ((pWin->Status & WM_SF_ANCHOR_RIGHT) && (!(pWin->Status & WM_SF_ANCHOR_LEFT))) { + rNew.x0 -= dx; + } else { + rNew.x1 += dx; + } + } + if (dy) { + if ((pWin->Status & WM_SF_ANCHOR_BOTTOM) && (!(pWin->Status & WM_SF_ANCHOR_TOP))) { + rNew.y0 -= dy; + } else { + rNew.y1 += dy; + } + } + GUI_MergeRect(&rMerge, &rOld, &rNew); + pWin->Rect = rNew; + WM_InvalidateArea(&rMerge); + WM__UpdateChildPositions(pWin, rNew.x0 - rOld.x0, rNew.y0 - rOld.y0, rNew.x1 - rOld.x1, rNew.y1 - rOld.y1); + GUI__IntersectRect(&pWin->InvalidRect, &pWin->Rect); /* Make sure invalid area is not bigger than window itself */ + WM__SendMsgNoData(hWin, WM_SIZE); /* Send size message to the window */ + WM_UNLOCK(); +} + +#else + void WM_ResizeWindow(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Screen2Win.c b/User/system/lib/lcd/gui/WM/WM_Screen2Win.c new file mode 100644 index 0000000..0699144 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Screen2Win.c @@ -0,0 +1,111 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Screen2hWin.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Screen2hWin + + This routine is recursive. + It checks if the given coordinates are in the window or a decendant. + Returns: + 0: If coordinates are neither in the given window nor a decendent + !=0 Handle of the topmost visible decendent in which the given + coordinate falls. + +*/ +static WM_HWIN _Screen2hWin(WM_HWIN hWin, WM_HWIN hStop, int x, int y) { + WM_Obj* pWin = WM_HANDLE2PTR(hWin); + WM_HWIN hChild; + WM_HWIN hHit; + /* First check if the coordinates are in the given window. If not, return 0 */ + if (WM__IsInWindow(pWin, x, y) == 0) { + return 0; + } + /* If the coordinates are in a child, search deeper ... */ + for (hChild = pWin->hFirstChild; hChild && (hChild != hStop); ) { + WM_Obj* pChild = WM_HANDLE2PTR(hChild); + if ((hHit = _Screen2hWin(hChild, hStop, x, y)) != 0) { + hWin = hHit; /* Found a window */ + } + hChild = pChild->hNext; + } + return hWin; /* No Child affected ... The parent is the right one */ +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__IsInWindow +*/ +int WM__IsInWindow(WM_Obj * pWin, int x, int y) { + if ( (pWin->Status & WM_SF_ISVIS) + && (x >= pWin->Rect.x0) + && (x <= pWin->Rect.x1) + && (y >= pWin->Rect.y0) + && (y <= pWin->Rect.y1)) + { + return 1; + } + return 0; +} + +/********************************************************************* +* +* WM_Screen2hWin +*/ +WM_HWIN WM_Screen2hWin(int x, int y) { + WM_HWIN r; + WM_LOCK(); + r = _Screen2hWin(WM__FirstWin, 0, x, y); + WM_UNLOCK(); + return r; +} + +/********************************************************************* +* +* WM_Screen2hWinEx +*/ +WM_HWIN WM_Screen2hWinEx(WM_HWIN hStop, int x, int y) { + WM_HWIN r; + WM_LOCK(); + r = _Screen2hWin(WM__FirstWin, hStop, x, y); + WM_UNLOCK(); + return r; +} + +#else /* Avoid empty object files */ + void WM_Screen2Win(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SendMessageNoPara.c b/User/system/lib/lcd/gui/WM/WM_SendMessageNoPara.c new file mode 100644 index 0000000..e61c0de --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SendMessageNoPara.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SendMessageNoPara.c +Purpose : Implementation of WM_SendMessageNoPara +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SendMessageNoPara +*/ +void WM_SendMessageNoPara(WM_HWIN hWin, int MsgId) { + WM_LOCK(); + WM__SendMessageNoPara(hWin, MsgId); + WM_UNLOCK(); +} + +#else + void WM_SendMessageNoPara_c(void); + void WM_SendMessageNoPara_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SendToParent.c b/User/system/lib/lcd/gui/WM/WM_SendToParent.c new file mode 100644 index 0000000..d4c2893 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SendToParent.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SendToParent.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SendToParent +*/ +void WM_SendToParent(WM_HWIN hChild, WM_MESSAGE* pMsg) { + if (pMsg) { + WM_HWIN hParent; + WM_LOCK(); + hParent = WM_GetParent(hChild); + if (hParent) { + pMsg->hWinSrc = hChild; + WM_SendMessage(hParent, pMsg); + } + WM_UNLOCK(); + } +} + +#else + void WM_SendToParent_C(void) {} /* Avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetAnchor.c b/User/system/lib/lcd/gui/WM/WM_SetAnchor.c new file mode 100644 index 0000000..160109a --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetAnchor.c @@ -0,0 +1,57 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetAnchor.c +Purpose : Windows manager, implementation of said function +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetAnchor +*/ +void WM_SetAnchor(WM_HWIN hWin, U16 AnchorFlags) { + if (hWin) { + WM_Obj* pWin; + U16 Mask; + WM_LOCK(); + pWin = WM_H2P(hWin); + Mask = (WM_SF_ANCHOR_LEFT | WM_SF_ANCHOR_RIGHT | WM_SF_ANCHOR_TOP | WM_SF_ANCHOR_BOTTOM); + + GUI_DEBUG_WARN_IF(AnchorFlags & ~(Mask), "WM_SetAnchor.c: Wrong anchor flags"); + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_PARA + AnchorFlags &= Mask; + #endif + + pWin->Status &= ~(Mask); + pWin->Status |= AnchorFlags; + WM_UNLOCK(); + } +} + +#else + void WM_SetAnchor_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetCallback.c b/User/system/lib/lcd/gui/WM/WM_SetCallback.c new file mode 100644 index 0000000..af87545 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetCallback.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetCallback.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" + +/********************************************************************* +* +* Exported routines: Set callback +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetCallback +*/ +WM_CALLBACK* WM_SetCallback (WM_HWIN hWin, WM_CALLBACK* cb) { + WM_CALLBACK* r = NULL; + if (hWin) { + WM_Obj* pWin; + WM_LOCK(); + pWin = WM_H2P(hWin); + r = pWin->cb; + pWin->cb = cb; + WM_InvalidateWindow(hWin); + WM_UNLOCK(); + } + return r; +} + +#else + void WM_SetCallBack(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetCapture.c b/User/system/lib/lcd/gui/WM/WM_SetCapture.c new file mode 100644 index 0000000..da458c9 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetCapture.c @@ -0,0 +1,85 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetCapture.c +Purpose : Implementation of WM_SetCapture +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public data +* +********************************************************************** +*/ + + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__ReleaseCapture +*/ +static void WM__ReleaseCapture(void) { + if (WM__hCapture) { + WM_MESSAGE Msg; + Msg.MsgId = WM_CAPTURE_RELEASED; + WM_SendMessage(WM__hCapture, &Msg); + WM__hCapture = 0; + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetCapture +*/ +void WM_SetCapture(WM_HWIN hObj, int AutoRelease) { + WM_LOCK(); + if (WM__hCapture != hObj) { + WM__ReleaseCapture(); + } + WM__hCapture = hObj; + WM__CaptureReleaseAuto = AutoRelease; + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_ReleaseCapture +*/ +void WM_ReleaseCapture(void) { + WM_LOCK(); + WM__ReleaseCapture(); + WM_UNLOCK(); +} + +#else + void WM_SetCapture_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetCaptureMove.c b/User/system/lib/lcd/gui/WM/WM_SetCaptureMove.c new file mode 100644 index 0000000..c19dfaa --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetCaptureMove.c @@ -0,0 +1,73 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetCaptureMove.c +Purpose : Implementation of WM_SetCaptureMove +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +static GUI_POINT WM__CapturePoint; + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetCaptureMove +*/ +void WM_SetCaptureMove(WM_HWIN hWin, const GUI_PID_STATE* pState, int MinVisibility) { + if (!WM_HasCaptured(hWin)) { + WM_SetCapture(hWin, 1); /* Set capture with auto release */ + WM__CapturePoint.x = pState->x; + WM__CapturePoint.y = pState->y; + } else { /* Moving ... let the window move ! */ + int dx, dy; + dx = pState->x - WM__CapturePoint.x; + dy = pState->y - WM__CapturePoint.y; + /* make sure at least a part of the windows stays inside of its parent */ + if (MinVisibility == 0) { + WM_MoveWindow(hWin, dx, dy); + } else { + GUI_RECT Rect, RectParent; + /* make sure at least a part of the windows stays inside of its parent */ + WM_GetWindowRectEx(hWin, &Rect); + WM_GetWindowRectEx(WM_GetParent(hWin), &RectParent); + GUI_MoveRect(&Rect, dx, dy); + GUI__ReduceRect(&RectParent, &RectParent, MinVisibility); + if (GUI_RectsIntersect(&Rect, &RectParent)) { + WM_MoveWindow(hWin, dx, dy); + } + } + } +} + + +#else + void WM_SetCaptureMove_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetCreateFlags.c b/User/system/lib/lcd/gui/WM/WM_SetCreateFlags.c new file mode 100644 index 0000000..48be709 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetCreateFlags.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetCreateFlags.C +Purpose : Implementation of WM_SetCreateFlags +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" + +/******************************************************************* +* +* Public code +* +******************************************************************** +*/ +/********************************************************************* +* +* WM_SetCreateFlags +*/ +U16 WM_SetCreateFlags(U16 Flags) { + U16 r = WM__CreateFlags; + WM__CreateFlags = Flags; + return r; +} + +#else + void WM_SetCreateFlags(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetDesktopColor.c b/User/system/lib/lcd/gui/WM/WM_SetDesktopColor.c new file mode 100644 index 0000000..abfa69e --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetDesktopColor.c @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetDesktopColor.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern_ConfDep.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetDesktopColorEx +*/ +GUI_COLOR WM_SetDesktopColorEx(GUI_COLOR Color, unsigned int LayerIndex) { + GUI_COLOR r = GUI_INVALID_COLOR; + if (LayerIndex < GUI_NUM_LAYERS) { + r = WM__aBkColor[LayerIndex]; + WM__aBkColor[LayerIndex] = Color; + WM_InvalidateWindow(WM__ahDesktopWin[LayerIndex]); + } + return r; +} + +/********************************************************************* +* +* WM_SetDesktopColor +*/ +GUI_COLOR WM_SetDesktopColor(GUI_COLOR Color) { + return WM_SetDesktopColorEx(Color, 0); +} + +/********************************************************************* +* +* WM_SetDesktopColors +*/ +void WM_SetDesktopColors(GUI_COLOR Color) { + int i; + for (i = 0; i < GUI_NUM_LAYERS; i++) { + WM_SetDesktopColorEx(Color, i); + } +} + +#else + void WM_SetDesktopColor_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetFocus.c b/User/system/lib/lcd/gui/WM/WM_SetFocus.c new file mode 100644 index 0000000..bf99fef --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetFocus.c @@ -0,0 +1,88 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetFocus.c +Purpose : Implementation of WM_SetFocus +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetFocus +* +* Purpose: +* Sets the focus to the specified child. It sends 2 messages: +* WM_SET_FOCUS(1) to window to receive focus +* WM_SET_FOCUS(0) to window to lose focus +* +* Return value: +* 0 on success (Focus could be set) +* !=0 on failure (Windows could not take the focus) +*/ +int WM_SetFocus(WM_HWIN hWin) { + int r; + WM_MESSAGE Msg = {0}; + WM_LOCK(); + if ((hWin) && (hWin != WM__hWinFocus)) { + WM_NOTIFY_CHILD_HAS_FOCUS_INFO Info; + Info.hOld = WM__hWinFocus; + Info.hNew = hWin; + Msg.MsgId = WM_SET_FOCUS; + /* Send a "no more focus" message to window losing focus */ + Msg.Data.v = 0; + if (WM__hWinFocus) { + WM_SendMessage(WM__hWinFocus, &Msg); + } + /* Send "You have the focus now" message to the window */ + Msg.Data.v = 1; + WM_SendMessage(WM__hWinFocus = hWin, &Msg); + if ((r = Msg.Data.v) == 0) { /* On success only */ + /* Set message to ancestors of window getting the focus */ + while ((hWin = WM_GetParent(hWin)) != 0) { + Msg.MsgId = WM_NOTIFY_CHILD_HAS_FOCUS; + Msg.Data.p = &Info; + WM_SendMessage(hWin, &Msg); + } + /* Set message to ancestors of window loosing the focus */ + hWin = Info.hOld; + if (WM_IsWindow(hWin)) { /* Make sure window has not been deleted in the mean time. Can be optimized: _DeleteWindow could clear the handle to avoid this check (RS) */ + while ((hWin = WM_GetParent(hWin)) != 0) { + Msg.MsgId = WM_NOTIFY_CHILD_HAS_FOCUS; + Msg.Data.p = &Info; + WM_SendMessage(hWin, &Msg); + } + } + } + } else { + r = 1; + } + WM_UNLOCK(); + return r; +} + +#else + void WM_SetFocus_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetFocusOnNextChild.c b/User/system/lib/lcd/gui/WM/WM_SetFocusOnNextChild.c new file mode 100644 index 0000000..3fabc55 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetFocusOnNextChild.c @@ -0,0 +1,114 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetFocusOnNextChild.c +Purpose : Implementation of WM_SetFocusOnNextChild +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetNextChild +* +* Purpose: +* Returns a handle to the next child of a window. +* +* Parameters: +* hParent: handle of parent window. +* hChild: handle of child to begin our search to its next sibling. +* +* Return value: +* Handle to next child if we found one. +* 0 if window has no other children. +*/ +static WM_HWIN _GetNextChild(WM_HWIN hParent, WM_HWIN hChild) { + WM_HWIN hObj = 0; + WM_Obj* pObj; + if (hChild) { + pObj = WM_HANDLE2PTR(hChild); + hObj = pObj->hNext; + } + if (!hObj) { + pObj = WM_HANDLE2PTR(hParent); + hObj = pObj->hFirstChild; + } + if (hObj != hChild) { + return hObj; + } + return 0; +} + +/********************************************************************* +* +* _SetFocusOnNextChild +* +* Purpose: +* Sets the focus on next focussable child of a window. +* +* Return value: +* Handle of focussed child, if we found an other focussable child +* as the current. Otherwise the return value is zero. +*/ +static WM_HWIN _SetFocusOnNextChild(WM_HWIN hParent) { + WM_HWIN hChild, hWin; + hChild = WM__GetFocussedChild(hParent); + hChild = _GetNextChild(hParent, hChild); + hWin = hChild; + while ((WM_IsFocussable(hWin) == 0) && hWin) { + hWin = _GetNextChild(hParent, hWin); + if (hWin == hChild) { + break; + } + } + if (WM_SetFocus(hWin) == 0) { + return hWin; + } + return 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetFocusOnNextChild +*/ +WM_HWIN WM_SetFocusOnNextChild(WM_HWIN hParent) { + WM_HWIN r = 0; + if (hParent) { + WM_LOCK(); + r = _SetFocusOnNextChild(hParent); + WM_UNLOCK(); + } + return r; +} + +#else + void WM_SetFocusOnNextChild_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetFocusOnPrevChild.c b/User/system/lib/lcd/gui/WM/WM_SetFocusOnPrevChild.c new file mode 100644 index 0000000..9be8ce6 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetFocusOnPrevChild.c @@ -0,0 +1,112 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetFocusOnPrevChild.c +Purpose : Implementation of WM_SetFocusOnPrevChild +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetPrevChild +* +* Purpose: +* Returns a handle to the previous child of a window. +* +* Parameters: +* hParent: Handle of parent window. +* hChild: Handle of child to begin our search to its previous sibling. +* +* Return value: +* Handle to previous child if we found one. +* 0 if window has no other children. +*/ +static WM_HWIN _GetPrevChild(WM_HWIN hChild) { + WM_HWIN hObj = 0; + if (hChild) { + hObj = WM__GetPrevSibling(hChild); + } + if (!hObj) { + hObj = WM__GetLastSibling(hChild); + } + if (hObj != hChild) { + return hObj; + } + return 0; +} + +/********************************************************************* +* +* _SetFocusOnPrevChild +* +* Purpose: +* Sets the focus on previous focussable child of a window. +* +* Return value: +* Handle of focussed child, if we found an other focussable child +* as the current. Otherwise the return value is zero. +*/ +static WM_HWIN _SetFocusOnPrevChild(WM_HWIN hParent) { + WM_HWIN hChild, hWin; + hChild = WM__GetFocussedChild(hParent); + hChild = _GetPrevChild(hChild); + hWin = hChild; + while ((WM_IsFocussable(hWin) == 0) && hWin) { + hWin = _GetPrevChild(hWin); + if (hWin == hChild) { + break; + } + } + if (WM_SetFocus(hWin) == 0) { + return hWin; + } + return 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetFocusOnPrevChild +*/ +WM_HWIN WM_SetFocusOnPrevChild(WM_HWIN hParent) { + WM_HWIN r = 0; + if (hParent) { + WM_LOCK(); + r = _SetFocusOnPrevChild(hParent); + WM_UNLOCK(); + } + return r; +} + +#else + void WM_SetFocusOnPrevChild_C(void); + void WM_SetFocusOnPrevChild_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetId.c b/User/system/lib/lcd/gui/WM/WM_SetId.c new file mode 100644 index 0000000..0123501 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetId.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetId.c +Purpose : Implementation of WM_SetId +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetId +*/ +void WM_SetId(WM_HWIN hObj, int Id) { + WM_MESSAGE Msg; + Msg.MsgId = WM_SET_ID; + Msg.Data.v = Id; + WM_SendMessage(hObj, &Msg); +} + +#else + void WM_SetId_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetScrollState.c b/User/system/lib/lcd/gui/WM/WM_SetScrollState.c new file mode 100644 index 0000000..2c936b6 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetScrollState.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetSize.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetScrollState +*/ +void WM_SetScrollState(WM_HWIN hWin, const WM_SCROLL_STATE* pState) { + if (hWin && pState) { + WM_MESSAGE Msg; + Msg.MsgId = WM_SET_SCROLL_STATE; + Msg.Data.p = (const void*)pState; + WM_SendMessage(hWin, &Msg); + } +} + +#else + void WM_SetScrollSize_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetScrollbar.c b/User/system/lib/lcd/gui/WM/WM_SetScrollbar.c new file mode 100644 index 0000000..d994b14 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetScrollbar.c @@ -0,0 +1,109 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetScrollbar.c +Purpose : Implementation of WM_SetScrollbarV, WM_SetScrollbarH +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" +#include "SCROLLBAR.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _SetScrollbar +* +* Return value: 1 if scrollbar was visible, 0 if not +*/ +static int _SetScrollbar(WM_HWIN hWin, int OnOff, int Id, int Flags) { + WM_HWIN hBar; + hBar = WM_GetDialogItem(hWin, Id); + if (OnOff) { + if (!hBar) { + SCROLLBAR_CreateAttached(hWin, Flags); + } + } else { + WM_HideWindow(hBar); + if (hBar) { + WM_DeleteWindow(hBar); + } + } + return (hBar ? 1 : 0); +} + + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__SetScrollbarV +* +*/ +int WM__SetScrollbarV(WM_HWIN hWin, int OnOff) { + return _SetScrollbar(hWin, OnOff, GUI_ID_VSCROLL, SCROLLBAR_CF_VERTICAL); +} + +/********************************************************************* +* +* WM__SetScrollbarH +* +*/ +int WM__SetScrollbarH(WM_HWIN hWin, int OnOff) { + return _SetScrollbar(hWin, OnOff, GUI_ID_HSCROLL, 0); +} + +/********************************************************************* +* +* WM_SetScrollbarH +* +*/ +int WM_SetScrollbarH(WM_HWIN hWin, int OnOff) { + int r; + WM_LOCK(); + r = WM__SetScrollbarH(hWin, OnOff); + WM_UNLOCK(); + return r; +} + +/********************************************************************* +* +* WM_SetScrollbarV +* +*/ +int WM_SetScrollbarV(WM_HWIN hWin, int OnOff) { + int r; + WM_LOCK(); + r = WM__SetScrollbarV(hWin, OnOff); + WM_UNLOCK(); + return r; +} + +#else + void WM_SetScrollbar_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetSize.c b/User/system/lib/lcd/gui/WM/WM_SetSize.c new file mode 100644 index 0000000..5829928 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetSize.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetSize.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" +#define WM_DEBUG_LEVEL 1 + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetSize +*/ +void WM_SetSize(WM_HWIN hWin, int xSize, int ySize) { + WM_Obj* pWin; + int dx, dy; + if (hWin) { + WM_LOCK(); + pWin = WM_H2P(hWin); + dx = xSize - (pWin->Rect.x1 - pWin->Rect.x0 + 1); + dy = ySize - (pWin->Rect.y1 - pWin->Rect.y0 + 1); + WM_ResizeWindow(hWin, dx, dy); + WM_UNLOCK(); + } +} + +#else + void WM_SetSize_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetTrans.c b/User/system/lib/lcd/gui/WM/WM_SetTrans.c new file mode 100644 index 0000000..47a1105 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetTrans.c @@ -0,0 +1,93 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetTrans.C +Purpose : Windows manager, optional routines +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT +#if WM_SUPPORT_TRANSPARENCY /* If 0, WM will not generate any code */ + +#include "GUIDebug.h" + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetHasTrans +*/ +void WM_SetHasTrans(WM_HWIN hWin) { + WM_Obj *pWin; + WM_LOCK(); + if (hWin) { + pWin = WM_H2P(hWin); + /* First check if this is necessary at all */ + if ((pWin->Status & WM_SF_HASTRANS) == 0) { + pWin->Status |= WM_SF_HASTRANS; /* Set Transparency flag */ + WM__TransWindowCnt++; /* Increment counter for transparency windows */ + WM_InvalidateWindow(hWin); /* Mark content as invalid */ + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_ClrHasTrans +*/ +void WM_ClrHasTrans(WM_HWIN hWin) { + WM_Obj *pWin; + WM_LOCK(); + if (hWin) { + pWin = WM_H2P(hWin); + /* First check if this is necessary at all */ + if (pWin->Status & WM_SF_HASTRANS) { + pWin->Status &= ~WM_SF_HASTRANS; + WM__TransWindowCnt--; /* Decrement counter for transparency windows */ + WM_InvalidateWindow(hWin); /* Mark content as invalid */ + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_GetHasTrans +*/ +int WM_GetHasTrans(WM_HWIN hWin) { + int r = 0; + WM_Obj *pWin; + WM_LOCK(); + if (hWin) { + pWin = WM_H2P(hWin); + r = pWin->Status & WM_SF_HASTRANS; + } + WM_UNLOCK(); + return r; +} + +#endif /*WM_SUPPORT_TRANSPARENCY*/ + +#else + void WM_SetTrans_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetTransState.c b/User/system/lib/lcd/gui/WM/WM_SetTransState.c new file mode 100644 index 0000000..c904409 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetTransState.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetTransState.c +Purpose : Implementation of WM_SetTransState +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT && WM_SUPPORT_TRANSPARENCY + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +void WM_SetTransState(WM_HWIN hWin, unsigned State) { + WM_Obj *pWin; + WM_LOCK(); + if (hWin) { + pWin = WM_H2P(hWin); + if (State & WM_CF_HASTRANS) { + WM_SetHasTrans(hWin); + } else { + WM_ClrHasTrans(hWin); + } + if (State & WM_CF_CONST_OUTLINE) { + if (!(pWin->Status & WM_CF_CONST_OUTLINE)) { + pWin->Status |= WM_CF_CONST_OUTLINE; + WM_InvalidateWindow(hWin); + } + } else { + if (pWin->Status & WM_CF_CONST_OUTLINE) { + pWin->Status &= ~WM_CF_CONST_OUTLINE; + WM_InvalidateWindow(hWin); + } + } + } + WM_UNLOCK(); +} + +#else + void WM_SetTransState_c(void); + void WM_SetTransState_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/WM/WM_SetUserClipRect.c b/User/system/lib/lcd/gui/WM/WM_SetUserClipRect.c new file mode 100644 index 0000000..0033774 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetUserClipRect.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetUserClipArea.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetUserClipRect +*/ +const GUI_RECT* WM_SetUserClipRect(const GUI_RECT* pRect) { + const GUI_RECT* pRectReturn; + WM_LOCK(); + pRectReturn = GUI_Context.WM__pUserClipRect; + GUI_Context.WM__pUserClipRect = pRect; +/* Activate it ... */ + WM__ActivateClipRect(); + WM_UNLOCK(); + return pRectReturn; +} + +#else + void WM_SetUserClipRect(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetXSize.c b/User/system/lib/lcd/gui/WM/WM_SetXSize.c new file mode 100644 index 0000000..f5e10fa --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetXSize.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetXSize.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetXSize +*/ +int WM_SetXSize(WM_HWIN hWin, int XSize) { + WM_Obj* pWin; + int dx; + int r = 0; + if (hWin) { + WM_LOCK(); + pWin = WM_H2P(hWin); + dx = XSize - (pWin->Rect.x1 - pWin->Rect.x0 + 1); + WM_ResizeWindow(hWin, dx, 0); + r = pWin->Rect.x1 - pWin->Rect.x0 + 1; + WM_UNLOCK(); + } + return r; +} + +#else + void WM_SetXSize_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetYSize.c b/User/system/lib/lcd/gui/WM/WM_SetYSize.c new file mode 100644 index 0000000..339f8c9 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetYSize.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetYSize.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetYSize +*/ +int WM_SetYSize(WM_HWIN hWin, int YSize) { + WM_Obj* pWin; + int dy; + int r = 0; + if (hWin) { + WM_LOCK(); + pWin = WM_H2P(hWin); + dy = YSize - (pWin->Rect.y1 - pWin->Rect.y0 + 1); + WM_ResizeWindow(hWin, 0, dy); + r = pWin->Rect.y1 - pWin->Rect.y0 + 1; + WM_UNLOCK(); + } + return r; +} + +#else + void WM_SetYSize_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_SetpfPollPID.c b/User/system/lib/lcd/gui/WM/WM_SetpfPollPID.c new file mode 100644 index 0000000..ec27212 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_SetpfPollPID.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_SetpfPollPID.c +Purpose : Implementation of WM_SetpfPollPID +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_SetpfPollPID +*/ +WM_tfPollPID* WM_SetpfPollPID(WM_tfPollPID* pf) { + WM_tfPollPID* r = WM_pfPollPID; + WM_pfPollPID = pf; + return r; +} + +#else + void WM_SetpfPollPID_c(void); + void WM_SetpfPollPID_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Show.c b/User/system/lib/lcd/gui/WM/WM_Show.c new file mode 100644 index 0000000..d997fd3 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Show.c @@ -0,0 +1,74 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Show.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" +#define WM_DEBUG_LEVEL 1 + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_InvalidateWindowDescs + + Invalidate window and all descendents (children and grandchildren and ... +*/ +void WM_InvalidateWindowDescs(WM_HWIN hWin) { + WM_HWIN hChild; + if (hWin) { + WM_InvalidateWindow(hWin); /* Invalidate window itself */ + for (hChild = WM_GetFirstChild(hWin); hChild;) { + WM_Obj* pChild = WM_H2P(hChild); + WM_InvalidateWindowDescs(hChild); + hChild = pChild->hNext; + } + } +} + +/********************************************************************* +* +* WM_ShowWindow +*/ +void WM_ShowWindow(WM_HWIN hWin) { + if (hWin) { + WM_Obj *pWin; + WM_LOCK(); + pWin = WM_H2P(hWin); + if ((pWin->Status & WM_SF_ISVIS) == 0) { /* First check if this is necessary at all */ + pWin->Status |= WM_SF_ISVIS; /* Set Visibility flag */ + WM_InvalidateWindowDescs(hWin); /* Mark content as invalid */ + #if WM_SUPPORT_NOTIFY_VIS_CHANGED + WM__NotifyVisChanged(hWin, &pWin->Rect); + #endif + } + WM_UNLOCK(); + } +} + +#else + void WM_Show_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_StayOnTop.c b/User/system/lib/lcd/gui/WM/WM_StayOnTop.c new file mode 100644 index 0000000..bd69ac4 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_StayOnTop.c @@ -0,0 +1,80 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_StayOnTop.c +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM_SetStayOnTop +*/ +void WM_SetStayOnTop(WM_HWIN hWin, int OnOff) { + WM_Obj * pWin; + if (hWin) { + U16 OldStatus; + WM_LOCK(); + pWin = WM_H2P(hWin); + OldStatus = pWin->Status; + if (OnOff) { + if ((pWin->Status & WM_SF_STAYONTOP) == 0) { /* First check if this is necessary at all */ + pWin->Status |= WM_SF_STAYONTOP; + } + } else { + if ((pWin->Status & WM_SF_STAYONTOP) != 0) { /* First check if this is necessary at all */ + pWin->Status &= ~WM_SF_STAYONTOP; + } + } + if (pWin->Status != OldStatus) { + WM_AttachWindow(hWin, WM_GetParent(hWin)); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* WM_GetStayOnTop +*/ +int WM_GetStayOnTop(WM_HWIN hWin) { + int Result = 0; + WM_Obj * pWin; + if (hWin) { + WM_LOCK(); + pWin = WM_H2P(hWin); + if ((pWin->Status & WM_SF_STAYONTOP) != 0) { + Result = 1; + } + WM_UNLOCK(); + } + return Result; +} + +#else + void WM_StayOnTop_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Timer.c b/User/system/lib/lcd/gui/WM/WM_Timer.c new file mode 100644 index 0000000..d93bb24 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Timer.c @@ -0,0 +1,112 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Timer.c +Purpose : Implementetion of WM_CreateTimer, WM_DeleteTimer + for systems with external one shot timers. + (--> Philips, 2003) + + This module requires 2 macros in order to work and + generate code: + GUI_X_CREATE_TIMER(Period, void (*cb)(int)) + GUI_X_DELETE_TIMER(ID) + + Note that the delete macro is optional, since + one-shot-timers are expected to delete themselves. +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + + +/* Typical configuration: */ + +#if GUI_WINSUPPORT && !defined(GUI_X_CREATE_TIMER) /* If 0, WM will not generate any code */ + + +/********************************************************************* +* +* Required data structures +* +********************************************************************** +*/ + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + + +/********************************************************************* +* +* WM_DeleteTimer +* +* Purpose: +* API function (optional). +* Allows the application to delete a timer. +*/ +void WM_DeleteTimer (WM_HWIN hWin, int UserId) { + WM_LOCK(); + GUI_USE_PARA(hWin); + GUI_USE_PARA(UserId); + WM_UNLOCK(); +} + + +/********************************************************************* +* +* WM_CreateTimer +* +* Returns: 0 if failed, else != 0 +* Parameters: +* hWin Window handle of the window to receive the WM_TIMER message +* UserId User defined Id. If not needed, use 0. +* Period Number of time units (ticks) +* Mode 0: one-shot +* +*/ +int WM_CreateTimer (WM_HWIN hWin, int UserId, int Period, int Mode) { + int r = 0; + WM_LOCK(); + GUI_USE_PARA(hWin); + GUI_USE_PARA(UserId); + GUI_USE_PARA(Period); + GUI_USE_PARA(Mode); + WM_UNLOCK(); + return r; +} + +#else + void WM_Timer_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_TimerExternal.c b/User/system/lib/lcd/gui/WM/WM_TimerExternal.c new file mode 100644 index 0000000..0f9d4fa --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_TimerExternal.c @@ -0,0 +1,262 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_TimerExternal.c +Purpose : Implementetion of WM_CreateTimer, WM_DeleteTimer + for systems with external one shot timers. + (--> Philips, 2003) + + This module requires 2 macros in order to work and + generate code: + GUI_X_CREATE_TIMER(Period, void (*cb)(int)) + GUI_X_DELETE_TIMER(ID) + + Note that the delete macro is optional, since + one-shot-timers are expected to delete themselves. +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + + +/* Typical configuration: */ + +#if 0 +int MyApp_CreateTimer(int Period, void (*cb)(int)) { + int r = 0; + /* Alloc a one-shot timer from the kernel & start it etc ... */ + return r; +} +#define GUI_X_CREATE_TIMER(Period, cb) MyApp_CreateTimer(Period, cb) +#define GUI_X_DELETE_TIMER(ID) + +#endif + + +#if GUI_WINSUPPORT && defined(GUI_X_CREATE_TIMER) /* If 0, WM will not generate any code */ + + +/********************************************************************* +* +* Required data structures +* +********************************************************************** +*/ +typedef struct TIMER_LINK { + int UserId; + int TimerId; + WM_HWIN hWin; + GUI_HMEM hNext; +} TIMER_LINK; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +static GUI_HMEM _hFirst; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +/********************************************************************* +* +* _DeleteLinkItem +* +* Purpose: +* Returns: +* +*/ +static void _DeleteLinkItem(GUI_HMEM hLinkToDelete) { + GUI_HMEM hLink; + TIMER_LINK* pLink; + TIMER_LINK* pLinkToDelete; + if (hLinkToDelete) { + pLinkToDelete = (TIMER_LINK*)GUI_ALLOC_h2p(hLinkToDelete); + if (_hFirst == hLinkToDelete) { + _hFirst = pLinkToDelete->hNext; + GUI_ALLOC_Free(hLinkToDelete); + } else { + for (hLink = _hFirst; hLink; hLink = pLink->hNext) { + pLink = (TIMER_LINK*)GUI_ALLOC_h2p(hLink); + if (pLink->hNext == hLinkToDelete) { + pLink->hNext = pLinkToDelete->hNext; + GUI_ALLOC_Free(hLinkToDelete); + break; /* We found it ! */ + } + } + } + } +} + +/********************************************************************* +* +* _FindTimerByTimerId +* +* Purpose: +* Find the link item for this timer. +* Returns: pointer to the link if the TimerId is valid, else NULL +* +*/ +static GUI_HMEM _FindTimerByTimerId(int TimerId) { + GUI_HMEM hLink; + TIMER_LINK* pLink; + for (hLink = _hFirst; hLink; hLink = pLink->hNext) { + pLink = (TIMER_LINK*)GUI_ALLOC_h2p(hLink); + if (pLink->TimerId == TimerId) { + break; /* We found it ! */ + } + } + return hLink; +} + +/********************************************************************* +* +* _FindTimerByUserId +* +* Purpose: +* Find the link item for this timer. +* Returns: pointer to the link if the Window handle & UserId are valid, else NULL +* +*/ +static GUI_HMEM _FindTimerByUserId(WM_HWIN hWin, int UserId) { + GUI_HMEM hLink; + TIMER_LINK* pLink; + for (hLink = _hFirst; hLink; hLink = pLink->hNext) { + pLink = (TIMER_LINK*)GUI_ALLOC_h2p(hLink); + if ((pLink->hWin == hWin) && (pLink->UserId == UserId)) { + break; /* We found it ! */ + } + } + return hLink; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* _OnTimer +* +* This routine is called when a timer is expired. Its function is to +* find out which window needs to receive a WM_TIMER message. +*/ +static void _OnTimer(int TimerId) { + TIMER_LINK* pLink; + GUI_HMEM hLink; + WM_LOCK(); + hLink = _FindTimerByTimerId(TimerId); + if (hLink) { + WM_MESSAGE Msg; + /* Send Message */ + pLink = GUI_ALLOC_h2p(hLink); + Msg.MsgId = WM_TIMER; + Msg.Data.v = pLink->UserId; + Msg.hWinSrc = 0; + WM_SendMessage(pLink->hWin, &Msg); + /* Since these timers are one shot, we need to delete the link item. */ + _DeleteLinkItem(hLink); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WM_DeleteTimer +* +* Purpose: +* API function (optional). +* Allows the application to delete a timer. +*/ +void WM_DeleteTimer (WM_HWIN hWin, int UserId) { + GUI_HMEM hLink; + WM_LOCK(); + hLink = _FindTimerByUserId(hWin, UserId); + if (hLink) { + TIMER_LINK* pLink; + pLink = GUI_ALLOC_h2p(hLink); + GUI_X_DELETE_TIMER(pLink->TimerId); + _DeleteLinkItem(hLink); + } + WM_UNLOCK(); +} + + +/********************************************************************* +* +* WM_CreateTimer +* +* Returns: 0 if failed, else != 0 +* Parameters: +* hWin Window handle of the window to receive the WM_TIMER message +* UserId User defined Id. If not needed, use 0. +* Period Number of time units (ticks) +* Mode 0: one-shot +* +*/ +int WM_CreateTimer (WM_HWIN hWin, int UserId, int Period, int Mode) { + int r = 0; + int TimerId; + GUI_HMEM hTimerLink; + TIMER_LINK* pLink; + WM_LOCK(); + TimerId = GUI_X_CREATE_TIMER(Period, _OnTimer); + if (TimerId) { + hTimerLink = GUI_ALLOC_AllocZero(sizeof(TIMER_LINK)); + if (hTimerLink) { + pLink = (TIMER_LINK*) GUI_ALLOC_h2p(hTimerLink); + /* Put new timer at beginning of the linked list */ + pLink->hNext = _hFirst; + if (_hFirst) { + TIMER_LINK* pNext; + pNext = (TIMER_LINK*) GUI_ALLOC_h2p(_hFirst); + } + _hFirst = hTimerLink; + /* Fill in link data */ + pLink->hWin = hWin; + pLink->TimerId = TimerId; + pLink->UserId = UserId; + r = 1; /* All right, we have successfully created a new timer */ + } + } + /* Cleanup in case of problem */ + if (r == 0) { + if (TimerId) { + GUI_X_DELETE_TIMER(TimerId); + } + } + WM_UNLOCK(); + return r; +} + + + + + +#else + void WM_TimerExternal_c(void); + void WM_TimerExternal_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_UserData.c b/User/system/lib/lcd/gui/WM/WM_UserData.c new file mode 100644 index 0000000..7a0799b --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_UserData.c @@ -0,0 +1,101 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_UserData.c +Purpose : Implementation of WM_xxxUserData +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" +#include /* for memcpy, memset */ + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Min +*/ +static int Min(int v0, int v1) { + return (v0 < v1) ? v0 : v1; +} + +/********************************************************************* +* +* _CalcNumBytes +*/ +static int _CalcNumBytes(WM_HWIN hWin, int NumBytes) { + return Min(GUI_ALLOC_GetSize(hWin) - sizeof(WM_Obj), NumBytes); +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_GetUserData +* +* Purpose +* Get the User data (extra bytes) associated with a window +* These bytes have typically been set using WM_SetUserData first. +* (If not, they are 0) +* Return value: +* Number of bytes fetched. (<= SizeofBuffer) +*/ +int WM_GetUserData(WM_HWIN hWin, void* pDest, int NumBytes) { + if (hWin) { + WM_Obj *pWin; + NumBytes = _CalcNumBytes(hWin, NumBytes); + WM_LOCK(); + pWin = WM_H2P(hWin); + memcpy(pDest, pWin + 1, NumBytes); + WM_UNLOCK(); + } + return NumBytes; +} + +/********************************************************************* +* +* WM_SetUserData +* +* Purpose +* Set the User data (extra bytes) associated with a window +* Return value: +* Number of bytes fetched. (<= SizeofBuffer) +*/ +int WM_SetUserData(WM_HWIN hWin, const void* pSrc, int NumBytes) { + if (hWin) { + WM_Obj *pWin; + NumBytes = _CalcNumBytes(hWin, NumBytes); + WM_LOCK(); + pWin = WM_H2P(hWin); + memcpy(pWin + 1, pSrc, NumBytes); + WM_UNLOCK(); + } + return NumBytes; +} + +#else + void WM_UserData_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_Validate.c b/User/system/lib/lcd/gui/WM/WM_Validate.c new file mode 100644 index 0000000..b3a9fb1 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_Validate.c @@ -0,0 +1,103 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_Validate.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define Min(v0,v1) ((v0>v1) ? v1 : v0) +#define Max(v0,v1) ((v0>v1) ? v0 : v1) + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__SubRect + + The result is the smallest rectangle which includes the entire + remaining area. + + *pDest = *pr0- *pr1; +*/ +static void _SubRect(GUI_RECT* pDest, const GUI_RECT* pr0, const GUI_RECT* pr1) { + if ((pDest == NULL) || (pr0 == NULL)) + return; + *pDest = *pr0; + if (pr1 == NULL) + return; + /* Check left/right sides */ + if ( (pr1->y0 <= pr0->y0) + &&(pr1->y1 >= pr0->y1)) { + pDest->x0 = Max(pr0->x0, pr1->x1); + pDest->x1 = Min(pr0->x1, pr1->x0); + } + /* Check top/bottom sides */ + if ( (pr1->x0 <= pr0->x0) + &&(pr1->x1 >= pr0->x1)) { + pDest->y0 = Max(pr0->y0, pr1->y1); + pDest->y1 = Min(pr0->y1, pr1->y0); + } +} + +/********************************************************************* +* +* WM_ValidateRect +* + Use this function with great care ! It should under most circumstances not + be necessary to use it, as validation is done automatically as soon as + a window has been redrawn. If you validate a section of a window, this + part will not be included in the paint-command and could therefor not + be updated. +*/ +void WM_ValidateRect(WM_HWIN hWin, const GUI_RECT*pRect) { + WM_Obj* pWin; + if (hWin) { + WM_LOCK(); + pWin = WM_HANDLE2PTR(hWin); + if (pWin->Status & WM_SF_INVALID) { + if (pRect) { + _SubRect(&pWin->InvalidRect, &pWin->InvalidRect, pRect); + if (WM__RectIsNZ(&pWin->InvalidRect)) + goto Done; + } + pWin->Status &= ~WM_SF_INVALID; + WM__NumInvalidWindows--; + } + Done: + WM_UNLOCK(); + } +} + +#else + void WM_Validate(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM_ValidateWindow.c b/User/system/lib/lcd/gui/WM/WM_ValidateWindow.c new file mode 100644 index 0000000..9691ef0 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM_ValidateWindow.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM_ValidateWindow.c +Purpose : Implementation of WM_ValidateWindow +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM_ValidateWindow +*/ +void WM_ValidateWindow(WM_HWIN hWin) { + WM_Obj* pWin; + WM_LOCK(); + if (hWin) { + pWin = WM_HANDLE2PTR(hWin); + if (pWin->Status & WM_SF_INVALID) { + pWin->Status &= ~WM_SF_INVALID; + WM__NumInvalidWindows--; + } + } + WM_UNLOCK(); +} + +#else + void WM_ValidateWindow_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__ForEachDesc.c b/User/system/lib/lcd/gui/WM/WM__ForEachDesc.c new file mode 100644 index 0000000..ff0afb2 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__ForEachDesc.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__ForEachDesc.c +Purpose : Implementation of WM__ForEachDesc +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__ForEachDesc +*/ +void WM__ForEachDesc(WM_HWIN hWin, WM_tfForEach * pcb, void * pData) { + WM_HWIN hChild; + WM_Obj* pChild; + WM_Obj* pWin; + pWin = WM_H2P(hWin); + for (hChild = pWin->hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + pcb(hChild, pData); + WM_ForEachDesc(hChild, pcb, pData); + } +} + +#else + void WM__ForEachDesc_C(void); + void WM__ForEachDesc_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__GetFirstSibling.c b/User/system/lib/lcd/gui/WM/WM__GetFirstSibling.c new file mode 100644 index 0000000..b724254 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__GetFirstSibling.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__GetFirstSibling.c +Purpose : Implementation of WM__GetFirstSibling +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__GetFirstSibling + + Return value: Handle of parent, 0 if none +*/ +WM_HWIN WM__GetFirstSibling(WM_HWIN hWin) { + hWin = WM_GetParent(hWin); + return (hWin) ? WM_HANDLE2PTR(hWin)->hFirstChild : 0; +} + +#else + void WM__GetFirstSibling_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__GetFocussedChild.c b/User/system/lib/lcd/gui/WM/WM__GetFocussedChild.c new file mode 100644 index 0000000..0e35b22 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__GetFocussedChild.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__GetFocussedChild.c +Purpose : Implementation of WM__GetFocussedChild +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__GetFocussedChild +*/ +WM_HWIN WM__GetFocussedChild(WM_HWIN hWin) { + WM_HWIN r = 0; + if (WM__IsChild(WM__hWinFocus, hWin)) { + r = WM__hWinFocus; + } + return r; +} + +#else + void WM__GetFocussedChild_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__GetLastSibling.c b/User/system/lib/lcd/gui/WM/WM__GetLastSibling.c new file mode 100644 index 0000000..6989cca --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__GetLastSibling.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__GetLastSibling.c +Purpose : Implementation of WM__GetLastSibling +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__GetLastSibling + + Return value: Handle of last sibling +*/ +WM_HWIN WM__GetLastSibling(WM_HWIN hWin) { + WM_Obj* pWin; + for (; hWin; hWin = pWin->hNext) { + pWin = WM_H2P(hWin); + if (pWin->hNext == 0) { + break; + } + } + return hWin; +} + +#else + void WM__GetLastSibling_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__GetOrg_AA.c b/User/system/lib/lcd/gui/WM/WM__GetOrg_AA.c new file mode 100644 index 0000000..6fb019c --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__GetOrg_AA.c @@ -0,0 +1,61 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__GetOrg_AA.c +Purpose : Windows manager routine +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if (GUI_WINSUPPORT && GUI_SUPPORT_AA) /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__GetOrgX_AA +*/ +int WM__GetOrgX_AA(void) { + int r; + r = GUI_Context.xOff; + if (GUI_Context.AA_HiResEnable) { + r *= GUI_Context.AA_Factor; + } + return r; +} + +/********************************************************************* +* +* WM__GetOrgY_AA +*/ +int WM__GetOrgY_AA(void) { + int r; + r = GUI_Context.yOff; + if (GUI_Context.AA_HiResEnable) { + r *= GUI_Context.AA_Factor; + } + return r; +} + +#else + void WM__GetOrg_AA_c(void); + void WM__GetOrg_AA_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__GetPrevSibling.c b/User/system/lib/lcd/gui/WM/WM__GetPrevSibling.c new file mode 100644 index 0000000..0d183fc --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__GetPrevSibling.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__GetPrevSibling.c +Purpose : Implementation of WM__GetPrevSibling +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__GetPrevSibling + + Return value: Handle of previous sibling (if any), otherwise 0 +*/ +WM_HWIN WM__GetPrevSibling(WM_HWIN hWin) { + WM_HWIN hi; + WM_Obj* pi; + for (hi = WM__GetFirstSibling(hWin); hi; hi = pi->hNext) { + if (hi == hWin) { + hi = 0; /* There is no previous sibling. Return 0 */ + break; + } + pi = WM_H2P(hi); + if (pi->hNext == hWin) { + break; /* We found the previous one ! */ + } + } + return hi; +} + +#else + void WM__GetPrevSibling_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__IsAncestor.c b/User/system/lib/lcd/gui/WM/WM__IsAncestor.c new file mode 100644 index 0000000..0eb8c04 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__IsAncestor.c @@ -0,0 +1,76 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__IsAncestor.c +Purpose : Implementation of WM__IsAncestor +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM__IsAncestor +* +* Return value: +* if hChild is indeed a descendent (Child or child of child etc.) : 1 +* Else: 0 +* +* +*/ +int WM__IsAncestor(WM_HWIN hChild, WM_HWIN hParent) { + int r = 0; + if (hChild && hParent) { + while(hChild) { + WM_Obj *pChild = WM_H2P(hChild); + if (pChild->hParent == hParent) { + r = 1; + break; + } + hChild = pChild->hParent; + } + } + return r; +} + +/********************************************************************* +* +* WM__IsAncestor +* +* Return value: +* if hChild is indeed a descendent (Child or child of child etc.) : 1 +* Else: 0 +* +* +*/ +int WM__IsAncestorOrSelf(WM_HWIN hChild, WM_HWIN hParent) { + if (hChild == hParent) { + return 1; + } + return WM__IsAncestor(hChild, hParent); +} +#else + void WM__IsAncestor_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__IsChild.c b/User/system/lib/lcd/gui/WM/WM__IsChild.c new file mode 100644 index 0000000..f661d49 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__IsChild.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__IsChild.c +Purpose : Implementation of WM__IsChild +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__IsChild +*/ +int WM__IsChild(WM_HWIN hWin, WM_HWIN hParent) { + int r = 0; + if (hWin) { + WM_Obj *pObj = WM_H2P(hWin); + if (pObj) { + if (pObj->hParent == hParent) { + r = 1; + } + } + } + return r; +} + +#else + void WM__IsChild_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__IsEnabled.c b/User/system/lib/lcd/gui/WM/WM__IsEnabled.c new file mode 100644 index 0000000..9b6c17c --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__IsEnabled.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__IsEnabled.c +Purpose : Windows manager function +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__IsEnabled +*/ +int WM__IsEnabled(WM_HWIN hWin) { + int r = 1; + if ((WM_H2P(hWin)->Status) & WM_SF_DISABLED) { + r = 0; + } + return r; +} + +#else + void WM__IsEnabled_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__NotifyVisChanged.c b/User/system/lib/lcd/gui/WM/WM__NotifyVisChanged.c new file mode 100644 index 0000000..ca87da1 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__NotifyVisChanged.c @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__NotifyVisChanged.c +Purpose : Windows manager routine +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +/********************************************************************* +* +* _NotifyVisChanged +* +* Description +* Notify all descendents +*/ +static void _NotifyVisChanged(WM_HWIN hWin, GUI_RECT * pRect) { + WM_Obj* pWin; + + for (hWin = WM_GetFirstChild(hWin); hWin; hWin = pWin->hNext) { + pWin = WM_H2P(hWin); + if (pWin->Status & WM_SF_ISVIS) { + if (GUI_RectsIntersect(&pWin->Rect, pRect)) { + WM__SendMsgNoData(hWin, WM_NOTIFY_VIS_CHANGED); /* Notify window that visibility may have changed */ + _NotifyVisChanged(hWin, pRect); + } + } + } +} + + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* WM__NotifyVisChanged +* +* Description +* Notify all siblings & descendents +*/ +void WM__NotifyVisChanged(WM_HWIN hWin, GUI_RECT * pRect) { + WM_Obj * pWin; + WM_HWIN hParent; + pWin = WM_H2P(hWin); + hParent = pWin->hParent; + if (hParent) { + _NotifyVisChanged(hParent, pRect); + } +} + +#else + void WM__NotifyVisChanged_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__Screen2Client.c b/User/system/lib/lcd/gui/WM/WM__Screen2Client.c new file mode 100644 index 0000000..3c871e3 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__Screen2Client.c @@ -0,0 +1,43 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__Screen2Client.c +Purpose : Implementation of WM__Screen2Client +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__Screen2Client +*/ +void WM__Screen2Client(const WM_Obj* pWin, GUI_RECT *pRect) { + GUI_MoveRect(pRect, -pWin->Rect.x0, -pWin->Rect.y0); +} + +#else + void WM__Screen2Client_c(void); + void WM__Screen2Client_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__SendMessage.c b/User/system/lib/lcd/gui/WM/WM__SendMessage.c new file mode 100644 index 0000000..56eee72 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__SendMessage.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__SendMessage.c +Purpose : Implementation of WM__SendMessage +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__SendMessage +*/ +void WM__SendMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) { + WM_Obj* pWin = WM_HANDLE2PTR(hWin); + pMsg->hWin = hWin; + if (pWin->cb != NULL) { + (*pWin->cb)(pMsg); + } else { + WM_DefaultProc(pMsg); + } +} + +#else + void WM__SendMessage_c(void); + void WM__SendMessage_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__SendMessageIfEnabled.c b/User/system/lib/lcd/gui/WM/WM__SendMessageIfEnabled.c new file mode 100644 index 0000000..4ed3c3a --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__SendMessageIfEnabled.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__SendMessageIfEnabled.c +Purpose : Implementation of WM__SendMessageIfEnabled +---------------------------------------------------------------------- +*/ + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__SendMessageIfEnabled +*/ +void WM__SendMessageIfEnabled(WM_HWIN hWin, WM_MESSAGE* pMsg) { + if (WM__IsEnabled(hWin)) { + WM__SendMessage(hWin, pMsg); + } +} + +#else + void WM__SendMessageIfEnabled_c(void); + void WM__SendMessageIfEnabled_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__SendMessageNoPara.c b/User/system/lib/lcd/gui/WM/WM__SendMessageNoPara.c new file mode 100644 index 0000000..c727366 --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__SendMessageNoPara.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__SendMessageNoPara.c +Purpose : Implementation of WM__SendMessageNoPara +---------------------------------------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__SendMessageNoPara +*/ +void WM__SendMessageNoPara(WM_HWIN hWin, int MsgId) { + WM_MESSAGE Msg = {0}; + WM_Obj* pWin = WM_HANDLE2PTR(hWin); + if (pWin->cb != NULL) { + Msg.hWin = hWin; + Msg.MsgId = MsgId; + (*pWin->cb)(&Msg); + } +} + +#else + void WM__SendMessageNoPara_c(void); + void WM__SendMessageNoPara_c(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/WM__UpdateChildPositions.c b/User/system/lib/lcd/gui/WM/WM__UpdateChildPositions.c new file mode 100644 index 0000000..43cbe0e --- /dev/null +++ b/User/system/lib/lcd/gui/WM/WM__UpdateChildPositions.c @@ -0,0 +1,99 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WM__UpdateChildPositions.C +Purpose : Windows manager, add. module +---------------------------------------------------------------------- +*/ + +#include +#include "WM_Intern.h" + +#if GUI_WINSUPPORT /* If 0, WM will not generate any code */ +#include "GUIDebug.h" +#define WM_DEBUG_LEVEL 1 + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WM__UpdateChildPositions +* +* Purpose: +* Move and/or resize all children of a resized window. +* What exactly happens to the window depends on how the edges are +* anchored. +*/ +void WM__UpdateChildPositions(WM_Obj* pObj, int dx0, int dy0, int dx1, int dy1) { + WM_HWIN hChild; + WM_Obj* pChild; + int dx, dy, dw, dh; + for (hChild = pObj->hFirstChild; hChild; hChild = pChild->hNext) { + int Status; + GUI_RECT rOld, rNew; + pChild = WM_H2P(hChild); + /* Compute size of new rectangle */ + rOld = pChild->Rect; + rNew = rOld; + Status = pChild->Status & (WM_SF_ANCHOR_RIGHT | WM_SF_ANCHOR_LEFT); + switch (Status) { + case WM_SF_ANCHOR_RIGHT: /* Right ANCHOR : Move window with right side */ + rNew.x0 += dx1; + rNew.x1 += dx1; + break; + case WM_SF_ANCHOR_RIGHT | WM_SF_ANCHOR_LEFT: /* Left & Right ANCHOR: Resize window */ + rNew.x0 += dx0; + rNew.x1 += dx1; + break; + default: /* Left ANCHOR: Move window with left side of parent */ + rNew.x0 += dx0; + rNew.x1 += dx0; + } + Status = pChild->Status & (WM_SF_ANCHOR_TOP | WM_SF_ANCHOR_BOTTOM); + switch (Status) { + case WM_SF_ANCHOR_BOTTOM: /* Bottom ANCHOR */ + rNew.y0 += dy1; + rNew.y1 += dy1; + break; + case WM_SF_ANCHOR_BOTTOM | WM_SF_ANCHOR_TOP: /* resize window */ + rNew.y0 += dy0; + rNew.y1 += dy1; + break; + default: /* Top ANCHOR */ + rNew.y0 += dy0; + rNew.y1 += dy0; + } + /* Set new window position using Move and Resize as required */ + dx = rNew.x0 - rOld.x0; + dy = rNew.y0 - rOld.y0; + if (dx || dy) { + WM_MoveWindow(hChild, dx, dy); + } + dw = (rNew.x1 - rNew.x0) - (rOld.x1 - rOld.x0); + dh = (rNew.y1 - rNew.y0) - (rOld.y1 - rOld.y0); + if (dw || dh) { + WM_ResizeWindow(hChild, dw, dh); + } + } +} + +#else + void WM_UpdateChildPositions_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/WM/vssver.scc b/User/system/lib/lcd/gui/WM/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..98eae906033dbee0205baa868042c8ed30b618a1 GIT binary patch literal 1632 zcmX}seN4=890%~?PM%f#Q7J3U(aclpl9E4IG!xN=m^GQFTWJ&}ZA!Nc8`&fsX_WJj z(ut@eD)OAlp)1s#^dM4KcOFjiW_y2s|NQp)y?@{DZ{N@F`}z7f+S+i8>O0yxGz zXr>F{@_0!$eGQ(~uQ)~*!49V~^Jxvd%GhtDufuD%1TCYB;b1Ro1bqXp3A1yjZ^Fs} zmoT~n4sdBqrEkG1*L|7vZFrQ%D#n+>F^c61=4Eiw8jBmPg`1sHbLcy;GF>C;aToSa z(hg%@4o9zCeVM)oyRNWXrkJ&-?ce{q5338xwlc4PrLF4ubS3OH_2?723SOG+|BZeC zZ!U8zrXRv{vXoVHHEbGPyp(QLlPU=C9y* z-3|k-gAIpMwDfDZbJ{=+{RUn)tNTHBg}3~Xd@g|VVq2V zgbh!fZ%dsG^5+{1@0(<5om}h2vx+MSpd}8D=j(=HKAvfQfRt2Tlx3>7aYzc7ux;Z-VvX z64o*AgWUtdHq-rZq^Vr&Pc!V9)+5d{3moxlkyy`nIJ2Nu^ve(U`02T#9zWr%*&FOR z|1a2Qx?cuug%6Ah7vKL4M>;!-`3K;`tD3}l_Xj?x$`}1G2)ElW6#L0Wih3tS$T+_( moKrt0jUECAhPc<$L*cNL8=`+C@Q+@dI6tKDt`L0}-~S6g$iQ3x literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/gui/Widget/BUTTON.c b/User/system/lib/lcd/gui/Widget/BUTTON.c new file mode 100644 index 0000000..acecd96 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON.c @@ -0,0 +1,455 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON.c +Purpose : Implementation of button widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef BUTTON_FONT_DEFAULT + #define BUTTON_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Support for 3D effects */ +#ifndef BUTTON_USE_3D + #define BUTTON_USE_3D 1 +#endif + +#ifndef BUTTON_3D_MOVE_X + #define BUTTON_3D_MOVE_X 1 +#endif +#ifndef BUTTON_3D_MOVE_Y + #define BUTTON_3D_MOVE_Y 1 +#endif + +/* Define colors */ +#ifndef BUTTON_BKCOLOR0_DEFAULT + #define BUTTON_BKCOLOR0_DEFAULT 0xAAAAAA +#endif + +#ifndef BUTTON_BKCOLOR1_DEFAULT + #define BUTTON_BKCOLOR1_DEFAULT GUI_WHITE +#endif + +#ifndef BUTTON_BKCOLOR2_DEFAULT + #define BUTTON_BKCOLOR2_DEFAULT GUI_LIGHTGRAY +#endif + +#ifndef BUTTON_TEXTCOLOR0_DEFAULT + #define BUTTON_TEXTCOLOR0_DEFAULT GUI_BLACK +#endif + +#ifndef BUTTON_TEXTCOLOR1_DEFAULT + #define BUTTON_TEXTCOLOR1_DEFAULT GUI_BLACK +#endif + +#ifndef BUTTON_TEXTCOLOR2_DEFAULT + #define BUTTON_TEXTCOLOR2_DEFAULT GUI_DARKGRAY +#endif + +#ifndef BUTTON_REACT_ON_LEVEL + #define BUTTON_REACT_ON_LEVEL 0 +#endif + +#ifndef BUTTON_ALIGN_DEFAULT + #define BUTTON_ALIGN_DEFAULT GUI_TA_HCENTER | GUI_TA_VCENTER +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +BUTTON_PROPS BUTTON__DefaultProps = { + BUTTON_BKCOLOR0_DEFAULT, + BUTTON_BKCOLOR1_DEFAULT, + BUTTON_BKCOLOR2_DEFAULT, + BUTTON_TEXTCOLOR0_DEFAULT, + BUTTON_TEXTCOLOR1_DEFAULT, + BUTTON_TEXTCOLOR2_DEFAULT, + BUTTON_FONT_DEFAULT, + BUTTON_ALIGN_DEFAULT +}; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _Paint +*/ +static void _Paint(BUTTON_Obj* pObj, BUTTON_Handle hObj) { + const char* s = NULL; + unsigned int Index; + int State, PressedState, ColorIndex; + GUI_RECT rClient, rInside; + State = pObj->Widget.State; + PressedState = (State & BUTTON_STATE_PRESSED) ? 1 : 0; + ColorIndex = (WM__IsEnabled(hObj)) ? PressedState : 2; + GUI_SetFont(pObj->Props.pFont); + GUI_DEBUG_LOG("BUTTON: Paint(..)\n"); + if (pObj->hpText) { + s = (const char*) GUI_ALLOC_h2p(pObj->hpText); + } + GUI_GetClientRect(&rClient); + /* Start drawing */ + rInside = rClient; +/* Draw the 3D effect (if configured) */ + #if BUTTON_USE_3D + { + int EffectSize; + if ((PressedState) == 0) { + pObj->Widget.pEffect->pfDrawUp(); /* _WIDGET_EFFECT_3D_DrawUp(); */ + EffectSize = pObj->Widget.pEffect->EffectSize; + } else { + LCD_SetColor(0x000000); + GUI_DrawRect(rClient.y0, rClient.x0, rClient.x1, rClient.y1); + EffectSize = 1; + } + GUI__ReduceRect(&rInside, &rInside, EffectSize); + } + #endif + /* Draw background */ + LCD_SetBkColor (pObj->Props.aBkColor[ColorIndex]); + LCD_SetColor (pObj->Props.aTextColor[ColorIndex]); + WM_SetUserClipRect(&rInside); + GUI_Clear(); + /* Draw bitmap. + If we have only one, we will use it. + If we have to we will use the second one (Index 1) for the pressed state + */ + if (ColorIndex < 2) { + Index = (pObj->ahDrawObj[BUTTON_BI_PRESSED] && PressedState) ? BUTTON_BI_PRESSED : BUTTON_BI_UNPRESSED; + } else { + Index = pObj->ahDrawObj[BUTTON_BI_DISABLED] ? BUTTON_BI_DISABLED : BUTTON_BI_UNPRESSED; + } + GUI_DRAW__Draw(pObj->ahDrawObj[Index], 0, 0); +/* Draw the actual button (background and text) */ + { + GUI_RECT r; + r = rInside; + #if BUTTON_USE_3D + if (PressedState) { + GUI_MoveRect(&r, BUTTON_3D_MOVE_X,BUTTON_3D_MOVE_Y); + } + #endif + GUI_SetTextMode(GUI_TM_TRANS); + GUI_DispStringInRect(s, &r, pObj->Props.Align); + } + /* Draw focus */ + if (State & BUTTON_STATE_FOCUS) { + LCD_SetColor(GUI_BLACK); + GUI_DrawFocusRect(&rClient, 2); + } + WM_SetUserClipRect(NULL); +} + +/********************************************************************* +* +* _Delete +* +* Delete attached objects (if any) +*/ +static void _Delete(BUTTON_Obj* pObj) { + GUI_ALLOC_FreePtr(&pObj->hpText); + GUI_ALLOC_FreePtr(&pObj->ahDrawObj[0]); + GUI_ALLOC_FreePtr(&pObj->ahDrawObj[1]); +} + +/********************************************************************* +* +* _ButtonPressed +*/ +static void _ButtonPressed(BUTTON_Handle hObj, BUTTON_Obj* pObj) { + WIDGET_OrState(hObj, BUTTON_STATE_PRESSED); + if (pObj->Widget.Win.Status & WM_SF_ISVIS) { + WM_NotifyParent(hObj, WM_NOTIFICATION_CLICKED); + } +} + +/********************************************************************* +* +* _ButtonReleased +*/ +static void _ButtonReleased(BUTTON_Handle hObj, BUTTON_Obj* pObj, int Notification) { + WIDGET_AndState(hObj, BUTTON_STATE_PRESSED); + if (pObj->Widget.Win.Status & WM_SF_ISVIS) { + WM_NotifyParent(hObj, Notification); + } + if (Notification == WM_NOTIFICATION_RELEASED) { + GUI_DEBUG_LOG("BUTTON: Hit\n"); + GUI_StoreKey(pObj->Widget.Id); + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(BUTTON_Handle hObj, BUTTON_Obj* pObj, WM_MESSAGE*pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; +#if BUTTON_REACT_ON_LEVEL + if (!pMsg->Data.p) { /* Mouse moved out */ + _ButtonReleased(hObj, pObj, WM_NOTIFICATION_MOVED_OUT); + } +#else + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + if ((pObj->Widget.State & BUTTON_STATE_PRESSED) == 0){ + _ButtonPressed(hObj, pObj); + } + } else { + /* React only if button was pressed before ... avoid problems with moving / hiding windows above (such as dropdown) */ + if (pObj->Widget.State & BUTTON_STATE_PRESSED) { + _ButtonReleased(hObj, pObj, WM_NOTIFICATION_RELEASED); + } + } + } else { + _ButtonReleased(hObj, pObj, WM_NOTIFICATION_MOVED_OUT); + } + +#endif +} + +/********************************************************************* +* +* _OnPidStateChange +*/ +#if BUTTON_REACT_ON_LEVEL +static void _OnPidStateChange(BUTTON_Handle hObj, BUTTON_Obj * pObj, WM_MESSAGE * pMsg) { + const WM_PID_STATE_CHANGED_INFO * pState = (const WM_PID_STATE_CHANGED_INFO *)pMsg->Data.p; + if ((pState->StatePrev == 0) && (pState->State == 1)) { + if ((pObj->Widget.State & BUTTON_STATE_PRESSED) == 0){ + _ButtonPressed(hObj, pObj); + } + } else if ((pState->StatePrev == 1) && (pState->State == 0)) { + if (pObj->Widget.State & BUTTON_STATE_PRESSED) { + _ButtonReleased(hObj, pObj, WM_NOTIFICATION_RELEASED); + } + } +} +#endif + +/********************************************************************* +* +* BUTTON_Callback +*/ +void BUTTON_Callback(WM_MESSAGE *pMsg) { + BUTTON_Handle hObj = pMsg->hWin; + BUTTON_Obj* pObj = BUTTON_H2P(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { +#if BUTTON_REACT_ON_LEVEL + case WM_PID_STATE_CHANGED: + _OnPidStateChange(hObj, pObj, pMsg); + return; /* Message handled. Do not call WM_DefaultProc, because the window may have been destroyed */ +#endif + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + return; /* Message handled. Do not call WM_DefaultProc, because the window may have been destroyed */ + case WM_PAINT: + GUI_DEBUG_LOG("BUTTON: _BUTTON_Callback(WM_PAINT)\n"); + _Paint(pObj, hObj); + return; + case WM_DELETE: + GUI_DEBUG_LOG("BUTTON: _BUTTON_Callback(WM_DELETE)\n"); + _Delete(pObj); + break; /* No return here ... WM_DefaultProc needs to be called */ + #if 0 /* TBD: Button should react to space & Enter */ + case WM_KEY: + { + int PressedCnt = ((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt; + int Key = ((WM_KEY_INFO*)(pMsg->Data.p))->Key; + if (PressedCnt > 0) { /* Key pressed? */ + switch (Key) { + case ' ': + _ButtonPressed(hObj, pObj); + return; + } + } else { + switch (Key) { + case ' ': + _ButtonReleased(hObj, pObj, WM_NOTIFICATION_RELEASED); + return; + } + } + } + break; + #endif + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_CreateEx +*/ +BUTTON_Handle BUTTON_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id) { + BUTTON_Handle hObj; + GUI_USE_PARA(ExFlags); + /* Create the window */ + WM_LOCK(); + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, BUTTON_Callback, + sizeof(BUTTON_Obj) - sizeof(WM_Obj)); + if (hObj) { + BUTTON_Obj* pObj = BUTTON_H2P(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + /* init member variables */ + BUTTON_INIT_ID(pObj); + pObj->Props = BUTTON__DefaultProps; + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "BUTTON_Create failed") + } + WM_UNLOCK(); + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ + +/********************************************************************* +* +* BUTTON_SetText +*/ +void BUTTON_SetText(BUTTON_Handle hObj, const char* s) { + if (hObj) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + if (GUI__SetText(&pObj->hpText, s)) { + BUTTON_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* BUTTON_SetFont +*/ +void BUTTON_SetFont(BUTTON_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont) { + if (hObj) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + BUTTON_ASSERT_IS_VALID_PTR(pObj); + pObj->Props.pFont = pfont; + BUTTON_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* BUTTON_SetBkColor +*/ +void BUTTON_SetBkColor(BUTTON_Handle hObj,unsigned int Index, GUI_COLOR Color) { + if (hObj && (Index <= 2)) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + BUTTON_ASSERT_IS_VALID_PTR(pObj); + pObj->Props.aBkColor[Index] = Color; + BUTTON_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* BUTTON_SetTextColor +*/ +void BUTTON_SetTextColor(BUTTON_Handle hObj,unsigned int Index, GUI_COLOR Color) { + if (hObj && (Index <= 2)) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + BUTTON_ASSERT_IS_VALID_PTR(pObj); + pObj->Props.aTextColor[Index] = Color; + BUTTON_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* BUTTON_SetState +*/ +void BUTTON_SetState(BUTTON_Handle hObj, int State) { + WIDGET_SetState(hObj, State); +} + +/********************************************************************* +* +* BUTTON_SetPressed +*/ +void BUTTON_SetPressed(BUTTON_Handle hObj, int State) { + if (State) { + WIDGET_OrState(hObj, BUTTON_STATE_PRESSED); + } else { + WIDGET_AndState(hObj, BUTTON_STATE_PRESSED); + } +} + +/********************************************************************* +* +* BUTTON_SetFocussable +*/ +void BUTTON_SetFocussable(BUTTON_Handle hObj, int State) { + if (State) { + WIDGET_OrState(hObj, WIDGET_STATE_FOCUSSABLE); + } else { + WIDGET_AndState(hObj, WIDGET_STATE_FOCUSSABLE); + } +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_C(void) {} +#endif /* GUI_WINSUPPORT */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/BUTTON.h b/User/system/lib/lcd/gui/Widget/BUTTON.h new file mode 100644 index 0000000..899c58c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON.h @@ -0,0 +1,166 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON.h +Purpose : BUTTON public header file (API) +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef BUTTON_H +#define BUTTON_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ +#include "WIDGET.h" + + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +#if GUI_WINSUPPORT + +/************************************************************ +* +* Create flags +*/ +/* For compatibility only ! */ +#define BUTTON_CF_HIDE WM_CF_HIDE +#define BUTTON_CF_SHOW WM_CF_SHOW +#define BUTTON_CF_MEMDEV WM_CF_MEMDEV + +/********************************************************************* +* +* Color indices +*/ +#define BUTTON_CI_UNPRESSED 0 +#define BUTTON_CI_PRESSED 1 +#define BUTTON_CI_DISABLED 2 + +/********************************************************************* +* +* Bitmap indices +*/ +#define BUTTON_BI_UNPRESSED 0 +#define BUTTON_BI_PRESSED 1 +#define BUTTON_BI_DISABLED 2 + +/************************************************************ +* +* Messages +*/ + +/************************************************************ +* +* States +*/ + +#define BUTTON_STATE_FOCUS WIDGET_STATE_FOCUS +#define BUTTON_STATE_PRESSED WIDGET_STATE_USER0 + +/************************************************************ +* +* Types +* +************************************************************* +*/ +typedef WM_HMEM BUTTON_Handle; + +/************************************************************ +* +* Create function(s) + + Note: the parameters to a create function may vary. + Some widgets may have multiple create functions +*/ + +BUTTON_Handle BUTTON_Create (int x0, int y0, int xsize, int ysize, int ID, int Flags); +BUTTON_Handle BUTTON_CreateAsChild (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags); +BUTTON_Handle BUTTON_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +BUTTON_Handle BUTTON_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +GUI_COLOR BUTTON_GetDefaultBkColor (unsigned Index); +const GUI_FONT GUI_UNI_PTR * BUTTON_GetDefaultFont (void); +int BUTTON_GetDefaultTextAlign(void); +GUI_COLOR BUTTON_GetDefaultTextColor(unsigned Index); +void BUTTON_SetDefaultBkColor (GUI_COLOR Color, unsigned Index); +void BUTTON_SetDefaultFont (const GUI_FONT GUI_UNI_PTR * pFont); +void BUTTON_SetDefaultTextAlign(int Align); +void BUTTON_SetDefaultTextColor(GUI_COLOR Color, unsigned Index); + +#define BUTTON_EnableMemdev(hObj) WM_EnableMemdev (hObj) +#define BUTTON_DisableMemdev(hObj) WM_DisableMemdev (hObj) +#define BUTTON_Delete(hObj) WM_DeleteWindow (hObj) +#define BUTTON_Paint(hObj) WM_Paint (hObj) +#define BUTTON_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/********************************************************************* +* +* The callback ... +* +* Do not call it directly ! It is only to be used from within an +* overwritten callback. +*/ +void BUTTON_Callback(WM_MESSAGE *pMsg); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +GUI_COLOR BUTTON_GetBkColor (BUTTON_Handle hObj, unsigned int Index); +const GUI_FONT GUI_UNI_PTR * BUTTON_GetFont(BUTTON_Handle hObj); +void BUTTON_GetText (BUTTON_Handle hObj, char * pBuffer, int MaxLen); +GUI_COLOR BUTTON_GetTextColor (BUTTON_Handle hObj, unsigned int Index); +unsigned BUTTON_IsPressed (BUTTON_Handle hObj); +void BUTTON_SetBitmap (BUTTON_Handle hObj, unsigned int Index, const GUI_BITMAP * pBitmap); +void BUTTON_SetBitmapEx (BUTTON_Handle hObj, unsigned int Index, const GUI_BITMAP * pBitmap, int x, int y); +void BUTTON_SetBkColor (BUTTON_Handle hObj, unsigned int Index, GUI_COLOR Color); +void BUTTON_SetBMP (BUTTON_Handle hObj, unsigned int Index, const void * pBitmap); +void BUTTON_SetBMPEx (BUTTON_Handle hObj, unsigned int Index, const void * pBitmap, int x, int y); +void BUTTON_SetFont (BUTTON_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont); +void BUTTON_SetState (BUTTON_Handle hObj, int State); /* Not to be doc. */ +void BUTTON_SetPressed (BUTTON_Handle hObj, int State); +void BUTTON_SetFocussable (BUTTON_Handle hObj, int State); +void BUTTON_SetStreamedBitmap (BUTTON_Handle hObj, unsigned int Index, const GUI_BITMAP_STREAM * pBitmap); +void BUTTON_SetStreamedBitmapEx(BUTTON_Handle hObj, unsigned int Index, const GUI_BITMAP_STREAM * pBitmap, int x, int y); +void BUTTON_SetText (BUTTON_Handle hObj, const char* s); +void BUTTON_SetTextAlign (BUTTON_Handle hObj, int Align); +void BUTTON_SetTextColor (BUTTON_Handle hObj, unsigned int Index, GUI_COLOR Color); +void BUTTON_SetSelfDrawEx (BUTTON_Handle hObj, unsigned int Index, void (*pDraw)(void), int x, int y); /* Not to be doc. */ +void BUTTON_SetSelfDraw (BUTTON_Handle hObj, unsigned int Index, void (*pDraw)(void)); /* Not to be doc. */ + +/************************************************************ +* +* States +*/ +#define BUTTON_STATE_HASFOCUS 0 + +#endif /* BUTTON_H */ + +#if defined(__cplusplus) + } +#endif + +#endif /* BUTTON_H */ diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_BMP.c b/User/system/lib/lcd/gui/Widget/BUTTON_BMP.c new file mode 100644 index 0000000..76fb0f4 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_BMP.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_StreamedBitmap.c +Purpose : Button streamed bitmap support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetBMPEx +*/ +void BUTTON_SetBMPEx(BUTTON_Handle hObj,unsigned int Index, const void * pBitmap, int x, int y) { + BUTTON__SetDrawObj(hObj, Index, GUI_DRAW_BMP_Create(pBitmap, x, y)); +} + +/********************************************************************* +* +* BUTTON_SetBMP +*/ +void BUTTON_SetBMP(BUTTON_Handle hObj,unsigned int Index, const void * pBitmap) { + BUTTON_SetBMPEx(hObj, Index, pBitmap, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_BMP_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_Bitmap.c b/User/system/lib/lcd/gui/Widget/BUTTON_Bitmap.c new file mode 100644 index 0000000..df06ace --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_Bitmap.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_Bitmap.c +Purpose : Button bitmap support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetBitmapEx +*/ +void BUTTON_SetBitmapEx(BUTTON_Handle hObj, unsigned int Index, const GUI_BITMAP * pBitmap, int x, int y) { + BUTTON__SetDrawObj(hObj, Index, GUI_DRAW_BITMAP_Create(pBitmap, x, y)); +} + +/********************************************************************* +* +* BUTTON_SetBitmap +*/ +void BUTTON_SetBitmap(BUTTON_Handle hObj,unsigned int Index, const GUI_BITMAP* pBitmap) { + BUTTON_SetBitmapEx(hObj, Index, pBitmap, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_Bitmap_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_Create.c b/User/system/lib/lcd/gui/Widget/BUTTON_Create.c new file mode 100644 index 0000000..ce3fbd8 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_Create.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_Create.c +Purpose : Implementation of button widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_Create +*/ +BUTTON_Handle BUTTON_Create(int x0, int y0, int xsize, int ysize, int Id, int Flags) { + return BUTTON_CreateEx(x0, y0, xsize, ysize, WM_HMEM_NULL, Flags, 0, Id); +} + +/********************************************************************* +* +* BUTTON_CreateAsChild +*/ +BUTTON_Handle BUTTON_CreateAsChild (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags) { + return BUTTON_CreateEx(x0, y0, xsize, ysize, hParent, Flags, 0, Id); +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_Create_C(void) {} +#endif /* GUI_WINSUPPORT */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/BUTTON_CreateIndirect.c new file mode 100644 index 0000000..333e5af --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_CreateIndirect.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_CreateIndirect.c +Purpose : Implementation of button widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_CreateIndirect +*/ +BUTTON_Handle BUTTON_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + BUTTON_Handle hThis; + GUI_USE_PARA(cb); + hThis = BUTTON_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, + pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + BUTTON_SetText(hThis, pCreateInfo->pName); + return hThis; +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_CreateIndirect_C(void) {} +#endif /* GUI_WINSUPPORT */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_Default.c b/User/system/lib/lcd/gui/Widget/BUTTON_Default.c new file mode 100644 index 0000000..83d7d73 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_Default.c @@ -0,0 +1,110 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_Default.c +Purpose : Implementation of button widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetDefaultFont +*/ +void BUTTON_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + BUTTON__DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* BUTTON_SetDefaultTextColor +*/ +void BUTTON_SetDefaultTextColor(GUI_COLOR Color, unsigned Index) { + if (Index < GUI_COUNTOF(BUTTON__DefaultProps.aTextColor)) { + BUTTON__DefaultProps.aTextColor[Index] = Color; + } +} + +/********************************************************************* +* +* BUTTON_SetDefaultBkColor +*/ +void BUTTON_SetDefaultBkColor(GUI_COLOR Color, unsigned Index) { + if (Index < GUI_COUNTOF(BUTTON__DefaultProps.aBkColor)) { + BUTTON__DefaultProps.aBkColor[Index] = Color; + } +} + +/********************************************************************* +* +* BUTTON_SetDefaultTextAlign +*/ +void BUTTON_SetDefaultTextAlign(int Align) { + BUTTON__DefaultProps.Align = Align; +} + +/********************************************************************* +* +* BUTTON_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * BUTTON_GetDefaultFont(void) { + return BUTTON__DefaultProps.pFont; +} + +/********************************************************************* +* +* BUTTON_GetDefaultTextColor +*/ +GUI_COLOR BUTTON_GetDefaultTextColor(unsigned Index) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (Index < GUI_COUNTOF(BUTTON__DefaultProps.aTextColor)) { + Color = BUTTON__DefaultProps.aTextColor[Index]; + } + return Color; +} + +/********************************************************************* +* +* BUTTON_GetDefaultBkColor +*/ +GUI_COLOR BUTTON_GetDefaultBkColor(unsigned Index) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (Index < GUI_COUNTOF(BUTTON__DefaultProps.aBkColor)) { + Color = BUTTON__DefaultProps.aBkColor[Index]; + } + return Color; +} + +/********************************************************************* +* +* BUTTON_GetDefaultTextAlign +*/ +int BUTTON_GetDefaultTextAlign(void) { + return BUTTON__DefaultProps.Align; +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_Default_C(void); + void BUTTON_Default_C(void) {} +#endif + diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_Get.c b/User/system/lib/lcd/gui/Widget/BUTTON_Get.c new file mode 100644 index 0000000..9ce29b7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_Get.c @@ -0,0 +1,106 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_Get.c +Purpose : Button widget, various (optional) Get routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "BUTTON.h" +#include "BUTTON_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_GetBkColor +*/ +GUI_COLOR BUTTON_GetBkColor(BUTTON_Handle hObj,unsigned int Index) { + GUI_COLOR Color = 0; + if (hObj && (Index < 2)) { + BUTTON_Obj * pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + Color = pObj->Props.aBkColor[Index]; + WM_UNLOCK(); + } + return Color; +} + +/********************************************************************* +* +* BUTTON_GetFont +*/ +const GUI_FONT GUI_UNI_PTR * BUTTON_GetFont(BUTTON_Handle hObj) { + const GUI_FONT GUI_UNI_PTR * pFont = 0; + if (hObj) { + BUTTON_Obj * pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + pFont = pObj->Props.pFont; + WM_UNLOCK(); + } + return pFont; +} + +/********************************************************************* +* +* BUTTON_GetText +*/ +void BUTTON_GetText(BUTTON_Handle hObj, char * pBuffer, int MaxLen) { + if (hObj) { + BUTTON_Obj * pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + if (pObj->hpText) { + const char * pText = (const char*) GUI_ALLOC_h2p(pObj->hpText); + int Len = strlen(pText); + if (Len > (MaxLen - 1)) + Len = MaxLen - 1; + memcpy((void *)pBuffer, (const void *)pText, Len); + *(pBuffer + Len) = 0; + } else { + *pBuffer = 0; /* Empty string */ + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* BUTTON_GetTextColor +*/ +GUI_COLOR BUTTON_GetTextColor(BUTTON_Handle hObj,unsigned int Index) { + GUI_COLOR Color = 0; + if (hObj && (Index < 2)) { + BUTTON_Obj * pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + Color = pObj->Props.aTextColor[Index]; + WM_UNLOCK(); + } + return Color; +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_Get_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_IsPressed.c b/User/system/lib/lcd/gui/Widget/BUTTON_IsPressed.c new file mode 100644 index 0000000..0542bf6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_IsPressed.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_IsPressed.c +Purpose : Button widget, various (optional) Get routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "BUTTON.h" +#include "BUTTON_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_IsPressed +*/ +unsigned BUTTON_IsPressed(BUTTON_Handle hObj) { + unsigned r = 0; + if (hObj) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + r = (pObj->Widget.State & BUTTON_STATE_PRESSED) ? 1 : 0; + WM_UNLOCK(); + } + return r; +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_IsPressed_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_Private.h b/User/system/lib/lcd/gui/Widget/BUTTON_Private.h new file mode 100644 index 0000000..3611011 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_Private.h @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_Private.h +Purpose : BUTTON private header file +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef BUTTON_PRIVATE_H +#define BUTTON_PRIVATE_H + +#include "WM.h" +#include "BUTTON.h" + +#if GUI_WINSUPPORT + +#define BUTTON_ID 0x42555454 + +#define BUTTON_H2P(h) (BUTTON_Obj*) GUI_ALLOC_h2p(h) + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + #define BUTTON_ASSERT_IS_VALID_PTR(p) GUI_DEBUG_ERROROUT_IF(p->DebugId != BUTTON_ID, "BUTTON.C: Wrong handle type or object not init'ed") + #define BUTTON_INIT_ID(p) p->DebugId = BUTTON_ID + #define BUTTON_DEINIT_ID(p) p->DebugId = BUTTON_ID+1 +#else + #define BUTTON_ASSERT_IS_VALID_PTR(p) + #define BUTTON_INIT_ID(p) + #define BUTTON_DEINIT_ID(p) +#endif + +typedef struct { + GUI_COLOR aBkColor[3]; + GUI_COLOR aTextColor[3]; + const GUI_FONT GUI_UNI_PTR * pFont; + I16 Align; +} BUTTON_PROPS; + +typedef struct { + WIDGET Widget; + BUTTON_PROPS Props; + WM_HMEM hpText; + WM_HMEM ahDrawObj[3]; + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + int DebugId; + #endif +} BUTTON_Obj; + +extern BUTTON_PROPS BUTTON__DefaultProps; + +void BUTTON__SetDrawObj(BUTTON_Handle hObj, int Index, GUI_DRAW_HANDLE hDrawObj); + + +#endif /* GUI_WINSUPPORT */ +#endif /* BUTTON_H */ diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_SelfDraw.c b/User/system/lib/lcd/gui/Widget/BUTTON_SelfDraw.c new file mode 100644 index 0000000..b508253 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_SelfDraw.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_SelfDraw.c +Purpose : Button self draw support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON.h" +#include "BUTTON_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetSelfDrawEx +*/ +void BUTTON_SetSelfDrawEx(BUTTON_Handle hObj,unsigned int Index, GUI_DRAW_SELF_CB* pDraw, int x, int y) { + BUTTON__SetDrawObj(hObj, Index, GUI_DRAW_SELF_Create(pDraw, x, y)); +} + +/********************************************************************* +* +* BUTTON_SetSelfDraw +*/ +void BUTTON_SetSelfDraw(BUTTON_Handle hObj,unsigned int Index, GUI_DRAW_SELF_CB* pDraw) { + BUTTON_SetSelfDrawEx(hObj, Index, pDraw, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_SelfDraw_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_SetTextAlign.c b/User/system/lib/lcd/gui/Widget/BUTTON_SetTextAlign.c new file mode 100644 index 0000000..62f1d40 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_SetTextAlign.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_SetTextAlign.c +Purpose : Implementation of BUTTON_SetTextAlign +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetTextAlign +*/ +void BUTTON_SetTextAlign(BUTTON_Handle hObj, int Align) { + if (hObj) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + BUTTON_ASSERT_IS_VALID_PTR(pObj); + pObj->Props.Align = Align; + BUTTON_Invalidate(hObj); + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void BUTTON_SetTextAlign_C(void); + void BUTTON_SetTextAlign_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON_StreamedBitmap.c b/User/system/lib/lcd/gui/Widget/BUTTON_StreamedBitmap.c new file mode 100644 index 0000000..5f0097c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON_StreamedBitmap.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON_StreamedBitmap.c +Purpose : Button streamed bitmap support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON.h" +#include "BUTTON_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetStreamedBitmapEx +*/ +void BUTTON_SetStreamedBitmapEx(BUTTON_Handle hObj,unsigned int Index, const GUI_BITMAP_STREAM * pBitmap, int x, int y) { + BUTTON__SetDrawObj(hObj, Index, GUI_DRAW_STREAMED_Create(pBitmap, x, y)); +} + +/********************************************************************* +* +* BUTTON_SetStreamedBitmap +*/ +void BUTTON_SetStreamedBitmap(BUTTON_Handle hObj,unsigned int Index, const GUI_BITMAP_STREAM * pBitmap) { + BUTTON_SetStreamedBitmapEx(hObj, Index, pBitmap, 0, 0); +} + + +#else /* Avoid problems with empty object modules */ + void BUTTON_StreamedBitmap_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/BUTTON__SetBitmapObj.c b/User/system/lib/lcd/gui/Widget/BUTTON__SetBitmapObj.c new file mode 100644 index 0000000..38736fb --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/BUTTON__SetBitmapObj.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : BUTTON__SetBitmapObj.c +Purpose : Button bitmap support, private function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "BUTTON.h" +#include "BUTTON_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* BUTTON_SetDrawObj +*/ +void BUTTON__SetDrawObj(BUTTON_Handle hObj, int Index, GUI_DRAW_HANDLE hDrawObj) { + if (hObj) { + BUTTON_Obj* pObj; + WM_LOCK(); + pObj = BUTTON_H2P(hObj); + BUTTON_ASSERT_IS_VALID_PTR(pObj); + if ((unsigned int)Index <= GUI_COUNTOF(pObj->ahDrawObj)) { + GUI_ALLOC_FreePtr(&pObj->ahDrawObj[Index]); + pObj->ahDrawObj[Index] = hDrawObj; + BUTTON_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void BUTTON__SetBitmapObj_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CCGUIWidget.bat b/User/system/lib/lcd/gui/Widget/CCGUIWidget.bat new file mode 100644 index 0000000..8ce4795 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CCGUIWidget.bat @@ -0,0 +1,210 @@ +@ECHO OFF + +ECHO CCGUIWidget.BAT: Compiling GUI\Widget + +CALL CC BUTTON +CALL CC BUTTON__SetBitmapObj +CALL CC BUTTON_Bitmap +CALL CC BUTTON_BMP +CALL CC BUTTON_Create +CALL CC BUTTON_CreateIndirect +CALL CC BUTTON_Default +CALL CC BUTTON_Get +CALL CC BUTTON_IsPressed +CALL CC BUTTON_SelfDraw +CALL CC BUTTON_SetTextAlign +CALL CC BUTTON_StreamedBitmap +CALL CC CHECKBOX +CALL CC CHECKBOX_Create +CALL CC CHECKBOX_CreateIndirect +CALL CC CHECKBOX_GetState +CALL CC CHECKBOX_Image +CALL CC CHECKBOX_IsChecked +CALL CC CHECKBOX_SetBkColor +CALL CC CHECKBOX_SetDefaultImage +CALL CC CHECKBOX_SetFont +CALL CC CHECKBOX_SetImage +CALL CC CHECKBOX_SetNumStates +CALL CC CHECKBOX_SetSpacing +CALL CC CHECKBOX_SetState +CALL CC CHECKBOX_SetText +CALL CC CHECKBOX_SetTextAlign +CALL CC CHECKBOX_SetTextColor +CALL CC DIALOG +CALL CC DROPDOWN +CALL CC DROPDOWN_Create +CALL CC DROPDOWN_CreateIndirect +CALL CC DROPDOWN_DeleteItem +CALL CC DROPDOWN_InsertString +CALL CC DROPDOWN_ItemSpacing +CALL CC DROPDOWN_SetAutoScroll +CALL CC DROPDOWN_SetTextAlign +CALL CC DROPDOWN_SetTextHeight +CALL CC EDIT +CALL CC EDIT_Create +CALL CC EDIT_CreateIndirect +CALL CC EDIT_Default +CALL CC EDIT_GetNumChars +CALL CC EDIT_SetCursorAtChar +CALL CC EDIT_SetInsertMode +CALL CC EDIT_SetpfAddKeyEx +CALL CC EDIT_SetpfUpdateBuffer +CALL CC EDIT_SetSel +CALL CC EDITBin +CALL CC EDITDec +CALL CC EDITFloat +CALL CC EDITHex +CALL CC FRAMEWIN +CALL CC FRAMEWIN__UpdateButtons +CALL CC FRAMEWIN_AddMenu +CALL CC FRAMEWIN_Button +CALL CC FRAMEWIN_ButtonClose +CALL CC FRAMEWIN_ButtonMax +CALL CC FRAMEWIN_ButtonMin +CALL CC FRAMEWIN_Create +CALL CC FRAMEWIN_CreateIndirect +CALL CC FRAMEWIN_Default +CALL CC FRAMEWIN_Get +CALL CC FRAMEWIN_IsMinMax +CALL CC FRAMEWIN_MinMaxRest +CALL CC FRAMEWIN_SetBorderSize +CALL CC FRAMEWIN_SetColors +CALL CC FRAMEWIN_SetFont +CALL CC FRAMEWIN_SetResizeable +CALL CC FRAMEWIN_SetTitleHeight +CALL CC FRAMEWIN_SetTitleVis +CALL CC GUI_ARRAY +CALL CC GUI_ARRAY_DeleteItem +CALL CC GUI_ARRAY_InsertItem +CALL CC GUI_ARRAY_ResizeItem +CALL CC GUI_DRAW +CALL CC GUI_DRAW_BITMAP +CALL CC GUI_DRAW_BMP +CALL CC GUI_DRAW_Self +CALL CC GUI_DRAW_STREAMED +CALL CC GUI_EditBin +CALL CC GUI_EditDec +CALL CC GUI_EditFloat +CALL CC GUI_EditHex +CALL CC GUI_EditString +CALL CC GUI_HOOK +CALL CC HEADER +CALL CC HEADER__SetDrawObj +CALL CC HEADER_Bitmap +CALL CC HEADER_BMP +CALL CC HEADER_Create +CALL CC HEADER_CreateIndirect +CALL CC HEADER_StreamedBitmap +CALL CC LISTBOX +CALL CC LISTBOX_Create +CALL CC LISTBOX_CreateIndirect +CALL CC LISTBOX_Default +CALL CC LISTBOX_DeleteItem +CALL CC LISTBOX_Font +CALL CC LISTBOX_GetItemText +CALL CC LISTBOX_GetNumItems +CALL CC LISTBOX_InsertString +CALL CC LISTBOX_ItemDisabled +CALL CC LISTBOX_ItemSpacing +CALL CC LISTBOX_MultiSel +CALL CC LISTBOX_ScrollStep +CALL CC LISTBOX_SetAutoScroll +CALL CC LISTBOX_SetBkColor +CALL CC LISTBOX_SetOwner +CALL CC LISTBOX_SetOwnerDraw +CALL CC LISTBOX_SetScrollbarWidth +CALL CC LISTBOX_SetString +CALL CC LISTBOX_SetTextColor +CALL CC LISTVIEW +CALL CC LISTVIEW_Create +CALL CC LISTVIEW_CreateIndirect +CALL CC LISTVIEW_Default +CALL CC LISTVIEW_DeleteColumn +CALL CC LISTVIEW_DeleteRow +CALL CC LISTVIEW_GetBkColor +CALL CC LISTVIEW_GetFont +CALL CC LISTVIEW_GetHeader +CALL CC LISTVIEW_GetNumColumns +CALL CC LISTVIEW_GetNumRows +CALL CC LISTVIEW_GetSel +CALL CC LISTVIEW_GetTextColor +CALL CC LISTVIEW_SetBkColor +CALL CC LISTVIEW_SetColumnWidth +CALL CC LISTVIEW_SetFont +CALL CC LISTVIEW_SetGridVis +CALL CC LISTVIEW_SetItemColor +CALL CC LISTVIEW_SetItemText +CALL CC LISTVIEW_SetLBorder +CALL CC LISTVIEW_SetRBorder +CALL CC LISTVIEW_SetRowHeight +CALL CC LISTVIEW_SetSel +CALL CC LISTVIEW_SetTextAlign +CALL CC LISTVIEW_SetTextColor +CALL CC MENU +CALL CC MENU__FindItem +CALL CC MENU_Attach +CALL CC MENU_CreateIndirect +CALL CC MENU_Default +CALL CC MENU_DeleteItem +CALL CC MENU_DisableItem +CALL CC MENU_EnableItem +CALL CC MENU_GetItem +CALL CC MENU_GetItemText +CALL CC MENU_GetNumItems +CALL CC MENU_InsertItem +CALL CC MENU_Popup +CALL CC MENU_SetBkColor +CALL CC MENU_SetBorderSize +CALL CC MENU_SetFont +CALL CC MENU_SetItem +CALL CC MENU_SetTextColor +CALL CC MESSAGEBOX +CALL CC MULTIEDIT +CALL CC MULTIEDIT_Create +CALL CC MULTIEDIT_CreateIndirect +CALL CC MULTIPAGE +CALL CC MULTIPAGE_Create +CALL CC MULTIPAGE_CreateIndirect +CALL CC MULTIPAGE_Default +CALL CC PROGBAR +CALL CC PROGBAR_Create +CALL CC PROGBAR_CreateIndirect +CALL CC RADIO +CALL CC RADIO_Create +CALL CC RADIO_CreateIndirect +CALL CC RADIO_Default +CALL CC RADIO_Image +CALL CC RADIO_SetBkColor +CALL CC RADIO_SetDefaultImage +CALL CC RADIO_SetFont +CALL CC RADIO_SetGroupId +CALL CC RADIO_SetText +CALL CC RADIO_SetTextColor +CALL CC SCROLLBAR +CALL CC SCROLLBAR_Create +CALL CC SCROLLBAR_CreateIndirect +CALL CC SCROLLBAR_Defaults +CALL CC SCROLLBAR_GetValue +CALL CC SCROLLBAR_SetWidth +CALL CC SLIDER +CALL CC SLIDER_Create +CALL CC SLIDER_CreateIndirect +CALL CC TEXT +CALL CC TEXT_Create +CALL CC TEXT_CreateIndirect +CALL CC TEXT_SetBkColor +CALL CC TEXT_SetFont +CALL CC TEXT_SetText +CALL CC TEXT_SetTextAlign +CALL CC TEXT_SetTextColor +CALL CC WIDGET +CALL CC WIDGET_Effect_3D +CALL CC WIDGET_Effect_3D1L +CALL CC WIDGET_Effect_3D2L +CALL CC WIDGET_Effect_None +CALL CC WIDGET_Effect_Simple +CALL CC WIDGET_FillStringInRect +CALL CC WIDGET_SetEffect +CALL CC WIDGET_SetWidth +CALL CC WINDOW +CALL CC WINDOW_Default diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX.c b/User/system/lib/lcd/gui/Widget/CHECKBOX.c new file mode 100644 index 0000000..629a932 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX.c @@ -0,0 +1,324 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX.c +Purpose : Implementation of checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "CHECKBOX_Private.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef CHECKBOX_FONT_DEFAULT + #define CHECKBOX_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define default images */ +#ifndef CHECKBOX_IMAGE0_DEFAULT + #define CHECKBOX_IMAGE0_DEFAULT &CHECKBOX__abmCheck[0] +#endif + +#ifndef CHECKBOX_IMAGE1_DEFAULT + #define CHECKBOX_IMAGE1_DEFAULT &CHECKBOX__abmCheck[1] +#endif + +/* Define widget background color */ +#ifndef CHECKBOX_BKCOLOR_DEFAULT + #define CHECKBOX_BKCOLOR_DEFAULT 0xC0C0C0 /* Text background color */ +#endif + +#ifndef CHECKBOX_SPACING_DEFAULT + #define CHECKBOX_SPACING_DEFAULT 4 +#endif + +#ifndef CHECKBOX_TEXTCOLOR_DEFAULT + #define CHECKBOX_TEXTCOLOR_DEFAULT GUI_BLACK +#endif + +#ifndef CHECKBOX_TEXTALIGN_DEFAULT + #define CHECKBOX_TEXTALIGN_DEFAULT (GUI_TA_LEFT | GUI_TA_VCENTER) +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +CHECKBOX_PROPS CHECKBOX__DefaultProps = { + CHECKBOX_FONT_DEFAULT, + CHECKBOX_BKCOLOR0_DEFAULT, + CHECKBOX_BKCOLOR1_DEFAULT, + CHECKBOX_BKCOLOR_DEFAULT, + CHECKBOX_TEXTCOLOR_DEFAULT, + CHECKBOX_TEXTALIGN_DEFAULT, + CHECKBOX_SPACING_DEFAULT, + CHECKBOX_IMAGE0_DEFAULT, + CHECKBOX_IMAGE1_DEFAULT +}; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define CHECKBOX_ID 0x4544 /* Magic numer, should be unique if possible */ + +#if GUI_DEBUG_LEVEL > 1 + #define CHECKBOX_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != CHECKBOX_ID, "xxx.c: Wrong handle type or Object not init'ed") + #define CHECKBOX_INIT_ID(p) p->DebugId = CHECKBOX_ID + #define CHECKBOX_DEINIT_ID(p) p->DebugId = CHECKBOX_ID+1 +#else + #define CHECKBOX_ASSERT_IS_VALID_PTR(p) + #define CHECKBOX_INIT_ID(p) + #define CHECKBOX_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _Paint +*/ +static void _Paint(CHECKBOX_Obj* pObj, CHECKBOX_Handle hObj) { + GUI_RECT RectBox = {0}; + int ColorIndex, EffectSize; + EffectSize = pObj->Widget.pEffect->EffectSize; + ColorIndex = WM__IsEnabled(hObj); + /* Clear inside ... Just in case */ + /* Fill with parents background color */ +#if WM_SUPPORT_TRANSPARENCY + if (!WM_GetHasTrans(hObj)) +#endif + { + if (pObj->Props.BkColor == GUI_INVALID_COLOR) { + LCD_SetBkColor(WIDGET__GetBkColor(hObj)); + } else { + LCD_SetBkColor(pObj->Props.BkColor); + } + GUI_Clear(); + } + /* Get size from bitmap */ + RectBox.x1 = pObj->Props.apBm[0]->XSize - 1 + 2 * EffectSize; + RectBox.y1 = pObj->Props.apBm[0]->YSize - 1 + 2 * EffectSize; + WM_SetUserClipRect(&RectBox); + /* Clear inside ... Just in case */ + LCD_SetBkColor(pObj->Props.aBkColorBox[ColorIndex]); + GUI_Clear(); + if (pObj->CurrentState) { + int Index = (pObj->CurrentState - 1) * 2 + ColorIndex; + GUI_DrawBitmap(pObj->Props.apBm[Index], EffectSize, EffectSize); + } + /* Draw the effect arround the box */ + WIDGET__EFFECT_DrawDownRect(&pObj->Widget, &RectBox); + WM_SetUserClipRect(NULL); + /* Draw text if needed */ + if (pObj->hpText) { + const char * s; + GUI_RECT RectText; + /* Draw the text */ + s = (const char *) GUI_ALLOC_h2p(pObj->hpText); + WM_GetClientRect(&RectText); + RectText.x0 += RectBox.x1 + 1 + pObj->Props.Spacing; + GUI_SetTextMode(GUI_TM_TRANS); + LCD_SetColor(pObj->Props.TextColor); + GUI_SetFont(pObj->Props.pFont); + GUI_DispStringInRect(s, &RectText, pObj->Props.Align); + /* Draw focus rectangle */ + if (pObj->Widget.State & WIDGET_STATE_FOCUS) { + int xSizeText = GUI_GetStringDistX(s); + int ySizeText = GUI_GetFontSizeY(); + GUI_RECT RectFocus = RectText; + switch (pObj->Props.Align & ~(GUI_TA_HORIZONTAL)) { + case GUI_TA_VCENTER: + RectFocus.y0 = (RectText.y1 - ySizeText) / 2; + break; + case GUI_TA_BOTTOM: + RectFocus.y0 = RectText.y1 - ySizeText; + break; + } + switch (pObj->Props.Align & ~(GUI_TA_VERTICAL)) { + case GUI_TA_HCENTER: + RectFocus.x0 += ((RectText.x1 - RectText.x0) - xSizeText) / 2; + break; + case GUI_TA_RIGHT: + RectFocus.x0 += (RectText.x1 - RectText.x0) - xSizeText; + break; + } + RectFocus.x1 = RectFocus.x0 + xSizeText; + RectFocus.y1 = RectFocus.y0 + ySizeText; + LCD_SetColor(GUI_BLACK); + WIDGET__DrawFocusRect(&pObj->Widget, &RectFocus, 0); + } + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(CHECKBOX_Handle hObj, CHECKBOX_Obj* pObj, WM_MESSAGE*pMsg) { + int Notification = 0; + int Hit = 0; + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (!WM_HasCaptured(hObj)) { + if (pState->Pressed) { + WM_SetCapture(hObj, 1); + pObj->CurrentState = (pObj->CurrentState + 1) % pObj->NumStates; + WM_Invalidate(hObj); + Notification = WM_NOTIFICATION_CLICKED; + } else { + Hit =1; + Notification = WM_NOTIFICATION_RELEASED; + } + } + } else { + Notification = WM_NOTIFICATION_MOVED_OUT; + } + WM_NotifyParent(hObj, Notification); + if (Hit == 1) { + GUI_DEBUG_LOG("CHECKBOX: Hit\n"); + GUI_StoreKey(pObj->Widget.Id); + } +} + +/********************************************************************* +* +* _OnKey +*/ +static void _OnKey(CHECKBOX_Handle hObj, CHECKBOX_Obj * pObj, WM_MESSAGE * pMsg) { + WM_KEY_INFO * pKeyInfo; + if (WM__IsEnabled(hObj)) { + pKeyInfo = (WM_KEY_INFO *)(pMsg->Data.p); + if (pKeyInfo->PressedCnt > 0) { + switch (pKeyInfo->Key) { + case GUI_KEY_SPACE: + pObj->CurrentState = (pObj->CurrentState + 1) % pObj->NumStates; + WM_Invalidate(hObj); + break; /* Send to parent by not doing anything */ + } + } + } +} + +/********************************************************************* +* +* _CHECKBOX_Callback +*/ +static void _CHECKBOX_Callback (WM_MESSAGE *pMsg) { + CHECKBOX_Handle hObj; + CHECKBOX_Obj* pObj; + hObj = pMsg->hWin; + pObj = CHECKBOX_H2P(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_KEY: + _OnKey(hObj, pObj, pMsg); + break; + case WM_PAINT: + GUI_DEBUG_LOG("CHECKBOX: _Callback(WM_PAINT)\n"); + _Paint(pObj, hObj); + return; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* CHECKBOX_CreateEx +*/ +CHECKBOX_Handle CHECKBOX_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + CHECKBOX_Handle hObj; + GUI_USE_PARA(ExFlags); + WM_LOCK(); + /* Calculate size if needed */ + if ((xsize == 0) || (ysize == 0)) { + int EffectSize; + EffectSize = WIDGET_GetDefaultEffect()->EffectSize; + if (xsize == 0) { + xsize = CHECKBOX__DefaultProps.apBm[0]->XSize + 2 * EffectSize; + } + if (ysize == 0) { + ysize = CHECKBOX__DefaultProps.apBm[0]->YSize + 2 * EffectSize; + } + } +#if WM_SUPPORT_TRANSPARENCY + if (CHECKBOX__DefaultProps.BkColor == GUI_INVALID_COLOR) { + WinFlags |= WM_CF_HASTRANS; + } +#endif + /* Create the window */ + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _CHECKBOX_Callback, + sizeof(CHECKBOX_Obj) - sizeof(WM_Obj)); + if (hObj) { + CHECKBOX_Obj* pObj = CHECKBOX_H2P(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + CHECKBOX_INIT_ID(pObj); + /* init member variables */ + pObj->Props = CHECKBOX__DefaultProps; + pObj->NumStates = 2; /* Default behaviour is 2 states: checked and unchecked */ + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "CHECKBOX_Create failed") + } + WM_UNLOCK(); + return hObj; +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_C(void); + void CHECKBOX_C(void) {} +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX.h b/User/system/lib/lcd/gui/Widget/CHECKBOX.h new file mode 100644 index 0000000..6f455f8 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX.h @@ -0,0 +1,124 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX.h +Purpose : CHECKBOX include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef CHECKBOX_H +#define CHECKBOX_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +/********************************************************************* +* +* Bitmap indices +*/ +#define CHECKBOX_BI_INACTIV 0 +#define CHECKBOX_BI_ACTIV 1 +#define CHECKBOX_BI_INACTIV_3STATE 2 +#define CHECKBOX_BI_ACTIV_3STATE 3 + +/********************************************************************* +* +* Public Types +* +********************************************************************** + +*/ +typedef WM_HMEM CHECKBOX_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +CHECKBOX_Handle CHECKBOX_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags); +CHECKBOX_Handle CHECKBOX_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +CHECKBOX_Handle CHECKBOX_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +int CHECKBOX_GetDefaultAlign (void); +GUI_COLOR CHECKBOX_GetDefaultBkColor (void); +const GUI_FONT GUI_UNI_PTR * CHECKBOX_GetDefaultFont (void); +int CHECKBOX_GetDefaultSpacing (void); +int CHECKBOX_GetDefaultTextAlign(void); +GUI_COLOR CHECKBOX_GetDefaultTextColor(void); +void CHECKBOX_SetDefaultAlign (int Align); +void CHECKBOX_SetDefaultBkColor (GUI_COLOR Color); +void CHECKBOX_SetDefaultFont (const GUI_FONT GUI_UNI_PTR * pFont); +void CHECKBOX_SetDefaultImage (const GUI_BITMAP * pBitmap, unsigned int Index); +void CHECKBOX_SetDefaultSpacing (int Spacing); +void CHECKBOX_SetDefaultTextAlign(int Align); +void CHECKBOX_SetDefaultTextColor(GUI_COLOR Color); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +int CHECKBOX_GetState (CHECKBOX_Handle hObj); +int CHECKBOX_IsChecked (CHECKBOX_Handle hObj); +void CHECKBOX_SetBkColor (CHECKBOX_Handle hObj, GUI_COLOR Color); +void CHECKBOX_SetFont (CHECKBOX_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont); +void CHECKBOX_SetImage (CHECKBOX_Handle hObj, const GUI_BITMAP * pBitmap, unsigned int Index); +void CHECKBOX_SetNumStates(CHECKBOX_Handle hObj, unsigned NumStates); +void CHECKBOX_SetSpacing (CHECKBOX_Handle hObj, unsigned Spacing); +void CHECKBOX_SetState (CHECKBOX_Handle hObj, unsigned State); +void CHECKBOX_SetText (CHECKBOX_Handle hObj, const char * pText); +void CHECKBOX_SetTextAlign(CHECKBOX_Handle hObj, int Align); +void CHECKBOX_SetTextColor(CHECKBOX_Handle hObj, GUI_COLOR Color); + +/********************************************************************* +* +* Macros for compatibility +* +********************************************************************** +*/ + +#define CHECKBOX_Check(hObj) CHECKBOX_SetState(hObj, 1) +#define CHECKBOX_Uncheck(hObj) CHECKBOX_SetState(hObj, 0) + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* CHECKBOX_H */ diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_Create.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_Create.c new file mode 100644 index 0000000..d573d79 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_Create.c @@ -0,0 +1,43 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_Create.c +Purpose : Implementation of checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_Create +*/ +CHECKBOX_Handle CHECKBOX_Create(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags) { + return CHECKBOX_CreateEx(x0, y0, xsize, ysize, hParent, Flags, 0, Id); +} + +#else + void CHECKBOX_Create_C(void) {} +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_CreateIndirect.c new file mode 100644 index 0000000..4efdff8 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_CreateIndirect.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_CreateIndirect.c +Purpose : Implementation of checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_CreateIndirect +*/ +CHECKBOX_Handle CHECKBOX_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + CHECKBOX_Handle hThis; + GUI_USE_PARA(cb); + hThis = CHECKBOX_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else + void CHECKBOX_CreateIndirect_C(void) {} +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_Default.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_Default.c new file mode 100644 index 0000000..548b6ac --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_Default.c @@ -0,0 +1,114 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_Default.c +Purpose : Implementation of checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetDefaultSpacing +*/ +void CHECKBOX_SetDefaultSpacing(int Spacing) { + CHECKBOX__DefaultProps.Spacing = Spacing; +} + +/********************************************************************* +* +* CHECKBOX_SetDefaultTextColor +*/ +void CHECKBOX_SetDefaultTextColor(GUI_COLOR Color) { + CHECKBOX__DefaultProps.TextColor = Color; +} + +/********************************************************************* +* +* CHECKBOX_SetDefaultBkColor +*/ +void CHECKBOX_SetDefaultBkColor(GUI_COLOR Color) { + CHECKBOX__DefaultProps.BkColor = Color; +} + +/********************************************************************* +* +* CHECKBOX_SetDefaultFont +*/ +void CHECKBOX_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + CHECKBOX__DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* CHECKBOX_SetDefaultAlign +*/ +void CHECKBOX_SetDefaultAlign(int Align) { + CHECKBOX__DefaultProps.Align = Align; +} + +/********************************************************************* +* +* CHECKBOX_GetDefaultSpacing +*/ +int CHECKBOX_GetDefaultSpacing(void) { + return CHECKBOX__DefaultProps.Spacing; +} + +/********************************************************************* +* +* CHECKBOX_GetDefaultTextColor +*/ +GUI_COLOR CHECKBOX_GetDefaultTextColor(void) { + return CHECKBOX__DefaultProps.TextColor; +} + +/********************************************************************* +* +* CHECKBOX_GetDefaultBkColor +*/ +GUI_COLOR CHECKBOX_GetDefaultBkColor(void) { + return CHECKBOX__DefaultProps.BkColor; +} + +/********************************************************************* +* +* CHECKBOX_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * CHECKBOX_GetDefaultFont(void) { + return CHECKBOX__DefaultProps.pFont; +} + +/********************************************************************* +* +* CHECKBOX_GetDefaultAlign +*/ +int CHECKBOX_GetDefaultAlign(void) { + return CHECKBOX__DefaultProps.Align; +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_Default_C(void); + void CHECKBOX_Default_C(void) {} +#endif + diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_GetState.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_GetState.c new file mode 100644 index 0000000..7f4ba03 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_GetState.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_GetState.c +Purpose : Implementation of CHECKBOX_GetState +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_GetState +*/ +int CHECKBOX_GetState(CHECKBOX_Handle hObj) { + int Result = 0; + CHECKBOX_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + Result = pObj->CurrentState; + WM_UNLOCK(); + } + return Result; +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_GetState_C(void); + void CHECKBOX_GetState_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_Image.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_Image.c new file mode 100644 index 0000000..be03c30 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_Image.c @@ -0,0 +1,78 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_Image.c +Purpose : Contains the default bitmap used by the checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX.h" +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static const data +* +********************************************************************** +*/ +/* Colors */ +static const GUI_COLOR _aColorDisabled[] = {CHECKBOX_FGCOLOR0_DEFAULT, CHECKBOX_BKCOLOR0_DEFAULT}; +static const GUI_COLOR _aColorEnabled[] = {CHECKBOX_FGCOLOR1_DEFAULT, CHECKBOX_BKCOLOR1_DEFAULT}; + +/* Palettes */ +static const GUI_LOGPALETTE _PalCheckDisabled = { + 2, /* number of entries */ + 0, /* No transparency */ + _aColorDisabled +}; + +static const GUI_LOGPALETTE _PalCheckEnabled = { + 2, /* number of entries */ + 0, /* No transparency */ + _aColorEnabled +}; + +/* Pixel data */ +static const unsigned char _acCheck[] = { + XXXXXXXX, XXX_____, + XXXXXXXX, XXX_____, + XXXXXXXX, _XX_____, + XXXXXXX_, _XX_____, + XX_XXX__, _XX_____, + XX__X___, XXX_____, + XX_____X, XXX_____, + XXX___XX, XXX_____, + XXXX_XXX, XXX_____, + XXXXXXXX, XXX_____, + XXXXXXXX, XXX_____ +}; + +/********************************************************************* +* +* Exported const data +* +********************************************************************** +*/ +/* Bitmaps */ +const GUI_BITMAP CHECKBOX__abmCheck[2] = { + { 11, 11, 2, 1, _acCheck, &_PalCheckDisabled}, + { 11, 11, 2, 1, _acCheck, &_PalCheckEnabled } +}; + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_Image_C(void); + void CHECKBOX_Image_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_IsChecked.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_IsChecked.c new file mode 100644 index 0000000..dadb065 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_IsChecked.c @@ -0,0 +1,41 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_IsChecked.c +Purpose : Implementation of CHECKBOX_IsChecked +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_IsChecked +*/ +int CHECKBOX_IsChecked(CHECKBOX_Handle hObj) { + return (CHECKBOX_GetState(hObj) == 1) ? 1 : 0; +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_IsChecked_C(void); + void CHECKBOX_IsChecked_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_Private.h b/User/system/lib/lcd/gui/Widget/CHECKBOX_Private.h new file mode 100644 index 0000000..77f96a9 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_Private.h @@ -0,0 +1,103 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_Private.h +Purpose : CHECKBOX private header file +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef CHECKBOX_PRIVATE_H +#define CHECKBOX_PRIVATE_H + +#include "WM.h" +#include "WIDGET.h" +#include "CHECKBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ +#ifndef CHECKBOX_BKCOLOR0_DEFAULT + #define CHECKBOX_BKCOLOR0_DEFAULT 0x808080 /* Inactive color */ +#endif + +#ifndef CHECKBOX_BKCOLOR1_DEFAULT + #define CHECKBOX_BKCOLOR1_DEFAULT GUI_WHITE /* Active color */ +#endif + +#ifndef CHECKBOX_FGCOLOR0_DEFAULT + #define CHECKBOX_FGCOLOR0_DEFAULT 0x101010 +#endif + +#ifndef CHECKBOX_FGCOLOR1_DEFAULT + #define CHECKBOX_FGCOLOR1_DEFAULT GUI_BLACK +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ +typedef struct { + const GUI_FONT GUI_UNI_PTR * pFont; + GUI_COLOR aBkColorBox[2]; /* Colors used to draw the box background */ + GUI_COLOR BkColor; /* Widget background color */ + GUI_COLOR TextColor; + I16 Align; + U8 Spacing; + const GUI_BITMAP * apBm[4]; +} CHECKBOX_PROPS; + +typedef struct { + WIDGET Widget; + CHECKBOX_PROPS Props; + U8 NumStates; + U8 CurrentState; + WM_HMEM hpText; + #if GUI_DEBUG_LEVEL > 1 + int DebugId; + #endif +} CHECKBOX_Obj; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ +#define CHECKBOX_H2P(h) (CHECKBOX_Obj*) GUI_ALLOC_h2p(h) + +/********************************************************************* +* +* Public data (internal defaults) +* +********************************************************************** +*/ +extern CHECKBOX_PROPS CHECKBOX__DefaultProps; + +/********************************************************************* +* +* Extern data +* +********************************************************************** +*/ +extern const GUI_BITMAP CHECKBOX__abmCheck[2]; + +#endif /* GUI_WINSUPPORT */ +#endif /* CHECKBOX_PRIVATE_H */ diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetBkColor.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetBkColor.c new file mode 100644 index 0000000..459aab7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetBkColor.c @@ -0,0 +1,57 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetBkColor.c +Purpose : Implementation of CHECKBOX_SetBkColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetBkColor +*/ +void CHECKBOX_SetBkColor(CHECKBOX_Handle hObj, GUI_COLOR Color) { + if (hObj) { + CHECKBOX_Obj* pObj; + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (Color != pObj->Props.BkColor) { + pObj->Props.BkColor = Color; + #if WM_SUPPORT_TRANSPARENCY + if (Color <= 0xFFFFFF) { + WM_SetTransState(hObj, 0); + } else { + WM_SetTransState(hObj, WM_CF_HASTRANS); + } + #endif + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetBkColor_C(void); + void CHECKBOX_SetBkColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetDefaultImage.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetDefaultImage.c new file mode 100644 index 0000000..875166e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetDefaultImage.c @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetDefaultImage.c +Purpose : Implementation of checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +void CHECKBOX_SetDefaultImage(const GUI_BITMAP * pBitmap, unsigned int Index) { + if (Index <= GUI_COUNTOF(CHECKBOX__DefaultProps.apBm)) { + CHECKBOX__DefaultProps.apBm[Index] = pBitmap; + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetDefaultImage_C(void); + void CHECKBOX_SetDefaultImage_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetFont.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetFont.c new file mode 100644 index 0000000..40477ec --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetFont.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetFont.c +Purpose : Implementation of CHECKBOX_SetFont +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetFont +*/ +void CHECKBOX_SetFont(CHECKBOX_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + CHECKBOX_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (pObj->Props.pFont != pFont) { + pObj->Props.pFont = pFont; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetFont_C(void); + void CHECKBOX_SetFont_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetImage.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetImage.c new file mode 100644 index 0000000..17bba5f --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetImage.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetImage.c +Purpose : Implementation of checkbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +void CHECKBOX_SetImage(CHECKBOX_Handle hObj, const GUI_BITMAP * pBitmap, unsigned int Index) { + if (hObj) { + CHECKBOX_Obj * pObj; + GUI_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (Index <= GUI_COUNTOF(pObj->Props.apBm)) { + pObj->Props.apBm[Index] = pBitmap; + } + GUI_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetImage_C(void); + void CHECKBOX_SetImage_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetNumStates.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetNumStates.c new file mode 100644 index 0000000..e1fc0fd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetNumStates.c @@ -0,0 +1,99 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetNumStates.c +Purpose : Routines and bitmaps used for third state of checkbox +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static const data +* +********************************************************************** +*/ +/* Colors */ +static const GUI_COLOR _aColorDisabled[] = {CHECKBOX_FGCOLOR0_DEFAULT, CHECKBOX_BKCOLOR0_DEFAULT}; +static const GUI_COLOR _aColorEnabled[] = {CHECKBOX_FGCOLOR1_DEFAULT, CHECKBOX_BKCOLOR1_DEFAULT}; + +/* Palettes */ +static const GUI_LOGPALETTE _PalCheckDisabled = { + 2, /* number of entries */ + 0, /* No transparency */ + _aColorDisabled +}; + +static const GUI_LOGPALETTE _PalCheckEnabled = { + 2, /* number of entries */ + 0, /* No transparency */ + _aColorEnabled +}; + +/* Pixel data */ +static const unsigned char _acCheck[] = { + XXXXXXXX, XXX_____, + XXXXXXXX, XXX_____, + XXXXXXXX, _XX_____, + XXXXXXX_, XXX_____, + XX_XXX_X, _XX_____, + XXX_X_X_, XXX_____, + XX_X_X_X, XXX_____, + XXX_X_XX, XXX_____, + XXXX_XXX, XXX_____, + XXXXXXXX, XXX_____, + XXXXXXXX, XXX_____ +}; + +/* Bitmaps */ +static const GUI_BITMAP _abmCheck[2] = { + { 11, 11, 2, 1, _acCheck, &_PalCheckDisabled}, + { 11, 11, 2, 1, _acCheck, &_PalCheckEnabled } +}; + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetNumStates +*/ +void CHECKBOX_SetNumStates(CHECKBOX_Handle hObj, unsigned NumStates) { + CHECKBOX_Obj * pObj; + if (!CHECKBOX__DefaultProps.apBm[2]) { + CHECKBOX_SetDefaultImage(&_abmCheck[0], 2); + } + if (!CHECKBOX__DefaultProps.apBm[3]) { + CHECKBOX_SetDefaultImage(&_abmCheck[1], 3); + } + if (hObj && ((NumStates == 2) || (NumStates == 3))) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + pObj->Props.apBm[2] = CHECKBOX__DefaultProps.apBm[2]; + pObj->Props.apBm[3] = CHECKBOX__DefaultProps.apBm[3]; + pObj->NumStates = NumStates; + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetNumStates_C(void); + void CHECKBOX_SetNumStates_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetSpacing.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetSpacing.c new file mode 100644 index 0000000..c2f457b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetSpacing.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetSpacing.c +Purpose : Implementation of CHECKBOX_SetSpacing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetSpacing +*/ +void CHECKBOX_SetSpacing(CHECKBOX_Handle hObj, unsigned Spacing) { + CHECKBOX_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if ((unsigned)pObj->Props.Spacing != Spacing) { + pObj->Props.Spacing = Spacing; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetSpacing_C(void); + void CHECKBOX_SetSpacing_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetState.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetState.c new file mode 100644 index 0000000..58c6c3c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetState.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetState.c +Purpose : Implementation of CHECKBOX_SetState +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetState +*/ +void CHECKBOX_SetState(CHECKBOX_Handle hObj, unsigned State) { + CHECKBOX_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (State <= (unsigned)pObj->NumStates) { + pObj->CurrentState = State; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetState_C(void); + void CHECKBOX_SetState_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetText.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetText.c new file mode 100644 index 0000000..5f9e774 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetText.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetText.c +Purpose : Implementation of CHECKBOX_SetText +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetText +*/ +void CHECKBOX_SetText(CHECKBOX_Handle hObj, const char * s) { + CHECKBOX_Obj * pObj; + if (hObj && s) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (GUI__SetText(&pObj->hpText, s)) { + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetText_C(void); + void CHECKBOX_SetText_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextAlign.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextAlign.c new file mode 100644 index 0000000..2ccb801 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextAlign.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetTextAlign.c +Purpose : Implementation of CHECKBOX_SetAlign +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetTextAlign +*/ +void CHECKBOX_SetTextAlign(CHECKBOX_Handle hObj, int Align) { + CHECKBOX_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (pObj->Props.Align != Align) { + pObj->Props.Align = Align; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetTextAlign_C(void); + void CHECKBOX_SetTextAlign_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextColor.c b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextColor.c new file mode 100644 index 0000000..7cf3b5d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/CHECKBOX_SetTextColor.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : CHECKBOX_SetTextColor.c +Purpose : Implementation of CHECKBOX_SetTextColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "CHECKBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* CHECKBOX_SetTextColor +*/ +void CHECKBOX_SetTextColor(CHECKBOX_Handle hObj, GUI_COLOR Color) { + if (hObj) { + CHECKBOX_Obj * pObj; + WM_LOCK(); + pObj = CHECKBOX_H2P(hObj); + if (pObj->Props.TextColor != Color) { + pObj->Props.TextColor = Color; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void CHECKBOX_SetTextColor_C(void); + void CHECKBOX_SetTextColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DIALOG.c b/User/system/lib/lcd/gui/Widget/DIALOG.c new file mode 100644 index 0000000..c07de0c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DIALOG.c @@ -0,0 +1,175 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : +Purpose : Dialog box include +---------------------------------------------------------------------- +Open items: +None +--------------------END-OF-HEADER------------------------------------- +*/ + +#include /* needed for definition of NULL */ +#include "DIALOG.h" +#include "WIDGET.h" +#include "WM_Intern.h" + + + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define colors */ +#ifndef DIALOG_BKCOLOR0_DEFAULT + #define DIALOG_BKCOLOR0_DEFAULT 0xc0c0c0 +#endif + +/********************************************************************* +* +* static data; +* +********************************************************************** +*/ + +static LCD_COLOR _BkColor = DIALOG_BKCOLOR0_DEFAULT; + +/********************************************************************* +* +* Public code: API functions +* +********************************************************************** +*/ +/********************************************************************* +* +* DIALOG_GetBkColor +*/ +LCD_COLOR DIALOG_GetBkColor(void) { + return _BkColor; +} + +/********************************************************************* +* +* DIALOG_SetBkColor +*/ +LCD_COLOR DIALOG_SetBkColor(LCD_COLOR BkColor) { + LCD_COLOR r; + r = _BkColor; + _BkColor = BkColor; + return r; +} +/********************************************************************* +* +* GUI_SetDialogStatusPtr +*/ +void GUI_SetDialogStatusPtr(WM_HWIN hDialog, WM_DIALOG_STATUS* pDialogStatus) { + WM_MESSAGE Msg = {0}; + Msg.MsgId = WM_HANDLE_DIALOG_STATUS; + Msg.Data.p = pDialogStatus; + WM_SendMessage(hDialog, &Msg); +} + +/********************************************************************* +* +* GUI_GetDialogStatusPtr +*/ +WM_DIALOG_STATUS* GUI_GetDialogStatusPtr(WM_HWIN hDialog) { + WM_MESSAGE Msg = {0}; + Msg.MsgId = WM_HANDLE_DIALOG_STATUS; + WM_SendMessage(hDialog, &Msg); + return (WM_DIALOG_STATUS*)Msg.Data.p; +} +/********************************************************************* +* +* GUI_CreateDialogbox +*/ +WM_HWIN GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent, + int x0, int y0) +{ + WM_HWIN hDialog = paWidget->pfCreateIndirect(paWidget, hParent, x0, y0, cb); /* Create parent window */ + WM_HWIN hDialogClient = WM_GetClientWindow(hDialog); + WIDGET_OrState(hDialog, paWidget->Flags); + WM_ShowWindow(hDialog); + WM_ShowWindow(hDialogClient); + while (--NumWidgets > 0) { + WM_HWIN hChild; + paWidget++; + hChild = paWidget->pfCreateIndirect(paWidget, hDialogClient, 0, 0, 0); /* Create child window */ + WM_ShowWindow(hChild); + } + WM_SetFocusOnNextChild(hDialog); /* Set the focus to the first child */ + WM_SendMessageNoPara(hDialogClient, WM_INIT_DIALOG); + return hDialog; +} + +/********************************************************************* +* +* GUI_EndDialog +*/ +void GUI_EndDialog(WM_HWIN hDialog, int r) { + WM_DIALOG_STATUS* pStatus; + pStatus = GUI_GetDialogStatusPtr(hDialog); + if (pStatus) { + pStatus->ReturnValue = r; + pStatus->Done = 1; + } + WM_DeleteWindow(hDialog); +} + + +/********************************************************************* +* +* GUI_ExecCreatedDialog +*/ +int GUI_ExecCreatedDialog (WM_HWIN hDialog) { + WM_DIALOG_STATUS DialogStatus = {0}; + /* Let window know how to send feedback (close info & return value) */ + GUI_SetDialogStatusPtr(hDialog, &DialogStatus); + while (!DialogStatus.Done) { + if (!GUI_Exec()) { + GUI_X_WAIT_EVENT(); /* Wait for event (keyboard, mouse or whatever) */ + } + } + return DialogStatus.ReturnValue; +} + +/********************************************************************* +* +* GUI_ExecDialogbox +* +* Purpose: +* Create and execute a dialog +* The name is somewhat confusing, it should really be something like +* GUI_CreateExecDialog. However, we keep it like that for compatibility +* +*/ +int GUI_ExecDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, + int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent, int x0, int y0) +{ + WM_HWIN hDialog; + hDialog = GUI_CreateDialogBox(paWidget, NumWidgets, cb, hParent, x0, y0); + return GUI_ExecCreatedDialog(hDialog); +} + + +#else + void Dialog_c(void); /* Avoid problems with empty object modules */ + void Dialog_c(void){} +#endif /* GUI_WINSUPPORT */ + diff --git a/User/system/lib/lcd/gui/Widget/DIALOG.h b/User/system/lib/lcd/gui/Widget/DIALOG.h new file mode 100644 index 0000000..f1ad6a8 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DIALOG.h @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : Dialog.h +Purpose : Dialog box include +---------------------------------------------------------------------- +Open items: +None +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef DIALOG_H +#define DIALOG_H + +#include "WM.h" +#include "BUTTON.h" +#include "CHECKBOX.h" +#include "DROPDOWN.h" +#include "EDIT.h" +#include "FRAMEWIN.h" +#include "LISTBOX.h" +#include "MULTIEDIT.h" +#include "RADIO.h" +#include "SLIDER.h" +#include "TEXT.h" + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +WM_HWIN WINDOW_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +void WINDOW_SetDefaultBkColor(GUI_COLOR Color); + +#if defined(__cplusplus) + } +#endif + +#endif + +#endif + diff --git a/User/system/lib/lcd/gui/Widget/DIALOG_Intern.h b/User/system/lib/lcd/gui/Widget/DIALOG_Intern.h new file mode 100644 index 0000000..8802b65 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DIALOG_Intern.h @@ -0,0 +1,98 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : Dialog.h +Purpose : Dialog box include +---------------------------------------------------------------------- +Open items: +None +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef DIALOG_INTERN_H +#define DIALOG_INTERN_H + +#include "WM.h" + +#if GUI_WINSUPPORT + + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* typedefs +* +********************************************************************** +*/ + +typedef struct GUI_WIDGET_CREATE_INFO_struct GUI_WIDGET_CREATE_INFO; +typedef WM_HWIN GUI_WIDGET_CREATE_FUNC (const GUI_WIDGET_CREATE_INFO* pCreate, WM_HWIN hWin, int x0, int y0, WM_CALLBACK* cb); + +/********************************************************************* +* +* structures +* +********************************************************************** +*/ +struct GUI_WIDGET_CREATE_INFO_struct { + GUI_WIDGET_CREATE_FUNC* pfCreateIndirect; + const char* pName; /* Text ... Not used on all widgets */ + I16 Id; /* ID ... should be unique in a dialog */ + I16 x0, y0, xSize, ySize; /* Define position and size */ + U16 Flags; /* Widget specific create flags (opt.) */ + I32 Para; /* Widget specific parameter (opt.) */ +}; + +/********************************************************************* +* +* Create functions for well known widgets +* +********************************************************************** +*/ + +WM_HWIN BUTTON_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN CHECKBOX_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN EDIT_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN FRAMEWIN_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN RADIO_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN SLIDER_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN SCROLLBAR_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +WM_HWIN TEXT_CreateIndirect (const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); + +/********************************************************************* +* +* Public API functions +* +********************************************************************** +*/ +int GUI_ExecDialogBox (const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent, int x0, int y0); +int GUI_ExecCreatedDialog (WM_HWIN hDialog); +WM_HWIN GUI_CreateDialogBox (const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent, int x0, int y0); +void GUI_SetDialogStatusPtr(WM_HWIN hDialog, WM_DIALOG_STATUS* pDialogStatus); /* not to documented */ +WM_DIALOG_STATUS* GUI_GetDialogStatusPtr(WM_HWIN hDialog); /* not to documented */ +void GUI_EndDialog(WM_HWIN hWin, int r); +LCD_COLOR DIALOG_GetBkColor(void); /* obsolete */ +LCD_COLOR DIALOG_SetBkColor(LCD_COLOR BkColor); /* obsolete */ + +#if defined(__cplusplus) + } +#endif + + +#endif /* GUI_WINSUPPORT */ +#endif + diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN.c b/User/system/lib/lcd/gui/Widget/DROPDOWN.c new file mode 100644 index 0000000..173297e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN.c @@ -0,0 +1,680 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_ARRAY.h" +#include +#include +#include "DROPDOWN.h" +#include "DROPDOWN_Private.h" +#include "SCROLLBAR.h" +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef DROPDOWN_FONT_DEFAULT + #define DROPDOWN_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define colors */ +#ifndef DROPDOWN_BKCOLOR0_DEFAULT + #define DROPDOWN_BKCOLOR0_DEFAULT GUI_WHITE /* Not selected */ +#endif + +#ifndef DROPDOWN_BKCOLOR1_DEFAULT + #define DROPDOWN_BKCOLOR1_DEFAULT GUI_GRAY /* Selected, no focus */ +#endif + +#ifndef DROPDOWN_BKCOLOR2_DEFAULT + #define DROPDOWN_BKCOLOR2_DEFAULT GUI_BLUE /* Selected, focus */ +#endif + +#ifndef DROPDOWN_TEXTCOLOR0_DEFAULT + #define DROPDOWN_TEXTCOLOR0_DEFAULT GUI_BLACK /* Not selected */ +#endif + +#ifndef DROPDOWN_TEXTCOLOR1_DEFAULT + #define DROPDOWN_TEXTCOLOR1_DEFAULT GUI_WHITE /* Selected, no focus */ +#endif + +#ifndef DROPDOWN_TEXTCOLOR2_DEFAULT + #define DROPDOWN_TEXTCOLOR2_DEFAULT GUI_WHITE /* Selected, focus */ +#endif + +#ifndef DROPDOWN_BORDER_DEFAULT + #define DROPDOWN_BORDER_DEFAULT 2 +#endif + +#ifndef DROPDOWN_ALIGN_DEFAULT + #define DROPDOWN_ALIGN_DEFAULT GUI_TA_LEFT /* Default text alignment */ +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +DROPDOWN_PROPS DROPDOWN__DefaultProps = { + DROPDOWN_FONT_DEFAULT, + DROPDOWN_BKCOLOR0_DEFAULT, + DROPDOWN_BKCOLOR1_DEFAULT, + DROPDOWN_BKCOLOR2_DEFAULT, + DROPDOWN_TEXTCOLOR0_DEFAULT, + DROPDOWN_TEXTCOLOR1_DEFAULT, + DROPDOWN_TEXTCOLOR2_DEFAULT, + DROPDOWN_BORDER_DEFAULT, + DROPDOWN_ALIGN_DEFAULT +}; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#if GUI_DEBUG_LEVEL >1 + #define OBJECT_ID 0x4444 /* Magic numer, should be unique if possible */ + #define ASSERT_IS_VALID_PTR(p) GUI_DEBUG_ERROROUT_IF(p->DebugId != OBJECT_ID, "DROPDOWN.C: Wrong handle type or Object not init'ed") + #define INIT_ID(p) p->DebugId = OBJECT_ID + #define DEINIT_ID(p) p->DebugId = 0 +#else + #define ASSERT_IS_VALID_PTR(p) + #define INIT_ID(p) + #define DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* _GetNumItems + + Returns: + Number of fully or partially visible items +*/ +static int _GetNumItems(DROPDOWN_Obj* pObj) { + return pObj->Handles.NumItems; +} + +/********************************************************************* +* +* _GethItem + + Returns: + Handle of the specified item +*/ +static WM_HMEM _GethItem(DROPDOWN_Obj* pObj, int Index) { + return GUI_ARRAY_GethItem(&pObj->Handles, Index); +} + +/********************************************************************* +* +* _DrawTriangleDown +*/ +static void _DrawTriangleDown(int x, int y, int Size) { + for (; Size >= 0; Size--, y++ ) { + GUI_DrawHLine(y, x - Size, x + Size); + } +} +/********************************************************************* +* +* _GetpItem + + Returns: + Pointer to the specified item +*/ +static const char* _GetpItem(DROPDOWN_Obj* pObj, int Index) { + const char* s = NULL; + WM_HMEM h = _GethItem(pObj, Index); + if (h) { + s = (const char*) GUI_ALLOC_h2p(h); + } + return s; +} + +/********************************************************************* +* +* _Tolower +*/ +static int _Tolower(int Key) { + if ((Key >= 0x41) && (Key <= 0x5a)) { + Key += 0x20; + } + return Key; +} + +/********************************************************************* +* +* _SelectByKey +*/ +static void _SelectByKey(DROPDOWN_Handle hObj, int Key) { + int i; + DROPDOWN_Obj* pObj; + pObj = DROPDOWN_H2P(hObj); + Key = _Tolower(Key); + for (i = 0; i < _GetNumItems(pObj); i++) { + char c = _Tolower(*_GetpItem(pObj, i)); + if (c == Key) { + DROPDOWN_SetSel(hObj, i); + break; + } + } +} + +/********************************************************************* +* +* _FreeAttached +*/ +static void _FreeAttached(DROPDOWN_Obj* pObj) { + GUI_ARRAY_Delete(&pObj->Handles); + WM_DeleteWindow(pObj->hListWin); +} + +/********************************************************************* +* +* _Paint +*/ +static void _Paint(DROPDOWN_Handle hObj) { + int Border; + GUI_RECT r; + const char* s; + int InnerSize, ColorIndex; + DROPDOWN_Obj* pObj; + int TextBorderSize; + /* Do some initial calculations */ + pObj = DROPDOWN_H2P(hObj); + Border = pObj->Widget.pEffect->EffectSize; + TextBorderSize = pObj->Props.TextBorderSize; + GUI_SetFont(pObj->Props.pFont); + ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; + s = _GetpItem(pObj, pObj->Sel); + WM_GetClientRect(&r); + GUI__ReduceRect(&r, &r, Border); + InnerSize = r.y1 - r.y0 + 1; + /* Draw the 3D effect (if configured) */ + WIDGET__EFFECT_DrawDown(&pObj->Widget); + /* Draw the outer text frames */ + r.x1 -= InnerSize; /* Spare square area to the right */ + LCD_SetColor(pObj->Props.aBackColor[ColorIndex]); + /* Draw the text */ + LCD_SetBkColor(pObj->Props.aBackColor[ColorIndex]); + GUI_FillRectEx(&r); + r.x0 += TextBorderSize; + r.x1 -= TextBorderSize; + LCD_SetColor (pObj->Props.aTextColor[ColorIndex]); + GUI_DispStringInRect(s, &r, pObj->Props.Align);/**/ + /* Draw arrow */ + WM_GetClientRect(&r); + GUI__ReduceRect(&r, &r, Border); + r.x0 = r.x1 + 1 - InnerSize; + LCD_SetColor(0xc0c0c0); + GUI_FillRectEx(&r); + LCD_SetColor(GUI_BLACK); + _DrawTriangleDown((r.x1 + r.x0) / 2, r.y0 + 5, (r.y1 - r.y0 - 8) / 2); + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &r); +} + +/********************************************************************* +* +* _OnTouch +*/ +static int _OnTouch(DROPDOWN_Handle hObj, WM_MESSAGE*pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + WM_NotifyParent(hObj, WM_NOTIFICATION_CLICKED); + } else { + WM_NotifyParent(hObj, WM_NOTIFICATION_RELEASED); + } + } else { /* Mouse moved out */ + WM_NotifyParent(hObj, WM_NOTIFICATION_MOVED_OUT); + } + return 0; /* Message handled */ +} + +/********************************************************************* +* +* DROPDOWN__AdjustHeight +*/ +void DROPDOWN__AdjustHeight(DROPDOWN_Handle hObj, DROPDOWN_Obj* pObj) { + int Height; + Height = pObj->TextHeight; + if (!Height) { + Height = GUI_GetYDistOfFont(pObj->Props.pFont); + } + Height += pObj->Widget.pEffect->EffectSize + 2 * pObj->Props.TextBorderSize; + WM_SetSize(hObj, WM__GetWindowSizeX(&pObj->Widget.Win), Height); +} + +/********************************************************************* +* +* _DROPDOWN_Callback +*/ +static void _DROPDOWN_Callback (WM_MESSAGE*pMsg) { + DROPDOWN_Handle hObj = pMsg->hWin; + DROPDOWN_Obj* pObj = DROPDOWN_H2P(hObj); + char IsExpandedBeforeMsg; + IsExpandedBeforeMsg = pObj->hListWin ? 1 : 0; + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_NOTIFY_PARENT: + switch (pMsg->Data.v) { + case WM_NOTIFICATION_SCROLL_CHANGED: + WM_NotifyParent(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + break; + case WM_NOTIFICATION_CLICKED: + DROPDOWN_SetSel(hObj, LISTBOX_GetSel(pObj->hListWin)); + WM_SetFocus(hObj); + break; + case LISTBOX_NOTIFICATION_LOST_FOCUS: + DROPDOWN_Collapse(hObj); + break; + } + break; + case WM_PID_STATE_CHANGED: + if (IsExpandedBeforeMsg == 0) { /* Make sure we do not react a second time */ + const WM_PID_STATE_CHANGED_INFO * pInfo = (const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p; + if (pInfo->State) { + DROPDOWN_Expand(hObj); + } + } + break; + case WM_TOUCH: + if (_OnTouch(hObj, pMsg) == 0) { + return; + } + break; + case WM_PAINT: + _Paint(hObj); + break; + case WM_DELETE: + _FreeAttached(pObj); + break; /* No return here ... WM_DefaultProc needs to be called */ + case WM_KEY: + if ( ((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) { + int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + switch (Key) { + case GUI_KEY_TAB: + break; /* Send to parent by not doing anything */ + default: + DROPDOWN_AddKey(hObj, Key); + return; + } + } + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* DROPDOWN_CreateEx +*/ +DROPDOWN_Handle DROPDOWN_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + DROPDOWN_Handle hObj; + hObj = WM_CreateWindowAsChild(x0, y0, xsize, -1, hParent, WinFlags, _DROPDOWN_Callback, + sizeof(DROPDOWN_Obj) - sizeof(WM_Obj)); + if (hObj) { + DROPDOWN_Obj* pObj; + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->Handles); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + pObj->Flags = ExFlags; + pObj->Props = DROPDOWN__DefaultProps; + pObj->ScrollbarWidth = 0; + INIT_ID(pObj); + pObj->ySizeEx = ysize; + DROPDOWN__AdjustHeight(hObj, pObj); + WM_UNLOCK(); + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_Collapse +*/ +void DROPDOWN_Collapse(DROPDOWN_Handle hObj) { + DROPDOWN_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + if (pObj->hListWin) { + WM_DeleteWindow(pObj->hListWin); + pObj->hListWin = 0; + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_Expand +*/ +void DROPDOWN_Expand(DROPDOWN_Handle hObj) { + int xSize, ySize, i, NumItems; + WM_HWIN hLst; + GUI_RECT r; + WM_HWIN hParent; + WM_Obj* pParent; + DROPDOWN_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + if (pObj->hListWin == 0) { + hParent = WM_GetParent(hObj); + pParent = WM_H2P(hParent); + xSize = WM__GetWindowSizeX(&pObj->Widget.Win); + ySize = pObj->ySizeEx; + NumItems = _GetNumItems(pObj); + /* Get coordinates of window in client coordiantes of parent */ + r = pObj->Widget.Win.Rect; + GUI_MoveRect(&r, -pParent->Rect.x0, -pParent->Rect.y0); + if (pObj->Flags & DROPDOWN_CF_UP) { + r.y0 -= ySize; + } else { + r.y0 = r.y1; + } + hLst = LISTBOX_CreateAsChild(NULL, WM_GetParent(hObj), r.x0, r.y0 + , xSize, ySize, WM_CF_SHOW); + if (pObj->Flags & DROPDOWN_SF_AUTOSCROLLBAR) { + LISTBOX_SetScrollbarWidth(hLst, pObj->ScrollbarWidth); + LISTBOX_SetAutoScrollV(hLst, 1); + } + for (i = 0; i< NumItems; i++) { + LISTBOX_AddString(hLst, _GetpItem(pObj, i)); + } + for (i = 0; i < GUI_COUNTOF(pObj->Props.aBackColor); i++) { + LISTBOX_SetBkColor(hLst, i, pObj->Props.aBackColor[i]); + } + for (i = 0; i < GUI_COUNTOF(pObj->Props.aTextColor); i++) { + LISTBOX_SetTextColor(hLst, i, pObj->Props.aTextColor[i]); + } + LISTBOX_SetItemSpacing(hLst, pObj->ItemSpacing); + LISTBOX_SetFont(hLst, pObj->Props.pFont); + WM_SetFocus(hLst); + pObj->hListWin = hLst; + LISTBOX_SetOwner(hLst, hObj); + LISTBOX_SetSel(hLst, pObj->Sel); + WM_NotifyParent(hObj, WM_NOTIFICATION_CLICKED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_AddKey +*/ +void DROPDOWN_AddKey(DROPDOWN_Handle hObj, int Key) { + if (hObj) { + WM_LOCK(); + switch (Key) { + case GUI_KEY_DOWN: + DROPDOWN_IncSel(hObj); + break; + case GUI_KEY_UP: + DROPDOWN_DecSel(hObj); + break; + default: + _SelectByKey(hObj, Key); + break; + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_AddString +*/ +void DROPDOWN_AddString(DROPDOWN_Handle hObj, const char* s) { + DROPDOWN_Obj* pObj; + if (hObj && s) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + GUI_ARRAY_AddItem(&pObj->Handles, s, strlen(s) + 1); + DROPDOWN_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_GetNumItems +*/ +int DROPDOWN_GetNumItems(DROPDOWN_Handle hObj) { + DROPDOWN_Obj* pObj; + int r = 0; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + r = _GetNumItems(pObj); + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* DROPDOWN_SetFont +*/ +void DROPDOWN_SetFont(DROPDOWN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont) { + int OldHeight; + DROPDOWN_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + OldHeight = GUI_GetYDistOfFont(pObj->Props.pFont); + pObj->Props.pFont = pfont; + DROPDOWN__AdjustHeight(hObj, pObj); + DROPDOWN_Invalidate(hObj); + if (pObj->hListWin) { + if (OldHeight != GUI_GetYDistOfFont(pObj->Props.pFont)) { + DROPDOWN_Collapse(hObj); + DROPDOWN_Expand(hObj); + } + LISTBOX_SetFont(pObj->hListWin, pfont); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_SetBkColor +*/ +void DROPDOWN_SetBkColor(DROPDOWN_Handle hObj, unsigned int Index, GUI_COLOR color) { + DROPDOWN_Obj* pObj; + if (hObj) { + if (Index < GUI_COUNTOF(pObj->Props.aBackColor)) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->Props.aBackColor[Index] = color; + DROPDOWN_Invalidate(hObj); + if (pObj->hListWin) { + LISTBOX_SetBkColor(pObj->hListWin, Index, color); + } + WM_UNLOCK(); + } + } +} + +/********************************************************************* +* +* DROPDOWN_SetTextColor +*/ +void DROPDOWN_SetTextColor(DROPDOWN_Handle hObj, unsigned int Index, GUI_COLOR color) { + DROPDOWN_Obj* pObj; + if (hObj) { + if (Index < GUI_COUNTOF(pObj->Props.aBackColor)) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->Props.aTextColor[Index] = color; + DROPDOWN_Invalidate(hObj); + if (pObj->hListWin) { + LISTBOX_SetTextColor(pObj->hListWin, Index, color); + } + WM_UNLOCK(); + } + } +} + +/********************************************************************* +* +* DROPDOWN_SetSel +*/ +void DROPDOWN_SetSel(DROPDOWN_Handle hObj, int Sel) { + int NumItems, MaxSel; + DROPDOWN_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + NumItems = _GetNumItems(pObj); + MaxSel = NumItems ? NumItems-1 : 0; + if (Sel > MaxSel) { + Sel = MaxSel; + } + if (Sel != pObj->Sel) { + pObj->Sel = Sel; + DROPDOWN_Invalidate(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_SEL_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_IncSel +*/ +void DROPDOWN_IncSel(DROPDOWN_Handle hObj) { + int Sel = DROPDOWN_GetSel(hObj); + DROPDOWN_SetSel(hObj, Sel+1); +} + +/********************************************************************* +* +* DROPDOWN_DecSel +*/ +void DROPDOWN_DecSel(DROPDOWN_Handle hObj) { + int Sel = DROPDOWN_GetSel(hObj); + if (Sel) + Sel--; + DROPDOWN_SetSel(hObj, Sel); +} + +int DROPDOWN_GetSel (DROPDOWN_Handle hObj) { + int r = 0; + DROPDOWN_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + r = pObj->Sel; + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* DROPDOWN_SetScrollbarWidth +*/ +void DROPDOWN_SetScrollbarWidth(DROPDOWN_Handle hObj, unsigned Width) { + DROPDOWN_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + if (Width != (unsigned)pObj->ScrollbarWidth) { + pObj->ScrollbarWidth = Width; + if (pObj->hListWin) { + LISTBOX_SetScrollbarWidth(pObj->hListWin, Width); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_SetDefaultFont +*/ +void DROPDOWN_SetDefaultFont(const GUI_FONT* pFont) { + DROPDOWN__DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* DROPDOWN_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * DROPDOWN_GetDefaultFont(void) { + return DROPDOWN__DefaultProps.pFont; +} + + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN.h b/User/system/lib/lcd/gui/Widget/DROPDOWN.h new file mode 100644 index 0000000..0c13769 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN.h @@ -0,0 +1,117 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN.h +Purpose : Multiple choice object include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef DROPDOWN_H +#define DROPDOWN_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +typedef WM_HMEM DROPDOWN_Handle; + +/************************************************************ +* +* Create flags +*/ +#define DROPDOWN_CF_AUTOSCROLLBAR (1 << 0) +#define DROPDOWN_CF_UP (1 << 1) + +/********************************************************************* +* +* Color indices +*/ +#define DROPDOWN_CI_UNSEL 0 +#define DROPDOWN_CI_SEL 1 +#define DROPDOWN_CI_SELFOCUS 2 + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define DROPDOWN_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define DROPDOWN_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define DROPDOWN_Delete(hObj) WM_DeleteWindow(hObj) +#define DROPDOWN_Paint(hObj) WM_Paint(hObj) +#define DROPDOWN_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +DROPDOWN_Handle DROPDOWN_Create (WM_HWIN hWinParent, int x0, int y0, int xsize, int ysize, int Flags); +DROPDOWN_Handle DROPDOWN_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +DROPDOWN_Handle DROPDOWN_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +void DROPDOWN_AddKey (DROPDOWN_Handle hObj, int Key); +void DROPDOWN_AddString (DROPDOWN_Handle hObj, const char* s); +void DROPDOWN_Collapse (DROPDOWN_Handle hObj); +void DROPDOWN_DecSel (DROPDOWN_Handle hObj); +void DROPDOWN_DeleteItem (DROPDOWN_Handle hObj, unsigned int Index); +void DROPDOWN_Expand (DROPDOWN_Handle hObj); +unsigned DROPDOWN_GetItemSpacing (DROPDOWN_Handle hObj); +int DROPDOWN_GetNumItems (DROPDOWN_Handle hObj); +int DROPDOWN_GetSel (DROPDOWN_Handle hObj); +void DROPDOWN_IncSel (DROPDOWN_Handle hObj); +void DROPDOWN_InsertString (DROPDOWN_Handle hObj, const char* s, unsigned int Index); +void DROPDOWN_SetAutoScroll (DROPDOWN_Handle hObj, int OnOff); +void DROPDOWN_SetBkColor (DROPDOWN_Handle hObj, unsigned int index, GUI_COLOR color); +void DROPDOWN_SetFont (DROPDOWN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont); +void DROPDOWN_SetItemSpacing (DROPDOWN_Handle hObj, unsigned Value); +void DROPDOWN_SetSel (DROPDOWN_Handle hObj, int Sel); +void DROPDOWN_SetScrollbarWidth(DROPDOWN_Handle hObj, unsigned Width); +void DROPDOWN_SetTextAlign (DROPDOWN_Handle hObj, int Align); +void DROPDOWN_SetTextColor (DROPDOWN_Handle hObj, unsigned int index, GUI_COLOR color); +void DROPDOWN_SetTextHeight (DROPDOWN_Handle hObj, unsigned TextHeight); + + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ +const GUI_FONT GUI_UNI_PTR * DROPDOWN_GetDefaultFont(void); +void DROPDOWN_SetDefaultFont(const GUI_FONT* pFont); + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ +#endif /* DROPDOWN_H */ diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_Create.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_Create.c new file mode 100644 index 0000000..8833ef0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_Create.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_Create.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DROPDOWN.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* DROPDOWN_Create +*/ +DROPDOWN_Handle DROPDOWN_Create(WM_HWIN hWinParent, int x0, int y0, int xsize, int ysize, int Flags) { + return DROPDOWN_CreateEx(x0, y0, xsize, ysize, hWinParent, Flags, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_CreateIndirect.c new file mode 100644 index 0000000..c1dad9f --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_CreateIndirect.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_CreateIndirect.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "DROPDOWN.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* DROPDOWN_CreateIndirect +*/ +DROPDOWN_Handle DROPDOWN_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, + WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + DROPDOWN_Handle hThis; + GUI_USE_PARA(cb); + hThis = DROPDOWN_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, + pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_DeleteItem.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_DeleteItem.c new file mode 100644 index 0000000..97f357b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_DeleteItem.c @@ -0,0 +1,57 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_DeleteItem.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DROPDOWN_Private.h" +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_DeleteItem +*/ +void DROPDOWN_DeleteItem(DROPDOWN_Handle hObj, unsigned int Index) { + if (hObj) { + DROPDOWN_Obj * pObj; + unsigned int NumItems; + NumItems = DROPDOWN_GetNumItems(hObj); + if (Index < NumItems) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + GUI_ARRAY_DeleteItem(&pObj->Handles, Index); + WM_InvalidateWindow(hObj); + if (pObj->hListWin) { + LISTBOX_DeleteItem(pObj->hListWin, Index); + } + WM_UNLOCK(); + } + } +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_DeleteItem_C(void); + void DROPDOWN_DeleteItem_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_InsertString.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_InsertString.c new file mode 100644 index 0000000..d1f08df --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_InsertString.c @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_InsertString.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "DROPDOWN.h" +#include "DROPDOWN_Private.h" +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_InsertString +*/ +void DROPDOWN_InsertString(DROPDOWN_Handle hObj, const char * s, unsigned int Index) { + if (hObj && s) { + DROPDOWN_Obj* pObj; + unsigned int NumItems; + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + NumItems = DROPDOWN_GetNumItems(hObj); + if (Index < NumItems) { + WM_HMEM hItem; + hItem = GUI_ARRAY_InsertItem(&pObj->Handles, Index, strlen(s) + 1); + if (hItem) { + char * pBuffer = (char *)GUI_ALLOC_h2p(hItem); + strcpy(pBuffer, s); + } + WM_InvalidateWindow(hObj); + if (pObj->hListWin) { + LISTBOX_InsertString(pObj->hListWin, s, Index); + } + } else { + DROPDOWN_AddString(hObj, s); + if (pObj->hListWin) { + LISTBOX_AddString(pObj->hListWin, s); + } + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_InsertString_C(void); + void DROPDOWN_InsertString_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_ItemSpacing.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_ItemSpacing.c new file mode 100644 index 0000000..0704413 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_ItemSpacing.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_ItemSpacing.c +Purpose : Implementation of DROPDOWN_SetItemSpacing & DROPDOWN_GetItemSpacing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DROPDOWN_Private.h" +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_SetItemSpacing +*/ +void DROPDOWN_SetItemSpacing(DROPDOWN_Handle hObj, unsigned Value) { + if (hObj) { + DROPDOWN_Obj* pObj; + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + pObj->ItemSpacing = Value; + if (pObj->hListWin) { + LISTBOX_SetItemSpacing(pObj->hListWin, Value); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* DROPDOWN_GetItemSpacing +*/ +unsigned DROPDOWN_GetItemSpacing(DROPDOWN_Handle hObj) { + unsigned Value = 0; + if (hObj) { + DROPDOWN_Obj* pObj; + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + Value = pObj->ItemSpacing; + WM_UNLOCK(); + } + return Value; +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_ItemSpacing_C(void); + void DROPDOWN_ItemSpacing_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_Private.h b/User/system/lib/lcd/gui/Widget/DROPDOWN_Private.h new file mode 100644 index 0000000..2d87c62 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_Private.h @@ -0,0 +1,66 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_Private.h +Purpose : DROPDOWN private header file +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef DROPDOWN_PRIVATE_H +#define DROPDOWN_PRIVATE_H + +#include "DROPDOWN.h" +#include "WIDGET.h" +#include "GUI_ARRAY.h" + +#if GUI_WINSUPPORT + +/************************************************************ +* +* Create / Status flags +*/ +#define DROPDOWN_SF_AUTOSCROLLBAR DROPDOWN_CF_AUTOSCROLLBAR + +#define DROPDOWN_H2P(h) (DROPDOWN_Obj*) GUI_ALLOC_h2p(h) + +typedef struct { + const GUI_FONT GUI_UNI_PTR * pFont; + GUI_COLOR aBackColor[3]; + GUI_COLOR aTextColor[3]; + I16 TextBorderSize; + I16 Align; +} DROPDOWN_PROPS; + +typedef struct { + WIDGET Widget; + I16 Sel; /* current selection */ + I16 ySizeEx; /* Drop down size */ + I16 TextHeight; + GUI_ARRAY Handles; + WM_SCROLL_STATE ScrollState; + DROPDOWN_PROPS Props; + WM_HWIN hListWin; + U8 Flags; + U16 ItemSpacing; + U8 ScrollbarWidth; + char IsPressed; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif +} DROPDOWN_Obj; + +void DROPDOWN__AdjustHeight(DROPDOWN_Handle hObj, DROPDOWN_Obj* pObj); + +#endif /* GUI_WINSUPPORT */ +#endif /* DROPDOWN_PRIVATE_H */ diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_SetAutoScroll.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_SetAutoScroll.c new file mode 100644 index 0000000..ef0141e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_SetAutoScroll.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_SetAutoScroll.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DROPDOWN_Private.h" +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_SetAutoScroll +*/ +void DROPDOWN_SetAutoScroll(DROPDOWN_Handle hObj, int OnOff) { + if (hObj) { + DROPDOWN_Obj* pObj; + char Flags; + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + Flags = pObj->Flags & (~DROPDOWN_SF_AUTOSCROLLBAR); + if (OnOff) { + Flags |= DROPDOWN_SF_AUTOSCROLLBAR; + } + if (pObj->Flags != Flags) { + pObj->Flags = Flags; + if (pObj->hListWin) { + LISTBOX_SetAutoScrollV(pObj->hListWin, (Flags & DROPDOWN_SF_AUTOSCROLLBAR) ? 1 : 0); + } + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_SetAutoScroll_C(void); + void DROPDOWN_SetAutoScroll_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextAlign.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextAlign.c new file mode 100644 index 0000000..911cc4e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextAlign.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_SetTextAlign.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DROPDOWN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_SetTextAlign +*/ +void DROPDOWN_SetTextAlign(DROPDOWN_Handle hObj, int Align) { + DROPDOWN_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + pObj->Props.Align = Align; + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_SetTextAlign_C(void); + void DROPDOWN_SetTextAlign_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextHeight.c b/User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextHeight.c new file mode 100644 index 0000000..a43fed9 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/DROPDOWN_SetTextHeight.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : DROPDOWN_SetTextHeight.c +Purpose : Implementation of dropdown widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DROPDOWN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* DROPDOWN_SetTextHeight +*/ +void DROPDOWN_SetTextHeight(DROPDOWN_Handle hObj, unsigned TextHeight) { + DROPDOWN_Obj * pObj; + if (hObj) { + WM_LOCK(); + pObj = DROPDOWN_H2P(hObj); + pObj->TextHeight = TextHeight; + DROPDOWN__AdjustHeight(hObj, pObj); + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void DROPDOWN_SetTextHeight_C(void); + void DROPDOWN_SetTextHeight_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/EDIT.c b/User/system/lib/lcd/gui/Widget/EDIT.c new file mode 100644 index 0000000..e8940b5 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT.c @@ -0,0 +1,872 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#define EDIT_C /* Required to generate intermodule data */ + +#include "EDIT.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef EDIT_FONT_DEFAULT + #define EDIT_FONT_DEFAULT &GUI_Font13_1 +#endif + +#ifndef EDIT_ALIGN_DEFAULT + #define EDIT_ALIGN_DEFAULT GUI_TA_LEFT | GUI_TA_VCENTER +#endif + +/* Define colors */ +#ifndef EDIT_BKCOLOR0_DEFAULT + #define EDIT_BKCOLOR0_DEFAULT 0xC0C0C0 +#endif + +#ifndef EDIT_BKCOLOR1_DEFAULT + #define EDIT_BKCOLOR1_DEFAULT GUI_WHITE +#endif + +#ifndef EDIT_TEXTCOLOR0_DEFAULT + #define EDIT_TEXTCOLOR0_DEFAULT GUI_BLACK +#endif + +#ifndef EDIT_TEXTCOLOR1_DEFAULT + #define EDIT_TEXTCOLOR1_DEFAULT GUI_BLACK +#endif + +#ifndef EDIT_BORDER_DEFAULT + #define EDIT_BORDER_DEFAULT 1 +#endif + +#ifndef EDIT_XOFF + #define EDIT_XOFF 1 +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +EDIT_PROPS EDIT__DefaultProps = { + EDIT_ALIGN_DEFAULT, + EDIT_BORDER_DEFAULT, + EDIT_FONT_DEFAULT, + EDIT_TEXTCOLOR0_DEFAULT, + EDIT_TEXTCOLOR1_DEFAULT, + EDIT_BKCOLOR0_DEFAULT, + EDIT_BKCOLOR1_DEFAULT +}; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + #define OBJECT_ID 0x4569 /* Magic nubmer, should be unique if possible */ + #define INIT_ID(p) p->DebugId = OBJECT_ID + #define DEINIT_ID(p) p->DebugId = 0 +#else + #define INIT_ID(p) + #define DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_h2p +*/ +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL +EDIT_Obj* EDIT_h2p(EDIT_Handle h) { + EDIT_Obj* p = (EDIT_Obj*)GUI_ALLOC_h2p(h); + if (p) { + //houhh 20061022... + if (p->DebugId != OBJECT_ID) { + GUI_DEBUG_ERROROUT("EDIT.C: Wrong handle type or Object not init'ed"); + return 0; + } + } + return p; +} +#endif + +///////////houhh 20061018... +static GUI_TIMER_HANDLE Timer1 = 0; //houhh 20061018... +static void _Paint(EDIT_Obj* pObj, EDIT_Handle hObj) ; + +void ShowCurrsor(GUI_TIMER_MESSAGE* TimeMsg) +{ + EDIT_Handle hObj = (EDIT_Handle) TimeMsg->Context; + EDIT_Obj* pObj = (EDIT_Obj*) GUI_ALLOC_h2p(hObj); + + WM_Obj* pWin = WM_H2P(hObj); + GUI_DEBUG_LOG("EDIT: _Callback(WM_PAINT)\n"); + WM_SelectWindow(hObj); + _Paint(pObj, hObj); + pObj->CurrsorShow++; + GUI_TIMER_Restart(Timer1); + +} +/////// + +/********************************************************************* +* +* _Paint +*/ +static void _Paint(EDIT_Obj* pObj, EDIT_Handle hObj) { + GUI_RECT rFillRect, rInside, r, rText, rInvert; + const char GUI_UNI_PTR * pText = NULL; + int IsEnabled, CursorWidth; + IsEnabled = WM__IsEnabled(hObj); + /* Set colors and font */ + LCD_SetBkColor(pObj->Props.aBkColor[IsEnabled]); + LCD_SetColor(pObj->Props.aTextColor[0]); + GUI_SetFont(pObj->Props.pFont); + /* Calculate size */ + WM__GetClientRectWin(&pObj->Widget.Win, &r); + WIDGET__GetInsideRect(&pObj->Widget, &rFillRect); + if (pObj->hpText) { + pText = (const char*) GUI_ALLOC_h2p(pObj->hpText); + } + rInside = rFillRect; + rInside.x0 += pObj->Props.Border + EDIT_XOFF; + rInside.x1 -= pObj->Props.Border + EDIT_XOFF; + GUI__CalcTextRect(pText, &rInside, &rText, pObj->Props.Align); + /* Calculate position and size of cursor */ + if (pObj->Widget.State & WIDGET_STATE_FOCUS) { + const char GUI_UNI_PTR * p = pText; + CursorWidth = ((pObj->XSizeCursor > 0) ? (pObj->XSizeCursor) : (1)); + if (pText) { + U16 Char; + int i; + // pObj->SelSize = 3; //houhh 20061023... + if ((pObj->EditMode != GUI_EDIT_MODE_INSERT) || (pObj->SelSize)) { + int NumChars, CursorOffset; + NumChars = GUI__GetNumChars(pText); + if (pObj->CursorPos < NumChars) { + if (pObj->SelSize) { + CursorWidth = 0; + for (i = pObj->CursorPos; i < (int)(pObj->CursorPos + pObj->SelSize); i++) { + CursorOffset = GUI_UC__NumChars2NumBytes(pText, i); + Char = GUI_UC_GetCharCode (pText + CursorOffset); + CursorWidth += GUI_GetCharDistX (Char); + } + if (!CursorWidth) { + CursorWidth = 1; + } + } else { + CursorOffset = GUI_UC__NumChars2NumBytes(pText, pObj->CursorPos); + Char = GUI_UC_GetCharCode(pText + CursorOffset); + CursorWidth = GUI_GetCharDistX(Char); + } + } + } + rInvert = rText; + for (i = 0; i != pObj->CursorPos; i++) { + Char = GUI_UC__GetCharCodeInc(&p); + rInvert.x0 += GUI_GetCharDistX(Char); + } + } + } + /* WM loop */ + WM_ITERATE_START(NULL) { + /* Set clipping rectangle */ + WM_SetUserClipRect(&rFillRect); + /* Display text */ + WIDGET__FillStringInRect(pText, &rFillRect, &rInside, &rText); + /* Display cursor if needed */ + if (pObj->Widget.State & WIDGET_STATE_FOCUS) { + ///////////////houhh 20061020... + // static GUI_TIMER_HANDLE Timer1 = NULL; //houhh 20061018... + if(!Timer1){ + Timer1 = GUI_TIMER_Create((GUI_TIMER_CALLBACK*)ShowCurrsor, 1000*2, 0, 0); //houhh 20061018... + GUI_TIMER_SetTime(Timer1, 1000*2); + GUI_TIMER_SetPeriod(Timer1, 500); + } + if(Timer1) GUI_TIMER_Context(Timer1, hObj); + if(pObj->CurrsorShow%2) //houhh 20061022... + GUI_InvertRect(rInvert.x0, rInvert.y0, rInvert.x0 + CursorWidth - 1, rInvert.y1); + ///////////// + GUI_InvertRect(rInvert.x0, rInvert.y0, rInvert.x0 + CursorWidth - 1, rInvert.y1); + } + WM_SetUserClipRect(NULL); + /* Draw the 3D effect (if configured) */ + WIDGET__EFFECT_DrawDown(&pObj->Widget); + } WM_ITERATE_END(); +} + +/********************************************************************* +* +* _Delete +*/ +static void _Delete(EDIT_Obj* pObj) { + GUI_ALLOC_FreePtr(&pObj->hpText); +} + +/********************************************************************* +* +* EDIT_SetCursorAtPixel +*/ +void EDIT_SetCursorAtPixel(EDIT_Handle hObj, int xPos) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj->hpText) { + const GUI_FONT GUI_UNI_PTR *pOldFont; + int xSize, TextWidth, NumChars; + const char GUI_UNI_PTR * pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + pOldFont = GUI_SetFont(pObj->Props.pFont); + xSize = WM_GetWindowSizeX(hObj); + TextWidth = GUI_GetStringDistX(pText); + switch (pObj->Props.Align & GUI_TA_HORIZONTAL) { + case GUI_TA_HCENTER: + xPos -= (xSize - TextWidth + 1) / 2; + break; + case GUI_TA_RIGHT: + xPos -= xSize - TextWidth - (pObj->Props.Border + EDIT_XOFF); + break; + default: + xPos -= (pObj->Props.Border + EDIT_XOFF) + pObj->Widget.pEffect->EffectSize; + } + NumChars = GUI__GetNumChars(pText); + if (xPos < 0) { + EDIT__SetCursorPos(pObj, 0); + } else if (xPos > TextWidth) { + EDIT__SetCursorPos(pObj, NumChars); + } else { + int i, x, xLenChar; + U16 Char; + for (i = 0, x = 0; (i < NumChars) && (x < xPos); i++) { + Char = GUI_UC__GetCharCodeInc(&pText); + xLenChar = GUI_GetCharDistX(Char); + if (xPos < (x + xLenChar)) + break; + x += xLenChar; + } + EDIT__SetCursorPos(pObj, i); + } + GUI_SetFont(pOldFont); + EDIT_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* _IncrementBuffer +* +* Increments the buffer size by AddBytes. +*/ +static int _IncrementBuffer(EDIT_Obj* pObj, unsigned AddBytes) { + WM_HMEM hNew; + int NewSize; + NewSize = pObj->BufferSize + AddBytes; + hNew = GUI_ALLOC_Realloc(pObj->hpText, NewSize); + if (hNew) { + if (!(pObj->hpText)) { + char* pText; + pText = (char*) GUI_ALLOC_h2p(hNew); + *pText = 0; + } + pObj->BufferSize = NewSize; + pObj->hpText = hNew; + return 1; + } + return 0; +} + +/********************************************************************* +* +* _IsSpaceInBuffer +* +* Checks the available space in the buffer. If there is not enough +* space left this function attempts to get more. +* +* Returns: +* 1 = requested space is available +* 0 = failed to get enough space +*/ +static int _IsSpaceInBuffer(EDIT_Obj* pObj, int BytesNeeded) { + int NumBytes = 0; + if (pObj->hpText) { + NumBytes = strlen((char*)GUI_ALLOC_h2p(pObj->hpText)); + } + BytesNeeded = (BytesNeeded + NumBytes + 1) - pObj->BufferSize; + if (BytesNeeded > 0) { + if (!_IncrementBuffer(pObj, BytesNeeded + EDIT_REALLOC_SIZE)) { + return 0; + } + } + return 1; +} + +/********************************************************************* +* +* _IsCharsAvailable +* +* Checks weither the maximum number of characters is reached or not. +* +* Returns: +* 1 = requested number of chars is available +* 0 = maximum number of chars have reached +*/ +static int _IsCharsAvailable(EDIT_Obj* pObj, int CharsNeeded) { + if ((CharsNeeded > 0) && (pObj->MaxLen > 0)) { + int NumChars = 0; + if (pObj->hpText) { + NumChars = GUI__GetNumChars((char*)GUI_ALLOC_h2p(pObj->hpText)); + } + if ((CharsNeeded + NumChars) > pObj->MaxLen) { + return 0; + } + } + return 1; +} + +/********************************************************************* +* +* _DeleteChar +* +* Deletes a character at the current cursor position and moves +* all bytes after the cursor position. +*/ +static void _DeleteChar(EDIT_Handle hObj, EDIT_Obj* pObj) { + if (pObj->hpText) { + unsigned CursorOffset; + char* pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + CursorOffset = GUI_UC__NumChars2NumBytes(pText, pObj->CursorPos); + if (CursorOffset < strlen(pText)) { + int NumBytes; + pText += CursorOffset; + NumBytes = GUI_UC_GetCharSize(pText); + strcpy(pText, pText + NumBytes); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + } +} + +/********************************************************************* +* +* _InsertChar +* +* Create space at the current cursor position and inserts a character. +*/ +static int _InsertChar(EDIT_Handle hObj, EDIT_Obj* pObj, U16 Char) { + if (_IsCharsAvailable(pObj, 1)) { + int BytesNeeded; + BytesNeeded = GUI_UC__CalcSizeOfChar(Char); + if (_IsSpaceInBuffer(pObj, BytesNeeded)) { + int CursorOffset; + char* pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + CursorOffset = GUI_UC__NumChars2NumBytes(pText, pObj->CursorPos); + pText += CursorOffset; + memmove(pText + BytesNeeded, pText, strlen(pText) + 1); + GUI_UC_Encode(pText, Char); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + return 1; + } + } + return 0; +} + +/********************************************************************* +* +* EDIT__GetCurrentChar +*/ +U16 EDIT__GetCurrentChar(EDIT_Obj* pObj) { + U16 Char = 0; + if (pObj->hpText) { + const char* pText; + pText = (const char*) GUI_ALLOC_h2p(pObj->hpText); + pText += GUI_UC__NumChars2NumBytes(pText, pObj->CursorPos); + Char = GUI_UC_GetCharCode(pText); + } + return Char; +} + +/********************************************************************* +* +* EDIT__SetCursorPos +* +* Sets a new cursor position. +*/ +void EDIT__SetCursorPos(EDIT_Obj* pObj, int CursorPos) { + if (pObj->hpText) { + char* pText; + int NumChars, Offset; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + NumChars = GUI__GetNumChars(pText); + Offset = (pObj->EditMode == GUI_EDIT_MODE_INSERT) ? 0 : 1; + if (CursorPos < 0) { + CursorPos = 0; + } + if (CursorPos > NumChars) { + CursorPos = NumChars; + } + if (CursorPos > (pObj->MaxLen - Offset)) { + CursorPos = pObj->MaxLen - Offset; + } + if (pObj->CursorPos != CursorPos) { + pObj->CursorPos = CursorPos; + } + pObj->SelSize = 0; + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(EDIT_Handle hObj, EDIT_Obj* pObj, WM_MESSAGE*pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + GUI_USE_PARA(pObj); + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + static int StartPress = 0; //houhh 20061023... + if (pState->Pressed) { + GUI_DEBUG_LOG1("EDIT__Callback(WM_TOUCH, Pressed, Handle %d)\n",1); + EDIT_SetCursorAtPixel(hObj, pState->x); + StartPress = pObj->CursorPos; //houhh 20061023... + } else { + GUI_DEBUG_LOG1("EDIT__Callback(WM_TOUCH, Released, Handle %d)\n",1); + } + } else { + GUI_DEBUG_LOG1("_EDIT_Callback(WM_TOUCH, Moved out, Handle %d)\n",1); + } +} + +/********************************************************************* +* +* EDIT__Callback +*/ +static void EDIT__Callback (WM_MESSAGE * pMsg) { + int IsEnabled; + EDIT_Handle hObj = (EDIT_Handle) pMsg->hWin; + EDIT_Obj* pObj = (EDIT_Obj*) GUI_ALLOC_h2p(hObj); + IsEnabled = WM__IsEnabled(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + case WM_PAINT: + GUI_DEBUG_LOG("EDIT: _Callback(WM_PAINT)\n"); + _Paint(pObj, hObj); + return; + case WM_DELETE: + GUI_DEBUG_LOG("EDIT: _Callback(WM_DELETE)\n"); + _Delete(pObj); + break; /* No return here ... WM_DefaultProc needs to be called */ + case WM_KEY: + if (IsEnabled) { + if ( ((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) { + int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + switch (Key) { + case GUI_KEY_TAB: + break; /* Send to parent by not doing anything */ + default: + EDIT_AddKey(hObj, Key); + return; + } + } + } + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_CreateEx +*/ +EDIT_Handle EDIT_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, + int Id, int MaxLen) +{ + EDIT_Handle hObj; + GUI_USE_PARA(ExFlags); + /* Alloc memory for obj */ + WinFlags |= WM_CF_LATE_CLIP; /* Always use late clipping since widget is optimized for it. */ + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WM_CF_SHOW | WinFlags, EDIT__Callback, + sizeof(EDIT_Obj) - sizeof(WM_Obj)); + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = (EDIT_Obj*)GUI_ALLOC_h2p(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + /* init member variables */ + INIT_ID(pObj); + pObj->Props = EDIT__DefaultProps; + pObj->XSizeCursor = 1; + pObj->MaxLen = (MaxLen == 0) ? 8 : MaxLen; + pObj->BufferSize = 0; + pObj->hpText = 0; + if (_IncrementBuffer(pObj, pObj->MaxLen + 1) == 0) { + GUI_DEBUG_ERROROUT("EDIT_Create failed to alloc buffer"); + EDIT_Delete(hObj); + hObj = 0; + } + WM_UNLOCK(); + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_AddKey +*/ +void EDIT_AddKey(EDIT_Handle hObj, int Key) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj) { + if (pObj->pfAddKeyEx) { + pObj->pfAddKeyEx(hObj, Key); + } else { + switch (Key) { + case GUI_KEY_UP: + if (pObj->hpText) { + char* pText; + U16 Char; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + pText += GUI_UC__NumChars2NumBytes(pText, pObj->CursorPos); + Char = GUI_UC_GetCharCode(pText); + if (Char < 0x7f) { + *pText = Char + 1; + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + } + break; + case GUI_KEY_DOWN: + if (pObj->hpText) { + char* pText; + U16 Char; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + pText += GUI_UC__NumChars2NumBytes(pText, pObj->CursorPos); + Char = GUI_UC_GetCharCode(pText); + if (Char > 0x20) { + *pText = Char - 1; + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + } + break; + case GUI_KEY_RIGHT: + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + break; + case GUI_KEY_LEFT: + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + break; + case GUI_KEY_BACKSPACE: + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + _DeleteChar(hObj, pObj); + break; + case GUI_KEY_DELETE: + _DeleteChar(hObj, pObj); + break; + case GUI_KEY_INSERT: + if (pObj->EditMode == GUI_EDIT_MODE_OVERWRITE) { + pObj->EditMode = GUI_EDIT_MODE_INSERT; + } else { + pObj->EditMode = GUI_EDIT_MODE_OVERWRITE; + EDIT__SetCursorPos(pObj, pObj->CursorPos); + } + break; + case GUI_KEY_ENTER: + case GUI_KEY_ESCAPE: + break; + default: + if (Key >= 0x20) { + if (pObj->EditMode != GUI_EDIT_MODE_INSERT) { + _DeleteChar(hObj, pObj); + } + if (_InsertChar(hObj, pObj, Key)) { + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + } + } + } + } + EDIT_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* EDIT_SetFont +*/ +void EDIT_SetFont(EDIT_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont) { + EDIT_Obj* pObj; + if (hObj == 0) + return; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj) { + pObj->Props.pFont = pfont; + EDIT_Invalidate(hObj); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* EDIT_SetBkColor +*/ +void EDIT_SetBkColor(EDIT_Handle hObj, unsigned int Index, GUI_COLOR color) { + EDIT_Obj* pObj; + if (hObj == 0) + return; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj) { + if (Index < GUI_COUNTOF(pObj->Props.aBkColor)) { + pObj->Props.aBkColor[Index] = color; + EDIT_Invalidate(hObj); + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* EDIT_SetTextColor +*/ +void EDIT_SetTextColor(EDIT_Handle hObj, unsigned int Index, GUI_COLOR color) { + EDIT_Obj* pObj; + if (hObj == 0) + return; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj) { + if (Index < GUI_COUNTOF(pObj->Props.aTextColor)) { + pObj->Props.aTextColor[Index] = color; + EDIT_Invalidate(hObj); + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* EDIT_SetText +*/ +void EDIT_SetText(EDIT_Handle hObj, const char* s) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (s) { + int NumBytesNew, NumBytesOld = 0; + int NumCharsNew; + if (pObj->hpText) { + char* pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + NumBytesOld = strlen(pText) + 1; + } + NumCharsNew = GUI__GetNumChars(s); + if (NumCharsNew > pObj->MaxLen) { + NumCharsNew = pObj->MaxLen; + } + NumBytesNew = GUI_UC__NumChars2NumBytes(s, NumCharsNew) + 1; + if (_IsSpaceInBuffer(pObj, NumBytesNew - NumBytesOld)) { + char* pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + memcpy(pText, s, NumBytesNew); + pObj->CursorPos = NumBytesNew - 1; + if (pObj->CursorPos == pObj->MaxLen) { + if (pObj->EditMode == GUI_EDIT_MODE_OVERWRITE) { + pObj->CursorPos--; + } + } + } + } else { + GUI_ALLOC_FreePtr(&pObj->hpText); + pObj->BufferSize = 0; + pObj->CursorPos = 0; + } + EDIT_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* EDIT_GetText +*/ +void EDIT_GetText(EDIT_Handle hObj, char* sDest, int MaxLen) { + if (sDest) { + *sDest = 0; + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj->hpText) { + char* pText; + int NumChars, NumBytes; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + NumChars = GUI__GetNumChars(pText); + if (NumChars > MaxLen) { + NumChars = MaxLen; + } + NumBytes = GUI_UC__NumChars2NumBytes(pText, NumChars); + memcpy(sDest, pText, NumBytes); + *(sDest + NumBytes) = 0; + } + WM_UNLOCK(); + } + } +} + +/********************************************************************* +* +* EDIT_GetValue +*/ +I32 EDIT_GetValue(EDIT_Handle hObj) { + EDIT_Obj* pObj; + I32 r = 0; + if (hObj) { + WM_LOCK(); + pObj = EDIT_H2P(hObj); + r = pObj->CurrentValue; + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* EDIT_SetValue +*/ +void EDIT_SetValue(EDIT_Handle hObj, I32 Value) { + EDIT_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = EDIT_H2P(hObj); + /* Put in min/max range */ + if (Value < pObj->Min) { + Value = pObj->Min; + } + if (Value > pObj->Max) { + Value = pObj->Max; + } + if (pObj->CurrentValue != (U32)Value) { + pObj->CurrentValue = Value; + if (pObj->pfUpdateBuffer) { + pObj->pfUpdateBuffer(hObj); + } + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* EDIT_SetMaxLen +*/ +void EDIT_SetMaxLen(EDIT_Handle hObj, int MaxLen) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (MaxLen != pObj->MaxLen) { + if (MaxLen < pObj->MaxLen) { + if (pObj->hpText) { + char* pText; + int NumChars; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + NumChars = GUI__GetNumChars(pText); + if (NumChars > MaxLen) { + int NumBytes; + NumBytes = GUI_UC__NumChars2NumBytes(pText, MaxLen); + *(pText + NumBytes) = 0; + } + } + } + _IncrementBuffer(pObj, MaxLen - pObj->BufferSize + 1); + pObj->MaxLen = MaxLen; + EDIT_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* EDIT_SetTextAlign +*/ +void EDIT_SetTextAlign(EDIT_Handle hObj, int Align) { + EDIT_Obj* pObj; + if (hObj == 0) + return; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj) { + pObj->Props.Align = Align; + EDIT_Invalidate(hObj); + } + WM_UNLOCK(); +} + +#else /* avoid empty object files */ + +void Edit_C(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/EDIT.h b/User/system/lib/lcd/gui/Widget/EDIT.h new file mode 100644 index 0000000..18f1122 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT.h @@ -0,0 +1,205 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT.h +Purpose : EDIT include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef EDIT_H +#define EDIT_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Defaults for configuration switches +* +********************************************************************** + +The following are defaults for config switches which affect the +interface specified in this module +*/ + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +/************************************************************ +* +* Create / Status flags +*/ +#define EDIT_CF_LEFT GUI_TA_LEFT +#define EDIT_CF_RIGHT GUI_TA_RIGHT +#define EDIT_CF_HCENTER GUI_TA_HCENTER + +#define EDIT_CF_VCENTER GUI_TA_VCENTER +#define EDIT_CF_TOP GUI_TA_TOP +#define EDIT_CF_BOTTOM GUI_TA_BOTTOM + +/********************************************************************* +* +* Color indices +*/ +#define EDIT_CI_DISABLED 0 +#define EDIT_CI_ENABLED 1 + +/************************************************************ +* +* States +*/ + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ +typedef WM_HMEM EDIT_Handle; +typedef void tEDIT_AddKeyEx (EDIT_Handle hObj, int Key); +typedef void tEDIT_UpdateBuffer(EDIT_Handle hObj); + + +/* + ************************************************************* + * * + * Create function(s) * + * * + * (Constructors) * + * * + ************************************************************* + +*/ +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + + +EDIT_Handle EDIT_Create (int x0, int y0, int xsize, int ysize, int Id, int MaxLen, int Flags); +EDIT_Handle EDIT_CreateAsChild (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int MaxLen); +EDIT_Handle EDIT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +EDIT_Handle EDIT_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, int MaxLen); + +/* + ************************************************************* + * * + * Standard member functions * + * * + ************************************************************* +*/ + +#define EDIT_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define EDIT_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define EDIT_Delete(hObj) WM_DeleteWindow(hObj) +#define EDIT_Paint(hObj) WM_Paint(hObj) +#define EDIT_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/* + ************************************************************* + * * + * Individual member functions * + * * + ************************************************************* + +*/ + +/* Methods changing preferences */ +void EDIT_SetDefaultBkColor(unsigned int Index, GUI_COLOR Color); +void EDIT_SetDefaultFont(const GUI_FONT* pFont); +void EDIT_SetDefaultTextAlign(int Align); +void EDIT_SetDefaultTextColor(unsigned int Index, GUI_COLOR Color); + +/* Query preferences */ +GUI_COLOR EDIT_GetDefaultBkColor(unsigned int Index); +const GUI_FONT GUI_UNI_PTR * EDIT_GetDefaultFont(void); +int EDIT_GetDefaultTextAlign(void); +GUI_COLOR EDIT_GetDefaultTextColor(unsigned int Index); + +/* Methods changing properties */ +void EDIT_AddKey (EDIT_Handle hObj, int Key); +void EDIT_ClearCursor (EDIT_Handle hObj); +void EDIT_SetBkColor (EDIT_Handle hObj, unsigned int Index, GUI_COLOR color); +void EDIT_SetCursorAtChar (EDIT_Handle hObj, int Pos); +void EDIT_SetCursorAtPixel (EDIT_Handle hObj, int xPos); +void EDIT_SetFont (EDIT_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont); +int EDIT_SetInsertMode (EDIT_Handle hObj, int OnOff); +void EDIT_SetMaxLen (EDIT_Handle hObj, int MaxLen); +void EDIT_SetpfAddKeyEx (EDIT_Handle hObj, tEDIT_AddKeyEx * pfAddKeyEx); +void EDIT_SetpfUpdateBuffer(EDIT_Handle hObj, tEDIT_UpdateBuffer * pfUpdateBuffer); +void EDIT_SetText (EDIT_Handle hObj, const char* s); +void EDIT_SetTextAlign (EDIT_Handle hObj, int Align); +void EDIT_SetTextColor (EDIT_Handle hObj, unsigned int Index, GUI_COLOR color); +void EDIT_SetSel (EDIT_Handle hObj, int FirstChar, int LastChar); + +/* Get/Set user input */ +float EDIT_GetFloatValue(EDIT_Handle hObj); +void EDIT_GetText (EDIT_Handle hObj, char* sDest, int MaxLen); +I32 EDIT_GetValue (EDIT_Handle hObj); +void EDIT_SetFloatValue(EDIT_Handle hObj, float Value); +void EDIT_SetValue (EDIT_Handle hObj, I32 Value); +int EDIT_GetNumChars (EDIT_Handle hObj); + +/********************************************************************* +* +* Routines for editing values +* +********************************************************************** +*/ + +void EDIT_SetHexMode(EDIT_Handle hEdit, U32 Value, U32 Min, U32 Max); +void EDIT_SetBinMode(EDIT_Handle hEdit, U32 Value, U32 Min, U32 Max); +void EDIT_SetDecMode(EDIT_Handle hEdit, I32 Value, I32 Min, I32 Max, int Shift, U8 Flags); +void EDIT_SetFloatMode(EDIT_Handle hEdit, float Value, float Min, float Max, int Shift, U8 Flags); + +U32 GUI_EditHex(U32 Value, U32 Min, U32 Max, int Len, int xsize); +U32 GUI_EditBin(U32 Value, U32 Min, U32 Max, int Len, int xsize); +I32 GUI_EditDec(I32 Value, I32 Min, I32 Max, int Len, int xsize, int Shift, U8 Flags); +float GUI_EditFloat(float Value, float Min, float Max, int Len, int xsize, int Shift, U8 Flags); +void GUI_EditString(char * pString, int Len, int xsize); + +/********************************************************************* +* +* Flags +* +********************************************************************** +*/ + +/* Signed or normal mode */ +#define GUI_EDIT_NORMAL 0 +#define GUI_EDIT_SIGNED 1 + +/* Edit modes */ +#define GUI_EDIT_MODE_INSERT 0 +#define GUI_EDIT_MODE_OVERWRITE 1 + +/* Compatibility macros */ +#define EDIT_CI_DISABELD EDIT_CI_DISABLED +#define EDIT_CI_ENABELD EDIT_CI_ENABLED + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ +#endif /* EDIT_H */ diff --git a/User/system/lib/lcd/gui/Widget/EDITBin.c b/User/system/lib/lcd/gui/Widget/EDITBin.c new file mode 100644 index 0000000..2dd1e40 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDITBin.c @@ -0,0 +1,188 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDITBin.c +Purpose : Support for binary editing for widgets +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "EDIT.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Helpers +* +********************************************************************** +*/ +/********************************************************************* +* +* _BinChar2Int +*/ +static int _BinChar2Int(int Char) { + if ((Char >= '0') && (Char <= '1')) + return Char - '0'; + return -1; +} + +/********************************************************************* +* +* _GetNumDigits +*/ +static int _GetNumDigits(U32 Value) { + int Ret; + for (Ret = 0; Value; Value >>= 1, Ret++); + return Ret; +} + +/********************************************************************* +* +* _UpdateBuffer +*/ +static void _UpdateBuffer(EDIT_Handle hObj) { + char * s; + EDIT_Obj * pObj; + pObj = EDIT_H2P(hObj); /* The GUI needs not to be locked here. This function is called only from EDIT_AddKey which has already locked the GUI */ + s = (char*) GUI_ALLOC_h2p(pObj->hpText); + GUI_AddBin(pObj->CurrentValue, pObj->MaxLen, &s); +} + +/********************************************************************* +* +* _EditBin +*/ +static void _EditBin(U8 Bit, EDIT_Obj* pObj, EDIT_Handle hObj) { + int Pos = pObj->MaxLen - pObj->CursorPos - 1; /* Bit position */ + U32 AndMask = ~(1 << Pos); + U32 OrMask = Bit << Pos; + I32 Result = pObj->CurrentValue & AndMask; + Result |= OrMask; + EDIT_SetValue(hObj, Result); +} + +/********************************************************************* +* +* _GetCurrentBit +*/ +static U8 _GetCurrentBit(EDIT_Obj* pObj) { + int Pos = pObj->MaxLen - pObj->CursorPos - 1; /* Bit position */ + U32 AndMask = 1 << Pos; + U8 Bit = (pObj->CurrentValue & AndMask) >> Pos; + return Bit; +} + +/********************************************************************* +* +* Handle input +* +********************************************************************** +*/ +/********************************************************************* +* +* _AddKeyBin +*/ +static void _AddKeyBin(EDIT_Handle hObj, int Key) { + EDIT_Obj * pObj; + pObj = EDIT_H2P(hObj); /* The GUI needs not to be locked here. This function is called only from EDIT_AddKey which has already locked the GUI */ + if (pObj) { + switch (Key) { + case GUI_KEY_UP: + { + int Bit = _GetCurrentBit(pObj) + 1; + if (Bit > 1) { + Bit = 0; + } + _EditBin(Bit, pObj, hObj); + } + break; + case GUI_KEY_DOWN: + { + int Bit = _GetCurrentBit(pObj) - 1; + if (Bit < 0) { + Bit = 1; + } + _EditBin(Bit, pObj, hObj); + } + break; + case GUI_KEY_RIGHT: + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + break; + case GUI_KEY_LEFT: + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + break; + default: + { + int Bit = _BinChar2Int(Key); + if (Bit >= 0) { + _EditBin(Bit, pObj, hObj); + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + } + } + break; + } + _UpdateBuffer(hObj); + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetBinMode +*/ +void EDIT_SetBinMode(EDIT_Handle hEdit, U32 Value, U32 Min, U32 Max) { + EDIT_Obj* pObj; + int MaxLen; + WM_LOCK(); + if (hEdit) { + pObj = EDIT_H2P(hEdit); + pObj->pfAddKeyEx = _AddKeyBin; + pObj->pfUpdateBuffer = _UpdateBuffer; + pObj->CurrentValue = Value; + pObj->CursorPos = 0; + MaxLen = pObj->MaxLen; + if (MaxLen <= 0 ) { + MaxLen = _GetNumDigits(Max); + } + if (MaxLen > 32) { + MaxLen = 32; + } + if (MaxLen != pObj->MaxLen) { + EDIT_SetMaxLen(hEdit, MaxLen); + } + pObj->Min = Min; + pObj->Max = Max; + pObj->EditMode = GUI_EDIT_MODE_OVERWRITE; + _UpdateBuffer(hEdit); + WM_Invalidate(hEdit); + } + WM_UNLOCK(); +} + +#else /* avoid empty object files */ + +void EditBin_C(void); +void EditBin_C(void){} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/EDITDec.c b/User/system/lib/lcd/gui/Widget/EDITDec.c new file mode 100644 index 0000000..b4c6b82 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDITDec.c @@ -0,0 +1,313 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EditDec +Purpose : Edit decimal values +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "EDIT.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Defaults for config switches +* +********************************************************************** +*/ +#ifndef EDIT_DEC_DIGITONLY + #define EDIT_DEC_DIGITONLY 0 +#endif + + +/********************************************************************* +* +* static Helpers +* +********************************************************************** +*/ +/********************************************************************* +* +* _DecChar2Int +*/ +static int _DecChar2Int(int Char) { + if ((Char >= '0') && (Char <= '9')) + return Char - '0'; + return -1; +} + +/********************************************************************* +* +* _UpdateBuffer +*/ +static void _UpdateBuffer(EDIT_Handle hObj) { + char * s; + EDIT_Obj * pObj; + pObj = EDIT_H2P(hObj); /* The GUI needs not to be locked here. This function is called only from EDIT_AddKey which has already locked the GUI */ + s = (char*) GUI_ALLOC_h2p(pObj->hpText); + if (pObj->Flags == GUI_EDIT_SIGNED) { + I32 Result = GUI_AddSign(pObj->CurrentValue, &s); + GUI_AddDecShift(Result, pObj->MaxLen - 1, pObj->NumDecs, &s); + } else { + GUI_AddDecShift(pObj->CurrentValue, pObj->MaxLen, pObj->NumDecs, &s); + } +} + +/********************************************************************* +* +* _EditDec +*/ +static void _EditDec(int Digit, EDIT_Obj* pObj, EDIT_Handle hObj) { + I32 Result = 0; + int i, Pos = 0; + char * s = (char*) GUI_ALLOC_h2p(pObj->hpText); + for (i = 0; i < pObj->MaxLen; i++) { + int Index = pObj->MaxLen - i - 1; + if (Index == pObj->CursorPos) { + Result += GUI_Pow10[Pos++] * Digit; + } else { + char c = *(s + Index); + int Value = _DecChar2Int(c); + if (Value >= 0) { + Result += GUI_Pow10[Pos++] * Value; + } + if (c == '-') { + Result *= -1; + } + } + } + EDIT_SetValue(hObj, Result); +} + +/********************************************************************* +* +* EDIT_DEC_DIGITONLY +*/ +#if EDIT_DEC_DIGITONLY +static int GetCurrentDigit(EDIT_Obj* pObj) { + return _DecChar2Int(EDIT__GetCurrentChar(pObj)); +} +#endif + +/********************************************************************* +* +* _MakePositive +*/ +static void _MakePositive(EDIT_Obj* pObj, EDIT_Handle hObj) { + if ((I32)pObj->CurrentValue < 0) { + EDIT_SetValue(hObj, (I32)pObj->CurrentValue * -1); + } +} + +/********************************************************************* +* +* _MakeNegative +*/ +static void _MakeNegative(EDIT_Obj* pObj, EDIT_Handle hObj) { + if ((I32)pObj->CurrentValue > 0) { + EDIT_SetValue(hObj, (I32)pObj->CurrentValue * -1); + } +} + +/********************************************************************* +* +* _SwapSign +*/ +static void _SwapSign(EDIT_Obj* pObj, EDIT_Handle hObj) { + if ((I32)pObj->CurrentValue > 0) + _MakeNegative(pObj, hObj); + else + _MakePositive(pObj, hObj); +} + +/********************************************************************* +* +* _IncrementCursor +*/ +static void _IncrementCursor(EDIT_Obj* pObj) { + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + if (EDIT__GetCurrentChar(pObj) == '.') { + if (pObj->CursorPos < (pObj->MaxLen - 1)) { + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + } else { + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + } + } +} + +/********************************************************************* +* +* _AddPosition +*/ +#if !EDIT_DEC_DIGITONLY +static void _AddPosition(EDIT_Obj* pObj, EDIT_Handle hObj, int Sign) { + int Pos; + I32 v; + v = Sign; + Pos = pObj->MaxLen - pObj->CursorPos-1; + if (pObj->NumDecs && (Pos > pObj->NumDecs)) { + Pos--; + } + while (Pos--) { + v *= 10; + } + EDIT_SetValue(hObj, (I32)pObj->CurrentValue + v); +} +#endif + +/********************************************************************* +* +* Handle input +* +********************************************************************** +*/ +/********************************************************************* +* +* _AddKeyDec +*/ +static void _AddKeyDec(EDIT_Handle hObj, int Key) { + char c; + EDIT_Obj * pObj; + pObj = EDIT_H2P(hObj); /* The GUI needs not to be locked here. This function is called only from EDIT_AddKey which has already locked the GUI */ + if (pObj) { + switch (Key) { + case '+': + if (pObj->CursorPos == 0) { + _MakePositive(pObj, hObj); + _IncrementCursor(pObj); + } + break; + case '-': + if (pObj->CursorPos == 0) { + _MakeNegative(pObj, hObj); + _IncrementCursor(pObj); + } + break; + #if EDIT_DEC_DIGITONLY + case GUI_KEY_UP: + c = EDIT__GetCurrentChar(pObj); + if ((c == '-') || (c == '+')) { + _SwapSign(pObj, hObj); + } else { + int Digit = GetCurrentDigit(pObj) + 1; + if (Digit > 9) + Digit = 0; + _EditDec(Digit, pObj, hObj); + } + break; + case GUI_KEY_DOWN: + c = EDIT__GetCurrentChar(pObj); + if ((c == '-') || (c == '+')) { + _SwapSign(pObj, hObj); + } else { + int Digit = GetCurrentDigit(pObj) - 1; + if (Digit < 0) + Digit = 9; + _EditDec(Digit, pObj, hObj); + } + break; + #else + case GUI_KEY_UP: + c = EDIT__GetCurrentChar(pObj); + if ((c == '-') || (c == '+')) { + _SwapSign(pObj, hObj); + } else { + _AddPosition(pObj, hObj, 1); + } + break; + case GUI_KEY_DOWN: + c = EDIT__GetCurrentChar(pObj); + if ((c == '-') || (c == '+')) { + _SwapSign(pObj, hObj); + } else { + _AddPosition(pObj, hObj, -1); + } + break; + #endif + case GUI_KEY_RIGHT: + _IncrementCursor(pObj); + break; + case GUI_KEY_LEFT: + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + if (EDIT__GetCurrentChar(pObj) == '.') { + if (pObj->CursorPos > 0) { + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + } else { + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + } + } + break; + default: + { + char c = EDIT__GetCurrentChar(pObj); + if ((c != '-') && (c != '+')) { + int Digit = _DecChar2Int(Key); + if (Digit >= 0) { + _EditDec(Digit, pObj, hObj); + _IncrementCursor(pObj); + } + } + } + break; + } + } + _UpdateBuffer(hObj); +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetDecMode +*/ +void EDIT_SetDecMode(EDIT_Handle hEdit, I32 Value, I32 Min, I32 Max, int Shift, U8 Flags) { + EDIT_Obj* pObj; + WM_LOCK(); + if (hEdit) { + pObj = EDIT_H2P(hEdit); + pObj->pfAddKeyEx = _AddKeyDec; + pObj->pfUpdateBuffer= _UpdateBuffer; + pObj->CurrentValue = Value; + pObj->CursorPos = 0; + pObj->Min = Min; + pObj->Max = Max; + pObj->NumDecs = Shift; + pObj->Flags = Flags; + pObj->EditMode = GUI_EDIT_MODE_OVERWRITE; + _UpdateBuffer(hEdit); + if (EDIT__GetCurrentChar(pObj) == '.') { + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + } + WM_Invalidate(hEdit); + } + WM_UNLOCK(); +} + +#else /* avoid empty object files */ + +void EditDec_C(void); +void EditDec_C(void){} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/EDITFloat.c b/User/system/lib/lcd/gui/Widget/EDITFloat.c new file mode 100644 index 0000000..281f23a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDITFloat.c @@ -0,0 +1,93 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EditDec +Purpose : Edit decimal values +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "EDIT.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetFloatMode +*/ +void EDIT_SetFloatMode(EDIT_Handle hEdit, float Value, float Min, float Max, int Shift, U8 Flags) { + I32 _Value, _Min, _Max; + float Scale; + if (hEdit) { + WM_LOCK(); + Scale =(float)GUI_Pow10[Shift]; + _Value = floor(Scale * Value + 0.5); + _Min = floor(Scale * Min + 0.5); + _Max = floor(Scale * Max + 0.5); + EDIT_SetDecMode(hEdit, _Value, _Min, _Max, Shift, Flags); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* EDIT_GetFloatValue +*/ +float EDIT_GetFloatValue(EDIT_Handle hObj) { + float Value = 0; + if (hObj) { + float Scale; + EDIT_Obj * pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + Scale = (float)GUI_Pow10[pObj->NumDecs]; + Value = (float)(I32)pObj->CurrentValue / Scale; + WM_UNLOCK(); + } + return Value; +} + +/********************************************************************* +* +* EDIT_SetFloatValue +*/ +void EDIT_SetFloatValue(EDIT_Handle hObj, float Value) { + if (hObj) { + float Scale; + EDIT_Obj * pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + Scale = (float)GUI_Pow10[pObj->NumDecs]; + Value *= Scale; + EDIT_SetValue(hObj, (I32)(Value + (Value >= 0 ? 0.5 : -0.5))); + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void EditFloat_C(void); +void EditFloat_C(void){} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/EDITHex.c b/User/system/lib/lcd/gui/Widget/EDITHex.c new file mode 100644 index 0000000..0ab77eb --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDITHex.c @@ -0,0 +1,223 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EditHex +Purpose : Edit hexadecimal values +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "EDIT.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Defaults for config switches +* +********************************************************************** +*/ +#ifndef EDIT_HEX_DIGITONLY + #define EDIT_HEX_DIGITONLY 0 +#endif + +/********************************************************************* +* +* Helpers +* +********************************************************************** +*/ +/********************************************************************* +* +* _HexChar2Int +*/ +static int _HexChar2Int(int Char) { + if ((Char >= '0') && (Char <= '9')) + return Char - '0'; + Char &= ~0x20; + if ((Char >= 'A') && (Char <= 'F')) + return Char - 'A' + 10; + return -1; +} + +/********************************************************************* +* +* _UpdateBuffer +*/ +static void _UpdateBuffer(EDIT_Handle hObj) { + char * s; + EDIT_Obj * pObj; + pObj = EDIT_H2P(hObj); /* The GUI needs not to be locked here. This function is called only from EDIT_AddKey which has already locked the GUI */ + s = (char*) GUI_ALLOC_h2p(pObj->hpText); + GUI_AddHex(pObj->CurrentValue, pObj->MaxLen, &s); +} + +/********************************************************************* +* +* _EditHex +*/ +static void _EditHex(int Nibble, EDIT_Obj* pObj, EDIT_Handle hObj) { + int Pos = pObj->MaxLen - pObj->CursorPos - 1; /* Nibble position */ + U32 AndMask = ~(15 << (Pos << 2)); + U32 OrMask = Nibble << (Pos << 2); + I32 Result = pObj->CurrentValue & AndMask; + Result |= OrMask; + EDIT_SetValue(hObj, Result); +} + +/********************************************************************* +* +* _GetCurrentNibble +*/ +#if EDIT_HEX_DIGITONLY + static U8 _GetCurrentNibble(EDIT_Obj* pObj) { + int Pos = pObj->MaxLen - pObj->CursorPos - 1; /* Nibble position */ + U32 AndMask = 0xf << (Pos << 2); + U8 Nibble = (pObj->CurrentValue & AndMask) >> (Pos << 2); + return Nibble; + } +#endif + +/********************************************************************* +* +* _GetNumDigits +*/ +static int _GetNumDigits(U32 Value) { + int Ret; + for (Ret = 0; Value; Value >>= 4, Ret++); + return Ret; +} + +/********************************************************************* +* +* _AddPosition +*/ +static void _AddPosition(EDIT_Obj* pObj, EDIT_Handle hObj, int Sign) { + int Pos; + U32 v; + v = 1; + Pos = pObj->MaxLen - pObj->CursorPos - 1; + while (Pos--) { + v <<= 4; + } + if (Sign < 0) + v = ~v + 1; + EDIT_SetValue(hObj, pObj->CurrentValue + v); +} + +/********************************************************************* +* +* Handle input +* +********************************************************************** +*/ +/********************************************************************* +* +* _AddKeyHex +*/ +static void _AddKeyHex(EDIT_Handle hObj, int Key) { + EDIT_Obj * pObj; + pObj = EDIT_H2P(hObj); /* The GUI needs not to be locked here. This function is called only from EDIT_AddKey which has already locked the GUI */ + if (pObj) { + switch (Key) { + #if EDIT_HEX_DIGITONLY + case GUI_KEY_UP: + { + int Nibble = (_GetCurrentNibble(pObj) + 1) & 15; + _EditHex(Nibble, pObj, hObj); + } + break; + case GUI_KEY_DOWN: + { + int Nibble = (_GetCurrentNibble(pObj) + 1) & 15; + _EditHex(Nibble, pObj, hObj); + } + break; + #else + case GUI_KEY_UP: + _AddPosition(pObj, hObj, 1); + break; + case GUI_KEY_DOWN: + _AddPosition(pObj, hObj, -1); + break; + #endif + case GUI_KEY_RIGHT: + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + break; + case GUI_KEY_LEFT: + EDIT__SetCursorPos(pObj, pObj->CursorPos - 1); + break; + default: + { + int Nibble = _HexChar2Int(Key); + if (Nibble >= 0) { + _EditHex(Nibble, pObj, hObj); + EDIT__SetCursorPos(pObj, pObj->CursorPos + 1); + } + } + break; + } + } + _UpdateBuffer(hObj); +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetHexMode +*/ +void EDIT_SetHexMode(EDIT_Handle hEdit, U32 Value, U32 Min, U32 Max) { + EDIT_Obj* pObj; + WM_LOCK(); + if (hEdit) { + int MaxLen; + pObj = EDIT_H2P(hEdit); + pObj->pfAddKeyEx = _AddKeyHex; + pObj->pfUpdateBuffer= _UpdateBuffer; + pObj->CurrentValue = Value; + pObj->CursorPos = 0; + MaxLen = pObj->MaxLen; + if (MaxLen <= 0 ) { + MaxLen = _GetNumDigits(Max); + } + if (MaxLen > 8) { + MaxLen = 8; + } + if (MaxLen != pObj->MaxLen) { + EDIT_SetMaxLen(hEdit, MaxLen); + } + pObj->Min = Min; + pObj->Max = Max; + pObj->EditMode = GUI_EDIT_MODE_OVERWRITE; + _UpdateBuffer(hEdit); + WM_Invalidate(hEdit); + } + WM_UNLOCK(); +} + +#else /* avoid empty object files */ + +void EditHex_C(void); +void EditHex_C(void){} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/EDIT_Create.c b/User/system/lib/lcd/gui/Widget/EDIT_Create.c new file mode 100644 index 0000000..7b56096 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_Create.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_Create.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_Create +*/ +EDIT_Handle EDIT_Create(int x0, int y0, int xsize, int ysize, int Id, int MaxLen, int Flags) { + return EDIT_CreateEx(x0, y0, xsize, ysize, WM_HMEM_NULL, Flags, 0, Id, MaxLen); +} + +/********************************************************************* +* +* EDIT_CreateAsChild +*/ +EDIT_Handle EDIT_CreateAsChild(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int MaxLen) { + return EDIT_CreateEx(x0, y0, xsize, ysize, hParent, Flags, 0, Id, MaxLen); +} + +#else /* avoid empty object files */ + void EDIT_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/EDIT_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/EDIT_CreateIndirect.c new file mode 100644 index 0000000..8013390 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_CreateIndirect.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_CreateIndirect.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_CreateIndirect +*/ +EDIT_Handle EDIT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + EDIT_Handle hEdit; + GUI_USE_PARA(cb); + hEdit = EDIT_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id, pCreateInfo->Para); + if (hEdit) { + EDIT_SetTextAlign(hEdit, pCreateInfo->Flags); + } + return hEdit; +} + +#else /* avoid empty object files */ + void EDIT_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/EDIT_Default.c b/User/system/lib/lcd/gui/Widget/EDIT_Default.c new file mode 100644 index 0000000..2b04ed8 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_Default.c @@ -0,0 +1,105 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_Default.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* EDIT_SetDefaultFont +*/ +void EDIT_SetDefaultFont(const GUI_FONT* pFont) { + EDIT__DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* EDIT_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * EDIT_GetDefaultFont(void) { + return EDIT__DefaultProps.pFont; +} + +/********************************************************************* +* +* EDIT_SetDefaultTextAlign +*/ +void EDIT_SetDefaultTextAlign(int Align) { + EDIT__DefaultProps.Align = Align; +} + +/********************************************************************* +* +* EDIT_GetDefaultTextAlign +*/ +int EDIT_GetDefaultTextAlign(void) { + return EDIT__DefaultProps.Align; +} + +/********************************************************************* +* +* EDIT_SetDefaultTextColor +*/ +void EDIT_SetDefaultTextColor(unsigned int Index, GUI_COLOR Color) { + if (Index <= GUI_COUNTOF(EDIT__DefaultProps.aTextColor)) { + EDIT__DefaultProps.aTextColor[Index] = Color; + } +} + +/********************************************************************* +* +* EDIT_SetDefaultBkColor +*/ +void EDIT_SetDefaultBkColor(unsigned int Index, GUI_COLOR Color) { + if (Index <= GUI_COUNTOF(EDIT__DefaultProps.aBkColor)) { + EDIT__DefaultProps.aBkColor[Index] = Color; + } +} + +/********************************************************************* +* +* EDIT_GetDefaultTextColor +*/ +GUI_COLOR EDIT_GetDefaultTextColor(unsigned int Index) { + GUI_COLOR Color = 0; + if (Index <= GUI_COUNTOF(EDIT__DefaultProps.aTextColor)) { + Color = EDIT__DefaultProps.aTextColor[Index]; + } + return Color; +} + +/********************************************************************* +* +* EDIT_GetDefaultBkColor +*/ +GUI_COLOR EDIT_GetDefaultBkColor(unsigned int Index) { + GUI_COLOR Color = 0; + if (Index <= GUI_COUNTOF(EDIT__DefaultProps.aBkColor)) { + Color = EDIT__DefaultProps.aBkColor[Index]; + } + return Color; +} + +#else /* avoid empty object files */ + +void EDIT_Default_C(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/EDIT_GetNumChars.c b/User/system/lib/lcd/gui/Widget/EDIT_GetNumChars.c new file mode 100644 index 0000000..3f9e47d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_GetNumChars.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_GetNumChars.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_GetNumChars +*/ +int EDIT_GetNumChars(EDIT_Handle hObj) { + int NumChars = 0; + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (pObj->hpText) { + char * pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + NumChars = GUI__GetNumChars(pText); + } + WM_UNLOCK(); + } + return NumChars; +} + +#else /* avoid empty object files */ + +void EDIT_GetNumChars_C(void); +void EDIT_GetNumChars_C(void) {} + +#endif /* GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/EDIT_Private.h b/User/system/lib/lcd/gui/Widget/EDIT_Private.h new file mode 100644 index 0000000..9ba1546 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_Private.h @@ -0,0 +1,99 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_Private.h +Purpose : Internal header file +---------------------------END-OF-HEADER------------------------------ +*/ + + +#if GUI_WINSUPPORT + +#include "WIDGET.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define EDIT_REALLOC_SIZE 16 + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct EDIT_Obj_struct EDIT_Obj; + +typedef struct { + int Align; + int Border; + const GUI_FONT GUI_UNI_PTR * pFont; + GUI_COLOR aTextColor[2]; + GUI_COLOR aBkColor[2]; +} EDIT_PROPS; + +struct EDIT_Obj_struct { + WIDGET Widget; + WM_HMEM hpText; + I16 MaxLen; + U16 BufferSize; + I32 Min, Max; /* Min max values as normalized floats (integers) */ + U8 NumDecs; /* Number of decimals */ + U32 CurrentValue; /* Current value */ + int CursorPos; /* Cursor position. 0 means left most */ + unsigned SelSize; /* Number of selected characters */ + U8 EditMode; /* Insert or overwrite mode */ + U8 XSizeCursor; /* Size of cursor when working in insert mode */ + U8 Flags; + tEDIT_AddKeyEx * pfAddKeyEx; /* Handle key input */ + tEDIT_UpdateBuffer * pfUpdateBuffer; /* Update textbuffer */ + EDIT_PROPS Props; + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + int DebugId; + #endif + int CurrsorShow; //houhh 20061022... +}; + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + EDIT_Obj* EDIT_h2p(EDIT_Handle h); + #define EDIT_H2P(h) EDIT_h2p(h) +#else + #define EDIT_H2P(h) ((EDIT_Obj*)GUI_ALLOC_h2p(h)) +#endif + +/********************************************************************* +* +* Public data (internal defaults) +* +********************************************************************** +*/ + +extern EDIT_PROPS EDIT__DefaultProps; + +/********************************************************************* +* +* Public functions (internal) +* +********************************************************************** +*/ + +void EDIT__SetCursorPos (EDIT_Obj* pObj, int CursorPos); +U16 EDIT__GetCurrentChar (EDIT_Obj* pObj); + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/EDIT_SetCursorAtChar.c b/User/system/lib/lcd/gui/Widget/EDIT_SetCursorAtChar.c new file mode 100644 index 0000000..5ae0917 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_SetCursorAtChar.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_SetCursorAtChar.c +Purpose : Implementation of EDIT_SetCursorAtChar +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "EDIT.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetCursorAtChar +*/ +void EDIT_SetCursorAtChar(EDIT_Handle hObj, int Pos) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + EDIT__SetCursorPos(pObj, Pos); + EDIT_Invalidate(hObj); + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void EDIT_SetCursorAtChar_C(void); +void EDIT_SetCursorAtChar_C(void){} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/EDIT_SetInsertMode.c b/User/system/lib/lcd/gui/Widget/EDIT_SetInsertMode.c new file mode 100644 index 0000000..72a6e77 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_SetInsertMode.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_SetInsertMode.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetInsertMode +*/ +int EDIT_SetInsertMode(EDIT_Handle hObj, int OnOff) { + int PrevMode = 0; + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + PrevMode = pObj->EditMode; + pObj->EditMode = OnOff ? GUI_EDIT_MODE_INSERT : GUI_EDIT_MODE_OVERWRITE; + WM_UNLOCK(); + } + return PrevMode; +} + +#else /* avoid empty object files */ + +void EDIT_SetInsertMode_C(void); +void EDIT_SetInsertMode_C(void) {} + +#endif /* GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/EDIT_SetSel.c b/User/system/lib/lcd/gui/Widget/EDIT_SetSel.c new file mode 100644 index 0000000..ef6ee42 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_SetSel.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_SetSel.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetSel +*/ +void EDIT_SetSel(EDIT_Handle hObj, int FirstChar, int LastChar) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + if (FirstChar == -1) { + pObj->SelSize = 0; + } else { + if (FirstChar > (pObj->BufferSize - 1)) { + FirstChar = pObj->BufferSize - 1; + } + if (LastChar > (pObj->BufferSize - 1)) { + LastChar = pObj->BufferSize - 1; + } + if (LastChar == -1) { + LastChar = EDIT_GetNumChars(hObj); + } + if (LastChar >= FirstChar) { + pObj->CursorPos = FirstChar; + pObj->SelSize = LastChar - FirstChar + 1; + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void EDIT_SetSel_C(void); +void EDIT_SetSel_C(void) {} + +#endif /* GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/EDIT_SetpfAddKeyEx.c b/User/system/lib/lcd/gui/Widget/EDIT_SetpfAddKeyEx.c new file mode 100644 index 0000000..14ddd95 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_SetpfAddKeyEx.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_SetpfAddKeyEx.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetpfAddKeyEx +*/ +void EDIT_SetpfAddKeyEx(EDIT_Handle hObj, tEDIT_AddKeyEx * pfAddKeyEx) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + pObj->pfAddKeyEx = pfAddKeyEx; + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void EDIT_SetpfAddKeyEx_C(void); +void EDIT_SetpfAddKeyEx_C(void) {} + +#endif /* GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/EDIT_SetpfUpdateBuffer.c b/User/system/lib/lcd/gui/Widget/EDIT_SetpfUpdateBuffer.c new file mode 100644 index 0000000..f0aab27 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/EDIT_SetpfUpdateBuffer.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : EDIT_SetpfUpdateBuffer.c +Purpose : Implementation of edit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "EDIT.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* EDIT_SetpfUpdateBuffer +*/ +void EDIT_SetpfUpdateBuffer(EDIT_Handle hObj, tEDIT_UpdateBuffer * pfUpdateBuffer) { + if (hObj) { + EDIT_Obj* pObj; + WM_LOCK(); + pObj = EDIT_H2P(hObj); + pObj->pfUpdateBuffer = pfUpdateBuffer; + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void EDIT_SetpfUpdateBuffer_C(void); +void EDIT_SetpfUpdateBuffer_C(void) {} + +#endif /* GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN.c new file mode 100644 index 0000000..ebd266a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN.c @@ -0,0 +1,621 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN.c +Purpose : Implementation of framewindow widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/****************************************************************** +* +* Config defaults +* +******************************************************************* +*/ + +/* Support for 3D effects */ +#ifndef FRAMEWIN_CLIENTCOLOR_DEFAULT + #define FRAMEWIN_CLIENTCOLOR_DEFAULT 0xc0c0c0 +#endif + +/* Default for top frame size */ +#ifndef FRAMEWIN_TITLEHEIGHT_DEFAULT + #define FRAMEWIN_TITLEHEIGHT_DEFAULT 0 +#endif + +/* Default for left/right/top/bottom frame size */ +#ifndef FRAMEWIN_BORDER_DEFAULT + #define FRAMEWIN_BORDER_DEFAULT 3 +#endif + +/* Default for inner frame size */ +#ifndef FRAMEWIN_IBORDER_DEFAULT + #define FRAMEWIN_IBORDER_DEFAULT 1 +#endif + +/* Default font */ +#ifndef FRAMEWIN_DEFAULT_FONT + #define FRAMEWIN_DEFAULT_FONT &GUI_Font8_1 +#endif + +/* Default barcolor when framewin is active */ +#ifndef FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT + #define FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT 0xFF0000 +#endif + +/* Default barcolor when framewin is inactive */ +#ifndef FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT + #define FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT 0x404040 +#endif + +/* Default framecolor */ +#ifndef FRAMEWIN_FRAMECOLOR_DEFAULT + #define FRAMEWIN_FRAMECOLOR_DEFAULT 0xAAAAAA +#endif + +/* Default textcolor when framewin is active */ +#ifndef FRAMEWIN_TEXTCOLOR0_DEFAULT + #define FRAMEWIN_TEXTCOLOR0_DEFAULT GUI_WHITE +#endif + +/* Default textcolor when framewin is inactive */ +#ifndef FRAMEWIN_TEXTCOLOR1_DEFAULT + #define FRAMEWIN_TEXTCOLOR1_DEFAULT GUI_WHITE +#endif + +/********************************************************************* +* +* public data, defaults (internal use only) +* +********************************************************************** +*/ + +FRAMEWIN_PROPS FRAMEWIN__DefaultProps = { + FRAMEWIN_DEFAULT_FONT, + FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT, + FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT, + FRAMEWIN_TEXTCOLOR0_DEFAULT, + FRAMEWIN_TEXTCOLOR1_DEFAULT, + FRAMEWIN_CLIENTCOLOR_DEFAULT, + FRAMEWIN_TITLEHEIGHT_DEFAULT, + FRAMEWIN_BORDER_DEFAULT, + FRAMEWIN_IBORDER_DEFAULT +}; + +/********************************************************************* +* +* static data +* +********************************************************************** +*/ + +static I16 FRAMEWIN__MinVisibility = 5; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* _SetActive +*/ +static void _SetActive(FRAMEWIN_Handle hObj, int State) { + FRAMEWIN_Obj* pObj; + pObj = FRAMEWIN_H2P(hObj); + if (State && !(pObj->Flags & FRAMEWIN_SF_ACTIVE)) { + pObj->Flags |= FRAMEWIN_CF_ACTIVE; + FRAMEWIN_Invalidate(hObj); + } else if (!State && (pObj->Flags & FRAMEWIN_SF_ACTIVE)) { + pObj->Flags &= ~FRAMEWIN_CF_ACTIVE; + FRAMEWIN_Invalidate(hObj); + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(FRAMEWIN_Handle hWin, FRAMEWIN_Obj* pObj, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState; + pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + if (!(pObj->Flags & FRAMEWIN_SF_ACTIVE)) { + WM_SetFocus(hWin); + } + WM_BringToTop(hWin); + if (pObj->Flags & FRAMEWIN_SF_MOVEABLE) { + WM_SetCaptureMove(hWin, pState, FRAMEWIN__MinVisibility); + } + } + } +} + +/********************************************************************* +* +* _Paint (Frame) +* +*/ +static void _Paint(FRAMEWIN_Obj* pObj) { + WM_HWIN hWin = WM_GetActiveWindow(); + const char* pText = NULL; + int xsize = WM_GetWindowSizeX(hWin); + int ysize = WM_GetWindowSizeY(hWin); + int BorderSize = pObj->Props.BorderSize; + int y0, Index; + POSITIONS Pos; + GUI_RECT r, rText; + + /* Perform computations */ + FRAMEWIN__CalcPositions(pObj, &Pos); + Index = (pObj->Flags & FRAMEWIN_SF_ACTIVE) ? 1 : 0; + + if (pObj->hText) { + pText = (const char*) GUI_ALLOC_h2p(pObj->hText); + } + r.x0 = Pos.rClient.x0; + r.x1 = Pos.rClient.x1; + r.y0 = Pos.rTitleText.y0; + r.y1 = Pos.rTitleText.y1; + Pos.rTitleText.y0++; + Pos.rTitleText.x0++; + Pos.rTitleText.x1--; + GUI_SetFont(pObj->Props.pFont); + GUI__CalcTextRect(pText, &Pos.rTitleText, &rText, pObj->TextAlign); + y0 = Pos.TitleHeight + BorderSize; + + /* Perform drawing operations */ + WM_ITERATE_START(NULL) { + /* Draw Title */ + LCD_SetBkColor(pObj->Props.aBarColor[Index]); + LCD_SetColor(pObj->Props.aTextColor[Index]); + WIDGET__FillStringInRect(pText, &r, &Pos.rTitleText, &rText); + /* Draw Frame */ + LCD_SetColor(FRAMEWIN_FRAMECOLOR_DEFAULT); + GUI_FillRect(0, 0, xsize-1, BorderSize-1); + GUI_FillRect(0, 0, Pos.rClient.x0-1, ysize-1); + GUI_FillRect(Pos.rClient.x1+1, 0, xsize-1, ysize-1); + GUI_FillRect(0, Pos.rClient.y1+1, xsize-1, ysize-1); + GUI_FillRect(0, y0, xsize - 1, y0 + pObj->Props.IBorderSize - 1); + /* Draw the 3D effect (if configured) */ + if (pObj->Props.BorderSize >= 2) { + WIDGET_EFFECT_3D_DrawUp(); /* pObj->Widget.pEffect->pfDrawUp(); */ + } + + } WM_ITERATE_END(); + + +} + +/********************************************************************* +* +* _OnChildHasFocus +* +* Function: +* A child has received or lost the focus. +* The basic idea is to make sure the framewindow is active if a +* descendant has the focus. +* If the focus travels from one desc. to an other, there is no need +* to make the framewindow inactive and active again. +* Avoiding this complicates the code a litlle, but avoids flicker +* and waste of CPU load. +* +*/ +static void _OnChildHasFocus(FRAMEWIN_Handle hWin, FRAMEWIN_Obj* pObj, WM_MESSAGE *pMsg) { + if (pMsg->Data.p) { + const WM_NOTIFY_CHILD_HAS_FOCUS_INFO * pInfo = (const WM_NOTIFY_CHILD_HAS_FOCUS_INFO *)pMsg->Data.p; + int IsDesc = WM__IsAncestorOrSelf(pInfo->hNew, hWin); + if (IsDesc) { /* A child has received the focus, Framewindow needs to be activated */ + _SetActive(hWin, 1); + } else { /* A child has lost the focus, we need to deactivate */ + _SetActive(hWin, 0); + /* Remember the child which had the focus so we can reactive this child */ + if (WM__IsAncestor(pInfo->hOld, hWin)) { + pObj->hFocussedChild = pInfo->hOld; + } + } + } +} + +/********************************************************************* +* +* Framewin Callback +*/ +static void _FRAMEWIN_Callback (WM_MESSAGE *pMsg) { + FRAMEWIN_Handle hWin = (FRAMEWIN_Handle)(pMsg->hWin); + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hWin); + GUI_RECT* pRect = (GUI_RECT*)(pMsg->Data.p); + POSITIONS Pos; + GUI_HOOK* pHook; + /* Call hook functions */ + for (pHook = pObj->pFirstHook; pHook; pHook = pHook->pNext) { + int r; + r = (*pHook->pHookFunc)(pMsg); + if (r) { + return; /* Message handled */ + } + } + switch (pMsg->MsgId) { + case WM_HANDLE_DIALOG_STATUS: + if (pMsg->Data.p) { /* set pointer to Dialog status */ + pObj->pDialogStatus = (WM_DIALOG_STATUS*)pMsg->Data.p; + } else { /* return pointer to Dialog status */ + pMsg->Data.p = pObj->pDialogStatus; + } + return; + case WM_PAINT: + _Paint(pObj); + break; + case WM_TOUCH: + _OnTouch(hWin, pObj, pMsg); + return; /* Return here ... Message handled */ + case WM_GET_INSIDE_RECT: + FRAMEWIN__CalcPositions(pObj, &Pos); + *pRect = Pos.rClient; + return; /* Return here ... Message handled */ + case WM_GET_CLIENT_WINDOW: /* return handle to client window. For most windows, there is no seperate client window, so it is the same handle */ + pMsg->Data.v = (int)pObj->hClient; + return; /* Return here ... Message handled */ + case WM_NOTIFY_PARENT: + if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) { + WM_MESSAGE Msg; + Msg.hWinSrc = hWin; + Msg.Data = pMsg->Data; + Msg.MsgId = WM_NOTIFY_PARENT_REFLECTION; + WM_SendMessage(pMsg->hWinSrc, &Msg); + } + return; + case WM_SET_FOCUS: /* We have received or lost focus */ + if (pMsg->Data.v == 1) { + if (WM_IsWindow(pObj->hFocussedChild)) { + WM_SetFocus(pObj->hFocussedChild); + } else { + pObj->hFocussedChild = WM_SetFocusOnNextChild(pObj->hClient); + } + FRAMEWIN_SetActive(hWin, 1); + pMsg->Data.v = 0; /* Focus could be accepted */ + } else { + FRAMEWIN_SetActive(hWin, 0); + } + return; + case WM_TOUCH_CHILD: + /* If a child of this framewindow has been touched and the frame window was not active, + the framewindow will receive the focus. + */ + if (!(pObj->Flags & FRAMEWIN_SF_ACTIVE)) { + const WM_MESSAGE * pMsgOrg; + const GUI_PID_STATE * pState; + pMsgOrg = (const WM_MESSAGE*)pMsg->Data.p; /* The original touch message */ + pState = (const GUI_PID_STATE*)pMsgOrg->Data.p; + if (pState) { /* Message may not have a valid pointer (moved out) ! */ + if (pState->Pressed) { + WM_SetFocus(hWin); + } + } + } + break; + case WM_NOTIFY_CHILD_HAS_FOCUS: + _OnChildHasFocus(hWin, pObj, pMsg); + break; + case WM_DELETE: + GUI_DEBUG_LOG("FRAMEWIN: _FRAMEWIN_Callback(WM_DELETE)\n"); + GUI_ALLOC_FreePtr(&pObj->hText); + break; + } + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hWin, pMsg) == 0) { + return; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Client Callback +*/ +static void FRAMEWIN__cbClient(WM_MESSAGE* pMsg) { + WM_HWIN hWin = pMsg->hWin; + WM_HWIN hParent = WM_GetParent(pMsg->hWin); + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hParent); + WM_CALLBACK* cb = pObj->cb; + switch (pMsg->MsgId) { + case WM_PAINT: + if (pObj->Props.ClientColor != GUI_INVALID_COLOR) { + LCD_SetBkColor(pObj->Props.ClientColor); + GUI_Clear(); + } + /* Give the user callback a chance to draw. + * Note that we can not run into the bottom part, as this passes the parents handle + */ + if (cb) { + WM_MESSAGE Msg; + Msg = *pMsg; + Msg.hWin = hWin; + (*cb)(&Msg); + } + return; + case WM_SET_FOCUS: + if (pMsg->Data.v) { /* Focus received */ + if (pObj->hFocussedChild && (pObj->hFocussedChild != hWin)) { + WM_SetFocus(pObj->hFocussedChild); + } else { + pObj->hFocussedChild = WM_SetFocusOnNextChild(hWin); + } + pMsg->Data.v = 0; /* Focus change accepted */ + } + return; + case WM_GET_ACCEPT_FOCUS: + WIDGET_HandleActive(hParent, pMsg); + return; + case WM_KEY: + if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt > 0) { + int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + switch (Key) { + case GUI_KEY_TAB: + pObj->hFocussedChild = WM_SetFocusOnNextChild(hWin); + return; + } + } + break; /* Send to parent by not doing anything */ + case WM_GET_BKCOLOR: + pMsg->Data.Color = pObj->Props.ClientColor; + return; /* Message handled */ + case WM_GET_INSIDE_RECT: /* This should not be passed to parent ... (We do not want parents coordinates)*/ + case WM_GET_ID: /* This should not be passed to parent ... (Possible recursion problem)*/ + case WM_GET_CLIENT_WINDOW: /* return handle to client window. For most windows, there is no seperate client window, so it is the same handle */ + WM_DefaultProc(pMsg); + return; /* We are done ! */ + } + /* Call user callback. Note that the user callback gets the handle of the Framewindow itself, NOT the Client. */ + if (cb) { + pMsg->hWin = hParent; + (*cb)(pMsg); + } else { + WM_DefaultProc(pMsg); + } +} + +/********************************************************************* +* +* Exported module-internal routines: +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN__CalcTitleHeight +*/ +int FRAMEWIN__CalcTitleHeight(FRAMEWIN_Obj* pObj) { + int r = 0; + if (pObj->Widget.State & FRAMEWIN_SF_TITLEVIS) { + r = pObj->Props.TitleHeight; + if (r == 0) { + r = 2 + GUI_GetYSizeOfFont(pObj->Props.pFont); + } + } + return r; +} + +/********************************************************************* +* +* FRAMEWIN__CalcPositions +*/ +void FRAMEWIN__CalcPositions(FRAMEWIN_Obj* pObj, POSITIONS* pPos) { + WM_HWIN hChild; + WM_Obj* pChild; + int TitleHeight; + int MenuHeight = 0; + int IBorderSize = 0; + int BorderSize; + int xsize, ysize; + int x0, x1, y0; + BorderSize = pObj->Props.BorderSize; + xsize = WM__GetWindowSizeX(&pObj->Widget.Win); + ysize = WM__GetWindowSizeY(&pObj->Widget.Win); + if (pObj->Widget.State & FRAMEWIN_SF_TITLEVIS) { + IBorderSize = pObj->Props.IBorderSize; + } + TitleHeight = FRAMEWIN__CalcTitleHeight(pObj); + if (pObj->hMenu) { + MenuHeight = WM_GetWindowSizeY(pObj->hMenu); + } + pPos->TitleHeight = TitleHeight; + pPos->MenuHeight = MenuHeight; + /* Set object properties accordingly */ + pPos->rClient.x0 = BorderSize; + pPos->rClient.x1 = xsize - BorderSize - 1; + pPos->rClient.y0 = BorderSize + IBorderSize + TitleHeight + MenuHeight; + pPos->rClient.y1 = ysize - BorderSize - 1; + /* Calculate title rect */ + pPos->rTitleText.x0 = BorderSize; + pPos->rTitleText.x1 = xsize - BorderSize - 1; + pPos->rTitleText.y0 = BorderSize; + pPos->rTitleText.y1 = BorderSize + TitleHeight - 1; + /* Iterate over all children */ + for (hChild = pObj->Widget.Win.hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + x0 = pChild->Rect.x0 - pObj->Widget.Win.Rect.x0; + x1 = pChild->Rect.x1 - pObj->Widget.Win.Rect.x0; + y0 = pChild->Rect.y0 - pObj->Widget.Win.Rect.y0; + if (y0 == BorderSize) { + if (pChild->Status & WM_SF_ANCHOR_RIGHT) { + if (x0 <= pPos->rTitleText.x1) { + pPos->rTitleText.x1 = x0 - 1; + } + } else { + if (x1 >= pPos->rTitleText.x0) { + pPos->rTitleText.x0 = x1 + 1; + } + } + } + } +} + +/********************************************************************* +* +* FRAMEWIN__UpdatePositions +*/ +void FRAMEWIN__UpdatePositions(FRAMEWIN_Obj* pObj) { + /* Move client window accordingly */ + if (pObj->hClient || pObj->hMenu) { + POSITIONS Pos; + FRAMEWIN__CalcPositions(pObj, &Pos); + if (pObj->hClient) { + WM_MoveChildTo(pObj->hClient, Pos.rClient.x0, Pos.rClient.y0); + WM_SetSize(pObj->hClient, + Pos.rClient.x1 - Pos.rClient.x0 + 1, + Pos.rClient.y1 - Pos.rClient.y0 + 1); + } + if (pObj->hMenu) { + WM_MoveChildTo(pObj->hMenu, Pos.rClient.x0, Pos.rClient.y0 - Pos.MenuHeight); + } + } +} + +/********************************************************************* +* +* Exported API routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_CreateEx +*/ +FRAMEWIN_Handle FRAMEWIN_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, const char* pTitle, WM_CALLBACK* cb) +{ + FRAMEWIN_Handle hObj; + /* Create the window */ + WinFlags |= WM_CF_LATE_CLIP; /* Always use late clipping since widget is optimized for it. */ + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _FRAMEWIN_Callback, + sizeof(FRAMEWIN_Obj) - sizeof(WM_Obj)); + if (hObj) { + FRAMEWIN_Obj* pObj; + POSITIONS Pos; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE | FRAMEWIN_SF_TITLEVIS); + /* init member variables */ + pObj->Props = FRAMEWIN__DefaultProps; + pObj->TextAlign = GUI_TA_LEFT; + pObj->cb = cb; + pObj->Flags = ExFlags; + pObj->hFocussedChild = 0; + pObj->hMenu = 0; + pObj->pFirstHook = NULL; + FRAMEWIN__CalcPositions(pObj, &Pos); + pObj->hClient = WM_CreateWindowAsChild(Pos.rClient.x0,Pos.rClient.y0, + Pos.rClient.x1 - Pos.rClient.x0 +1, + Pos.rClient.y1 - Pos.rClient.y0 +1, + hObj, + WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_TOP | WM_CF_ANCHOR_BOTTOM | WM_CF_SHOW | WM_CF_LATE_CLIP, + FRAMEWIN__cbClient, 0); + /* Normally we disable memory devices for the frame window: + * The frame window does not flicker, and not using memory devices is usually faster. + * You can still use memory by explicitly specifying the flag + */ + if ((WinFlags & (WM_CF_MEMDEV | (WM_CF_MEMDEV_ON_REDRAW))) == 0) { + WM_DisableMemdev(hObj); + } + FRAMEWIN_SetText(hObj, pTitle); + GUI_UNLOCK(); + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Set Properties +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_SetText +*/ +void FRAMEWIN_SetText(FRAMEWIN_Handle hObj, const char* s) { + if (hObj) { + FRAMEWIN_Obj* pObj; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (GUI__SetText(&pObj->hText, s)) { + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_SetTextAlign +*/ +void FRAMEWIN_SetTextAlign(FRAMEWIN_Handle hObj, int Align) { + if (hObj) { + FRAMEWIN_Obj* pObj; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (pObj->TextAlign != Align) { + pObj->TextAlign = Align; + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_SetMoveable +*/ +void FRAMEWIN_SetMoveable(FRAMEWIN_Handle hObj, int State) { + if (hObj) { + FRAMEWIN_Obj* pObj; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (State) { + pObj->Flags |= FRAMEWIN_CF_MOVEABLE; + } else { + pObj->Flags &= ~FRAMEWIN_CF_MOVEABLE; + } + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_SetActive +*/ +void FRAMEWIN_SetActive(FRAMEWIN_Handle hObj, int State) { + if (hObj) { + WM_LOCK(); + _SetActive(hObj, State); + WM_UNLOCK(); + } +} + +#else + void WIDGET_FrameWin(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN.h b/User/system/lib/lcd/gui/Widget/FRAMEWIN.h new file mode 100644 index 0000000..0868d2e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN.h @@ -0,0 +1,173 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN.h +Purpose : Frame window include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef FRAMEWIN_H +#define FRAMEWIN_H + +#include "WM.h" +#if GUI_WINSUPPORT +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/************************************************************ +* +* #defines +* +************************************************************* +*/ +/************************************************************ +* +* Create / Status flags +*/ +#define FRAMEWIN_CF_ACTIVE (1<<3) +#define FRAMEWIN_CF_MOVEABLE (1<<4) +#define FRAMEWIN_CF_TITLEVIS (1<<5) +#define FRAMEWIN_CF_MINIMIZED (1<<6) +#define FRAMEWIN_CF_MAXIMIZED (1<<7) + +#define FRAMEWIN_SF_ACTIVE FRAMEWIN_CF_ACTIVE +#define FRAMEWIN_SF_MOVEABLE FRAMEWIN_CF_MOVEABLE +#define FRAMEWIN_SF_TITLEVIS FRAMEWIN_CF_TITLEVIS +#define FRAMEWIN_SF_MINIMIZED FRAMEWIN_CF_MINIMIZED +#define FRAMEWIN_SF_MAXIMIZED FRAMEWIN_CF_MAXIMIZED + +/************************************************************ +* +* BUTTON Flags +*/ + +#define FRAMEWIN_BUTTON_RIGHT (1<<0) +#define FRAMEWIN_BUTTON_LEFT (1<<1) + +/************************************************************ +* * +* Types * +* * +************************************************************* +*/ + +typedef WM_HMEM FRAMEWIN_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ +FRAMEWIN_Handle FRAMEWIN_Create (const char* pTitle, WM_CALLBACK* cb, int Flags, int x0, int y0, int xsize, int ysize); +FRAMEWIN_Handle FRAMEWIN_CreateAsChild (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, const char* pText, WM_CALLBACK* cb, int Flags); +FRAMEWIN_Handle FRAMEWIN_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +FRAMEWIN_Handle FRAMEWIN_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, const char* pTitle, WM_CALLBACK* cb); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define FRAMEWIN_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define FRAMEWIN_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define FRAMEWIN_Delete(hObj) WM_DeleteWindow(hObj) +#define FRAMEWIN_Paint(hObj) WM_Paint(hObj) +#define FRAMEWIN_Invalidate(hObj) WM_InvalidateWindow(hObj) + +WM_HWIN FRAMEWIN_AddButton (FRAMEWIN_Handle hObj, int Flags, int Off, int Id); +WM_HWIN FRAMEWIN_AddCloseButton(FRAMEWIN_Handle hObj, int Flags, int Off); +WM_HWIN FRAMEWIN_AddMaxButton (FRAMEWIN_Handle hObj, int Flags, int Off); +void FRAMEWIN_AddMenu (FRAMEWIN_Handle hObj, WM_HWIN hMenu); +WM_HWIN FRAMEWIN_AddMinButton (FRAMEWIN_Handle hObj, int Flags, int Off); + +void FRAMEWIN_Minimize (FRAMEWIN_Handle hObj); +void FRAMEWIN_Maximize (FRAMEWIN_Handle hObj); +void FRAMEWIN_Restore (FRAMEWIN_Handle hObj); + +/********************************************************************* +* +* Member functions: Set Properties +* +********************************************************************** +*/ +void FRAMEWIN_SetActive (FRAMEWIN_Handle hObj, int State); +void FRAMEWIN_SetBarColor (FRAMEWIN_Handle hObj, unsigned Index, GUI_COLOR Color); +void FRAMEWIN_SetBorderSize (FRAMEWIN_Handle hObj, unsigned Size); +void FRAMEWIN_SetClientColor (FRAMEWIN_Handle hObj, GUI_COLOR Color); +void FRAMEWIN_SetFont (FRAMEWIN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont); +void FRAMEWIN_SetMoveable (FRAMEWIN_Handle hObj, int State); +void FRAMEWIN_SetResizeable (FRAMEWIN_Handle hObj, int State); +void FRAMEWIN_SetText (FRAMEWIN_Handle hObj, const char* s); +void FRAMEWIN_SetTextAlign (FRAMEWIN_Handle hObj, int Align); +void FRAMEWIN_SetTextColor (FRAMEWIN_Handle hObj, GUI_COLOR Color); +void FRAMEWIN_SetTextColorEx (FRAMEWIN_Handle hObj, unsigned Index, GUI_COLOR Color); +void FRAMEWIN_SetTitleVis (FRAMEWIN_Handle hObj, int Show); +int FRAMEWIN_SetTitleHeight (FRAMEWIN_Handle hObj, int Height); + +/********************************************************************* +* +* Member functions: Get Properties +* +********************************************************************** +*/ +int FRAMEWIN_GetTitleHeight (FRAMEWIN_Handle hObj); +int FRAMEWIN_GetBorderSize (FRAMEWIN_Handle hObj); +int FRAMEWIN_IsMinimized (FRAMEWIN_Handle hObj); +int FRAMEWIN_IsMaximized (FRAMEWIN_Handle hObj); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ +GUI_COLOR FRAMEWIN_GetDefaultBarColor (unsigned Index); +int FRAMEWIN_GetDefaultBorderSize (void); +int FRAMEWIN_GetDefaultTitleHeight(void); +GUI_COLOR FRAMEWIN_GetDefaultClientColor(void); +const GUI_FONT GUI_UNI_PTR * FRAMEWIN_GetDefaultFont (void); +GUI_COLOR FRAMEWIN_GetDefaultTextColor (unsigned Index); +void FRAMEWIN_SetDefaultBarColor (unsigned Index, GUI_COLOR Color); +void FRAMEWIN_SetDefaultBorderSize (int DefaultBorderSize); +void FRAMEWIN_SetDefaultTitleHeight(int DefaultTitleHeight); +void FRAMEWIN_SetDefaultClientColor(GUI_COLOR Color); +void FRAMEWIN_SetDefaultFont (const GUI_FONT GUI_UNI_PTR * pFont); +void FRAMEWIN_SetDefaultTextColor (unsigned Index, GUI_COLOR Color); + +/********************************************************************* +* +* Macros for compatibility +* +********************************************************************** +*/ +#define FRAMEWIN_SetDefaultCaptionSize(Height) FRAMEWIN_SetDefaultTitleHeight(Height) +#define FRAMEWIN_GetDefaultCaptionSize() FRAMEWIN_GetDefaultTitleHeight() +#define FRAMEWIN_CreateButton(hObj, Flags, Off, Id) FRAMEWIN_AddButton(hObj, Flags, Off, Id) +#define FRAMEWIN_CreateCloseButton(hObj, Flags, Off) FRAMEWIN_AddCloseButton(hObj, Flags, Off) +#define FRAMEWIN_CreateMaxButton(hObj, Flags, Off) FRAMEWIN_AddMaxButton(hObj, Flags, Off) +#define FRAMEWIN_CreateMinButton(hObj, Flags, Off) FRAMEWIN_AddMinButton(hObj, Flags, Off) + +#if defined(__cplusplus) + } +#endif + +#endif +#endif /* FRAMEWIN_H */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_AddMenu.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_AddMenu.c new file mode 100644 index 0000000..80ca0dc --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_AddMenu.c @@ -0,0 +1,71 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_AddMenu.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" +#include "MENU.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_AddMenu +*/ +void FRAMEWIN_AddMenu(FRAMEWIN_Handle hObj, WM_HWIN hMenu) { + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (pObj) { + int TitleHeight, BorderSize, IBorderSize = 0; + int x0, y0, xSize; + TitleHeight = FRAMEWIN__CalcTitleHeight(pObj); + BorderSize = pObj->Props.BorderSize; + if (pObj->Widget.State & FRAMEWIN_SF_TITLEVIS) { + IBorderSize = pObj->Props.IBorderSize; + } + x0 = BorderSize; + y0 = BorderSize + TitleHeight + IBorderSize; + xSize = WM__GetWindowSizeX(&pObj->Widget.Win); + xSize -= BorderSize * 2; + pObj->hMenu = hMenu; + if (pObj->cb) { + MENU_SetOwner(hMenu, pObj->hClient); + } + MENU_Attach(hMenu, hObj, x0, y0, xSize, 0, 0); + WM_SetAnchor(hMenu, WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_RIGHT); + FRAMEWIN__UpdatePositions(pObj); + FRAMEWIN_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else + void FRAMEWIN_AddMenu_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_Button.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Button.c new file mode 100644 index 0000000..41785fb --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Button.c @@ -0,0 +1,64 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_Button.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" +#include "BUTTON.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_AddButton +*/ +WM_HWIN FRAMEWIN_AddButton(FRAMEWIN_Handle hObj, int Flags, int Off, int Id) { + WM_HWIN r = 0; + if (hObj) { + FRAMEWIN_Obj* pObj; + POSITIONS Pos; + int Size = FRAMEWIN_GetTitleHeight(hObj); + int BorderSize = FRAMEWIN_GetBorderSize(hObj); + int WinFlags, x; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + FRAMEWIN__CalcPositions(pObj, &Pos); + if (Flags & FRAMEWIN_BUTTON_RIGHT) { + x = Pos.rTitleText.x1 - (Size - 1) - Off; + WinFlags = WM_CF_SHOW | WM_CF_ANCHOR_RIGHT; + } else { + x = Pos.rTitleText.x0 + Off; + WinFlags = WM_CF_SHOW; + } + r = BUTTON_CreateAsChild(x, BorderSize, Size, Size, hObj, Id, WinFlags); + BUTTON_SetFocussable(r, 0); + WM_UNLOCK(); + } + return r; +} + +#else + void FRAMEWIN_Button_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonClose.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonClose.c new file mode 100644 index 0000000..8948a81 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonClose.c @@ -0,0 +1,96 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_ButtonClose.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include +#include "GUI_Protected.h" +#include "FRAMEWIN_Private.h" +#include "BUTTON.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Callback +* +* This is the overwritten callback routine for the button. +* The primary reason for overwriting it is that we define the default +* action of the Framewindow here. +* It works as follows: +* - User clicks and releases the button +* -> BUTTON sends WM_NOTIFY_PARENT to FRAMEWIN +* -> FRAMEWIN either a) reacts or b)sends WM_NOTIFY_PARENT_REFLECTION back +* In case of a) This module reacts ! +*/ +static void _cbClose(WM_MESSAGE* pMsg) { + if (pMsg->MsgId == WM_NOTIFY_PARENT_REFLECTION) { + WM_DeleteWindow(pMsg->hWinSrc); + return; /* We are done ! */ + } + BUTTON_Callback(pMsg); +} + +/********************************************************************* +* +* _Draw +*/ +static void _Draw(void) { + GUI_RECT r; + int i, Size; + WM_GetInsideRect(&r); + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + Size = r.x1 - r.x0 - 2; + WM_ITERATE_START(&r); { + for (i = 2; i < Size; i++) { + LCD_DrawHLine(r.x0 + i, r.y0 + i, r.x0 + i + 1); + LCD_DrawHLine(r.x1 - i - 1, r.y0 + i, r.x1 - i); + } + } WM_ITERATE_END(); +} + + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_AddCloseButton +*/ +WM_HWIN FRAMEWIN_AddCloseButton(FRAMEWIN_Handle hObj, int Flags, int Off) { + WM_HWIN hButton; + hButton = FRAMEWIN_AddButton(hObj, Flags, Off, GUI_ID_CLOSE); + BUTTON_SetSelfDraw(hButton, 0, &_Draw); + WM_SetCallback(hButton, _cbClose); + return hButton; +} + +#else + void FRAMEWIN_ButtonClose_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMax.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMax.c new file mode 100644 index 0000000..a0147a6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMax.c @@ -0,0 +1,142 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_ButtonMax.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include +#include "GUI_Protected.h" +#include "FRAMEWIN_Private.h" +#include "BUTTON.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Callback +* +* This is the overwritten callback routine for the button. +* The primary reason for overwriting it is that we define the default +* action of the Framewindow here. +* It works as follows: +* - User clicks and releases the button +* -> BUTTON sends WM_NOTIFY_PARENT to FRAMEWIN +* -> FRAMEWIN either a) reacts or b)sends WM_NOTIFY_PARENT_REFLECTION back +* In case of a) This module reacts ! +*/ +static void _cbMax(WM_MESSAGE* pMsg) { + if (pMsg->MsgId == WM_NOTIFY_PARENT_REFLECTION) { + WM_HWIN hWin = pMsg->hWinSrc; + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hWin); + if (pObj->Flags & FRAMEWIN_SF_MAXIMIZED) { + FRAMEWIN_Restore(hWin); + } else { + FRAMEWIN_Maximize(hWin); + } + return; /* We are done ! */ + } + BUTTON_Callback(pMsg); +} + +/********************************************************************* +* +* _DrawMax +*/ +static void _DrawMax(void) { + GUI_RECT r; + WM_GetInsideRect(&r); + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + WM_ITERATE_START(&r); { + LCD_DrawHLine(r.x0 + 1, r.y0 + 1, r.x1 - 1); + LCD_DrawHLine(r.x0 + 1, r.y0 + 2, r.x1 - 1); + LCD_DrawHLine(r.x0 + 1, r.y1 - 1, r.x1 - 1); + LCD_DrawVLine(r.x0 + 1, r.y0 + 1, r.y1 - 1); + LCD_DrawVLine(r.x1 - 1, r.y0 + 1, r.y1 - 1); + } WM_ITERATE_END(); +} + +/********************************************************************* +* +* _DrawRestore +*/ +static void _DrawRestore(void) { + GUI_RECT r; + int Size; + WM_GetInsideRect(&r); + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + Size = ((r.x1 - r.x0 + 1) << 1) / 3; + WM_ITERATE_START(&r); { + LCD_DrawHLine(r.x1 - Size, r.y0 + 1, r.x1 - 1); + LCD_DrawHLine(r.x1 - Size, r.y0 + 2, r.x1 - 1); + LCD_DrawHLine(r.x0 + Size, r.y0 + Size, r.x1 - 1); + LCD_DrawVLine(r.x1 - Size, r.y0 + 1, r.y1 - Size); + LCD_DrawVLine(r.x1 - 1, r.y0 + 1, r.y0 + Size); + LCD_DrawHLine(r.x0 + 1, r.y1 - Size, r.x0 + Size); + LCD_DrawHLine(r.x0 + 1, r.y1 - Size + 1, r.x0 + Size); + LCD_DrawHLine(r.x0 + 1, r.y1 - 1, r.x0 + Size); + LCD_DrawVLine(r.x0 + 1, r.y1 - Size, r.y1 - 1); + LCD_DrawVLine(r.x0 + Size, r.y1 - Size, r.y1 - 1); + } WM_ITERATE_END(); +} + +/********************************************************************* +* +* _Draw +*/ +static void _Draw(void) { + FRAMEWIN_Obj* pObj; + WM_HWIN hWin; + hWin = WM_GetActiveWindow(); + hWin = WM_GetParent(hWin); + pObj = FRAMEWIN_H2P(hWin); + if (pObj->Flags & FRAMEWIN_SF_MAXIMIZED) { + _DrawRestore(); + } else { + _DrawMax(); + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_AddMaxButton +*/ +WM_HWIN FRAMEWIN_AddMaxButton(FRAMEWIN_Handle hObj, int Flags, int Off) { + WM_HWIN hButton; + hButton = FRAMEWIN_AddButton(hObj, Flags, Off, GUI_ID_MAXIMIZE); + BUTTON_SetSelfDraw(hButton, 0, &_Draw); + WM_SetCallback(hButton, _cbMax); + return hButton; +} + +#else + void FRAMEWIN_ButtonMax_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMin.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMin.c new file mode 100644 index 0000000..7f15913 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_ButtonMin.c @@ -0,0 +1,135 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_ButtonMin.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include +#include "GUI_Protected.h" +#include "FRAMEWIN_Private.h" +#include "BUTTON.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* Callback +* +* This is the overwritten callback routine for the button. +* The primary reason for overwriting it is that we define the default +* action of the Framewindow here. +* It works as follows: +* - User clicks and releases the button +* -> BUTTON sends WM_NOTIFY_PARENT to FRAMEWIN +* -> FRAMEWIN either a) reacts or b)sends WM_NOTIFY_PARENT_REFLECTION back +* In case of a) This module reacts ! +*/ +static void _cbMin(WM_MESSAGE* pMsg) { + if (pMsg->MsgId == WM_NOTIFY_PARENT_REFLECTION) { + WM_HWIN hWin = pMsg->hWinSrc; + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hWin); + if (pObj->Flags & FRAMEWIN_SF_MINIMIZED) { + FRAMEWIN_Restore(hWin); + } else { + FRAMEWIN_Minimize(hWin); + } + return; /* We are done ! */ + } + BUTTON_Callback(pMsg); +} + +/********************************************************************* +* +* _DrawMin +*/ +static void _DrawMin(void) { + GUI_RECT r; + int i, Size; + WM_GetInsideRect(&r); + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + Size = (r.x1 - r.x0 + 1) >> 1; + WM_ITERATE_START(&r); { + for (i = 1; i < Size; i++) { + LCD_DrawHLine(r.x0 + i, r.y1 - i - (Size >> 1), r.x1 - i); + } + } WM_ITERATE_END(); +} + +/********************************************************************* +* +* _DrawRestore +*/ +static void _DrawRestore(void) { + GUI_RECT r; + int i, Size; + WM_GetInsideRect(&r); + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + Size = (r.x1 - r.x0 + 1) >> 1; + WM_ITERATE_START(&r); { + for (i = 1; i < Size; i++) { + LCD_DrawHLine(r.x0 + i, r.y0 + i + (Size >> 1), r.x1 - i); + } + } WM_ITERATE_END(); +} + +/********************************************************************* +* +* _Draw +*/ +static void _Draw(void) { + FRAMEWIN_Obj* pObj; + WM_HWIN hWin; + hWin = WM_GetActiveWindow(); + hWin = WM_GetParent(hWin); + pObj = FRAMEWIN_H2P(hWin); + if (pObj->Flags & FRAMEWIN_SF_MINIMIZED) { + _DrawRestore(); + } else { + _DrawMin(); + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_AddMinButton +*/ +WM_HWIN FRAMEWIN_AddMinButton(FRAMEWIN_Handle hObj, int Flags, int Off) { + WM_HWIN hButton; + hButton = FRAMEWIN_AddButton(hObj, Flags, Off, GUI_ID_MINIMIZE); + BUTTON_SetSelfDraw(hButton, 0, &_Draw); + WM_SetCallback(hButton, _cbMin); + return hButton; +} + +#else + void FRAMEWIN_ButtonMin_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_Create.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Create.c new file mode 100644 index 0000000..15087fe --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Create.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_Create.c +Purpose : Implementation of framewin widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "FRAMEWIN.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_Create +*/ +FRAMEWIN_Handle FRAMEWIN_Create(const char* pText, WM_CALLBACK* cb, int Flags, + int x0, int y0, int xsize, int ysize) { + return FRAMEWIN_CreateEx(x0, y0, xsize, ysize, WM_HWIN_NULL, Flags, 0, 0, pText, cb); +} + +/********************************************************************* +* +* FRAMEWIN_CreateAsChild +*/ +FRAMEWIN_Handle FRAMEWIN_CreateAsChild(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + const char* pText, WM_CALLBACK* cb, int Flags) { + return FRAMEWIN_CreateEx(x0, y0, xsize, ysize, hParent, Flags, 0, 0, pText, cb); +} + +#else /* avoid empty object files */ + void FRAMEWIN_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_CreateIndirect.c new file mode 100644 index 0000000..0a694e3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_CreateIndirect.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_CreateIndirect.c +Purpose : Implementation of framewin widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "FRAMEWIN.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_CreateIndirect +*/ +FRAMEWIN_Handle FRAMEWIN_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, + int x0, int y0, WM_CALLBACK* cb) { + FRAMEWIN_Handle hObj; + hObj = FRAMEWIN_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id, pCreateInfo->pName, cb); + return hObj; +} + +#else /* avoid empty object files */ + void FRAMEWIN_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_Default.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Default.c new file mode 100644 index 0000000..a13df69 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Default.c @@ -0,0 +1,141 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_Default.c +Purpose : Implementation of framewindow widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public functions (Set/Get defaults) +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_SetDefaultFont +*/ +void FRAMEWIN_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + FRAMEWIN__DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* FRAMEWIN_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * FRAMEWIN_GetDefaultFont(void) { + return FRAMEWIN__DefaultProps.pFont; +} + +/********************************************************************* +* +* FRAMEWIN_SetDefaultBarColor +*/ +void FRAMEWIN_SetDefaultBarColor(unsigned Index, GUI_COLOR Color) { + if (Index < GUI_COUNTOF(FRAMEWIN__DefaultProps.aBarColor)) { + FRAMEWIN__DefaultProps.aBarColor[Index] = Color; + } +} + +/********************************************************************* +* +* FRAMEWIN_GetDefaultBarColor +*/ +GUI_COLOR FRAMEWIN_GetDefaultBarColor(unsigned Index) { + GUI_COLOR Color = 0; + if (Index < GUI_COUNTOF(FRAMEWIN__DefaultProps.aBarColor)) { + Color = FRAMEWIN__DefaultProps.aBarColor[Index]; + } + return Color; +} + +/********************************************************************* +* +* FRAMEWIN_SetDefaultClientColor +*/ +void FRAMEWIN_SetDefaultClientColor(GUI_COLOR Color) { + FRAMEWIN__DefaultProps.ClientColor = Color; +} + +/********************************************************************* +* +* FRAMEWIN_GetDefaultClientColor +*/ +GUI_COLOR FRAMEWIN_GetDefaultClientColor(void) { + return FRAMEWIN__DefaultProps.ClientColor; +} + +/********************************************************************* +* +* FRAMEWIN_SetDefaultTitleHeight +*/ +void FRAMEWIN_SetDefaultTitleHeight(int Height) { + FRAMEWIN__DefaultProps.TitleHeight = Height; +} + +/********************************************************************* +* +* FRAMEWIN_GetDefaultTitleHeight +*/ +int FRAMEWIN_GetDefaultTitleHeight(void) { + return FRAMEWIN__DefaultProps.TitleHeight; +} + +/********************************************************************* +* +* FRAMEWIN_SetDefaultBorderSize +*/ +void FRAMEWIN_SetDefaultBorderSize(int DefaultBorderSize) { + FRAMEWIN__DefaultProps.BorderSize = DefaultBorderSize; +} + +/********************************************************************* +* +* FRAMEWIN_GetDefaultBorderSize +*/ +int FRAMEWIN_GetDefaultBorderSize(void) { + return FRAMEWIN__DefaultProps.BorderSize; +} + +/********************************************************************* +* +* FRAMEWIN_SetDefaultTextColor +*/ +void FRAMEWIN_SetDefaultTextColor(unsigned Index, GUI_COLOR Color) { + if (Index < GUI_COUNTOF(FRAMEWIN__DefaultProps.aTextColor)) { + FRAMEWIN__DefaultProps.aTextColor[Index] = Color; + } +} + +/********************************************************************* +* +* FRAMEWIN_GetDefaultTextColor +*/ +GUI_COLOR FRAMEWIN_GetDefaultTextColor(unsigned Index) { + GUI_COLOR Color = 0; + if (Index < GUI_COUNTOF(FRAMEWIN__DefaultProps.aTextColor)) { + Color = FRAMEWIN__DefaultProps.aTextColor[Index]; + } + return Color; +} + +#else + void FRAMEWIN_Default(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_Get.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Get.c new file mode 100644 index 0000000..976a3c6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Get.c @@ -0,0 +1,90 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_Get.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_GetFont +*/ +const GUI_FONT GUI_UNI_PTR * FRAMEWIN_GetFont(FRAMEWIN_Handle hObj) { + const GUI_FONT GUI_UNI_PTR * r = NULL; + GUI_LOCK(); + if (hObj) { + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj); + r = pObj->Props.pFont; + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); + return r; +} + +/********************************************************************* +* +* FRAMEWIN_GetTitleHeight +*/ +int FRAMEWIN_GetTitleHeight(FRAMEWIN_Handle hObj) { + int r = 0; + POSITIONS Pos; + /* Move client window accordingly */ + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + FRAMEWIN__CalcPositions(pObj, &Pos); + r = pObj->Props.TitleHeight; + if (r == 0) { + r = Pos.TitleHeight; + } + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* FRAMEWIN_GetBorderSize +*/ +int FRAMEWIN_GetBorderSize(FRAMEWIN_Handle hObj) { + int r = 0; + /* Move client window accordingly */ + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + r = pObj->Props.BorderSize; + WM_UNLOCK(); + } + return r; +} + + +#else + void FRAMEWIN_Get_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_IsMinMax.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_IsMinMax.c new file mode 100644 index 0000000..19e9a7f --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_IsMinMax.c @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_IsMinMax.c +Purpose : Add. framewin routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" +#include "WIDGET.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_IsMinimized +*/ +int FRAMEWIN_IsMinimized(FRAMEWIN_Handle hObj) { + int r = 0; + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + r = (pObj->Flags & FRAMEWIN_SF_MINIMIZED) ? 1 : 0; + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* FRAMEWIN_IsMaximized +*/ +int FRAMEWIN_IsMaximized(FRAMEWIN_Handle hObj) { + int r = 0; + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + r = (pObj->Flags & FRAMEWIN_SF_MAXIMIZED) ? 1 : 0; + WM_UNLOCK(); + } + return r; +} + +#else + void FRAMEWIN_IsMinMax_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_MinMaxRest.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_MinMaxRest.c new file mode 100644 index 0000000..e11ea0d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_MinMaxRest.c @@ -0,0 +1,179 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_MinMaxRest.c +Purpose : Add. framewin routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" +#include "WIDGET.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _InvalidateButton +*/ +static void _InvalidateButton(FRAMEWIN_Obj* pObj, int Id) { + WM_HWIN hChild; + WM_Obj* pChild; + for (hChild = pObj->Widget.Win.hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + if (WM_GetId(hChild) == Id) { + WM_InvalidateWindow(hChild); + } + } +} + +/********************************************************************* +* +* _RestoreMinimized +*/ +static void _RestoreMinimized(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) { + /* When window was minimized, restore it */ + if (pObj->Flags & FRAMEWIN_SF_MINIMIZED) { + int OldHeight = 1 + pObj->Widget.Win.Rect.y1 - pObj->Widget.Win.Rect.y0; + int NewHeight = 1 + pObj->rRestore.y1 - pObj->rRestore.y0; + WM_ResizeWindow(hObj, 0, NewHeight - OldHeight); + WM_ShowWindow(pObj->hClient); + WM_ShowWindow(pObj->hMenu); + FRAMEWIN__UpdatePositions(pObj); + pObj->Flags &= ~FRAMEWIN_SF_MINIMIZED; + _InvalidateButton(pObj, GUI_ID_MINIMIZE); + } +} + +/********************************************************************* +* +* _RestoreMaximized +*/ +static void _RestoreMaximized(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) { + /* When window was maximized, restore it */ + if (pObj->Flags & FRAMEWIN_SF_MAXIMIZED) { + GUI_RECT r = pObj->rRestore; + WM_MoveTo(hObj, r.x0, r.y0); + WM_SetSize(hObj, r.x1 - r.x0 + 1, r.y1 - r.y0 + 1); + FRAMEWIN__UpdatePositions(pObj); + pObj->Flags &= ~FRAMEWIN_SF_MAXIMIZED; + _InvalidateButton(pObj, GUI_ID_MAXIMIZE); + } +} + +/********************************************************************* +* +* _MinimizeFramewin +*/ +static void _MinimizeFramewin(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) { + _RestoreMaximized(hObj, pObj); + /* When window is not minimized, minimize it */ + if ((pObj->Flags & FRAMEWIN_SF_MINIMIZED) == 0) { + int OldHeight = pObj->Widget.Win.Rect.y1 - pObj->Widget.Win.Rect.y0 + 1; + int NewHeight = FRAMEWIN__CalcTitleHeight(pObj) + pObj->Widget.pEffect->EffectSize * 2 + 2; + pObj->rRestore = pObj->Widget.Win.Rect; + WM_HideWindow(pObj->hClient); + WM_HideWindow(pObj->hMenu); + WM_ResizeWindow(hObj, 0, NewHeight - OldHeight); + FRAMEWIN__UpdatePositions(pObj); + pObj->Flags |= FRAMEWIN_SF_MINIMIZED; + _InvalidateButton(pObj, GUI_ID_MINIMIZE); + } +} + +/********************************************************************* +* +* _MaximizeFramewin +*/ +static void _MaximizeFramewin(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) { + _RestoreMinimized(hObj, pObj); + /* When window is not maximized, maximize it */ + if ((pObj->Flags & FRAMEWIN_SF_MAXIMIZED) == 0) { + WM_HWIN hParent = pObj->Widget.Win.hParent; + WM_Obj* pParent = WM_H2P(hParent); + GUI_RECT r = pParent->Rect; + if (pParent->hParent == 0) { + r.x1 = LCD_GetXSize(); + r.y1 = LCD_GetYSize(); + } + pObj->rRestore = pObj->Widget.Win.Rect; + WM_MoveTo(hObj, r.x0, r.y0); + WM_SetSize(hObj, r.x1 - r.x0 + 1, r.y1 - r.y0 + 1); + FRAMEWIN__UpdatePositions(pObj); + pObj->Flags |= FRAMEWIN_SF_MAXIMIZED; + _InvalidateButton(pObj, GUI_ID_MAXIMIZE); + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_Minimize +*/ +void FRAMEWIN_Minimize(FRAMEWIN_Handle hObj) { + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + _MinimizeFramewin(hObj, pObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_Maximize +*/ +void FRAMEWIN_Maximize(FRAMEWIN_Handle hObj) { + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + _MaximizeFramewin(hObj, pObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_Restore +*/ +void FRAMEWIN_Restore(FRAMEWIN_Handle hObj) { + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + _RestoreMinimized(hObj, pObj); + _RestoreMaximized(hObj, pObj); + WM_UNLOCK(); + } +} + +#else + void FRAMEWIN_MinMaxRest_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_Private.h b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Private.h new file mode 100644 index 0000000..8fe898c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_Private.h @@ -0,0 +1,119 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_Private.h +Purpose : FRAMEWIN private header file +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef FRAMEWIN_PRIVATE_H +#define FRAMEWIN_PRIVATE_H + +#include "WM.h" +#include "FRAMEWIN.h" +#include "WIDGET.h" +#include "GUI_HOOK.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + const GUI_FONT GUI_UNI_PTR * pFont; + GUI_COLOR aBarColor[2]; + GUI_COLOR aTextColor[2]; + GUI_COLOR ClientColor; + I16 TitleHeight; + I16 BorderSize; + I16 IBorderSize; +} FRAMEWIN_PROPS; + +typedef struct { + WIDGET Widget; + FRAMEWIN_PROPS Props; + WM_CALLBACK* cb; + WM_HWIN hClient; + WM_HWIN hMenu; + WM_HWIN hText; + GUI_RECT rRestore; + I16 TextAlign; + U16 Flags; + WM_HWIN hFocussedChild; /* Handle to focussed child .. default none (0) */ + WM_DIALOG_STATUS* pDialogStatus; + GUI_HOOK* pFirstHook; +} FRAMEWIN_Obj; + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + I16 TitleHeight; + I16 MenuHeight; + GUI_RECT rClient; + GUI_RECT rTitleText; +} POSITIONS; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define FRAMEWIN_H2P(h) (FRAMEWIN_Obj*) GUI_ALLOC_h2p(h) + +/********************************************************************* +* +* public data (internal defaults) +* +********************************************************************** +*/ + +extern FRAMEWIN_PROPS FRAMEWIN__DefaultProps; + +/********************************************************************* +* +* public functions (internal) +* +********************************************************************** +*/ + +void FRAMEWIN__CalcPositions (FRAMEWIN_Obj* pObj, POSITIONS* pPos); +int FRAMEWIN__CalcTitleHeight (FRAMEWIN_Obj* pObj); +void FRAMEWIN__UpdatePositions (FRAMEWIN_Obj* pObj); +void FRAMEWIN__UpdateButtons (FRAMEWIN_Obj* pObj, int OldHeight); + +/********************************************************************* +* +* public functions +* +********************************************************************** +*/ + +const GUI_FONT GUI_UNI_PTR * FRAMEWIN_GetFont (FRAMEWIN_Handle hObj); +int FRAMEWIN_GetTitleHeight (FRAMEWIN_Handle hObj); +void FRAMEWIN_MinButtonSetState(WM_HWIN hButton, int State); +void FRAMEWIN_MaxButtonSetState(WM_HWIN hButton, int State); + +#endif /* GUI_WINSUPPORT */ +#endif /* FRAMEWIN_H */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetBorderSize.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetBorderSize.c new file mode 100644 index 0000000..0a803ad --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetBorderSize.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN.c +Purpose : FRAMEWIN_SetBorderSize +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "FRAMEWIN_Private.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ + +/********************************************************************* +* +* FRAMEWIN_SetBorderSize +*/ +void FRAMEWIN_SetBorderSize(FRAMEWIN_Handle hObj, unsigned Size) { + GUI_LOCK(); + if (hObj) { + GUI_RECT r; + WM_Obj * pChild; + int Diff, OldSize, OldHeight; + WM_HWIN hChild; + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj); + OldHeight = FRAMEWIN__CalcTitleHeight(pObj); + OldSize = pObj->Props.BorderSize; + Diff = Size - OldSize; + for (hChild = pObj->Widget.Win.hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + r = pChild->Rect; + GUI_MoveRect(&r, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); + if ((r.y0 == pObj->Props.BorderSize) && ((r.y1 - r.y0 + 1) == OldHeight)) { + if (pChild->Status & WM_SF_ANCHOR_RIGHT) { + WM_MoveWindow(hChild, -Diff, Diff); + } else { + WM_MoveWindow(hChild, Diff, Diff); + } + } + } + pObj->Props.BorderSize = Size; + FRAMEWIN__UpdatePositions(pObj); + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); +} + +#else + void FRAMEWIN_SetBorderSize_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetColors.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetColors.c new file mode 100644 index 0000000..cb35121 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetColors.c @@ -0,0 +1,101 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_SetColors.c +Purpose : Implementation of framewindow widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Set Properties +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_SetBarColor +*/ +void FRAMEWIN_SetBarColor(FRAMEWIN_Handle hObj, unsigned Index, GUI_COLOR Color) { + if (hObj) { + FRAMEWIN_Obj* pObj; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (Index < GUI_COUNTOF(pObj->Props.aBarColor)) { + pObj->Props.aBarColor[Index] = Color; + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_SetTextColor +*/ +void FRAMEWIN_SetTextColor(FRAMEWIN_Handle hObj, GUI_COLOR Color) { + if (hObj) { + FRAMEWIN_Obj* pObj; + int i; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + for (i = 0; i < GUI_COUNTOF(pObj->Props.aTextColor); i++) { + pObj->Props.aTextColor[i] = Color; + } + FRAMEWIN_Invalidate(hObj); + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_SetTextColorEx +*/ +void FRAMEWIN_SetTextColorEx(FRAMEWIN_Handle hObj, unsigned Index, GUI_COLOR Color) { + if (hObj) { + FRAMEWIN_Obj* pObj; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (Index < GUI_COUNTOF(pObj->Props.aTextColor)) { + pObj->Props.aTextColor[Index] = Color; + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); + } +} + +/********************************************************************* +* +* FRAMEWIN_SetClientColor +*/ +void FRAMEWIN_SetClientColor(FRAMEWIN_Handle hObj, GUI_COLOR Color) { + if (hObj) { + FRAMEWIN_Obj* pObj; + GUI_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (pObj->Props.ClientColor != Color) { + pObj->Props.ClientColor = Color; + FRAMEWIN_Invalidate(pObj->hClient); + } + GUI_UNLOCK(); + } +} + +#else + void FRAMEWIN_SetColors_C(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetFont.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetFont.c new file mode 100644 index 0000000..863ab69 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetFont.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_SetFont.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_SetFont +*/ +void FRAMEWIN_SetFont(FRAMEWIN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + GUI_LOCK(); + if (hObj) { + FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj); + int OldHeight = FRAMEWIN__CalcTitleHeight(pObj); + pObj->Props.pFont = pFont; + FRAMEWIN__UpdatePositions(pObj); + FRAMEWIN__UpdateButtons(pObj, OldHeight); + FRAMEWIN_Invalidate(hObj); + } + GUI_UNLOCK(); +} + +#else + void FRAMEWIN_SetFont_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetResizeable.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetResizeable.c new file mode 100644 index 0000000..a5036e7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetResizeable.c @@ -0,0 +1,546 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_SetResizeable.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#ifndef FRAMEWIN_REACT_BORDER + #define FRAMEWIN_REACT_BORDER 3 +#endif +#ifndef FRAMEWIN_MINSIZE_X + #define FRAMEWIN_MINSIZE_X 20 +#endif +#ifndef FRAMEWIN_MINSIZE_Y + #define FRAMEWIN_MINSIZE_Y 20 +#endif + +#define FRAMEWIN_RESIZE_X (1<<0) +#define FRAMEWIN_RESIZE_Y (1<<1) +#define FRAMEWIN_REPOS_X (1<<2) +#define FRAMEWIN_REPOS_Y (1<<3) +#define FRAMEWIN_MOUSEOVER (1<<4) +#define FRAMEWIN_RESIZE (FRAMEWIN_RESIZE_X | FRAMEWIN_RESIZE_Y | FRAMEWIN_REPOS_X | FRAMEWIN_REPOS_Y) + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_HOOK _HOOK_Resizeable; +static int _CaptureX; +static int _CaptureY; +static int _CaptureFlags; + +#if GUI_SUPPORT_CURSOR + static const GUI_CURSOR GUI_UNI_PTR * _pOldCursor; +#endif + +/********************************************************************* +* +* Static data, cursors +* +********************************************************************** +*/ +#if GUI_SUPPORT_CURSOR + +/********************************************************************* +* +* Cursor colors +*/ +static GUI_CONST_STORAGE GUI_COLOR _ColorsCursor[] = { + 0x0000FF,0x000000,0xFFFFFF +}; + +static GUI_CONST_STORAGE GUI_LOGPALETTE _PalCursor = { + 3, /* number of entries */ + 1, /* Has transparency */ + &_ColorsCursor[0] +}; + +/********************************************************************* +* +* Cursor data, CursorH +*/ +static GUI_CONST_STORAGE unsigned char _acResizeCursorH[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x00, + 0x01, 0x40, 0x00, 0x50, 0x00, + 0x06, 0x40, 0x00, 0x64, 0x00, + 0x1A, 0x55, 0x55, 0x69, 0x00, + 0x6A, 0xAA, 0xAA, 0xAA, 0x40, + 0x1A, 0x55, 0x55, 0x69, 0x00, + 0x06, 0x40, 0x00, 0x64, 0x00, + 0x01, 0x40, 0x00, 0x50, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static GUI_CONST_STORAGE GUI_BITMAP _bmResizeCursorH = { + 17, /* XSize */ + 17, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + _acResizeCursorH, /* Pointer to picture data (indices) */ + &_PalCursor /* Pointer to palette */ +}; + +static GUI_CONST_STORAGE GUI_CURSOR _ResizeCursorH = { + &_bmResizeCursorH, 8, 8 +}; + +/********************************************************************* +* +* Cursor data, CursorV +*/ +static GUI_CONST_STORAGE unsigned char _acResizeCursorV[] = { + 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x06, 0xA4, 0x00, 0x00, + 0x00, 0x1A, 0xA9, 0x00, 0x00, + 0x00, 0x55, 0x95, 0x40, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x55, 0x95, 0x40, 0x00, + 0x00, 0x1A, 0xA9, 0x00, 0x00, + 0x00, 0x06, 0xA4, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00 +}; + +static GUI_CONST_STORAGE GUI_BITMAP _bmResizeCursorV = { + 17, /* XSize */ + 17, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + _acResizeCursorV, /* Pointer to picture data (indices) */ + &_PalCursor /* Pointer to palette */ +}; + +static GUI_CONST_STORAGE GUI_CURSOR _ResizeCursorV = { + &_bmResizeCursorV, 8, 8 +}; + +/********************************************************************* +* +* Cursor data, CursorDD +*/ +static GUI_CONST_STORAGE unsigned char _acResizeCursorDD[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x55, 0x00, 0x00, 0x00, + 0x06, 0xA4, 0x00, 0x00, 0x00, + 0x06, 0x90, 0x00, 0x00, 0x00, + 0x06, 0x64, 0x00, 0x00, 0x00, + 0x05, 0x19, 0x00, 0x00, 0x00, + 0x04, 0x06, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x04, 0x00, + 0x00, 0x00, 0x19, 0x14, 0x00, + 0x00, 0x00, 0x06, 0x64, 0x00, + 0x00, 0x00, 0x01, 0xA4, 0x00, + 0x00, 0x00, 0x06, 0xA4, 0x00, + 0x00, 0x00, 0x15, 0x54, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static GUI_CONST_STORAGE GUI_BITMAP _bmResizeCursorDD = { + 17, /* XSize */ + 17, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + _acResizeCursorDD, /* Pointer to picture data (indices) */ + &_PalCursor /* Pointer to palette */ +}; + +static GUI_CONST_STORAGE GUI_CURSOR _ResizeCursorDD = { + &_bmResizeCursorDD, 8, 8 +}; + +/********************************************************************* +* +* Cursor data, CursorDU +*/ +static GUI_CONST_STORAGE unsigned char _acResizeCursorDU[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x15, 0x54, 0x00, + 0x00, 0x00, 0x06, 0xA4, 0x00, + 0x00, 0x00, 0x01, 0xA4, 0x00, + 0x00, 0x00, 0x06, 0x64, 0x00, + 0x00, 0x00, 0x19, 0x14, 0x00, + 0x00, 0x00, 0x64, 0x04, 0x00, + 0x00, 0x01, 0x90, 0x00, 0x00, + 0x04, 0x06, 0x40, 0x00, 0x00, + 0x05, 0x19, 0x00, 0x00, 0x00, + 0x06, 0x64, 0x00, 0x00, 0x00, + 0x06, 0x90, 0x00, 0x00, 0x00, + 0x06, 0xA4, 0x00, 0x00, 0x00, + 0x05, 0x55, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static GUI_CONST_STORAGE GUI_BITMAP _bmResizeCursorDU = { + 17, /* XSize */ + 17, /* YSize */ + 5, /* BytesPerLine */ + 2, /* BitsPerPixel */ + _acResizeCursorDU, /* Pointer to picture data (indices) */ + &_PalCursor /* Pointer to palette */ +}; + +static GUI_CONST_STORAGE GUI_CURSOR _ResizeCursorDU = { + &_bmResizeCursorDU, 8, 8 +}; + +#endif + +/********************************************************************* +* +* Static code, helpers +* +********************************************************************** +*/ +/********************************************************************* +* +* _SetResizeCursor +*/ +#if GUI_SUPPORT_CURSOR +static void _SetResizeCursor(int Mode) { + const GUI_CURSOR GUI_UNI_PTR * pNewCursor = NULL; + if (Mode) { + int Direction; + Direction = Mode & (FRAMEWIN_RESIZE_X | FRAMEWIN_RESIZE_Y); + if (Direction == FRAMEWIN_RESIZE_X) { + pNewCursor = &_ResizeCursorH; + } else if (Direction == FRAMEWIN_RESIZE_Y) { + pNewCursor = &_ResizeCursorV; + } else { + Direction = Mode & (FRAMEWIN_REPOS_X | FRAMEWIN_REPOS_Y); + if ((Direction == (FRAMEWIN_REPOS_X | FRAMEWIN_REPOS_Y)) || !Direction) { + pNewCursor = &_ResizeCursorDD; + } else { + pNewCursor = &_ResizeCursorDU; + } + } + } + if (pNewCursor) { + const GUI_CURSOR GUI_UNI_PTR * pOldCursor; + pOldCursor = GUI_CURSOR_Select(pNewCursor); + if (_pOldCursor == NULL) { + _pOldCursor = pOldCursor; + } + } else if (_pOldCursor) { + GUI_CURSOR_Select(_pOldCursor); + _pOldCursor = NULL; + } +} +#endif + +/********************************************************************* +* +* _SetCapture +*/ +static void _SetCapture(FRAMEWIN_Handle hWin, int x, int y, int Mode) { + if ((_CaptureFlags & FRAMEWIN_REPOS_X) == 0) { + _CaptureX = x; + } + if ((_CaptureFlags & FRAMEWIN_REPOS_Y) == 0) { + _CaptureY = y; + } + if (Mode) { + if (WM_HasCaptured(hWin) == 0) { + WM_SetCapture(hWin, 0); + } + #if GUI_SUPPORT_CURSOR + _SetResizeCursor(Mode); + #endif + if (Mode & FRAMEWIN_MOUSEOVER) { + Mode = 0; + } + _CaptureFlags = (Mode | FRAMEWIN_MOUSEOVER); + } +} + +/********************************************************************* +* +* _ChangeWindowPosSize +*/ +static void _ChangeWindowPosSize(FRAMEWIN_Handle hWin, int* px, int* py) { + int dx = 0, dy = 0; + GUI_RECT Rect; + WM_GetClientRectEx(hWin, &Rect); + /* Calculate new size of window */ + if (_CaptureFlags & FRAMEWIN_RESIZE_X) { + dx = (_CaptureFlags & FRAMEWIN_REPOS_X) ? (_CaptureX - *px) : (*px - _CaptureX); + } + if (_CaptureFlags & FRAMEWIN_RESIZE_Y) { + dy = (_CaptureFlags & FRAMEWIN_REPOS_Y) ? (_CaptureY - *py) : (*py - _CaptureY); + } + /* Check the minimal size of window */ + if ((Rect.x1 + dx + 1) < FRAMEWIN_MINSIZE_X) { + dx = FRAMEWIN_MINSIZE_X - Rect.x1 - 1; + *px = _CaptureX + dx; + } + if ((Rect.y1 + dy + 1) < FRAMEWIN_MINSIZE_Y) { + dy = FRAMEWIN_MINSIZE_Y - Rect.y1 - 1; + *py = _CaptureY + dy; + } + /* Set new window position */ + if (_CaptureFlags & FRAMEWIN_REPOS_X) { + WM_MoveWindow(hWin, -dx, 0); + } + if (_CaptureFlags & FRAMEWIN_REPOS_Y) { + WM_MoveWindow(hWin, 0, -dy); + } + /* Set new window size */ + WM_ResizeWindow(hWin, dx, dy); +} + +/********************************************************************* +* +* _CheckBorderX +*/ +static int _CheckBorderX(int x, int x1, int Border) { + int Mode = 0; + if (x > (x1 - Border)) { + Mode = FRAMEWIN_RESIZE_X; + } else if (x < (Border)) { + Mode = FRAMEWIN_RESIZE_X | FRAMEWIN_REPOS_X; + } + return Mode; +} + +/********************************************************************* +* +* _CheckBorderY +*/ +static int _CheckBorderY(int y, int y1, int Border) { + int Mode = 0; + if (y > (y1 - Border)) { + Mode = FRAMEWIN_RESIZE_Y; + } else if (y < (Border)) { + Mode = FRAMEWIN_RESIZE_Y | FRAMEWIN_REPOS_Y; + } + return Mode; +} + +/********************************************************************* +* +* _CheckReactBorder +*/ +static int _CheckReactBorder(FRAMEWIN_Handle hWin, int x, int y) { + int Mode = 0; + GUI_RECT r; + WM_GetClientRectEx(hWin, &r); + if ((x >= 0) && (y >= 0) && (x <= r.x1) && (y <= r.y1)) { + Mode |= _CheckBorderX(x, r.x1, FRAMEWIN_REACT_BORDER); + if (Mode) { + Mode |= _CheckBorderY(y, r.y1, 4 * FRAMEWIN_REACT_BORDER); + } else { + Mode |= _CheckBorderY(y, r.y1, FRAMEWIN_REACT_BORDER); + if (Mode) { + Mode |= _CheckBorderX(x, r.x1, 4 * FRAMEWIN_REACT_BORDER); + } + } + } + return Mode; +} + +/********************************************************************* +* +* _OnTouch +*/ +static int _OnTouch(FRAMEWIN_Handle hWin, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pState) { /* Something happened in our area (pressed or released) */ + int x, y, Mode; + x = pState->x; + y = pState->y; + Mode = _CheckReactBorder(hWin, x, y); + if (pState->Pressed == 1) { + if (_CaptureFlags & FRAMEWIN_RESIZE) { + _ChangeWindowPosSize(hWin, &x, &y); + _SetCapture(hWin, x, y, 0); + return 1; + } else if (Mode) { + WM_SetFocus(hWin); + WM_BringToTop(hWin); + _SetCapture(hWin, x, y, Mode); + return 1; + } + #if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR) + else if (_CaptureFlags) { + WM_ReleaseCapture(); + return 1; + } + #endif + } else if (WM_HasCaptured(hWin)) { + _CaptureFlags &= ~(FRAMEWIN_RESIZE); + #if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR) + if (!Mode) + #endif + { + WM_ReleaseCapture(); + } + return 1; + } + } + return 0; +} + +/******************************************************************* +* +* _ForwardMouseOverMsg +*/ +#if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR) +static int _ForwardMouseOverMsg(FRAMEWIN_Handle hWin, WM_MESSAGE* pMsg) { + GUI_PID_STATE* pState = (GUI_PID_STATE *)pMsg->Data.p; + WM_HWIN hBelow; + pState->x += WM_GetWindowOrgX(hWin); + pState->y += WM_GetWindowOrgY(hWin); + hBelow = WM_Screen2hWin(pState->x, pState->y); + if (hBelow && (hBelow != hWin)) { + pState->x -= WM_GetWindowOrgX(hBelow); + pState->y -= WM_GetWindowOrgY(hBelow); + WM__SendMessage(hBelow, pMsg); + return 1; + } + return 0; +} +#endif + +/********************************************************************* +* +* _OnMouseOver +*/ +#if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR) +static int _OnMouseOver(FRAMEWIN_Handle hWin, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE *)pMsg->Data.p; + if (pState) { + int x, y, Mode; + x = pState->x; + y = pState->y; + Mode = _CheckReactBorder(hWin, x, y); + if (Mode) { + if (_ForwardMouseOverMsg(hWin, pMsg) == 0) { + _SetCapture(hWin, x, y, Mode | FRAMEWIN_MOUSEOVER); + } + return 1; + } else if (WM_HasCaptured(hWin)) { + if ((_CaptureFlags & FRAMEWIN_RESIZE) == 0) { + WM_ReleaseCapture(); + _ForwardMouseOverMsg(hWin, pMsg); + } + return 1; + } + } + return 0; +} +#endif + +/********************************************************************* +* +* static code, hook function +* +********************************************************************** +*/ +/********************************************************************* +* +* _HOOKFUNC_Resizeable +*/ +static int _HOOKFUNC_Resizeable(WM_MESSAGE* pMsg) { + WM_HWIN hWin = pMsg->hWin; + if (WM_HasCaptured(hWin) && (_CaptureFlags == 0)) { + return 0; + } + if (FRAMEWIN_IsMinimized(hWin) || FRAMEWIN_IsMaximized(hWin)) { + return 0; + } + switch(pMsg->MsgId) { + case WM_TOUCH: + return _OnTouch(hWin, pMsg); +#if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR) + case WM_MOUSEOVER: + return _OnMouseOver(hWin, pMsg); +#endif + case WM_CAPTURE_RELEASED: + #if GUI_SUPPORT_CURSOR + _SetResizeCursor(0); + #endif + _CaptureFlags = 0; + return 1; + } + return 0; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_SetResizeable +*/ +void FRAMEWIN_SetResizeable(FRAMEWIN_Handle hObj, int State) { + if (hObj) { + FRAMEWIN_Obj* pObj; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + if (pObj) { + if (State) { + GUI_HOOK_Add(&pObj->pFirstHook, &_HOOK_Resizeable, &_HOOKFUNC_Resizeable); + } else { + GUI_HOOK_Remove(&pObj->pFirstHook, &_HOOK_Resizeable); + } + } + WM_UNLOCK(); + } +} + +#else + void FRAMEWIN_SetResizeable_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleHeight.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleHeight.c new file mode 100644 index 0000000..319bc71 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleHeight.c @@ -0,0 +1,60 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_SetTitleHeight.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN_SetTitleHeight +*/ +int FRAMEWIN_SetTitleHeight(FRAMEWIN_Handle hObj, int Height) { + int r = 0; + if (hObj) { + FRAMEWIN_Obj* pObj; + int OldHeight; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + r = pObj->Props.TitleHeight; + if (Height != r) { + OldHeight = FRAMEWIN__CalcTitleHeight(pObj); + pObj->Props.TitleHeight = Height; + FRAMEWIN__UpdatePositions(pObj); + FRAMEWIN__UpdateButtons(pObj, OldHeight); + FRAMEWIN_Invalidate(hObj); + } + WM_UNLOCK(); + } + return r; +} + + +#else + void FRAMEWIN_SetTitleHeight_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleVis.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleVis.c new file mode 100644 index 0000000..5d926a6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN_SetTitleVis.c @@ -0,0 +1,95 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN_SetTitleVis.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _ShowHideButtons +*/ +static void _ShowHideButtons(FRAMEWIN_Obj* pObj) { + WM_HWIN hChild; + WM_Obj* pChild; + int y0; + for (hChild = pObj->Widget.Win.hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + y0 = pChild->Rect.y0 - pObj->Widget.Win.Rect.y0; + if ((y0 == pObj->Props.BorderSize) && (hChild != pObj->hClient)) { + if (pObj->Widget.State & FRAMEWIN_SF_TITLEVIS) { + WM_ShowWindow(hChild); + } else { + WM_HideWindow(hChild); + } + } + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* FRAMEWIN_SetTitleVis +*/ +void FRAMEWIN_SetTitleVis(FRAMEWIN_Handle hObj, int Show) { + if (hObj) { + FRAMEWIN_Obj* pObj; + int State; + WM_LOCK(); + pObj = FRAMEWIN_H2P(hObj); + State = pObj->Widget.State; + if (Show) { + State |= FRAMEWIN_SF_TITLEVIS; + } else { + State &= ~FRAMEWIN_SF_TITLEVIS; + } + if (pObj->Widget.State != State) { + pObj->Widget.State = State; + FRAMEWIN__UpdatePositions(pObj); + _ShowHideButtons(pObj); + if (pObj->Flags & FRAMEWIN_SF_MINIMIZED) { + if (State & FRAMEWIN_SF_TITLEVIS) { + WM_ShowWindow(hObj); + } else { + WM_HideWindow(hObj); + } + } + FRAMEWIN_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else + void FRAMEWIN_SetTitleVis_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/FRAMEWIN__UpdateButtons.c b/User/system/lib/lcd/gui/Widget/FRAMEWIN__UpdateButtons.c new file mode 100644 index 0000000..8d4b1a4 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/FRAMEWIN__UpdateButtons.c @@ -0,0 +1,91 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : FRAMEWIN__UpdateButtons.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "FRAMEWIN_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* FRAMEWIN__UpdateButtons +* +* Purpose: +* Adjust button positions & size. +* This is required after resizing the title bar +*/ +void FRAMEWIN__UpdateButtons(FRAMEWIN_Obj* pObj, int OldHeight) { + int TitleHeight = FRAMEWIN__CalcTitleHeight(pObj); + int Diff = TitleHeight - OldHeight; + if (Diff) { + WM_HWIN hLeft; + WM_HWIN hRight; + WM_HWIN hChild; + WM_Obj* pChild; + GUI_RECT r; + int xLeft, xRight, n; + n = 0; + do { + hLeft = hRight = 0; + xLeft = GUI_XMAX; + xRight = GUI_XMIN; + for (hChild = pObj->Widget.Win.hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + r = pChild->Rect; + GUI_MoveRect(&r, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); + if ((r.y0 == pObj->Props.BorderSize) && ((r.y1 - r.y0 + 1) == OldHeight)) { + if (pChild->Status & WM_SF_ANCHOR_RIGHT) { + if (r.x1 > xRight) { + hRight = hChild; + xRight = r.x0; + } + } else { + if (r.x0 < xLeft) { + hLeft = hChild; + xLeft = r.x0; + } + } + } + } + if (hLeft) { + WM_ResizeWindow(hLeft, Diff, Diff); + WM_MoveWindow(hLeft, n * Diff, 0); + } + if (hRight) { + WM_ResizeWindow(hRight, Diff, Diff); + WM_MoveWindow(hRight, -(n * Diff), 0); + } + n++; + } while (hLeft || hRight); + } +} + + + +#else + void FRAMEWIN__UpdateButtons_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/GUI_ARRAY.c b/User/system/lib/lcd/gui/Widget/GUI_ARRAY.c new file mode 100644 index 0000000..dc0f1cd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_ARRAY.c @@ -0,0 +1,334 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ARRAY.c +Purpose : Array handling routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_ARRAY.h" +#include + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ARRAY_GetNumItems +*/ +unsigned int GUI_ARRAY_GetNumItems(const GUI_ARRAY* pThis) { + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + return pThis->NumItems; +} + +/********************************************************************* +* +* GUI_ARRAY_AddItem +* +* Purpose: +* Add an item to a GUI_ARRAY. +* If the SIze is > 0, a memory block is allocated for storage. +* If on top of this a pointer is specified, the memory block holding +* the copy of the item is initialized. +* +* Return value: +* If O.K. : 0 +* On error: 1 +* +*/ +int GUI_ARRAY_AddItem(GUI_ARRAY* pThis, const void *pNew, int Len) { + WM_HMEM hNewItem = 0; + WM_HMEM hNewBuffer; + WM_HMEM *pNewBuffer; + int r = 0; + + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + WM_LOCK(); + /* Alloc memory for new item */ + if (Len) { + if ((hNewItem = GUI_ALLOC_AllocInit(pNew, Len)) == 0) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_AddItem failed to alloc buffer"); + r = 1; /* Error */ + } + } + /* Put handle of new item into the array */ + if (r == 0) { + int NumItems; + NumItems = pThis->NumItems; + /* Add the handle to new item to the buffer */ + hNewBuffer = GUI_ALLOC_Realloc(pThis->haHandle, (NumItems + 1) * sizeof(WM_HMEM)); + if (hNewBuffer == 0) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_AddItem failed to alloc buffer"); + GUI_ALLOC_Free(hNewItem); + r = 1; /* Error */ + } else { + pNewBuffer = (WM_HMEM*) GUI_ALLOC_h2p(hNewBuffer); + *(pNewBuffer + NumItems) = hNewItem; + pThis->haHandle = hNewBuffer; + pThis->NumItems++; + } + } + WM_UNLOCK(); + return r; +} + +/********************************************************************* +* +* GUI_ARRAY_Delete +* +* Purpose: +* Free all allocated memory blocks +* +* Add. info: +* Locking is not required, since this routine is considered internal +* and should only be called after locking. +*/ +void GUI_ARRAY_Delete(GUI_ARRAY* pThis) { + int i; + WM_HMEM ha; + WM_HMEM* pa; + + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + ha = pThis->haHandle; + if (ha) { + pa = (WM_HMEM*) GUI_ALLOC_h2p(ha); + /* Free the attached items, one at a time */ + for (i = 0; i < pThis->NumItems; i++) { + GUI_ALLOC_FreePtr(pa+i); + } + /* Free the handle buffer */ + GUI_ALLOC_FreePtr(&pThis->haHandle); + pThis->NumItems = 0; /* For safety, in case the array is used after it has been deleted */ + } + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + pThis->InitState = GUI_ARRAY_STATE_DELETED; + #endif +} + +/********************************************************************* +* +* GUI_ARRAY_SethItem +* +* Purpose: +* Sets an item. +* +* Returns: +* 1: if operation has failed +* 0: OK +* +* Notes: +* (1) Replacing Items +* If the item is already assigned +* (Which means the handle is already != 0), it is freeed. However, +* the handle is treated as a handle to a data item, not an object. +* This means the data item is freed, but if the pointer points to +* an object, the destructor of the object is not called. +*/ +int GUI_ARRAY_SethItem(GUI_ARRAY* pThis, unsigned int Index, WM_HMEM hItem) { + WM_HMEM ha; + WM_HMEM* pa; + int r = 1; + + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + if (Index < (unsigned)pThis->NumItems) { + ha = pThis->haHandle; + if (ha) { + pa = (WM_HMEM*) GUI_ALLOC_h2p(ha); + pa += Index; + GUI_ALLOC_FreePtr(pa); + *pa = hItem; + r = 0; + } + } + return r; +} + +/********************************************************************* +* +* GUI_ARRAY_SetItem +* +* Purpose: +* Sets an item, returning the handle. +* If a data pointer is given, the allocated memory is initialized from it thru memcpy. +* +* Returns: +* Handle of the allocated memory block +* +* Notes: +* (1) Replacing Items +* If the item is already assigned +* (Which means the handle is already != 0), it is freeed. However, +* the handle is treated as a handle to a data item, not an object. +* This means the data item is freed, but if the pointer points to +* an object, the destructor of the object is not called. +*/ +WM_HMEM GUI_ARRAY_SetItem(GUI_ARRAY* pThis, unsigned int Index, const void* pData, int Len) { + WM_HMEM hItem = 0; + + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + if (Index < (unsigned)pThis->NumItems) { + WM_HMEM ha; + ha = pThis->haHandle; + if (ha) { + WM_HMEM* pa; + pa = (WM_HMEM*) GUI_ALLOC_h2p(ha); + pa += Index; + hItem = *pa; + /* + * If a buffer is already available, a new buffer is only needed when the + * new item has a different size. + */ + if (hItem) { + if (GUI_ALLOC_GetSize(hItem) != Len) { + hItem = 0; + } + } + /* + * Allocate a new buffer and free the old one (if needed). + */ + if (!hItem) { + hItem = GUI_ALLOC_AllocZero(Len); + if (hItem) { + GUI_ALLOC_FreePtr(pa); + *pa = hItem; + } + } + /* + * Set the item (if needed) + */ + if (pData && hItem) { + char* pItem = (char*) GUI_ALLOC_h2p(hItem); + memcpy(pItem, pData, Len); + } + } + } + return hItem; +} + +/********************************************************************* +* +* GUI_ARRAY_GethItem +* +* Purpose: +* Gets the handle of specified item +* +* Notes: +* (1) Index out of bounds +* It is permitted to specify an index larger than the +* array size. In this case, a 0-handle is returned. +*/ +WM_HMEM GUI_ARRAY_GethItem(const GUI_ARRAY* pThis, unsigned int Index) { + WM_HMEM h = 0; + + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + if (Index < (unsigned)pThis->NumItems) { + WM_HMEM ha; + WM_HMEM* pa; + ha = pThis->haHandle; + if (ha) { + pa = (WM_HMEM*) GUI_ALLOC_h2p(ha); + h = *(pa + Index); + } + } + return h; +} + +/********************************************************************* +* +* GUI_ARRAY_GetpItem +* +* Purpose: +* Gets the pointer of specified item +* +* Notes: +* (1) Index out of bounds +* It is permitted to specify an index larger than the +* array size. In this case, a 0-handle is returned. +* (2) Locking +* It is the caller's responsibility to lock before calling this +* function. +*/ +void* GUI_ARRAY_GetpItem(const GUI_ARRAY* pThis, unsigned int Index) { + void* p = NULL; + WM_HMEM h; + + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + h = GUI_ARRAY_GethItem(pThis, Index); + if (h) { + p = WM_H2P(h); + } + return p; +} + +/********************************************************************* +* +* Debug support +* +********************************************************************** +* +* Purpose: +* The routines below are required only at higher debug levels +*/ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + +/********************************************************************* +* +* GUI_ARRAY_Create +* +* Purpose: +*/ +void GUI_ARRAY_Create(GUI_ARRAY * pThis) { + GUI_DEBUG_ERROROUT_IF(pThis->InitState != GUI_ARRAY_STATE_NOT_CREATED, "GUI_ARRAY_Create: GUI_ARRAY not initialized to 0"); + pThis->InitState = GUI_ARRAY_STATE_CREATED; +} + + +/********************************************************************* +* +* GUI_ARRAY_Check +* +* Purpose: +*/ +void GUI_ARRAY_Check(const GUI_ARRAY * pThis) { + if (pThis->InitState == GUI_ARRAY_STATE_DELETED) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_Check: GUI_ARRAY has been deleted"); + } else if (pThis->InitState == GUI_ARRAY_STATE_NOT_CREATED) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_Check: GUI_ARRAY has not been created"); + } else if (pThis->InitState != GUI_ARRAY_STATE_CREATED) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_Check: GUI_ARRAY in unknown state"); + } +} + +#endif /* GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL */ + + +#else /* avoid empty object files */ + +void GUI_ARRAY_C(void); +void GUI_ARRAY_C(void){} + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/GUI_ARRAY.h b/User/system/lib/lcd/gui/Widget/GUI_ARRAY.h new file mode 100644 index 0000000..aaa2dee --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_ARRAY.h @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ARRAY.h +Purpose : Array handling routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef GUIARRAY_H +#define GUIARRAY_H + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +typedef enum { + GUI_ARRAY_STATE_NOT_CREATED, + GUI_ARRAY_STATE_CREATED, + GUI_ARRAY_STATE_DELETED +} GUI_ARRAY_STATE; + +typedef struct { + U16 NumItems; + WM_HMEM haHandle; /* Handle to buffer holding handles */ + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + GUI_ARRAY_STATE InitState; + #endif +} GUI_ARRAY; + + + +int GUI_ARRAY_AddItem (GUI_ARRAY* pThis, const void *pNew, int Len); +void GUI_ARRAY_Delete (GUI_ARRAY* pThis); +WM_HMEM GUI_ARRAY_GethItem (const GUI_ARRAY* pThis, unsigned int Index); +unsigned GUI_ARRAY_GetNumItems (const GUI_ARRAY* pThis); +void* GUI_ARRAY_GetpItem (const GUI_ARRAY* pThis, unsigned int Index); +/* Optional methods */ +int GUI_ARRAY_SethItem (GUI_ARRAY* pThis, unsigned int Index, WM_HMEM hItem); +WM_HMEM GUI_ARRAY_SetItem (GUI_ARRAY* pThis, unsigned int Index, const void* pData, int Len); +void GUI_ARRAY_DeleteItem (GUI_ARRAY* pThis, unsigned int Index); +char GUI_ARRAY_InsertBlankItem(GUI_ARRAY* pThis, unsigned int Index); +WM_HMEM GUI_ARRAY_InsertItem (GUI_ARRAY* pThis, unsigned int Index, int Len); +void* GUI_ARRAY_ResizeItem (GUI_ARRAY* pThis, unsigned int Index, int Len); + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + void GUI_ARRAY_Create ( GUI_ARRAY * pThis); + void GUI_ARRAY_Check (const GUI_ARRAY * pThis); + #define GUI_ARRAY_CREATE(pThis) GUI_ARRAY_Create(pThis) + #define GUI_ARRAY_CHECK(pThis) GUI_ARRAY_Check(pThis) +#else + #define GUI_ARRAY_CREATE(pThis) + #define GUI_ARRAY_CHECK(pThis) +#endif + + +#endif + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_ARRAY_DeleteItem.c b/User/system/lib/lcd/gui/Widget/GUI_ARRAY_DeleteItem.c new file mode 100644 index 0000000..aa15702 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_ARRAY_DeleteItem.c @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ARRAY_DeleteItem.c +Purpose : Array handling routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_ARRAY.h" +#include + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ARRAY_DeleteItem +* +* Purpose: +* Eliminate one element in a GUI_ARRAY. +* This means: +* - freeing the memory block +* - moving the last item to the position of the deleted item +* - possible reducing the size of the memory used for management (opt) +* +*/ +void GUI_ARRAY_DeleteItem(GUI_ARRAY* pThis, unsigned int Index) { + WM_HMEM ha; + WM_HMEM* pa; + int i; + if (Index < (unsigned)pThis->NumItems) { + ha = pThis->haHandle; + if (ha) { + int NumItems; + WM_LOCK(); + pa = (WM_HMEM*) GUI_ALLOC_h2p(ha); + /* Free the attached item */ + GUI_ALLOC_FreePtr(pa + Index); + /* Move the last items to the position of the deleted item */ + NumItems = --pThis->NumItems; + for (i = Index; i <= NumItems - 1; i++) { + *(pa + i) = *(pa + i + 1); + } + WM_UNLOCK(); + } + } +} + +#else + +void GUI_ARRAY_DeleteItem(void) {} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_ARRAY_InsertItem.c b/User/system/lib/lcd/gui/Widget/GUI_ARRAY_InsertItem.c new file mode 100644 index 0000000..62b2e6b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_ARRAY_InsertItem.c @@ -0,0 +1,113 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ARRAY_InsertItem.c +Purpose : Array handling routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_ARRAY.h" +#include + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ARRAY_InsertBlankItem +* +* Purpose: +* Inserts a blank element in a GUI_ARRAY. +* +* Parameters: +* Index Index of the element to insert before +* 0 means: Insert before first element +* 1 means: Insert before second element +* +* Return value: +* 1 if successful +* 0 if failed +* +* Notes: +* (1) Index changes +* The index of all items after the one inserted will change +* (Increment by 1) +*/ +char GUI_ARRAY_InsertBlankItem(GUI_ARRAY* pThis, unsigned int Index) { + GUI_ARRAY_CHECK(pThis); /* Sanity checks at higher debug levels only */ + + if (Index >= (unsigned)pThis->NumItems) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_InsertBlankItem: Illegal index"); + } else { + WM_HMEM hNewBuffer; + hNewBuffer = GUI_ALLOC_AllocZero(sizeof(WM_HMEM) * (pThis->NumItems + 1)); + if (hNewBuffer == 0) { + GUI_DEBUG_ERROROUT("GUI_ARRAY_InsertBlankItem: Failed to alloc buffer"); + } else { + WM_HMEM *pOldBuffer; + WM_HMEM *pNewBuffer; + pNewBuffer = (WM_HMEM*) GUI_ALLOC_h2p(hNewBuffer); + pOldBuffer = (WM_HMEM*) GUI_ALLOC_h2p(pThis->haHandle); + memcpy(pNewBuffer, pOldBuffer, Index * sizeof(WM_HMEM)); + memcpy(pNewBuffer + (Index + 1), pOldBuffer + Index, (pThis->NumItems - Index) * sizeof(WM_HMEM)); + GUI_ALLOC_Free(pThis->haHandle); + pThis->haHandle = hNewBuffer; + pThis->NumItems++; + return 1; /* Successfull */ + } + } + return 0; /* Failed */ +} + +/********************************************************************* +* +* GUI_ARRAY_InsertItem +* +* Purpose: +* Inserts an element in a GUI_ARRAY. +* +* +* Parameters: +* Index Index of the element to insert before +* 0 means: Insert before first element +* 1 means: Insert before second element +* +* Return value: +* Handle of allocated memory block if successful +* 0 if failed +* +* Notes: +* (1) Index changes +* The index of all items after the one inserted will change +* (Increment by 1) +*/ +WM_HMEM GUI_ARRAY_InsertItem(GUI_ARRAY* pThis, unsigned int Index, int Len) { + WM_HMEM hNewBuffer = 0; + if (GUI_ARRAY_InsertBlankItem(pThis, Index)) { + hNewBuffer = GUI_ARRAY_SetItem(pThis, Index, 0, Len); + } + return hNewBuffer; +} + +#else /* avoid empty object files */ + +void GUI_ARRAY_InsertItem_C(void); +void GUI_ARRAY_InsertItem_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_ARRAY_ResizeItem.c b/User/system/lib/lcd/gui/Widget/GUI_ARRAY_ResizeItem.c new file mode 100644 index 0000000..077a84c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_ARRAY_ResizeItem.c @@ -0,0 +1,64 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_ARRAY_ResizeItem.c +Purpose : Array handling routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_ARRAY.h" +#include + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_ARRAY_ResizeItem +* +* Purpose: +* Resizes one element in a GUI_ARRAY. +* Return value: +* Handle of allocated memory block if successful +* 0 if failed +* +*/ +void* GUI_ARRAY_ResizeItem(GUI_ARRAY* pThis, unsigned int Index, int Len) { + void* r = NULL; + WM_HMEM hNew; + hNew = GUI_ALLOC_AllocZero(Len); + if (hNew) { + void* pOld = GUI_ARRAY_GetpItem(pThis, Index); + void* pNew = GUI_ALLOC_h2p(hNew); + memcpy(pNew, pOld, Len); + if (GUI_ARRAY_SethItem(pThis, Index, hNew)) { + GUI_ALLOC_FreePtr(&hNew); /* Free on error */ + } else { + r = pNew; + } + } + return r; +} + +#else /* avoid empty object files */ + +void GUI_ARRAY_ResizeItem_C(void); +void GUI_ARRAY_ResizeItem_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_DRAW.c b/User/system/lib/lcd/gui/Widget/GUI_DRAW.c new file mode 100644 index 0000000..77794e3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_DRAW.c @@ -0,0 +1,75 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DRAW.c +Purpose : member functions of GUI_DRAW Object +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_Protected.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* puplic code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DRAW__Draw +*/ +void GUI_DRAW__Draw(GUI_DRAW_HANDLE hDrawObj, int x, int y) { + if (hDrawObj) { + GUI_DRAW * pDrawObj; + pDrawObj = (GUI_DRAW *)GUI_ALLOC_h2p(hDrawObj); + pDrawObj->pConsts->pfDraw(pDrawObj, x, y); + } +} + +/********************************************************************* +* +* GUI_DRAW__GetXSize +*/ +int GUI_DRAW__GetXSize(GUI_DRAW_HANDLE hDrawObj) { + if (hDrawObj) { + GUI_DRAW * pDrawObj; + pDrawObj = (GUI_DRAW *)GUI_ALLOC_h2p(hDrawObj); + return pDrawObj->pConsts->pfGetXSize(pDrawObj); + } + return 0; +} + +/********************************************************************* +* +* GUI_DRAW__GetYSize +*/ +int GUI_DRAW__GetYSize(GUI_DRAW_HANDLE hDrawObj) { + if (hDrawObj) { + GUI_DRAW * pDrawObj; + pDrawObj = (GUI_DRAW *)GUI_ALLOC_h2p(hDrawObj); + return pDrawObj->pConsts->pfGetYSize(pDrawObj); + } + return 0; +} + +#else /* Avoid problems with empty object modules */ + void GUI_DRAW_C(void) {} +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Widget/GUI_DRAW_BITMAP.c b/User/system/lib/lcd/gui/Widget/GUI_DRAW_BITMAP.c new file mode 100644 index 0000000..faf2320 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_DRAW_BITMAP.c @@ -0,0 +1,97 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DRAW_BITMAP.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_Protected.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawBitmap +*/ +static void _DrawBitmap(const GUI_DRAW* pObj, int x, int y) { + GUI_DrawBitmap((const GUI_BITMAP *)pObj->Data.pData, x + pObj->xOff, y + pObj->yOff); +} + +/********************************************************************* +* +* _GetXSize +*/ +static int _GetXSize(const GUI_DRAW* pObj) { + return ((const GUI_BITMAP *)pObj->Data.pData)->XSize; +} + +/********************************************************************* +* +* _GetYSize +*/ +static int _GetYSize(const GUI_DRAW* pObj) { + return ((const GUI_BITMAP *)pObj->Data.pData)->YSize; +} + +/********************************************************************* +* +* static data, ConstObj +* +********************************************************************** +*/ +static const GUI_DRAW_CONSTS _ConstObjData = { + _DrawBitmap, + _GetXSize, + _GetYSize +}; + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DRAW_BITMAP_Create +*/ +WM_HMEM GUI_DRAW_BITMAP_Create(const GUI_BITMAP* pBitmap, int x, int y) { + GUI_DRAW* pObj; + WM_HMEM hMem; + hMem = GUI_ALLOC_AllocZero(sizeof(GUI_DRAW)); + if (hMem) { + WM_LOCK(); + pObj = (GUI_DRAW*)GUI_ALLOC_h2p(hMem); + pObj->pConsts = &_ConstObjData; + pObj->Data.pData = (const void*)pBitmap; + pObj->xOff = x; + pObj->yOff = y; + WM_UNLOCK(); + } + return hMem; +} + + +#else /* Avoid problems with empty object modules */ + void GUI_DRAW_BITMAP_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_DRAW_BMP.c b/User/system/lib/lcd/gui/Widget/GUI_DRAW_BMP.c new file mode 100644 index 0000000..33b874e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_DRAW_BMP.c @@ -0,0 +1,97 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DRAW_BMP.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_Protected.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Draw +*/ +static void _Draw(const GUI_DRAW* pObj, int x, int y) { + GUI_BMP_Draw((const GUI_BITMAP *)pObj->Data.pData, x + pObj->xOff, y + pObj->yOff); +} + +/********************************************************************* +* +* _GetXSize +*/ +static int _GetXSize(const GUI_DRAW* pObj) { + return GUI_BMP_GetXSize(pObj->Data.pData); +} + +/********************************************************************* +* +* _GetYSize +*/ +static int _GetYSize(const GUI_DRAW* pObj) { + return GUI_BMP_GetXSize(pObj->Data.pData); +} + +/********************************************************************* +* +* static data, ConstObj +* +********************************************************************** +*/ +static const GUI_DRAW_CONSTS _ConstObjData = { + _Draw, + _GetXSize, + _GetYSize +}; + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DRAW_BMP_Create +*/ +WM_HMEM GUI_DRAW_BMP_Create(const void* pBMP, int x, int y) { + WM_HMEM hMem; + hMem = GUI_ALLOC_AllocZero(sizeof(GUI_DRAW)); + if (hMem) { + GUI_DRAW* pObj; + WM_LOCK(); + pObj = (GUI_DRAW*)GUI_ALLOC_h2p(hMem); + pObj->pConsts = &_ConstObjData; + pObj->Data.pData = pBMP; + pObj->xOff = x; + pObj->yOff = y; + WM_UNLOCK(); + } + return hMem; +} + + +#else /* Avoid problems with empty object modules */ + void GUI_DRAW_BMP_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_DRAW_STREAMED.c b/User/system/lib/lcd/gui/Widget/GUI_DRAW_STREAMED.c new file mode 100644 index 0000000..97e3678 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_DRAW_STREAMED.c @@ -0,0 +1,97 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DRAW_STREAMED.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_Protected.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Draw +*/ +static void _Draw(const GUI_DRAW* pObj, int x, int y) { + GUI_DrawStreamedBitmap((const GUI_BITMAP_STREAM *)pObj->Data.pData, x + pObj->xOff, y + pObj->yOff); +} + +/********************************************************************* +* +* _GetXSize +*/ +static int _GetXSize(const GUI_DRAW* pObj) { + return ((const GUI_BITMAP_STREAM *)pObj->Data.pData)->XSize; +} + +/********************************************************************* +* +* _GetYSize +*/ +static int _GetYSize(const GUI_DRAW* pObj) { + return ((const GUI_BITMAP_STREAM *)pObj->Data.pData)->YSize; +} + +/********************************************************************* +* +* static data, ConstObj +* +********************************************************************** +*/ +static const GUI_DRAW_CONSTS _ConstObjData = { + _Draw, + _GetXSize, + _GetYSize +}; + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DRAW_STREAMED_Create +*/ +WM_HMEM GUI_DRAW_STREAMED_Create(const GUI_BITMAP_STREAM * pBitmap, int x, int y) { + WM_HMEM hMem; + hMem = GUI_ALLOC_AllocZero(sizeof(GUI_DRAW)); + if (hMem) { + GUI_DRAW* pObj; + WM_LOCK(); + pObj = (GUI_DRAW*)GUI_ALLOC_h2p(hMem); + pObj->pConsts = &_ConstObjData; + pObj->Data.pData = (const void*)pBitmap; + pObj->xOff = x; + pObj->yOff = y; + WM_UNLOCK(); + } + return hMem; +} + + +#else /* Avoid problems with empty object modules */ + void GUI_DRAW_STREAMED_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_DRAW_Self.c b/User/system/lib/lcd/gui/Widget/GUI_DRAW_Self.c new file mode 100644 index 0000000..a909b9a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_DRAW_Self.c @@ -0,0 +1,101 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_DRAW_Self.c +Purpose : +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "GUI_Protected.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _Draw +*/ +static void _Draw(const GUI_DRAW* pObj, int x, int y) { + GUI_USE_PARA(x); + GUI_USE_PARA(y); + (*pObj->Data.pfDraw)(); +} + +/********************************************************************* +* +* _GetXSize +*/ +static int _GetXSize(const GUI_DRAW* pObj) { + GUI_USE_PARA(pObj); + return 0; +} + +/********************************************************************* +* +* _GetYSize +*/ +static int _GetYSize(const GUI_DRAW* pObj) { + GUI_USE_PARA(pObj); + return 0; +} + +/********************************************************************* +* +* static data, ConstObj +* +********************************************************************** +*/ +static const GUI_DRAW_CONSTS _ConstObjData = { + _Draw, + _GetXSize, + _GetYSize +}; + +/********************************************************************* +* +* public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_DRAW_SELF_Create +*/ +WM_HMEM GUI_DRAW_SELF_Create(GUI_DRAW_SELF_CB* pfDraw, int x, int y) { + WM_HMEM hMem; + hMem = GUI_ALLOC_AllocZero(sizeof(GUI_DRAW)); + if (hMem) { + GUI_DRAW* pObj; + GUI_LOCK(); + pObj = (GUI_DRAW*)GUI_ALLOC_h2p(hMem); + pObj->pConsts = &_ConstObjData; + pObj->Data.pfDraw = pfDraw; + pObj->xOff = x; + pObj->yOff = y; + GUI_UNLOCK(); + } + return hMem; +} + + +#else /* Avoid problems with empty object modules */ + void GUI_DRAW_Self_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_EditBin.c b/User/system/lib/lcd/gui/Widget/GUI_EditBin.c new file mode 100644 index 0000000..db57051 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_EditBin.c @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_EditBin.c +Purpose : Widget, add. module +---------------------------------------------------------------------- +*/ + +#include "EDIT.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_EditBin +*/ +U32 GUI_EditBin(U32 Value, U32 Min, U32 Max, int Len, int xsize) { + U32 Ret = Value; + int Key, x, y, ysize, Id; + EDIT_Handle hEdit; + EDIT_Obj* pObj; + const GUI_FONT GUI_UNI_PTR * pOldFont = GUI_SetFont(EDIT_GetDefaultFont()); + x = GUI_GetDispPosX(); + y = GUI_GetDispPosY(); + if (xsize == 0) + xsize = GUI_GetCharDistX('X') * Len + 6; + ysize = GUI_GetFontSizeY(); + Id = 0x1234; + hEdit = EDIT_Create(x, y, xsize, ysize, Id, Len, 0); + pObj = EDIT_H2P(hEdit); + EDIT_SetBinMode(hEdit, Value, Min, Max); + WM_SetFocus(hEdit); + do { + Key = GUI_WaitKey(); + } while ((Key != GUI_KEY_ESCAPE) && (Key != GUI_KEY_ENTER) && (Key != 0)); + GUI_SetFont(pOldFont); + if (Key == GUI_KEY_ENTER) + Ret = pObj->CurrentValue; + EDIT_Delete(hEdit); + return Ret; +} + +#else /* avoid empty object files */ + +void GUI_EditBin_C(void); +void GUI_EditBin_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_EditDec.c b/User/system/lib/lcd/gui/Widget/GUI_EditDec.c new file mode 100644 index 0000000..8de69e3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_EditDec.c @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_EditDec.c +Purpose : Widget, add. module +---------------------------------------------------------------------- +*/ + +#include "EDIT.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_EditDec +*/ +I32 GUI_EditDec(I32 Value, I32 Min, I32 Max, int Len, int xsize, int Shift, U8 Flags) { + I32 Ret = Value; + int Key, x, y, ysize, Id; + EDIT_Handle hEdit; + EDIT_Obj* pObj; + const GUI_FONT GUI_UNI_PTR * pOldFont = GUI_SetFont(EDIT_GetDefaultFont()); + x = GUI_GetDispPosX(); + y = GUI_GetDispPosY(); + if (xsize == 0) + xsize = GUI_GetCharDistX('X') * Len + 6; + ysize = GUI_GetFontSizeY(); + Id = 0x1234; + hEdit = EDIT_Create(x, y, xsize, ysize, Id, Len, 0); + pObj = EDIT_H2P(hEdit); + EDIT_SetDecMode(hEdit, Value, Min, Max, Shift, Flags); + WM_SetFocus(hEdit); + do { + Key = GUI_WaitKey(); + } while ((Key != GUI_KEY_ESCAPE) && (Key != GUI_KEY_ENTER) && (Key != 0)); + GUI_SetFont(pOldFont); + if (Key == GUI_KEY_ENTER) + Ret = pObj->CurrentValue; + EDIT_Delete(hEdit); + return Ret; +} + +#else /* avoid empty object files */ + +void GUI_EditDec_C(void); +void GUI_EditDec_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_EditFloat.c b/User/system/lib/lcd/gui/Widget/GUI_EditFloat.c new file mode 100644 index 0000000..235f4cb --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_EditFloat.c @@ -0,0 +1,71 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_EditFloat.c +Purpose : Widget, add. module +---------------------------------------------------------------------- +*/ + +#include "EDIT.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_EditFloat +*/ +float GUI_EditFloat(float Value, float Min, float Max, int Len, int xsize, int Shift, U8 Flags) { + float Ret; + int Key, x, y, ysize, Id; + EDIT_Handle hEdit; + EDIT_Obj* pObj; + const GUI_FONT GUI_UNI_PTR * pOldFont = GUI_SetFont(EDIT_GetDefaultFont()); + x = GUI_GetDispPosX(); + y = GUI_GetDispPosY(); + if (xsize == 0) + xsize = GUI_GetCharDistX('X') * Len; + ysize = GUI_GetFontSizeY(); + Id = 0x1234; + hEdit = EDIT_Create(x, y, xsize, ysize, Id, Len, 0); + pObj = EDIT_H2P(hEdit); + EDIT_SetFloatMode(hEdit, Value, Min, Max, Shift, Flags); + do { + Key = GUI_WaitKey(); + switch (Key) { + case GUI_KEY_ESCAPE: + break; + default: + EDIT_AddKey(hEdit, Key); + } + } while ((Key != GUI_KEY_ESCAPE) && (Key != GUI_KEY_ENTER) && (Key != 0)); + GUI_SetFont(pOldFont); + Ret = (I32)pObj->CurrentValue / (float)GUI_Pow10[pObj->NumDecs]; + EDIT_Delete(hEdit); + return Ret; +} + +#else /* avoid empty object files */ + +void GUI_EditFloat_C(void); +void GUI_EditFloat_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_EditHex.c b/User/system/lib/lcd/gui/Widget/GUI_EditHex.c new file mode 100644 index 0000000..0f58e28 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_EditHex.c @@ -0,0 +1,67 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_EditHex.c +Purpose : Widget, add. module +---------------------------------------------------------------------- +*/ + +#include "EDIT.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_EditHex +*/ +U32 GUI_EditHex(U32 Value, U32 Min, U32 Max, int Len, int xsize) { + U32 Ret = Value; + int Key, x, y, ysize, Id; + EDIT_Handle hEdit; + EDIT_Obj* pObj; + const GUI_FONT GUI_UNI_PTR * pOldFont = GUI_SetFont(EDIT_GetDefaultFont()); + x = GUI_GetDispPosX(); + y = GUI_GetDispPosY(); + if (xsize == 0) + xsize = GUI_GetCharDistX('X') * Len + 6; + ysize = GUI_GetFontSizeY(); + Id = 0x1234; + hEdit = EDIT_Create(x, y, xsize, ysize, Id, Len, 0); + pObj = EDIT_H2P(hEdit); + EDIT_SetHexMode(hEdit, Value, Min, Max); + WM_SetFocus(hEdit); + do { + Key = GUI_WaitKey(); + } while ((Key != GUI_KEY_ESCAPE) && (Key != GUI_KEY_ENTER) && (Key != 0)); + GUI_SetFont(pOldFont); + if (Key == GUI_KEY_ENTER) + Ret = pObj->CurrentValue; + EDIT_Delete(hEdit); + return Ret; +} + +#else /* avoid empty object files */ + +void GUI_EditHex_C(void); +void GUI_EditHex_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_EditString.c b/User/system/lib/lcd/gui/Widget/GUI_EditString.c new file mode 100644 index 0000000..02c1b18 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_EditString.c @@ -0,0 +1,65 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_EditString.c +Purpose : Widget, add. module +---------------------------------------------------------------------- +*/ + +#include "EDIT.h" +#include "GUI_Protected.h" +#include "EDIT_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_EditString +*/ +void GUI_EditString(char * pString, int Len, int xsize) { + int Key, x, y, ysize, Id; + EDIT_Handle hEdit; + EDIT_Obj* pObj; + const GUI_FONT GUI_UNI_PTR * pOldFont = GUI_SetFont(EDIT_GetDefaultFont()); + x = GUI_GetDispPosX(); + y = GUI_GetDispPosY(); + if (xsize == 0) + xsize = GUI_GetCharDistX('X') * Len + 6; + ysize = GUI_GetFontSizeY(); + Id = 0x1234; + hEdit = EDIT_Create(x, y, xsize, ysize, Id, Len, 0); + EDIT_SetText(hEdit, pString); + pObj = EDIT_H2P(hEdit); + WM_SetFocus(hEdit); + do { + Key = GUI_WaitKey(); + } while ((Key != GUI_KEY_ESCAPE) && (Key != GUI_KEY_ENTER) && (Key != 0)); + if (Key == GUI_KEY_ENTER) + EDIT_GetText(hEdit, pString, pObj->MaxLen); + GUI_SetFont(pOldFont); + EDIT_Delete(hEdit); +} + +#else /* avoid empty object files */ + +void GUI_EditString_C(void); +void GUI_EditString_C(void){} + +#endif diff --git a/User/system/lib/lcd/gui/Widget/GUI_HOOK.c b/User/system/lib/lcd/gui/Widget/GUI_HOOK.c new file mode 100644 index 0000000..807a490 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_HOOK.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_HOOK.C +Purpose : Implementation of GUI_HOOK +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_HOOK.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* GUI_HOOK_Add +*/ +void GUI_HOOK_Add(GUI_HOOK** ppFirstHook, GUI_HOOK* pNewHook, GUI_HOOK_FUNC* pHookFunc) { + pNewHook->pNext = *ppFirstHook; /* New entry points to former first one in list */ + pNewHook->pHookFunc = pHookFunc; + *ppFirstHook = pNewHook; /* New one is first one now */ +} + +/********************************************************************* +* +* GUI_HOOK_Remove +*/ +void GUI_HOOK_Remove(GUI_HOOK** ppFirstHook, GUI_HOOK* pHook) { + GUI_USE_PARA(pHook); + *ppFirstHook = NULL; +} + +#else + void GUI_HOOK_C(void); + void GUI_HOOK_C(void) {} /* avoid empty object files */ +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/GUI_HOOK.h b/User/system/lib/lcd/gui/Widget/GUI_HOOK.h new file mode 100644 index 0000000..13733a7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/GUI_HOOK.h @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : GUI_HOOK.h +Purpose : Hook handling routines +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef GUI_HOOK_H +#define GUI_HOOK_H + +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef int GUI_HOOK_FUNC(WM_MESSAGE* pMsg); + +typedef struct GUI_HOOK { + struct GUI_HOOK* pNext; + GUI_HOOK_FUNC* pHookFunc; +} GUI_HOOK; + +/********************************************************************* +* +* Functions +* +********************************************************************** +*/ + +void GUI_HOOK_Add (GUI_HOOK** ppFirstHook, GUI_HOOK* pNewHook, GUI_HOOK_FUNC* pHookFunc); +void GUI_HOOK_Remove(GUI_HOOK** ppFirstHook, GUI_HOOK* pHook); + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ +#endif /* GUI_HOOK_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/HEADER.c b/User/system/lib/lcd/gui/Widget/HEADER.c new file mode 100644 index 0000000..2a27dd3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER.c @@ -0,0 +1,714 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER.c +Purpose : Implementation of header widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "HEADER_Private.h" +#include "SCROLLBAR.h" +#include "GUI.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +#ifndef HEADER_SUPPORT_DRAG + #define HEADER_SUPPORT_DRAG 1 +#endif + +#ifndef HEADER_BORDER_V_DEFAULT + #define HEADER_BORDER_V_DEFAULT 0 +#endif + +#ifndef HEADER_BORDER_H_DEFAULT + #define HEADER_BORDER_H_DEFAULT 2 +#endif + +/* Define default fonts */ +#ifndef HEADER_FONT_DEFAULT + #define HEADER_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define colors */ +#ifndef HEADER_BKCOLOR_DEFAULT + #define HEADER_BKCOLOR_DEFAULT 0xAAAAAA +#endif + +#ifndef HEADER_TEXTCOLOR_DEFAULT + #define HEADER_TEXTCOLOR_DEFAULT GUI_BLACK +#endif + +/* Define cursors */ +#ifndef HEADER_CURSOR_DEFAULT + #define HEADER_CURSOR_DEFAULT &GUI_CursorHeaderM +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +/* Remember the old cursor */ +static const GUI_CURSOR GUI_UNI_PTR * _pOldCursor; + +/* Default values */ +static const GUI_CURSOR GUI_UNI_PTR * _pDefaultCursor = HEADER_CURSOR_DEFAULT; +static GUI_COLOR _DefaultBkColor = HEADER_BKCOLOR_DEFAULT; +static GUI_COLOR _DefaultTextColor = HEADER_TEXTCOLOR_DEFAULT; +static int _DefaultBorderH = HEADER_BORDER_H_DEFAULT; +static int _DefaultBorderV = HEADER_BORDER_V_DEFAULT; +static const GUI_FONT GUI_UNI_PTR * _pDefaultFont = HEADER_FONT_DEFAULT; + +/********************************************************************* +* +* static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _Paint +*/ +static void _Paint(/*HEADER_Handle hObj, */HEADER_Obj* pObj) { + GUI_RECT Rect; + int i, xPos = -pObj->ScrollPos; + int NumItems = GUI_ARRAY_GetNumItems(&pObj->Columns); + int EffectSize = pObj->Widget.pEffect->EffectSize; + LCD_SetBkColor(pObj->BkColor); + GUI_SetFont(pObj->pFont); + GUI_Clear(); + for (i = 0; i < NumItems; i++) { + HEADER_COLUMN * pColumn = (HEADER_COLUMN*)GUI_ARRAY_GetpItem(&pObj->Columns, i); + GUI_GetClientRect(&Rect); + Rect.x0 = xPos; + Rect.x1 = Rect.x0 + pColumn->Width; + if (pColumn->hDrawObj) { + int xOff = 0, yOff = 0; + switch (pColumn->Align & GUI_TA_HORIZONTAL) { + case GUI_TA_RIGHT: + xOff = (pColumn->Width - GUI_DRAW__GetXSize(pColumn->hDrawObj)); + break; + case GUI_TA_HCENTER: + xOff = (pColumn->Width - GUI_DRAW__GetXSize(pColumn->hDrawObj)) / 2; + break; + } + switch (pColumn->Align & GUI_TA_VERTICAL) { + case GUI_TA_BOTTOM: + yOff = ((Rect.y1 - Rect.y0 + 1) - GUI_DRAW__GetYSize(pColumn->hDrawObj)); + break; + case GUI_TA_VCENTER: + yOff = ((Rect.y1 - Rect.y0 + 1) - GUI_DRAW__GetYSize(pColumn->hDrawObj)) / 2; + break; + } + WM_SetUserClipRect(&Rect); + GUI_DRAW__Draw(pColumn->hDrawObj, xPos + xOff, yOff); + WM_SetUserClipRect(NULL); + } + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &Rect); + xPos += Rect.x1 - Rect.x0; + Rect.x0 += EffectSize + _DefaultBorderH; + Rect.x1 -= EffectSize + _DefaultBorderH; + Rect.y0 += EffectSize + _DefaultBorderV; + Rect.y1 -= EffectSize + _DefaultBorderV; + LCD_SetColor(pObj->TextColor); + GUI_DispStringInRect(pColumn->acText, &Rect, pColumn->Align); + } + GUI_GetClientRect(&Rect); + Rect.x0 = xPos; + Rect.x1 = 0xfff; + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &Rect); +} + +/********************************************************************* +* +* _RestoreOldCursor +*/ +static void _RestoreOldCursor(void) { + if (_pOldCursor) { + #if GUI_SUPPORT_CURSOR + GUI_CURSOR_Select(_pOldCursor); + #endif + _pOldCursor = 0; + } +} + +/********************************************************************* +* +* _FreeAttached +* +* Delete attached objects (if any) +*/ +static void _FreeAttached(HEADER_Obj * pObj) { + int i, NumItems; + NumItems = GUI_ARRAY_GetNumItems(&pObj->Columns); + for (i = 0; i < NumItems; i++) { + HEADER_COLUMN * pColumn = (HEADER_COLUMN*)GUI_ARRAY_GetpItem(&pObj->Columns, i); + if (pColumn->hDrawObj) { + GUI_ALLOC_Free(pColumn->hDrawObj); + } + } + /* Delete attached objects (if any) */ + GUI_ARRAY_Delete(&pObj->Columns); + _RestoreOldCursor(); +} + +/********************************************************************* +* +* _GetItemIndex +*/ +#if (HEADER_SUPPORT_DRAG) +static int _GetItemIndex(HEADER_Handle hObj, HEADER_Obj * pObj, int x, int y) { + int Item = -1; + if ((y >= 0) && (y < WM_GetWindowSizeY(hObj))) { + if (hObj) { + int Index, xPos = 0, NumColumns; + NumColumns = GUI_ARRAY_GetNumItems(&pObj->Columns); + for (Index = 0; Index < NumColumns; Index++) { + HEADER_COLUMN * pColumn; + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); + xPos += pColumn->Width; + if ((xPos >= (x - 4)) && (xPos <= (x + 4))) { + Item = Index; + if ((Index < (NumColumns - 1)) && (x < xPos)) { + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index + 1); + if (pColumn->Width == 0) { + break; + } + } + } + } + } + } + return Item; +} +#endif + +/********************************************************************* +* +* _HandlePID +*/ +#if (HEADER_SUPPORT_DRAG) +static void _HandlePID(HEADER_Handle hObj, HEADER_Obj * pObj, int x, int y, int Pressed) { + int Hit = _GetItemIndex(hObj, pObj, x, y); + /* set capture position () */ + if ((Pressed == 1) && (Hit >= 0) && (pObj->CapturePosX == -1)) { + pObj->CapturePosX = x; + pObj->CaptureItem = Hit; + } + /* set mouse cursor and capture () */ + if (Hit >= 0) { + WM_SetCapture(hObj, 1); + #if GUI_SUPPORT_CURSOR + if (!_pOldCursor) { + _pOldCursor = GUI_CURSOR_Select(_pDefaultCursor); + } + #endif + } + /* modify header */ + if ((pObj->CapturePosX >= 0) && (x != pObj->CapturePosX) && (Pressed == 1)) { + int NewSize = HEADER_GetItemWidth(hObj, pObj->CaptureItem) + x - pObj->CapturePosX; + if (NewSize >= 0) { + HEADER_SetItemWidth(hObj, pObj->CaptureItem, NewSize); + pObj->CapturePosX = x; + } + } + /* release capture & restore cursor */ + if (Pressed <= 0) { + #if (GUI_SUPPORT_MOUSE) + if (Hit == -1) + #endif + { + _RestoreOldCursor(); + pObj->CapturePosX = -1; + WM_ReleaseCapture(); + } + } +} +#endif + +/********************************************************************* +* +* _OnMouseOver +*/ +#if (HEADER_SUPPORT_DRAG & GUI_SUPPORT_MOUSE) +static void _OnMouseOver(HEADER_Handle hObj, HEADER_Obj * pObj, WM_MESSAGE * pMsg) { + const GUI_PID_STATE * pState = (const GUI_PID_STATE *)pMsg->Data.p; + if (pState) { + _HandlePID(hObj, pObj, pState->x + pObj->ScrollPos, pState->y, -1); + } +} +#endif + +/********************************************************************* +* +* _OnTouch +*/ +#if (HEADER_SUPPORT_DRAG) +static void _OnTouch(HEADER_Handle hObj, HEADER_Obj * pObj, WM_MESSAGE * pMsg) { + int Notification; + const GUI_PID_STATE * pState = (const GUI_PID_STATE *)pMsg->Data.p; + if (pState) { + _HandlePID(hObj, pObj, pState->x + pObj->ScrollPos, pState->y, pState->Pressed); + } + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + Notification = WM_NOTIFICATION_CLICKED; + } else { + Notification = WM_NOTIFICATION_RELEASED; + } + } else { + Notification = WM_NOTIFICATION_MOVED_OUT; + } + WM_NotifyParent(hObj, Notification); +} +#endif + +/********************************************************************* +* +* _HEADER_Callback +*/ +static void _HEADER_Callback (WM_MESSAGE *pMsg) { + HEADER_Handle hObj; + HEADER_Obj * pObj; + hObj = pMsg->hWin; + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + WM_LOCK(); + pObj = HEADER_H2P(hObj); + switch (pMsg->MsgId) { + case WM_PAINT: + _Paint(/*hObj, */pObj); + break; +#if (HEADER_SUPPORT_DRAG) + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; +#endif +#if (HEADER_SUPPORT_DRAG & GUI_SUPPORT_MOUSE) + case WM_MOUSEOVER: + _OnMouseOver(hObj, pObj, pMsg); + break; +#endif + case WM_DELETE: + _FreeAttached(pObj); /* No return here ... WM_DefaultProc needs to be called */ + default: + WM_DefaultProc(pMsg); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_Create +*/ +HEADER_Handle HEADER_Create(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int ExFlags) { + return HEADER_CreateEx(x0, y0, xsize, ysize, hParent, Flags, ExFlags, Id); +} + +/********************************************************************* +* +* HEADER_CreateEx +*/ +HEADER_Handle HEADER_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + HEADER_Handle hObj; + GUI_USE_PARA(ExFlags); + /* Create the window */ + WM_LOCK(); + if ((xsize == 0) && (x0 == 0) && (y0 == 0)) { + GUI_RECT Rect; + WM_GetInsideRectEx(hParent, &Rect); + xsize = Rect.x1 - Rect.x0 + 1; + x0 = Rect.x0; + y0 = Rect.y0; + } + if (ysize == 0) { + const WIDGET_EFFECT* pEffect = WIDGET_GetDefaultEffect(); + ysize = GUI_GetYDistOfFont(_pDefaultFont); + ysize += 2 * _DefaultBorderV; + ysize += 2 * (unsigned)pEffect->EffectSize; + } + WinFlags |= WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_RIGHT; + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, &_HEADER_Callback, + sizeof(HEADER_Obj) - sizeof(WM_Obj)); + if (hObj) { + HEADER_Obj* pObj = HEADER_H2P(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->Columns); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, 0); + /* init member variables */ + HEADER_INIT_ID(pObj); + pObj->BkColor = _DefaultBkColor; + pObj->TextColor = _DefaultTextColor; + pObj->pFont = _pDefaultFont; + pObj->CapturePosX = -1; + pObj->CaptureItem = -1; + pObj->ScrollPos = 0; + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "HEADER_Create failed") + } + WM_UNLOCK(); + return hObj; +} + +/********************************************************************* +* +* Exported routines: Global functions +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_SetDefautCursor +*/ +const GUI_CURSOR GUI_UNI_PTR * HEADER_SetDefaultCursor(const GUI_CURSOR * pCursor) { + const GUI_CURSOR GUI_UNI_PTR * pOldCursor = _pDefaultCursor; + _pDefaultCursor = pCursor; + return pOldCursor; +} + +/********************************************************************* +* +* HEADER_SetDefaultBkColor +*/ +GUI_COLOR HEADER_SetDefaultBkColor(GUI_COLOR Color) { + GUI_COLOR OldColor = _DefaultBkColor; + _DefaultBkColor = Color; + return OldColor; +} + +/********************************************************************* +* +* HEADER_SetDefaultTextColor +*/ +GUI_COLOR HEADER_SetDefaultTextColor(GUI_COLOR Color) { + GUI_COLOR OldColor = _DefaultTextColor; + _DefaultTextColor = Color; + return OldColor; +} + +/********************************************************************* +* +* HEADER_SetDefaultBorderH +*/ +int HEADER_SetDefaultBorderH(int Spacing) { + int OldSpacing = _DefaultBorderH; + _DefaultBorderH = Spacing; + return OldSpacing; +} + +/********************************************************************* +* +* HEADER_SetDefaultBorderV +*/ +int HEADER_SetDefaultBorderV(int Spacing) { + int OldSpacing = _DefaultBorderV; + _DefaultBorderV = Spacing; + return OldSpacing; +} + +/********************************************************************* +* +* HEADER_SetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * HEADER_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + const GUI_FONT GUI_UNI_PTR * pOldFont = _pDefaultFont; + _pDefaultFont = pFont; + return pOldFont; +} + +/********************************************************************* +* +* HEADER_GetDefault... +*/ +const GUI_CURSOR GUI_UNI_PTR * HEADER_GetDefaultCursor(void) { return _pDefaultCursor; } +GUI_COLOR HEADER_GetDefaultBkColor(void) { return _DefaultBkColor; } +GUI_COLOR HEADER_GetDefaultTextColor(void) { return _DefaultTextColor; } +int HEADER_GetDefaultBorderH(void) { return _DefaultBorderH; } +int HEADER_GetDefaultBorderV(void) { return _DefaultBorderV; } +const GUI_FONT GUI_UNI_PTR * HEADER_GetDefaultFont(void) { return _pDefaultFont; } + +/********************************************************************* +* +* Exported routines: Member functions +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_SetFont +*/ +void HEADER_SetFont(HEADER_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + pObj->pFont = pFont; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_SetHeight +*/ +void HEADER_SetHeight(HEADER_Handle hObj, int Height) { + if (hObj) { + GUI_RECT Rect; + WM_GetClientRectEx(hObj, &Rect); + WM_SetSize(hObj, Rect.x1 - Rect.x0 + 1, Height); + WM_InvalidateWindow(WM_GetParent(hObj)); + } +} + +/********************************************************************* +* +* HEADER_SetTextColor +*/ +void HEADER_SetTextColor(HEADER_Handle hObj, GUI_COLOR Color) { + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + pObj->TextColor = Color; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_SetBkColor +*/ +void HEADER_SetBkColor(HEADER_Handle hObj, GUI_COLOR Color) { + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + pObj->BkColor = Color; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_SetTextAlign +*/ +void HEADER_SetTextAlign(HEADER_Handle hObj, unsigned int Index, int Align) { + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (Index <= GUI_ARRAY_GetNumItems(&pObj->Columns)) { + HEADER_COLUMN * pColumn; + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); + pColumn->Align = Align; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_SetScrollPos +*/ +void HEADER_SetScrollPos(HEADER_Handle hObj, int ScrollPos) { + if (hObj && (ScrollPos >= 0)) { + HEADER_Obj* pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (ScrollPos != pObj->ScrollPos) { + pObj->ScrollPos = ScrollPos; + WM_Invalidate(hObj); + WM_InvalidateWindow(WM_GetParent(hObj)); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_AddItem +*/ +void HEADER_AddItem(HEADER_Handle hObj, int Width, const char * s, int Align) { + if (hObj) { + HEADER_Obj * pObj; + HEADER_COLUMN Column; + int Index; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (!Width) { + const GUI_FONT GUI_UNI_PTR * pFont = GUI_SetFont(pObj->pFont); + Width = GUI_GetStringDistX(s) + 2 * (pObj->Widget.pEffect->EffectSize + _DefaultBorderH); + GUI_SetFont(pFont); + } + Column.Width = Width; + Column.Align = Align; + Column.hDrawObj = 0; + Index = GUI_ARRAY_GetNumItems(&pObj->Columns); + if (GUI_ARRAY_AddItem(&pObj->Columns, &Column, sizeof(HEADER_COLUMN) + strlen(s) + 1) == 0) { + HEADER_COLUMN * pColumn; + pObj = HEADER_H2P(hObj); + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); + strcpy(pColumn->acText, s); + WM_InvalidateWindow(hObj); + WM_InvalidateWindow(WM_GetParent(hObj)); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_DeleteItem +*/ +void HEADER_DeleteItem(HEADER_Handle hObj, unsigned Index) { + if (hObj) { + HEADER_Obj* pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (Index < GUI_ARRAY_GetNumItems(&pObj->Columns)) { + GUI_ARRAY_DeleteItem(&pObj->Columns, Index); + WM_InvalidateWindow(hObj); + WM_InvalidateWindow(WM_GetParent(hObj)); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_SetItemText +*/ +void HEADER_SetItemText(HEADER_Handle hObj, unsigned int Index, const char* s) { + if (hObj) { + HEADER_Obj* pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (Index < GUI_ARRAY_GetNumItems(&pObj->Columns)) { + HEADER_COLUMN* pColumn; + pColumn = (HEADER_COLUMN*)GUI_ARRAY_ResizeItem(&pObj->Columns, Index, sizeof(HEADER_COLUMN) + strlen(s)); + if (pColumn) { + strcpy(pColumn->acText, s); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_SetItemWidth +*/ +void HEADER_SetItemWidth(HEADER_Handle hObj, unsigned int Index, int Width) { + if (hObj && (Width >= 0)) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (Index <= GUI_ARRAY_GetNumItems(&pObj->Columns)) { + HEADER_COLUMN * pColumn; + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); + if (pColumn) { + pColumn->Width = Width; + WM_InvalidateWindow(hObj); + WM__SendMsgNoData(WM_GetParent(hObj), WM_NOTIFY_CLIENTCHANGE); + WM_InvalidateWindow(WM_GetParent(hObj)); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* HEADER_GetHeight +*/ +int HEADER_GetHeight(HEADER_Handle hObj) { + int Height = 0; + if (hObj) { + GUI_RECT Rect; + WM_GetClientRectEx(hObj, &Rect); + GUI_MoveRect(&Rect, -Rect.x0, -Rect.y0); + Height = Rect.y1 - Rect.y0 + 1; + } + return Height; +} + +/********************************************************************* +* +* HEADER_GetItemWidth +*/ +int HEADER_GetItemWidth(HEADER_Handle hObj, unsigned int Index) { + int Width = 0; + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (Index <= GUI_ARRAY_GetNumItems(&pObj->Columns)) { + HEADER_COLUMN * pColumn; + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); + Width = pColumn->Width; + } + WM_UNLOCK(); + } + return Width; +} + +/********************************************************************* +* +* HEADER_GetNumItems +*/ +int HEADER_GetNumItems(HEADER_Handle hObj) { + int NumCols = 0; + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + NumCols = GUI_ARRAY_GetNumItems(&pObj->Columns); + WM_UNLOCK(); + } + return NumCols; +} + +#else /* avoid empty object files */ + +void HEADER_C(void); +void HEADER_C(void){} + +#endif /* #if GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/HEADER.h b/User/system/lib/lcd/gui/Widget/HEADER.h new file mode 100644 index 0000000..49e42f4 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER.h @@ -0,0 +1,141 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER.h +Purpose : HEADER include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef HEADER_H +#define HEADER_H + +#include "GUI.h" +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Public Types +* +********************************************************************** +*/ + +typedef WM_HMEM HEADER_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +HEADER_Handle HEADER_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int SpecialFlags); +HEADER_Handle HEADER_CreateIndirect(const GUI_WIDGET_CREATE_INFO * pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK * cb); +HEADER_Handle HEADER_CreateAttached(WM_HWIN hParent, int Id, int SpecialFlags); +HEADER_Handle HEADER_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define HEADER_EnableMemdev(hObj) WM_EnableMemdev (hObj) +#define HEADER_DisableMemdev(hObj) WM_DisableMemdev (hObj) +#define HEADER_Delete(hObj) WM_DeleteWindow (hObj) +#define HEADER_Paint(hObj) WM_Paint (hObj) +#define HEADER_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +/* Set defaults */ +GUI_COLOR HEADER_SetDefaultBkColor (GUI_COLOR Color); +const GUI_CURSOR GUI_UNI_PTR * HEADER_SetDefaultCursor (const GUI_CURSOR * pCursor); +const GUI_FONT GUI_UNI_PTR * HEADER_SetDefaultFont (const GUI_FONT GUI_UNI_PTR * pFont); +int HEADER_SetDefaultBorderH (int Spacing); +int HEADER_SetDefaultBorderV (int Spacing); +GUI_COLOR HEADER_SetDefaultTextColor(GUI_COLOR Color); + +/* Get defaults */ +GUI_COLOR HEADER_GetDefaultBkColor (void); +const GUI_CURSOR GUI_UNI_PTR * HEADER_GetDefaultCursor (void); +const GUI_FONT GUI_UNI_PTR * HEADER_GetDefaultFont (void); +int HEADER_GetDefaultBorderH (void); +int HEADER_GetDefaultBorderV (void); +GUI_COLOR HEADER_GetDefaultTextColor(void); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +void HEADER_AddItem (HEADER_Handle hObj, int Width, const char * s, int Align); +void HEADER_DeleteItem (HEADER_Handle hObj, unsigned Index); +int HEADER_GetHeight (HEADER_Handle hObj); +int HEADER_GetItemWidth (HEADER_Handle hObj, unsigned int Index); +int HEADER_GetNumItems (HEADER_Handle hObj); +void HEADER_SetBitmap (HEADER_Handle hObj, unsigned int Index, const GUI_BITMAP * pBitmap); +void HEADER_SetBitmapEx (HEADER_Handle hObj, unsigned int Index, const GUI_BITMAP * pBitmap, int x, int y); +void HEADER_SetBkColor (HEADER_Handle hObj, GUI_COLOR Color); +void HEADER_SetBMP (HEADER_Handle hObj, unsigned int Index, const void * pBitmap); +void HEADER_SetBMPEx (HEADER_Handle hObj, unsigned int Index, const void * pBitmap, int x, int y); +void HEADER_SetFont (HEADER_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont); +void HEADER_SetHeight (HEADER_Handle hObj, int Height); +void HEADER_SetTextAlign (HEADER_Handle hObj, unsigned int Index, int Align); +void HEADER_SetItemText (HEADER_Handle hObj, unsigned int Index, const char * s); +void HEADER_SetItemWidth (HEADER_Handle hObj, unsigned int Index, int Width); +void HEADER_SetScrollPos (HEADER_Handle hObj, int ScrollPos); +void HEADER_SetStreamedBitmap (HEADER_Handle hObj, unsigned int Index, const GUI_BITMAP_STREAM * pBitmap); +void HEADER_SetStreamedBitmapEx(HEADER_Handle hObj, unsigned int Index, const GUI_BITMAP_STREAM * pBitmap, int x, int y); +void HEADER_SetTextColor (HEADER_Handle hObj, GUI_COLOR Color); + +/********************************************************************* +* +* Macros for compatibility with older versions +* +********************************************************************** +*/ + +#ifdef HEADER_SPACING_H + #define HEADER_BORDER_H_DEFAULT HEADER_SPACING_H +#endif +#ifdef HEADER_SPACING_V + #define HEADER_BORDER_V_DEFAULT HEADER_SPACING_V +#endif +#define HEADER_SetDefaultSpacingH(Value) HEADER_SetDefaultBorderH(Value) +#define HEADER_SetDefaultSpacingV(Value) HEADER_SetDefaultBorderV(Value) +#define HEADER_GetDefaultSpacingH() HEADER_GetDefaultBorderH() +#define HEADER_GetDefaultSpacingV() HEADER_GetDefaultBorderV() + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* HEADER_H */ diff --git a/User/system/lib/lcd/gui/Widget/HEADER_BMP.c b/User/system/lib/lcd/gui/Widget/HEADER_BMP.c new file mode 100644 index 0000000..0262839 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER_BMP.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER_StreamedBitmap.c +Purpose : HEADER streamed bitmap support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "HEADER_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_SetBMPEx +*/ +void HEADER_SetBMPEx(HEADER_Handle hObj, unsigned int Index, const void * pBitmap, int x, int y) { + HEADER__SetDrawObj(hObj, Index, GUI_DRAW_BMP_Create(pBitmap, x, y)); + WM_InvalidateWindow(hObj); +} + +/********************************************************************* +* +* HEADER_SetBMP +*/ +void HEADER_SetBMP(HEADER_Handle hObj, unsigned int Index, const void * pBitmap) { + HEADER_SetBMPEx(hObj, Index, pBitmap, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void HEADER_BMP_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/HEADER_Bitmap.c b/User/system/lib/lcd/gui/Widget/HEADER_Bitmap.c new file mode 100644 index 0000000..0d81914 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER_Bitmap.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER_Bitmap.c +Purpose : HEADER bitmap support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "HEADER.h" +#include "HEADER_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_SetBitmapEx +*/ +void HEADER_SetBitmapEx(HEADER_Handle hObj, unsigned Index, const GUI_BITMAP * pBitmap, int x, int y) { + HEADER__SetDrawObj(hObj, Index, GUI_DRAW_BITMAP_Create(pBitmap, x, y)); + WM_InvalidateWindow(hObj); +} + +/********************************************************************* +* +* HEADER_SetBitmap +*/ +void HEADER_SetBitmap(HEADER_Handle hObj, unsigned Index, const GUI_BITMAP* pBitmap) { + HEADER_SetBitmapEx(hObj, Index, pBitmap, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void HEADER_Bitmap_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/HEADER_Create.c b/User/system/lib/lcd/gui/Widget/HEADER_Create.c new file mode 100644 index 0000000..9a3414e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER_Create.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER_Create.c +Purpose : Implementation of header widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "HEADER.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_CreateAttached +*/ +HEADER_Handle HEADER_CreateAttached(WM_HWIN hParent, int Id, int SpecialFlags) { + return HEADER_CreateEx(0, 0, 0, 0, hParent, WM_CF_SHOW, SpecialFlags, Id); +} + +#else /* avoid empty object files */ + void HEADER_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/HEADER_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/HEADER_CreateIndirect.c new file mode 100644 index 0000000..b8f6a68 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER_CreateIndirect.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER_CreateIndirect.c +Purpose : Implementation of header widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "HEADER.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_CreateIndirect +*/ +HEADER_Handle HEADER_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + HEADER_Handle hThis; + GUI_USE_PARA(cb); + hThis = HEADER_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, pCreateInfo->Flags, 0, pCreateInfo->Id); + return hThis; +} + +#else /* avoid empty object files */ + void HEADER_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/HEADER_Private.h b/User/system/lib/lcd/gui/Widget/HEADER_Private.h new file mode 100644 index 0000000..53c6ec6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER_Private.h @@ -0,0 +1,84 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER_Private.h +Purpose : Private HEADER include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef HEADER_PRIVATE_H +#define HEADER_PRIVATE_H + + +#include "WIDGET.h" +#include "HEADER.h" +#include "WM.h" +#include "GUI_ARRAY.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define HEADER_ID 0x4567 /* Magic numer, should be unique if possible */ + +#define HEADER_H2P(h) (HEADER_Obj*) WM_H2P(h) + +#if GUI_DEBUG_LEVEL > 1 + #define HEADER_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != HEADER_ID, "xxx.c: Wrong handle type or Object not init'ed") + #define HEADER_INIT_ID(p) p->DebugId = HEADER_ID + #define HEADER_DEINIT_ID(p) p->DebugId = HEADER_ID+1 +#else + #define HEADER_ASSERT_IS_VALID_PTR(p) + #define HEADER_INIT_ID(p) + #define HEADER_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + int Width; + I16 Align; + WM_HMEM hDrawObj; + char acText[1]; +} HEADER_COLUMN; + +typedef struct { + WIDGET Widget; + GUI_COLOR BkColor; + GUI_COLOR TextColor; + GUI_ARRAY Columns; + int CapturePosX; + int CaptureItem; + int ScrollPos; + const GUI_FONT GUI_UNI_PTR * pFont; + #if (GUI_DEBUG_LEVEL > 1) + int DebugId; + #endif +} HEADER_Obj; + +void HEADER__SetDrawObj(HEADER_Handle hObj, unsigned Index, GUI_DRAW_HANDLE hDrawObj); + + +#endif /* GUI_WINSUPPORT */ +#endif /* Avoid multiple inclusion */ diff --git a/User/system/lib/lcd/gui/Widget/HEADER_StreamedBitmap.c b/User/system/lib/lcd/gui/Widget/HEADER_StreamedBitmap.c new file mode 100644 index 0000000..d0a68e0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER_StreamedBitmap.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER_StreamedBitmap.c +Purpose : HEADER streamed bitmap support +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "HEADER.h" +#include "HEADER_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER_SetStreamedBitmapEx +*/ +void HEADER_SetStreamedBitmapEx(HEADER_Handle hObj, unsigned int Index, const GUI_BITMAP_STREAM * pBitmap, int x, int y) { + HEADER__SetDrawObj(hObj, Index, GUI_DRAW_STREAMED_Create(pBitmap, x, y)); + WM_InvalidateWindow(hObj); +} + +/********************************************************************* +* +* HEADER_SetStreamedBitmap +*/ +void HEADER_SetStreamedBitmap(HEADER_Handle hObj, unsigned int Index, const GUI_BITMAP_STREAM * pBitmap) { + HEADER_SetStreamedBitmapEx(hObj, Index, pBitmap, 0, 0); +} + +#else /* Avoid problems with empty object modules */ + void HEADER_StreamedBitmap_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/HEADER__SetDrawObj.c b/User/system/lib/lcd/gui/Widget/HEADER__SetDrawObj.c new file mode 100644 index 0000000..ff4ecf5 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/HEADER__SetDrawObj.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : HEADER__SetBitmapObj.c +Purpose : HEADER bitmap support, private function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "HEADER.h" +#include "HEADER_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported functions +* +********************************************************************** +*/ +/********************************************************************* +* +* HEADER__SetDrawObj +*/ +void HEADER__SetDrawObj(HEADER_Handle hObj, unsigned Index, GUI_DRAW_HANDLE hDrawObj) { + if (hObj) { + HEADER_Obj * pObj; + WM_LOCK(); + pObj = HEADER_H2P(hObj); + if (Index <= GUI_ARRAY_GetNumItems(&pObj->Columns)) { + HEADER_COLUMN * pColumn; + pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); + if (pColumn) { + GUI_ALLOC_FreePtr(&pColumn->hDrawObj); + pColumn->hDrawObj = hDrawObj; + } + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void HEADER__SetBitmapObj_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX.c b/User/system/lib/lcd/gui/Widget/LISTBOX.c new file mode 100644 index 0000000..bee4ab0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX.c @@ -0,0 +1,1124 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_ARRAY.h" +#include "LISTBOX_Private.h" +#include "SCROLLBAR.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Support for 3D effects */ +#ifndef LISTBOX_USE_3D + #define LISTBOX_USE_3D 1 +#endif + +/* Define default fonts */ +#ifndef LISTBOX_FONT_DEFAULT + #define LISTBOX_FONT_DEFAULT &GUI_Font13_1 +#endif + + +/* Define colors */ +#ifndef LISTBOX_BKCOLOR0_DEFAULT + #define LISTBOX_BKCOLOR0_DEFAULT GUI_WHITE /* Not selected */ +#endif + +#ifndef LISTBOX_BKCOLOR1_DEFAULT + #define LISTBOX_BKCOLOR1_DEFAULT GUI_GRAY /* Selected, no focus */ +#endif + +#ifndef LISTBOX_BKCOLOR2_DEFAULT + #define LISTBOX_BKCOLOR2_DEFAULT GUI_BLUE /* Selected, focus */ +#endif + +#ifndef LISTBOX_BKCOLOR3_DEFAULT + #define LISTBOX_BKCOLOR3_DEFAULT 0xC0C0C0 /* Disabled */ +#endif + + +#ifndef LISTBOX_TEXTCOLOR0_DEFAULT + #define LISTBOX_TEXTCOLOR0_DEFAULT GUI_BLACK /* Not selected */ +#endif + +#ifndef LISTBOX_TEXTCOLOR1_DEFAULT + #define LISTBOX_TEXTCOLOR1_DEFAULT GUI_WHITE /* Selected, no focus */ +#endif + +#ifndef LISTBOX_TEXTCOLOR2_DEFAULT + #define LISTBOX_TEXTCOLOR2_DEFAULT GUI_WHITE /* Selected, focus */ +#endif + +#ifndef LISTBOX_TEXTCOLOR3_DEFAULT + #define LISTBOX_TEXTCOLOR3_DEFAULT GUI_GRAY /* Disabled */ +#endif + + +#ifndef LISTBOX_SCROLLSTEP_H_DEFAULT + #define LISTBOX_SCROLLSTEP_H_DEFAULT 10 +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + + +LISTBOX_PROPS LISTBOX_DefaultProps = { + LISTBOX_FONT_DEFAULT, + LISTBOX_SCROLLSTEP_H_DEFAULT, + LISTBOX_BKCOLOR0_DEFAULT, + LISTBOX_BKCOLOR1_DEFAULT, + LISTBOX_BKCOLOR2_DEFAULT, + LISTBOX_BKCOLOR3_DEFAULT, + LISTBOX_TEXTCOLOR0_DEFAULT, + LISTBOX_TEXTCOLOR1_DEFAULT, + LISTBOX_TEXTCOLOR2_DEFAULT, + LISTBOX_TEXTCOLOR3_DEFAULT, +}; + + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _CallOwnerDraw +*/ +static int _CallOwnerDraw(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, int Cmd, int ItemIndex) { + WIDGET_ITEM_DRAW_INFO ItemInfo; + int r; + ItemInfo.Cmd = Cmd; + ItemInfo.hWin = hObj; + ItemInfo.ItemIndex = ItemIndex; + if (pObj->pfDrawItem) { + r = pObj->pfDrawItem(&ItemInfo); + } else { + r = LISTBOX_OwnerDraw(&ItemInfo); + } + return r; +} + +/********************************************************************* +* +* LISTBOX__GetNumItems +* +* Returns: +* Number of items +*/ +unsigned LISTBOX__GetNumItems(const LISTBOX_Obj* pObj) { + return GUI_ARRAY_GetNumItems(&pObj->ItemArray); +} + +/********************************************************************* +* +* LISTBOX__GetpString +* +* Returns: +* Pointer to the specified item +*/ +const char* LISTBOX__GetpString(const LISTBOX_Obj* pObj, int Index) { + const char* s = NULL; + LISTBOX_ITEM* pItem = (LISTBOX_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem) { + s = pItem->acText; + } + return s; +} + +/********************************************************************* +* +* _GetYSize +*/ +static int _GetYSize(LISTBOX_Handle hObj) { + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + return (Rect.y1 - Rect.y0 + 1); +} + +/********************************************************************* +* +* _GetItemSizeX +*/ +static int _GetItemSizeX(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, unsigned Index) { + LISTBOX_ITEM* pItem; + int xSize = 0; + pItem = (LISTBOX_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem) { + xSize = pItem->xSize; + } + if (xSize == 0) { + const GUI_FONT GUI_UNI_PTR* pOldFont; + pOldFont = GUI_SetFont(pObj->Props.pFont); + xSize = _CallOwnerDraw(hObj, pObj, WIDGET_ITEM_GET_XSIZE, Index); + GUI_SetFont(pOldFont); + } + if (pItem) { + pItem->xSize = xSize; + } + return xSize; +} + +/********************************************************************* +* +* _GetItemSizeY +*/ +static int _GetItemSizeY(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, unsigned Index) { + LISTBOX_ITEM* pItem; + int ySize = 0; + pItem = (LISTBOX_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem) { + ySize = pItem->ySize; + } + if (ySize == 0) { + const GUI_FONT GUI_UNI_PTR* pOldFont; + pOldFont = GUI_SetFont(pObj->Props.pFont); + ySize = _CallOwnerDraw(hObj, pObj, WIDGET_ITEM_GET_YSIZE, Index); + GUI_SetFont(pOldFont); + } + if (pItem) { + pItem->ySize = ySize; + } + return ySize; +} + +/********************************************************************* +* +* _GetContentsSizeX +*/ +static int _GetContentsSizeX(LISTBOX_Handle hObj) { + LISTBOX_Obj* pObj; + int i, NumItems, SizeX; + int Result = 0; + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + for (i = 0; i < NumItems; i++) { + SizeX = _GetItemSizeX(hObj, pObj, i); + if (Result < SizeX) { + Result = SizeX; + } + } + return Result; +} + +/********************************************************************* +* +* _GetItemPosY +*/ +static int _GetItemPosY(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, unsigned Index) { + if (Index < LISTBOX__GetNumItems(pObj)) { + if ((int)Index >= pObj->ScrollStateV.v) { + unsigned i; + int PosY = 0; + for (i = pObj->ScrollStateV.v; i < Index; i++) { + PosY += _GetItemSizeY(hObj, pObj, i); + } + return PosY; + } + } + return -1; +} + +/********************************************************************* +* +* _IsPartiallyVis +*/ +static int _IsPartiallyVis(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj) { + int Index; + Index = pObj->Sel; + if (Index < (int)LISTBOX__GetNumItems(pObj)) { + if (Index >= pObj->ScrollStateV.v) { + int y; + y = _GetItemPosY (hObj, pObj, Index); + y += _GetItemSizeY(hObj, pObj, Index); + if (y > _GetYSize(hObj)) { + return 1; + } + } + } + return 0; +} + +/********************************************************************* +* +* _GetNumVisItems +* +* Returns: +* Number of fully or partially visible items +*/ +static unsigned _GetNumVisItems(const LISTBOX_Obj* pObj, LISTBOX_Handle hObj) { + int NumItems, r = 1; + NumItems = LISTBOX__GetNumItems(pObj); + if (NumItems > 1) { + int i, ySize, DistY = 0; + ySize = _GetYSize(hObj); + for (i = NumItems - 1; i >= 0; i--) { + DistY += _GetItemSizeY(hObj, pObj, i); + if (DistY > ySize) { + break; + } + } + r = NumItems - i - 1; + if (r < 1) { + return 1; + } + } + return r; +} + +/********************************************************************* +* +* _NotifyOwner +* +* Purpose: +* Notify owner of the window. +* If no owner is registered, the parent is considered owner. +*/ +static void _NotifyOwner(WM_HWIN hObj, int Notification) { + WM_MESSAGE Msg = {0}; + WM_HWIN hOwner; + LISTBOX_Obj* pObj = LISTBOX_H2P(hObj); + hOwner = pObj->hOwner ? pObj->hOwner : WM_GetParent(hObj); + Msg.MsgId = WM_NOTIFY_PARENT; + Msg.Data.v = Notification; + Msg.hWinSrc= hObj; + WM_SendMessage(hOwner, &Msg); +} + +/********************************************************************* +* +* LISTBOX_OwnerDraw +*/ +int LISTBOX_OwnerDraw(const WIDGET_ITEM_DRAW_INFO* pDrawItemInfo) { + switch (pDrawItemInfo->Cmd) { + case WIDGET_ITEM_GET_XSIZE: { + LISTBOX_Obj* pObj; + const GUI_FONT GUI_UNI_PTR* pOldFont; + const char* s; + int DistX; + pObj = LISTBOX_H2P(pDrawItemInfo->hWin); + pOldFont = GUI_SetFont(pObj->Props.pFont); + s = LISTBOX__GetpString(pObj, pDrawItemInfo->ItemIndex); + DistX = GUI_GetStringDistX(s); + GUI_SetFont(pOldFont); + return DistX; + } + case WIDGET_ITEM_GET_YSIZE: { + LISTBOX_Obj* pObj; + pObj = LISTBOX_H2P(pDrawItemInfo->hWin); + return GUI_GetYDistOfFont(pObj->Props.pFont) + pObj->ItemSpacing; + } + case WIDGET_ITEM_DRAW: { + LISTBOX_Obj* pObj; + LISTBOX_ITEM* pItem; + WM_HMEM hItem; + GUI_RECT r; + int FontDistY; + int ItemIndex = pDrawItemInfo->ItemIndex; + const char* s; + int ColorIndex; + char IsDisabled; + char IsSelected; + pObj = LISTBOX_H2P(pDrawItemInfo->hWin); + hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, ItemIndex); + pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + WM_GetInsideRect(&r); + FontDistY = GUI_GetFontDistY(); + /* Calculate color index */ + IsDisabled = (pItem->Status & LISTBOX_ITEM_DISABLED) ? 1 : 0; + IsSelected = (pItem->Status & LISTBOX_ITEM_SELECTED) ? 1 : 0; + if (pObj->Flags & LISTBOX_SF_MULTISEL) { + if (IsDisabled) { + ColorIndex = 3; + } else { + ColorIndex = (IsSelected) ? 2 : 0; + } + } else { + if (IsDisabled) { + ColorIndex = 3; + } else { + if (ItemIndex == pObj->Sel) { + ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; + } else { + ColorIndex = 0; + } + } + } + /* Display item */ + LCD_SetBkColor(pObj->Props.aBackColor[ColorIndex]); + LCD_SetColor (pObj->Props.aTextColor[ColorIndex]); + s = LISTBOX__GetpString(pObj, ItemIndex); + GUI_SetTextMode(GUI_TM_TRANS); + GUI_Clear(); + GUI_DispStringAt(s, pDrawItemInfo->x0 + 1, pDrawItemInfo->y0); + /* Display focus rectangle */ + if ((pObj->Flags & LISTBOX_SF_MULTISEL) && (ItemIndex == pObj->Sel)) { + GUI_RECT rFocus; + rFocus.x0 = pDrawItemInfo->x0; + rFocus.y0 = pDrawItemInfo->y0; + rFocus.x1 = r.x1; + rFocus.y1 = pDrawItemInfo->y0 + FontDistY - 1; + LCD_SetColor(GUI_WHITE - pObj->Props.aBackColor[ColorIndex]); + GUI_DrawFocusRect(&rFocus, 0); + } + return 0; + } + } + return 0; +} + +/********************************************************************* +* +* _UpdateScrollPos +* +* Purpose: +* Checks whether if we must scroll up or scroll down to ensure +* that selection is in the visible area. This function also +* makes sure that scroll positions are in valid ranges. +* +* Return value: +* Difference between old and new vertical scroll pos. +*/ +static int _UpdateScrollPos(LISTBOX_Handle hObj, LISTBOX_Obj* pObj) { + int PrevScrollStateV; + PrevScrollStateV = pObj->ScrollStateV.v; + if (pObj->Sel >= 0) { + /* Check upper limit */ + if (_IsPartiallyVis(hObj, pObj)) { + pObj->ScrollStateV.v = pObj->Sel - (pObj->ScrollStateV.PageSize - 1); + } + /* Check lower limit */ + if (pObj->Sel < pObj->ScrollStateV.v) { + pObj->ScrollStateV.v = pObj->Sel; + } + } + WM_CheckScrollBounds(&pObj->ScrollStateV); + WM_CheckScrollBounds(&pObj->ScrollStateH); + WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH); + return pObj->ScrollStateV.v - PrevScrollStateV; +} + +/********************************************************************* +* +* LISTBOX__InvalidateItemSize +*/ +void LISTBOX__InvalidateItemSize(const LISTBOX_Obj* pObj, unsigned Index) { + LISTBOX_ITEM* pItem; + pItem = (LISTBOX_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem) { + pItem->xSize = 0; + pItem->ySize = 0; + } +} + +/********************************************************************* +* +* LISTBOX__InvalidateInsideArea +*/ +void LISTBOX__InvalidateInsideArea(LISTBOX_Handle hObj) { + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + WM_InvalidateRect(hObj, &Rect); +} + +/********************************************************************* +* +* LISTBOX__InvalidateItem +*/ +void LISTBOX__InvalidateItem(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, int Sel) { + if (Sel >= 0) { + int ItemPosY; + ItemPosY = _GetItemPosY(hObj, pObj, Sel); + if (ItemPosY >= 0) { + GUI_RECT Rect; + int ItemDistY; + ItemDistY = _GetItemSizeY(hObj, pObj, Sel); + WM_GetInsideRectExScrollbar(hObj, &Rect); + Rect.y0 += ItemPosY; + Rect.y1 = Rect.y0 + ItemDistY - 1; + WM_InvalidateRect(hObj, &Rect); + } + } +} + +/********************************************************************* +* +* LISTBOX__InvalidateItemAndBelow +*/ +void LISTBOX__InvalidateItemAndBelow(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, int Sel) { + if (Sel >= 0) { + int ItemPosY; + ItemPosY = _GetItemPosY(hObj, pObj, Sel); + if (ItemPosY >= 0) { + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + Rect.y0 += ItemPosY; + WM_InvalidateRect(hObj, &Rect); + } + } +} + +/********************************************************************* +* +* LISTBOX__SetScrollbarWidth +*/ +void LISTBOX__SetScrollbarWidth(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj) { + WM_HWIN hBarH, hBarV; + int Width; + Width = pObj->ScrollbarWidth; + if (Width == 0) { + Width = SCROLLBAR_GetDefaultWidth(); + } + hBarH = WM_GetDialogItem(hObj, GUI_ID_HSCROLL); + hBarV = WM_GetDialogItem(hObj, GUI_ID_VSCROLL); + SCROLLBAR_SetWidth(hBarH, Width); + SCROLLBAR_SetWidth(hBarV, Width); +} + +/********************************************************************* +* +* _CalcScrollParas +*/ +static int _CalcScrollParas(LISTBOX_Handle hObj) { + GUI_RECT Rect; + LISTBOX_Obj* pObj = LISTBOX_H2P(hObj); + /* Calc vertical scroll parameters */ + pObj->ScrollStateV.NumItems = LISTBOX__GetNumItems(pObj); + pObj->ScrollStateV.PageSize = _GetNumVisItems(pObj, hObj); + /* Calc horizontal scroll parameters */ + WM_GetInsideRectExScrollbar(hObj, &Rect); + pObj->ScrollStateH.NumItems = _GetContentsSizeX(hObj); + pObj->ScrollStateH.PageSize = Rect.x1 - Rect.x0 + 1; + return _UpdateScrollPos(hObj, pObj); +} + +/********************************************************************* +* +* _ManageAutoScroll +*/ +static void _ManageAutoScroll(LISTBOX_Handle hObj) { + char IsRequired; + LISTBOX_Obj* pObj = LISTBOX_H2P(hObj); + if (pObj->Flags & LISTBOX_SF_AUTOSCROLLBAR_V) { + IsRequired = (_GetNumVisItems(pObj, hObj) < LISTBOX__GetNumItems(pObj)); + WM_SetScrollbarV(hObj, IsRequired); + } + if (pObj->Flags & LISTBOX_SF_AUTOSCROLLBAR_H) { + GUI_RECT Rect; + int xSize, xSizeContents; + xSizeContents = _GetContentsSizeX(hObj); + WM_GetInsideRectExScrollbar(hObj, &Rect); + xSize = Rect.x1 - Rect.x0 + 1; + IsRequired = (xSizeContents > xSize); + WM_SetScrollbarH(hObj, IsRequired); + } + if (pObj->ScrollbarWidth) { + LISTBOX__SetScrollbarWidth(hObj, pObj); + } +} + +/********************************************************************* +* +* LISTBOX_UpdateScrollers +*/ +int LISTBOX_UpdateScrollers(LISTBOX_Handle hObj) { + _ManageAutoScroll(hObj); + return _CalcScrollParas(hObj); +} + +/********************************************************************* +* +* _Tolower +*/ +static int _Tolower(int Key) { + if ((Key >= 0x41) && (Key <= 0x5a)) { + Key += 0x20; + } + return Key; +} + +/********************************************************************* +* +* _IsAlphaNum +*/ +static int _IsAlphaNum(int Key) { + Key = _Tolower(Key); + if (Key >= 'a' && Key <= 'z') { + return 1; + } + if (Key >= '0' && Key <= '9') { + return 1; + } + return 0; +} + +/********************************************************************* +* +* _SelectByKey +*/ +static void _SelectByKey(LISTBOX_Handle hObj, int Key) { + unsigned i; + LISTBOX_Obj* pObj; + pObj = LISTBOX_H2P(hObj); + Key = _Tolower(Key); + for (i = 0; i < LISTBOX__GetNumItems(pObj); i++) { + const char* s = LISTBOX__GetpString(pObj, i); + if (_Tolower(*s) == Key) { + LISTBOX_SetSel(hObj, i); + break; + } + } +} + +/********************************************************************* +* +* _FreeAttached +*/ +static void _FreeAttached(LISTBOX_Obj* pObj) { + GUI_ARRAY_Delete(&pObj->ItemArray); +} + +/********************************************************************* +* +* _OnPaint +*/ +static void _OnPaint(LISTBOX_Handle hObj, LISTBOX_Obj* pObj, WM_MESSAGE* pMsg) { + WIDGET_ITEM_DRAW_INFO ItemInfo; + GUI_RECT RectInside, RectItem, ClipRect; + int ItemDistY, NumItems, i; + NumItems = LISTBOX__GetNumItems(pObj); + GUI_SetFont(pObj->Props.pFont); + /* Calculate clipping rectangle */ + ClipRect = *(const GUI_RECT*)pMsg->Data.p; + GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); + WM_GetInsideRectExScrollbar(hObj, &RectInside); + GUI__IntersectRect(&ClipRect, &RectInside); + RectItem.x0 = ClipRect.x0; + RectItem.x1 = ClipRect.x1; + /* Fill item info structure */ + ItemInfo.Cmd = WIDGET_ITEM_DRAW; + ItemInfo.hWin = hObj; + ItemInfo.x0 = RectInside.x0 - pObj->ScrollStateH.v; + ItemInfo.y0 = RectInside.y0; + /* Do the drawing */ + for (i = pObj->ScrollStateV.v; i < NumItems; i++) { + RectItem.y0 = ItemInfo.y0; + /* Break when all other rows are outside the drawing area */ + if (RectItem.y0 > ClipRect.y1) { + break; + } + ItemDistY = _GetItemSizeY(hObj, pObj, i); + RectItem.y1 = RectItem.y0 + ItemDistY - 1; + /* Make sure that we draw only when row is in drawing area */ + if (RectItem.y1 >= ClipRect.y0) { + /* Set user clip rect */ + WM_SetUserClipArea(&RectItem); + /* Fill item info structure */ + ItemInfo.ItemIndex = i; + /* Draw item */ + if (pObj->pfDrawItem) { + pObj->pfDrawItem(&ItemInfo); + } else { + LISTBOX_OwnerDraw(&ItemInfo); + } + } + ItemInfo.y0 += ItemDistY; + } + WM_SetUserClipArea(NULL); + /* Calculate & clear 'data free' area */ + RectItem.y0 = ItemInfo.y0; + RectItem.y1 = RectInside.y1; + LCD_SetBkColor(pObj->Props.aBackColor[0]); + GUI_ClearRectEx(&RectItem); + /* Draw the 3D effect (if configured) */ + WIDGET__EFFECT_DrawDown(&pObj->Widget); +} + +/********************************************************************* +* +* _ToggleMultiSel +*/ +static void _ToggleMultiSel(LISTBOX_Handle hObj, LISTBOX_Obj* pObj, int Sel) { + if (pObj->Flags & LISTBOX_SF_MULTISEL) { + WM_HMEM hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, Sel); + if (hItem) { + LISTBOX_ITEM * pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + if (!(pItem->Status & LISTBOX_ITEM_DISABLED)) { + pItem->Status ^= LISTBOX_ITEM_SELECTED; + _NotifyOwner(hObj, WM_NOTIFICATION_SEL_CHANGED); + LISTBOX__InvalidateItem(hObj, pObj, Sel); + } + } + } +} + +/********************************************************************* +* +* _GetItemFromPos +*/ +static int _GetItemFromPos(LISTBOX_Handle hObj, LISTBOX_Obj* pObj, int x, int y) { + int Sel = -1; + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + if ((x >= Rect.x0) && (y >= Rect.y0)) { + if ((x <= Rect.x1) && (y <= Rect.y1)) { + int NumItems = LISTBOX__GetNumItems(pObj); + int i, y0 = Rect.y0; + for (i = pObj->ScrollStateV.v; i < NumItems; i++) { + if (y >= y0) { + Sel = i; + } + y0 += _GetItemSizeY(hObj, pObj, i); + } + } + } + return Sel; +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(LISTBOX_Handle hObj, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed == 0) { + _NotifyOwner(hObj, WM_NOTIFICATION_RELEASED); + } + } else { /* Mouse moved out */ + _NotifyOwner(hObj, WM_NOTIFICATION_MOVED_OUT); + } +} + +/********************************************************************* +* +* _OnMouseOver +*/ +#if GUI_SUPPORT_MOUSE +static int _OnMouseOver(LISTBOX_Handle hObj, LISTBOX_Obj* pObj, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pObj->hOwner) { + if (pState) { /* Something happened in our area (pressed or released) */ + int Sel; + Sel = _GetItemFromPos(hObj, pObj, pState->x, pState->y); + if (Sel >= 0) { + if (Sel < (int)(pObj->ScrollStateV.v + _GetNumVisItems(pObj, hObj))) { + LISTBOX_SetSel(hObj, Sel); + } + } + } + } + return 0; /* Message handled */ +} +#endif + +/********************************************************************* +* +* _LISTBOX_Callback +*/ +static void _LISTBOX_Callback(WM_MESSAGE*pMsg) { + LISTBOX_Handle hObj = pMsg->hWin; + LISTBOX_Obj* pObj = LISTBOX_H2P(hObj); + WM_SCROLL_STATE ScrollState; + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + /* Owner needs to be informed about focus change */ + if (pMsg->MsgId == WM_SET_FOCUS) { + if (pMsg->Data.v == 0) { /* Lost focus ? */ + _NotifyOwner(hObj, LISTBOX_NOTIFICATION_LOST_FOCUS); + } + } + return; + } + switch (pMsg->MsgId) { + case WM_NOTIFY_PARENT: + switch (pMsg->Data.v) { + case WM_NOTIFICATION_VALUE_CHANGED: + if (pMsg->hWinSrc == WM_GetScrollbarV(hObj)) { + WM_GetScrollState(pMsg->hWinSrc, &ScrollState); + pObj->ScrollStateV.v = ScrollState.v; + LISTBOX__InvalidateInsideArea(hObj); + _NotifyOwner(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + } else if (pMsg->hWinSrc == WM_GetScrollbarH(hObj)) { + WM_GetScrollState(pMsg->hWinSrc, &ScrollState); + pObj->ScrollStateH.v = ScrollState.v; + LISTBOX__InvalidateInsideArea(hObj); + _NotifyOwner(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + } + break; + case WM_NOTIFICATION_SCROLLBAR_ADDED: + LISTBOX_UpdateScrollers(hObj); + break; + } + break; + case WM_PAINT: + _OnPaint(hObj, pObj, pMsg); + break; + case WM_PID_STATE_CHANGED: + { + const WM_PID_STATE_CHANGED_INFO* pInfo = (const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p; + if (pInfo->State) { + int Sel; + Sel = _GetItemFromPos(hObj, pObj, pInfo->x, pInfo->y); + if (Sel >= 0) { + _ToggleMultiSel(hObj, pObj, Sel); + LISTBOX_SetSel(hObj, Sel); + } + _NotifyOwner(hObj, WM_NOTIFICATION_CLICKED); + return; + } + } + break; + case WM_TOUCH: + _OnTouch(hObj, pMsg); + return; +#if GUI_SUPPORT_MOUSE + case WM_MOUSEOVER: + if (_OnMouseOver(hObj, pObj, pMsg) == 0) + return; + break; +#endif + case WM_DELETE: + _FreeAttached(pObj); + break; /* No return here ... WM_DefaultProc needs to be called */ + case WM_KEY: + if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt > 0) { + int Key; + Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + if (LISTBOX_AddKey(hObj, Key)) { + return; + } + } + break; + case WM_SIZE: + LISTBOX_UpdateScrollers(hObj); + WM_InvalidateWindow(hObj); + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* _MoveSel +* +* Moves the selection/focus to the next valid item +*/ +static void _MoveSel(LISTBOX_Handle hObj, int Dir) { + int Index, NewSel = -1, NumItems; + LISTBOX_Obj * pObj; + pObj = LISTBOX_H2P(hObj); + Index = LISTBOX_GetSel(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + do { + WM_HMEM hItem; + Index += Dir; + if ((Index < 0) || (Index >= NumItems)) { + break; + } + hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, Index); + if (hItem) { + LISTBOX_ITEM * pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + if (!(pItem->Status & LISTBOX_ITEM_DISABLED)) { + NewSel = Index; + } + } + } while(NewSel < 0); + if (NewSel >= 0) { + LISTBOX_SetSel(hObj, NewSel); + } +} + +/********************************************************************* +* +* _AddKey +* +* Returns: 1 if Key has been consumed +* 0 else +*/ +static int _AddKey(LISTBOX_Handle hObj, int Key) { + LISTBOX_Obj* pObj; + pObj = LISTBOX_H2P(hObj); + switch (Key) { + case ' ': + _ToggleMultiSel(hObj, pObj, pObj->Sel); + return 1; /* Key has been consumed */ + case GUI_KEY_RIGHT: + if (WM_SetScrollValue(&pObj->ScrollStateH, pObj->ScrollStateH.v + pObj->Props.ScrollStepH)) { + LISTBOX_UpdateScrollers(hObj); + LISTBOX__InvalidateInsideArea(hObj); + } + return 1; /* Key has been consumed */ + case GUI_KEY_LEFT: + if (WM_SetScrollValue(&pObj->ScrollStateH, pObj->ScrollStateH.v - pObj->Props.ScrollStepH)) { + LISTBOX_UpdateScrollers(hObj); + LISTBOX__InvalidateInsideArea(hObj); + } + return 1; /* Key has been consumed */ + case GUI_KEY_DOWN: + LISTBOX_IncSel(hObj); + return 1; /* Key has been consumed */ + case GUI_KEY_UP: + LISTBOX_DecSel(hObj); + return 1; /* Key has been consumed */ + default: + if(_IsAlphaNum(Key)) { + _SelectByKey(hObj, Key); + return 1; /* Key has been consumed */ + } + } + return 0; +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_CreateEx +*/ +LISTBOX_Handle LISTBOX_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, const GUI_ConstString* ppText) +{ + LISTBOX_Handle hObj; + GUI_USE_PARA(ExFlags); + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _LISTBOX_Callback, + sizeof(LISTBOX_Obj) - sizeof(WM_Obj)); + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->ItemArray); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + pObj->Props = LISTBOX_DefaultProps; + if (ppText) { + /* init member variables */ + /* Set non-zero attributes */ + LISTBOX_SetText(hObj, ppText); + } + INIT_ID(pObj); + LISTBOX_UpdateScrollers(hObj); + WM_UNLOCK(); + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_InvalidateItem +*/ +void LISTBOX_InvalidateItem(LISTBOX_Handle hObj, int Index) { + if (hObj) { + LISTBOX_Obj* pObj; + int NumItems; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if (Index < NumItems) { + if (Index < 0) { + int i; + for (i = 0; i < NumItems; i++) { + LISTBOX__InvalidateItemSize(pObj, i); + } + LISTBOX_UpdateScrollers(hObj); + LISTBOX__InvalidateInsideArea(hObj); + } else { + LISTBOX__InvalidateItemSize(pObj, Index); + LISTBOX_UpdateScrollers(hObj); + LISTBOX__InvalidateItemAndBelow(hObj, pObj, Index); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_AddKey +* +* Returns: 1 if Key has been consumed +* 0 else +*/ +int LISTBOX_AddKey(LISTBOX_Handle hObj, int Key) { + int r = 0; + if (hObj) { + WM_LOCK(); + r = _AddKey(hObj, Key); + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* LISTBOX_AddString +*/ +void LISTBOX_AddString(LISTBOX_Handle hObj, const char* s) { + if (hObj && s) { + LISTBOX_Obj* pObj; + LISTBOX_ITEM Item = {0, 0}; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + if (GUI_ARRAY_AddItem(&pObj->ItemArray, &Item, sizeof(LISTBOX_ITEM) + strlen(s)) == 0) { + unsigned ItemIndex = GUI_ARRAY_GetNumItems(&pObj->ItemArray) - 1; + LISTBOX_ITEM* pItem= (LISTBOX_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, ItemIndex); + strcpy(pItem->acText, s); + LISTBOX__InvalidateItemSize(pObj, ItemIndex); + LISTBOX_UpdateScrollers(hObj); + LISTBOX__InvalidateItem(hObj, pObj, ItemIndex); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_SetText +*/ +void LISTBOX_SetText(LISTBOX_Handle hObj, const GUI_ConstString* ppText) { + if (hObj) { + int i; + const char* s; + WM_LOCK(); + if (ppText) { + for (i = 0; (s = *(ppText+i)) != 0; i++) { + LISTBOX_AddString(hObj, s); + } + } + LISTBOX_InvalidateItem(hObj, LISTBOX_ALL_ITEMS); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_SetSel +*/ +void LISTBOX_SetSel (LISTBOX_Handle hObj, int NewSel) { + if (hObj) { + LISTBOX_Obj* pObj; + int MaxSel; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + MaxSel = LISTBOX__GetNumItems(pObj); + MaxSel = MaxSel ? MaxSel - 1 : 0; + if (NewSel > MaxSel) { + NewSel = MaxSel; + } + if (NewSel < 0) { + NewSel = -1; + } else { + WM_HMEM hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, NewSel); + if (hItem) { + LISTBOX_ITEM* pItem = (LISTBOX_ITEM*)GUI_ALLOC_h2p(hItem); + if (pItem->Status & LISTBOX_ITEM_DISABLED) { + NewSel = -1; + } + } + } + if (NewSel != pObj->Sel) { + int OldSel; + OldSel = pObj->Sel; + pObj->Sel = NewSel; + if (_UpdateScrollPos(hObj, pObj)) { + LISTBOX__InvalidateInsideArea(hObj); + } else { + LISTBOX__InvalidateItem(hObj, pObj, OldSel); + LISTBOX__InvalidateItem(hObj, pObj, NewSel); + } + _NotifyOwner(hObj, WM_NOTIFICATION_SEL_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_GetSel +*/ +int LISTBOX_GetSel (LISTBOX_Handle hObj) { + int r = -1; + LISTBOX_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + r = pObj->Sel; + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* LISTBOX_IncSel +*/ +void LISTBOX_IncSel (LISTBOX_Handle hObj) { + if (hObj) { + WM_LOCK(); + _MoveSel(hObj, 1); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_DecSel +*/ +void LISTBOX_DecSel (LISTBOX_Handle hObj) { + if (hObj) { + WM_LOCK(); + _MoveSel(hObj, -1); + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_C(void) {} +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX.h b/User/system/lib/lcd/gui/Widget/LISTBOX.h new file mode 100644 index 0000000..90530a1 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX.h @@ -0,0 +1,175 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX.h +Purpose : LISTBOX widget include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef LISTBOX_H +#define LISTBOX_H + +#include "WM.h" +#include "WIDGET.h" /* Req. for WIDGET_DRAW_ITEM_FUNC */ +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define LISTBOX_ALL_ITEMS -1 + +/********************************************************************* +* +* Color indices +*/ +#define LISTBOX_CI_UNSEL 0 +#define LISTBOX_CI_SEL 1 +#define LISTBOX_CI_SELFOCUS 2 + +/************************************************************ +* +* States +*/ +typedef WM_HMEM LISTBOX_Handle; + +/********************************************************************* +* +* Notification codes +* +* The following is the list of notification codes specific to this widget, +* Send with the WM_NOTIFY_PARENT message +*/ +#define LISTBOX_NOTIFICATION_LOST_FOCUS (WM_NOTIFICATION_WIDGET + 0) + +/************************************************************ +* +* Create / Status flags +*/ +#define LISTBOX_CF_AUTOSCROLLBAR_H (1<<0) +#define LISTBOX_CF_AUTOSCROLLBAR_V (1<<1) +#define LISTBOX_CF_MULTISEL (1<<2) +#define LISTBOX_SF_AUTOSCROLLBAR_H LISTBOX_CF_AUTOSCROLLBAR_H +#define LISTBOX_SF_AUTOSCROLLBAR_V LISTBOX_CF_AUTOSCROLLBAR_V +#define LISTBOX_SF_MULTISEL LISTBOX_CF_MULTISEL + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define LISTBOX_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define LISTBOX_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define LISTBOX_Delete(hObj) WM_DeleteWindow(hObj) +#define LISTBOX_Paint(hObj) WM_Paint(hObj) +#define LISTBOX_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +LISTBOX_Handle LISTBOX_Create (const GUI_ConstString* ppText, int x0, int y0, int xsize, int ysize, int Flags); +LISTBOX_Handle LISTBOX_CreateAsChild (const GUI_ConstString* ppText, WM_HWIN hWinParent, int x0, int y0, int xsize, int ysize, int Flags); +LISTBOX_Handle LISTBOX_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +LISTBOX_Handle LISTBOX_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, const GUI_ConstString* ppText); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +int LISTBOX_AddKey (LISTBOX_Handle hObj, int Key); +void LISTBOX_AddString (LISTBOX_Handle hObj, const char* s); +void LISTBOX_DecSel (LISTBOX_Handle hObj); +void LISTBOX_DeleteItem (LISTBOX_Handle hObj, unsigned int Index); +unsigned LISTBOX_GetItemSpacing (LISTBOX_Handle hObj); +unsigned LISTBOX_GetNumItems (LISTBOX_Handle hObj); +int LISTBOX_GetSel (LISTBOX_Handle hObj); +const GUI_FONT GUI_UNI_PTR * LISTBOX_GetFont (LISTBOX_Handle hObj); +int LISTBOX_GetItemDisabled (LISTBOX_Handle hObj, unsigned Index); +int LISTBOX_GetItemSel (LISTBOX_Handle hObj, unsigned Index); +void LISTBOX_GetItemText (LISTBOX_Handle hObj, unsigned Index, char * pBuffer, int MaxSize); +int LISTBOX_GetMulti (LISTBOX_Handle hObj); +int LISTBOX_GetScrollStepH (LISTBOX_Handle hObj); +void LISTBOX_IncSel (LISTBOX_Handle hObj); +void LISTBOX_InsertString (LISTBOX_Handle hObj, const char* s, unsigned int Index); +int LISTBOX_OwnerDraw (const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo); +void LISTBOX_SetAutoScrollH (LISTBOX_Handle hObj, int OnOff); +void LISTBOX_SetAutoScrollV (LISTBOX_Handle hObj, int OnOff); +void LISTBOX_SetBkColor (LISTBOX_Handle hObj, unsigned int Index, GUI_COLOR color); +void LISTBOX_SetFont (LISTBOX_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont); +void LISTBOX_SetItemDisabled (LISTBOX_Handle hObj, unsigned Index, int OnOff); +void LISTBOX_SetItemSel (LISTBOX_Handle hObj, unsigned Index, int OnOff); +void LISTBOX_SetItemSpacing (LISTBOX_Handle hObj, unsigned Value); +void LISTBOX_SetMulti (LISTBOX_Handle hObj, int Mode); +void LISTBOX_SetOwner (LISTBOX_Handle hObj, WM_HWIN hOwner); +void LISTBOX_SetOwnerDraw (LISTBOX_Handle hObj, WIDGET_DRAW_ITEM_FUNC * pfDrawItem); +void LISTBOX_SetScrollStepH (LISTBOX_Handle hObj, int Value); +void LISTBOX_SetSel (LISTBOX_Handle hObj, int Sel); +void LISTBOX_SetScrollbarWidth(LISTBOX_Handle hObj, unsigned Width); +void LISTBOX_SetString (LISTBOX_Handle hObj, const char* s, unsigned int Index); +void LISTBOX_SetText (LISTBOX_Handle hObj, const GUI_ConstString* ppText); +GUI_COLOR LISTBOX_SetTextColor (LISTBOX_Handle hObj, unsigned int Index, GUI_COLOR Color); +int LISTBOX_UpdateScrollers (LISTBOX_Handle hObj); +void LISTBOX_InvalidateItem (LISTBOX_Handle hObj, int Index); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +const GUI_FONT GUI_UNI_PTR* LISTBOX_GetDefaultFont(void); +int LISTBOX_GetDefaultScrollStepH (void); +GUI_COLOR LISTBOX_GetDefaultBkColor (unsigned Index); +GUI_COLOR LISTBOX_GetDefaultTextColor (unsigned Index); +void LISTBOX_SetDefaultFont (const GUI_FONT GUI_UNI_PTR * pFont); +void LISTBOX_SetDefaultScrollStepH (int Value); +void LISTBOX_SetDefaultBkColor (unsigned Index, GUI_COLOR Color); +void LISTBOX_SetDefaultTextColor (unsigned Index, GUI_COLOR Color); + +/********************************************************************* +* +* Compatibility to older versions +* +********************************************************************** +*/ + +#define LISTBOX_SetBackColor(hObj, Index, Color) LISTBOX_SetBkColor(hObj, Index, Color) +#define LISTBOX_DeleteString LISTBOX_DeleteItem + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ +#endif /* LISTBOX_H */ diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_Create.c b/User/system/lib/lcd/gui/Widget/LISTBOX_Create.c new file mode 100644 index 0000000..7cbf6a7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_Create.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_Create.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_Create +*/ +LISTBOX_Handle LISTBOX_Create(const GUI_ConstString* ppText, int x0, int y0, int xsize, int ysize, int Flags) { + return LISTBOX_CreateEx(x0, y0, xsize, ysize, WM_HWIN_NULL, Flags, 0, 0, ppText); +} + +/********************************************************************* +* +* LISTBOX_CreateAsChild +*/ +LISTBOX_Handle LISTBOX_CreateAsChild(const GUI_ConstString* ppText, WM_HWIN hWinParent, + int x0, int y0, int xsize, int ysize, int Flags) +{ + return LISTBOX_CreateEx(x0, y0, xsize, ysize, hWinParent, Flags, 0, 0, ppText); +} + +#else /* avoid empty object files */ + void LISTBOX_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/LISTBOX_CreateIndirect.c new file mode 100644 index 0000000..09191f5 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_CreateIndirect.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_CreateIndirect.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "LISTBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_CreateIndirect +*/ +LISTBOX_Handle LISTBOX_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + LISTBOX_Handle hObj; + GUI_USE_PARA(cb); + hObj = LISTBOX_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id, 0); + return hObj; +} + +#else /* avoid empty object files */ + void LISTBOX_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_Default.c b/User/system/lib/lcd/gui/Widget/LISTBOX_Default.c new file mode 100644 index 0000000..2b66a09 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_Default.c @@ -0,0 +1,108 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_Default.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetDefaultFont +*/ +void LISTBOX_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + LISTBOX_DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* LISTBOX_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * LISTBOX_GetDefaultFont(void) { + return LISTBOX_DefaultProps.pFont; +} + +/********************************************************************* +* +* LISTBOX_SetDefaultScrollStepH +*/ +void LISTBOX_SetDefaultScrollStepH(int Value) { + LISTBOX_DefaultProps.ScrollStepH = Value; +} + +/********************************************************************* +* +* LISTBOX_GetDefaultScrollStepH +*/ +int LISTBOX_GetDefaultScrollStepH(void) { + return LISTBOX_DefaultProps.ScrollStepH; +} + +/********************************************************************* +* +* LISTBOX_SetDefaultBkColor +*/ +void LISTBOX_SetDefaultBkColor(unsigned Index, GUI_COLOR Color) { + if (Index < GUI_COUNTOF(LISTBOX_DefaultProps.aBackColor)) { + LISTBOX_DefaultProps.aBackColor[Index] = Color; + } +} + +/********************************************************************* +* +* LISTBOX_GetDefaultBkColor +*/ +GUI_COLOR LISTBOX_GetDefaultBkColor(unsigned Index) { + if (Index < GUI_COUNTOF(LISTBOX_DefaultProps.aBackColor)) { + return LISTBOX_DefaultProps.aBackColor[Index]; + } + return GUI_INVALID_COLOR; +} + +/********************************************************************* +* +* LISTBOX_SetDefaultTextColor +*/ +void LISTBOX_SetDefaultTextColor(unsigned Index, GUI_COLOR Color) { + if (Index < GUI_COUNTOF(LISTBOX_DefaultProps.aTextColor)) { + LISTBOX_DefaultProps.aTextColor[Index] = Color; + } +} + +/********************************************************************* +* +* LISTBOX_GetDefaultTextColor +*/ +GUI_COLOR LISTBOX_GetDefaultTextColor(unsigned Index) { + if (Index < GUI_COUNTOF(LISTBOX_DefaultProps.aTextColor)) { + return LISTBOX_DefaultProps.aTextColor[Index]; + } + return GUI_INVALID_COLOR; +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_Default_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_DeleteItem.c b/User/system/lib/lcd/gui/Widget/LISTBOX_DeleteItem.c new file mode 100644 index 0000000..e0dbee1 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_DeleteItem.c @@ -0,0 +1,70 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_DeleteItem.c +Purpose : Implementation of LISTBOX_DeleteItem +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* LISTBOX_DeleteItem +*/ +void LISTBOX_DeleteItem(LISTBOX_Handle hObj, unsigned int Index) { + if (hObj) { + int Sel; + LISTBOX_Obj* pObj; + unsigned int NumItems; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if (Index < NumItems) { + GUI_ARRAY_DeleteItem(&pObj->ItemArray, Index); + /* + * Update selection + */ + Sel = pObj->Sel; + if (Sel >= 0) { /* Valid selction ? */ + if ((int)Index == Sel) { /* Deleting selected item ? */ + pObj->Sel = -1; /* Invalidate selection */ + } else if ((int)Index < Sel) { /* Deleting item above selection ? */ + pObj->Sel--; + } + } + if (LISTBOX_UpdateScrollers(hObj)) { + LISTBOX__InvalidateInsideArea(hObj); + } else { + LISTBOX__InvalidateItemAndBelow(hObj, pObj, Index); + } + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_DeleteString_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_Font.c b/User/system/lib/lcd/gui/Widget/LISTBOX_Font.c new file mode 100644 index 0000000..bf2438f --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_Font.c @@ -0,0 +1,69 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_Font.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetFont +*/ +void LISTBOX_SetFont(LISTBOX_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + LISTBOX_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->Props.pFont = pFont; + LISTBOX_InvalidateItem(hObj, LISTBOX_ALL_ITEMS); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_GetFont +*/ +const GUI_FONT GUI_UNI_PTR * LISTBOX_GetFont(LISTBOX_Handle hObj) { + const GUI_FONT GUI_UNI_PTR * pFont = NULL; + LISTBOX_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pFont = pObj->Props.pFont; + WM_UNLOCK(); + } + return pFont; +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_Font_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_GetItemText.c b/User/system/lib/lcd/gui/Widget/LISTBOX_GetItemText.c new file mode 100644 index 0000000..ec65781 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_GetItemText.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_GetItemText.c +Purpose : Implementation of said function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" +#include + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_GetItemText +*/ +void LISTBOX_GetItemText(LISTBOX_Handle hObj, unsigned Index, char * pBuffer, int MaxSize) { + if (hObj) { + unsigned NumItems; + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if (Index < NumItems) { + const char * pString; + int CopyLen; + pString = LISTBOX__GetpString(pObj, Index); + CopyLen = strlen(pString); + if (CopyLen > (MaxSize - 1)) { + CopyLen = MaxSize - 1; + } + memcpy(pBuffer, pString, CopyLen); + pBuffer[CopyLen] = 0; + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_GetItemText_C(void) {} +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_GetNumItems.c b/User/system/lib/lcd/gui/Widget/LISTBOX_GetNumItems.c new file mode 100644 index 0000000..dd42309 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_GetNumItems.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_GetNumItems.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_GetNumItems +*/ +unsigned LISTBOX_GetNumItems(LISTBOX_Handle hObj) { + int r = 0; + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + r = LISTBOX__GetNumItems(pObj); + WM_UNLOCK(); + } + return r; +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_GetNumItems_C(void) {} +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_InsertString.c b/User/system/lib/lcd/gui/Widget/LISTBOX_InsertString.c new file mode 100644 index 0000000..77f0fbb --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_InsertString.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_InsertString.c +Purpose : Implementation of LISTBOX_InsertString +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* LISTBOX_InsertString +*/ +void LISTBOX_InsertString(LISTBOX_Handle hObj, const char* s, unsigned int Index) { + if (hObj && s) { + LISTBOX_Obj* pObj; + unsigned int NumItems; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if (Index < NumItems) { + WM_HMEM hItem; + hItem = GUI_ARRAY_InsertItem(&pObj->ItemArray, Index, sizeof(LISTBOX_ITEM) + strlen(s)); + if (hItem) { + LISTBOX_ITEM* pItem = (LISTBOX_ITEM*)GUI_ALLOC_h2p(hItem); + pItem->Status = 0; + strcpy(pItem->acText, s); + LISTBOX_InvalidateItem(hObj, Index); + } + } else { + LISTBOX_AddString(hObj, s); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_InsertString_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_ItemDisabled.c b/User/system/lib/lcd/gui/Widget/LISTBOX_ItemDisabled.c new file mode 100644 index 0000000..8f3d0a5 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_ItemDisabled.c @@ -0,0 +1,95 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_ItemDisabled.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_ARRAY.h" +#include "LISTBOX_Private.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_GetItemDisabled +*/ +int LISTBOX_GetItemDisabled(LISTBOX_Handle hObj, unsigned Index) { + int Ret = 0; + if (hObj) { + unsigned NumItems; + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if (Index < NumItems) { + WM_HMEM hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, Index); + if (hItem) { + LISTBOX_ITEM * pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + if (pItem->Status & LISTBOX_ITEM_DISABLED) { + Ret = 1; + } + } + } + WM_UNLOCK(); + } + return Ret; +} + +/********************************************************************* +* +* LISTBOX_SetItemDisabled +*/ +void LISTBOX_SetItemDisabled(LISTBOX_Handle hObj, unsigned Index, int OnOff) { + if (hObj) { + unsigned NumItems; + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if (Index < NumItems) { + WM_HMEM hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, Index); + if (hItem) { + LISTBOX_ITEM * pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + if (OnOff) { + if (!(pItem->Status & LISTBOX_ITEM_DISABLED)) { + pItem->Status |= LISTBOX_ITEM_DISABLED; + LISTBOX__InvalidateItem(hObj, pObj, Index); + } + } else { + if (pItem->Status & LISTBOX_ITEM_DISABLED) { + pItem->Status &= ~LISTBOX_ITEM_DISABLED; + LISTBOX__InvalidateItem(hObj, pObj, Index); + } + } + } + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_ItemDisabled_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_ItemSpacing.c b/User/system/lib/lcd/gui/Widget/LISTBOX_ItemSpacing.c new file mode 100644 index 0000000..67c5488 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_ItemSpacing.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_ItemSpacing.c +Purpose : Implementation of LISTBOX_SetItemSpacing & LISTBOX_GetItemSpacing +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* LISTBOX_SetItemSpacing +*/ +void LISTBOX_SetItemSpacing(LISTBOX_Handle hObj, unsigned Value) { + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->ItemSpacing = Value; + LISTBOX_InvalidateItem(hObj, LISTBOX_ALL_ITEMS); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_GetItemSpacing +*/ +unsigned LISTBOX_GetItemSpacing(LISTBOX_Handle hObj) { + unsigned Value = 0; + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + Value = pObj->ItemSpacing; + WM_UNLOCK(); + } + return Value; +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetItemSpacing_C(void); + void LISTBOX_SetItemSpacing_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_MultiSel.c b/User/system/lib/lcd/gui/Widget/LISTBOX_MultiSel.c new file mode 100644 index 0000000..8101167 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_MultiSel.c @@ -0,0 +1,139 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_MultiSel.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_ARRAY.h" +#include "LISTBOX_Private.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetMulti +*/ +void LISTBOX_SetMulti(LISTBOX_Handle hObj, int Mode) { + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + if (Mode) { + if (!(pObj->Flags & LISTBOX_SF_MULTISEL)) { + pObj->Flags |= LISTBOX_SF_MULTISEL; + LISTBOX__InvalidateInsideArea(hObj); + } + } else { + if (pObj->Flags & LISTBOX_SF_MULTISEL) { + pObj->Flags &= ~LISTBOX_SF_MULTISEL; + LISTBOX__InvalidateInsideArea(hObj); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_GetMulti +*/ +int LISTBOX_GetMulti(LISTBOX_Handle hObj) { + int Multi = 0; + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + if (!(pObj->Flags & LISTBOX_SF_MULTISEL)) { + Multi = 0; + } else { + Multi = 1; + } + WM_UNLOCK(); + } + return Multi; +} + +/********************************************************************* +* +* LISTBOX_GetItemSel +*/ +int LISTBOX_GetItemSel(LISTBOX_Handle hObj, unsigned Index) { + int Ret = 0; + if (hObj) { + unsigned NumItems; + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if ((Index < NumItems) && (pObj->Flags & LISTBOX_SF_MULTISEL)) { + WM_HMEM hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, Index); + if (hItem) { + LISTBOX_ITEM * pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + if (pItem->Status & LISTBOX_ITEM_SELECTED) { + Ret = 1; + } + } + } + WM_UNLOCK(); + } + return Ret; +} + +/********************************************************************* +* +* LISTBOX_SetItemSel +*/ +void LISTBOX_SetItemSel(LISTBOX_Handle hObj, unsigned Index, int OnOff) { + if (hObj) { + unsigned NumItems; + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + NumItems = LISTBOX__GetNumItems(pObj); + if ((Index < NumItems) && (pObj->Flags & LISTBOX_SF_MULTISEL)) { + WM_HMEM hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, Index); + if (hItem) { + LISTBOX_ITEM * pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); + if (OnOff) { + if (!(pItem->Status & LISTBOX_ITEM_SELECTED)) { + pItem->Status |= LISTBOX_ITEM_SELECTED; + LISTBOX__InvalidateItem(hObj, pObj, Index); + } + } else { + if (pItem->Status & LISTBOX_ITEM_SELECTED) { + pItem->Status &= ~LISTBOX_ITEM_SELECTED; + LISTBOX__InvalidateItem(hObj, pObj, Index); + } + } + } + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_MultiSel_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_Private.h b/User/system/lib/lcd/gui/Widget/LISTBOX_Private.h new file mode 100644 index 0000000..b38398a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_Private.h @@ -0,0 +1,119 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_Private.h +Purpose : Private LISTBOX include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef LISTBOX_PRIVATE_H +#define LISTBOX_PRIVATE_H + +#include "LISTBOX.h" +#include "WM.h" +#include "GUI_ARRAY.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define LISTBOX_H2P(h) (LISTBOX_Obj*) GUI_ALLOC_h2p(h) + +#if GUI_DEBUG_LEVEL >1 + #define OBJECT_ID 0x4C69 /* Magic numer, should be unique if possible */ + #define ASSERT_IS_VALID_PTR(p) GUI_DEBUG_ERROROUT_IF(p->DebugId != OBJECT_ID, "EDIT.C: Wrong handle type or Object not init'ed") + #define INIT_ID(p) p->DebugId = OBJECT_ID + #define DEINIT_ID(p) p->DebugId = 0 +#else + #define ASSERT_IS_VALID_PTR(p) + #define INIT_ID(p) + #define DEINIT_ID(p) +#endif + +#define LISTBOX_ITEM_SELECTED (1 << 0) +#define LISTBOX_ITEM_DISABLED (1 << 1) + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + U16 xSize, ySize; + U8 Status; + char acText[1]; +} LISTBOX_ITEM; + +typedef struct { + const GUI_FONT GUI_UNI_PTR* pFont; + U16 ScrollStepH; + GUI_COLOR aBackColor[4]; + GUI_COLOR aTextColor[4]; +} LISTBOX_PROPS; + +typedef struct { + WIDGET Widget; + GUI_ARRAY ItemArray; + WIDGET_DRAW_ITEM_FUNC* pfDrawItem; + WM_SCROLL_STATE ScrollStateV; + WM_SCROLL_STATE ScrollStateH; + LISTBOX_PROPS Props; + WM_HWIN hOwner; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif + I16 Sel; /* current selection */ + U8 Flags; + U8 ScrollbarWidth; + U16 ItemSpacing; +} LISTBOX_Obj; + +/********************************************************************* +* +* Private (module internal) data +* +********************************************************************** +*/ + +extern LISTBOX_PROPS LISTBOX_DefaultProps; + +/********************************************************************* +* +* Private (module internal) functions +* +********************************************************************** +*/ +unsigned LISTBOX__GetNumItems (const LISTBOX_Obj* pObj); +const char* LISTBOX__GetpString (const LISTBOX_Obj* pObj, int Index); +void LISTBOX__InvalidateInsideArea (LISTBOX_Handle hObj); +void LISTBOX__InvalidateItem (LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, int Sel); +void LISTBOX__InvalidateItemAndBelow(LISTBOX_Handle hObj, const LISTBOX_Obj* pObj, int Sel); +void LISTBOX__InvalidateItemSize (const LISTBOX_Obj* pObj, unsigned Index); +void LISTBOX__SetScrollbarWidth (LISTBOX_Handle hObj, const LISTBOX_Obj* pObj); + +#endif /* GUI_WINSUPPORT */ + +#else /* Avoid problems with empty object modules */ + void LISTBOX_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_ScrollStep.c b/User/system/lib/lcd/gui/Widget/LISTBOX_ScrollStep.c new file mode 100644 index 0000000..88827dd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_ScrollStep.c @@ -0,0 +1,60 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_ScrollStep.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* LISTBOX_SetScrollStepH +*/ +void LISTBOX_SetScrollStepH(LISTBOX_Handle hObj, int Value) { + if (hObj) { + LISTBOX_Obj * pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + pObj->Props.ScrollStepH = Value; + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_GetScrollStepH +*/ +int LISTBOX_GetScrollStepH(LISTBOX_Handle hObj) { + int Value = 0; + if (hObj) { + LISTBOX_Obj * pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + Value = pObj->Props.ScrollStepH; + WM_UNLOCK(); + } + return Value; +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_ScrollStep_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetAutoScroll.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetAutoScroll.c new file mode 100644 index 0000000..066ab63 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetAutoScroll.c @@ -0,0 +1,84 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetAutoScroll.c +Purpose : Implementation of LISTBOX_SetAutoScroll +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_ARRAY.h" +#include "LISTBOX_Private.h" +#include "SCROLLBAR.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetAutoScrollH +*/ +void LISTBOX_SetAutoScrollH(LISTBOX_Handle hObj, int State) { + if (hObj) { + LISTBOX_Obj* pObj; + char Flags; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + Flags = pObj->Flags & (~LISTBOX_SF_AUTOSCROLLBAR_H); + if (State) { + Flags |= LISTBOX_SF_AUTOSCROLLBAR_H; + } + if (pObj->Flags != Flags) { + pObj->Flags = Flags; + LISTBOX_UpdateScrollers(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTBOX_SetAutoScrollV +*/ +void LISTBOX_SetAutoScrollV(LISTBOX_Handle hObj, int State) { + if (hObj) { + LISTBOX_Obj* pObj; + char Flags; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + Flags = pObj->Flags & (~LISTBOX_SF_AUTOSCROLLBAR_V); + if (State) { + Flags |= LISTBOX_SF_AUTOSCROLLBAR_V; + } + if (pObj->Flags != Flags) { + pObj->Flags = Flags; + LISTBOX_UpdateScrollers(hObj); + } + WM_UNLOCK(); + } +} + + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetAutoScroll_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetBkColor.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetBkColor.c new file mode 100644 index 0000000..00d18b0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetBkColor.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetBkColor.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetBkColor +*/ +void LISTBOX_SetBkColor(LISTBOX_Handle hObj, unsigned Index, GUI_COLOR color) { + LISTBOX_Obj* pObj; + if (hObj) { + if ((unsigned int)Index < GUI_COUNTOF(pObj->Props.aBackColor)) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->Props.aBackColor[Index] = color; + LISTBOX__InvalidateInsideArea(hObj); + WM_UNLOCK(); + } + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetBkColor_C(void) {} +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetOwner.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetOwner.c new file mode 100644 index 0000000..489f9c9 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetOwner.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetOwner.c +Purpose : Implementation of LISTBOX_SetOwner +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" + + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* LISTBOX_SetOwner +*/ +void LISTBOX_SetOwner(LISTBOX_Handle hObj, WM_HWIN hOwner) { + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->hOwner = hOwner; + LISTBOX__InvalidateInsideArea(hObj); + WM_UNLOCK(); + } +} + + + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetOwner_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetOwnerDraw.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetOwnerDraw.c new file mode 100644 index 0000000..28f562a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetOwnerDraw.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetOwnerDraw.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetOwnerDraw +*/ +void LISTBOX_SetOwnerDraw(LISTBOX_Handle hObj, WIDGET_DRAW_ITEM_FUNC * pfDrawItem) { + LISTBOX_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->pfDrawItem = pfDrawItem; + LISTBOX_InvalidateItem(hObj, LISTBOX_ALL_ITEMS); + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetOwnerDraw_C(void) {} +#endif + +/*************************** End of file ****************************/ + diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetScrollbarWidth.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetScrollbarWidth.c new file mode 100644 index 0000000..35aac2c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetScrollbarWidth.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetScrollbarWidth.c +Purpose : Implementation of listbox widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTBOX_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetScrollbarWidth +*/ +void LISTBOX_SetScrollbarWidth(LISTBOX_Handle hObj, unsigned Width) { + LISTBOX_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + if (Width != (unsigned)pObj->ScrollbarWidth) { + pObj->ScrollbarWidth = Width; + LISTBOX__SetScrollbarWidth(hObj, pObj); + LISTBOX_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetScrollbarWidth_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetString.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetString.c new file mode 100644 index 0000000..7edc5aa --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetString.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetString.c +Purpose : Implementation of LISTBOX_SetString +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" + + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTBOX_SetString +*/ +void LISTBOX_SetString(LISTBOX_Handle hObj, const char* s, unsigned int Index) { + if (hObj) { + LISTBOX_Obj* pObj; + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + if (Index < (unsigned int)LISTBOX__GetNumItems(pObj)) { + LISTBOX_ITEM* pItem; + pItem = (LISTBOX_ITEM*)GUI_ARRAY_ResizeItem(&pObj->ItemArray, Index, sizeof(LISTBOX_ITEM) + strlen(s)); + if (pItem) { + strcpy(pItem->acText, s); + LISTBOX__InvalidateItemSize(pObj, Index); + LISTBOX_UpdateScrollers(hObj); + LISTBOX__InvalidateItem(hObj, pObj, Index); + } + } + WM_UNLOCK(); + } +} + + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetString_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTBOX_SetTextColor.c b/User/system/lib/lcd/gui/Widget/LISTBOX_SetTextColor.c new file mode 100644 index 0000000..930e70b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTBOX_SetTextColor.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTBOX_SetTextColor.c +Purpose : Implementation of LISTBOX_SetTextColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "LISTBOX_Private.h" + + +#if GUI_WINSUPPORT + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ + +/********************************************************************* +* +* LISTBOX_SetTextColor +*/ +GUI_COLOR LISTBOX_SetTextColor(LISTBOX_Handle hObj, unsigned int Index, GUI_COLOR Color) { + GUI_COLOR r = GUI_INVALID_COLOR; + if (hObj) { + LISTBOX_Obj* pObj; + if (Index < GUI_COUNTOF(pObj->Props.aBackColor)) { + WM_LOCK(); + pObj = LISTBOX_H2P(hObj); + ASSERT_IS_VALID_PTR(pObj); + pObj->Props.aTextColor[Index] = Color; + r = pObj->Props.aTextColor[Index]; + LISTBOX__InvalidateInsideArea(hObj); + WM_UNLOCK(); + } + } + return r; +} + + + +#else /* Avoid problems with empty object modules */ + void LISTBOX_SetTextColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW.c b/User/system/lib/lcd/gui/Widget/LISTVIEW.c new file mode 100644 index 0000000..a94e6d2 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW.c @@ -0,0 +1,721 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW.c +Purpose : Implementation of listview widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_ARRAY.h" +#include +#include +#include "LISTVIEW_Private.h" +#include "HEADER.h" +#include "WIDGET.h" +#include "SCROLLBAR.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef LISTVIEW_FONT_DEFAULT + #define LISTVIEW_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define colors */ +#ifndef LISTVIEW_BKCOLOR0_DEFAULT + #define LISTVIEW_BKCOLOR0_DEFAULT GUI_WHITE /* Not selected */ +#endif + +#ifndef LISTVIEW_BKCOLOR1_DEFAULT + #define LISTVIEW_BKCOLOR1_DEFAULT GUI_GRAY /* Selected, no focus */ +#endif + +#ifndef LISTVIEW_BKCOLOR2_DEFAULT + #define LISTVIEW_BKCOLOR2_DEFAULT GUI_BLUE /* Selected, focus */ +#endif + +#ifndef LISTVIEW_TEXTCOLOR0_DEFAULT + #define LISTVIEW_TEXTCOLOR0_DEFAULT GUI_BLACK /* Not selected */ +#endif + +#ifndef LISTVIEW_TEXTCOLOR1_DEFAULT + #define LISTVIEW_TEXTCOLOR1_DEFAULT GUI_WHITE /* Selected, no focus */ +#endif + +#ifndef LISTVIEW_TEXTCOLOR2_DEFAULT + #define LISTVIEW_TEXTCOLOR2_DEFAULT GUI_WHITE /* Selected, focus */ +#endif + +#ifndef LISTVIEW_GRIDCOLOR_DEFAULT + #define LISTVIEW_GRIDCOLOR_DEFAULT GUI_LIGHTGRAY +#endif + +/* Define default alignment */ +#ifndef LISTVIEW_ALIGN_DEFAULT + #define LISTVIEW_ALIGN_DEFAULT (GUI_TA_VCENTER | GUI_TA_HCENTER) +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +LISTVIEW_PROPS LISTVIEW_DefaultProps = { + LISTVIEW_BKCOLOR0_DEFAULT, + LISTVIEW_BKCOLOR1_DEFAULT, + LISTVIEW_BKCOLOR2_DEFAULT, + LISTVIEW_TEXTCOLOR0_DEFAULT, + LISTVIEW_TEXTCOLOR1_DEFAULT, + LISTVIEW_TEXTCOLOR2_DEFAULT, + LISTVIEW_GRIDCOLOR_DEFAULT, + LISTVIEW_FONT_DEFAULT +}; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW__GetRowDistY +*/ +unsigned LISTVIEW__GetRowDistY(const LISTVIEW_Obj* pObj) { + unsigned RowDistY; + if (pObj->RowDistY) { + RowDistY = pObj->RowDistY; + } else { + RowDistY = GUI_GetYDistOfFont(pObj->Props.pFont); + if (pObj->ShowGrid) { + RowDistY++; + } + } + return RowDistY; +} + +/********************************************************************* +* +* _GetNumVisibleRows +* +* Purpose: +* Returns the number of visible rows according the header +* and (if exist) horizontal scrollbar. +* +* Return value: +* Number of visible rows. If no entire row can be displayed, this +* function will return one. +*/ +static unsigned _GetNumVisibleRows(LISTVIEW_Handle hObj, const LISTVIEW_Obj* pObj) { + unsigned RowDistY, ySize, r = 1; + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + ySize = Rect.y1 - Rect.y0 + 1 - HEADER_GetHeight(pObj->hHeader); + RowDistY = LISTVIEW__GetRowDistY(pObj); + if (RowDistY) { + r = ySize / RowDistY; + r = (r == 0) ? 1 : r; + } + return r; +} + +/********************************************************************* +* +* _Paint +*/ +static void _Paint(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, WM_MESSAGE* pMsg) { + const GUI_ARRAY* pRow; + GUI_RECT ClipRect, Rect; + int NumRows, NumVisRows, NumColumns; + int LBorder, RBorder, EffectSize; + int xPos, yPos, Width, RowDistY; + int Align, i, j, EndRow; + /* Init some values */ + NumColumns = HEADER_GetNumItems(pObj->hHeader); + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + NumVisRows = _GetNumVisibleRows(hObj, pObj); + RowDistY = LISTVIEW__GetRowDistY(pObj); + LBorder = pObj->LBorder; + RBorder = pObj->RBorder; + EffectSize = pObj->Widget.pEffect->EffectSize; + yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize; + EndRow = pObj->ScrollStateV.v + (((NumVisRows + 1) > NumRows) ? NumRows : NumVisRows + 1); + /* Calculate clipping rectangle */ + ClipRect = *(const GUI_RECT*)pMsg->Data.p; + GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); + WM_GetInsideRectExScrollbar(hObj, &Rect); + GUI__IntersectRect(&ClipRect, &Rect); + /* Set drawing color, font and text mode */ + LCD_SetColor(pObj->Props.aTextColor[0]); + GUI_SetFont(pObj->Props.pFont); + GUI_SetTextMode(GUI_TM_TRANS); + /* Do the drawing */ + for (i = pObj->ScrollStateV.v; i < EndRow; i++) { + pRow = (const GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, i); + if (pRow) { + Rect.y0 = yPos; + /* Break when all other rows are outside the drawing area */ + if (Rect.y0 > ClipRect.y1) { + break; + } + Rect.y1 = yPos + RowDistY - 1; + /* Make sure that we draw only when row is in drawing area */ + if (Rect.y1 >= ClipRect.y0) { + int ColorIndex; + /* Set background color */ + if (i == pObj->Sel) { + ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; + } else { + ColorIndex = 0; + } + LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]); + /* Iterate over all columns */ + if (pObj->ShowGrid) { + Rect.y1--; + } + xPos = EffectSize - pObj->ScrollStateH.v; + for (j = 0; j < NumColumns; j++) { + Width = HEADER_GetItemWidth(pObj->hHeader, j); + Rect.x0 = xPos; + /* Break when all other columns are outside the drawing area */ + if (Rect.x0 > ClipRect.x1) { + break; + } + Rect.x1 = xPos + Width - 1; + /* Make sure that we draw only when column is in drawing area */ + if (Rect.x1 >= ClipRect.x0) { + LISTVIEW_ITEM * pItem; + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, j); + if (pItem->hItemInfo) { + LISTVIEW_ITEM_INFO * pItemInfo; + pItemInfo = (LISTVIEW_ITEM_INFO *)GUI_ALLOC_h2p(pItem->hItemInfo); + LCD_SetBkColor(pItemInfo->aBkColor[ColorIndex]); + LCD_SetColor(pItemInfo->aTextColor[ColorIndex]); + } else { + LCD_SetColor(pObj->Props.aTextColor[ColorIndex]); + } + /* Clear background */ + GUI_ClearRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1); + /* Draw text */ + Rect.x0 += LBorder; + Rect.x1 -= RBorder; + Align = *((int*)GUI_ARRAY_GetpItem(&pObj->AlignArray, j)); + GUI_DispStringInRect(pItem->acText, &Rect, Align); + if (pItem->hItemInfo) { + LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]); + } + } + xPos += Width; + } + /* Clear unused area to the right of items */ + if (xPos <= ClipRect.x1) { + GUI_ClearRect(xPos, Rect.y0, ClipRect.x1, Rect.y1); + } + } + yPos += RowDistY; + } + } + /* Clear unused area below items */ + if (yPos <= ClipRect.y1) { + LCD_SetBkColor(pObj->Props.aBkColor[0]); + GUI_ClearRect(ClipRect.x0, yPos, ClipRect.x1, ClipRect.y1); + } + /* Draw grid */ + if (pObj->ShowGrid) { + LCD_SetColor(pObj->Props.GridColor); + yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize - 1; + for (i = 0; i < NumVisRows; i++) { + yPos += RowDistY; + /* Break when all other rows are outside the drawing area */ + if (yPos > ClipRect.y1) { + break; + } + /* Make sure that we draw only when row is in drawing area */ + if (yPos >= ClipRect.y0) { + GUI_DrawHLine(yPos, ClipRect.x0, ClipRect.x1); + } + } + xPos = EffectSize - pObj->ScrollStateH.v; + for (i = 0; i < NumColumns; i++) { + xPos += HEADER_GetItemWidth(pObj->hHeader, i); + /* Break when all other columns are outside the drawing area */ + if (xPos > ClipRect.x1) { + break; + } + /* Make sure that we draw only when column is in drawing area */ + if (xPos >= ClipRect.x0) { + GUI_DrawVLine(xPos, ClipRect.y0, ClipRect.y1); + } + } + } + /* Draw the effect */ + WIDGET__EFFECT_DrawDown(&pObj->Widget); +} + +/********************************************************************* +* +* LISTVIEW__InvalidateInsideArea +*/ +void LISTVIEW__InvalidateInsideArea(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj) { + GUI_RECT Rect; + int HeaderHeight; + HeaderHeight = HEADER_GetHeight(pObj->hHeader); + WM_GetInsideRectExScrollbar(hObj, &Rect); + Rect.y0 += HeaderHeight; + WM_InvalidateRect(hObj, &Rect); +} + +/********************************************************************* +* +* LISTVIEW__InvalidateRow +*/ +void LISTVIEW__InvalidateRow(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, int Sel) { + if (Sel >= 0) { + GUI_RECT Rect; + int HeaderHeight, RowDistY; + HeaderHeight = HEADER_GetHeight(pObj->hHeader); + RowDistY = LISTVIEW__GetRowDistY(pObj); + WM_GetInsideRectExScrollbar(hObj, &Rect); + Rect.y0 += HeaderHeight + (Sel - pObj->ScrollStateV.v) * RowDistY; + Rect.y1 = Rect.y0 + RowDistY - 1; + WM_InvalidateRect(hObj, &Rect); + } +} + +/********************************************************************* +* +* _SetSelFromPos +*/ +static void _SetSelFromPos(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, const GUI_PID_STATE* pState) { + GUI_RECT Rect; + int x, y, HeaderHeight; + HeaderHeight = HEADER_GetHeight(pObj->hHeader); + WM_GetInsideRectExScrollbar(hObj, &Rect); + x = pState->x - Rect.x0; + y = pState->y - Rect.y0 - HeaderHeight; + Rect.x1 -= Rect.x0; + Rect.y1 -= Rect.y0; + if ((x >= 0) && (x <= Rect.x1) && (y >= 0) && (y <= (Rect.y1 - HeaderHeight))) { + unsigned Sel; + Sel = (y / LISTVIEW__GetRowDistY(pObj)) + pObj->ScrollStateV.v; + if (Sel < GUI_ARRAY_GetNumItems(&pObj->RowArray)) { + LISTVIEW_SetSel(hObj, Sel); + } + } +} + +/********************************************************************* +* +* _NotifyOwner +* +* Purpose: +* Notify owner of the window. +* If no owner is registered, the parent is considered owner. +*/ +static void _NotifyOwner(WM_HWIN hObj, int Notification) { + WM_MESSAGE Msg = {0}; + WM_HWIN hOwner; + LISTVIEW_Obj* pObj = LISTVIEW_H2P(hObj); + hOwner = pObj->hOwner ? pObj->hOwner : WM_GetParent(hObj); + Msg.MsgId = WM_NOTIFY_PARENT; + Msg.Data.v = Notification; + Msg.hWin = hObj; + WM_SendMessage(hOwner, &Msg); +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, WM_MESSAGE*pMsg) { + int Notification; + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + GUI_USE_PARA(pObj); + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + _SetSelFromPos(hObj, pObj, pState); + Notification = WM_NOTIFICATION_CLICKED; + WM_SetFocus(hObj); + } else { + Notification = WM_NOTIFICATION_RELEASED; + } + } else { + Notification = WM_NOTIFICATION_MOVED_OUT; + } + _NotifyOwner(hObj, Notification); +} + +/********************************************************************* +* +* _GetXSize +* +* Purpose: +* Returns the width of the inside listview area. +*/ +static int _GetXSize(LISTVIEW_Handle hObj) { + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + return Rect.x1 + 1; +} + +/********************************************************************* +* +* _GetHeaderWidth +* +* Purpose: +* Returns the width of all items in header. +* +* Return value: +* NumItems > 0: width of all items. +* NumItems = 0: 1 (to avoid problem with horizontal scrollbar) +*/ +static int _GetHeaderWidth(LISTVIEW_Obj* pObj, HEADER_Handle hHeader) { + int NumItems, i, r = 1; + NumItems = HEADER_GetNumItems(hHeader); + if (NumItems) { + for (i = 0, r = 0; i < NumItems; i++) { + r += HEADER_GetItemWidth(hHeader, i); + } + } + if (pObj->ScrollStateH.v > (r - pObj->ScrollStateH.PageSize)) { + r += pObj->ScrollStateH.PageSize - (r - pObj->ScrollStateH.v); + } + return r; +} + +/********************************************************************* +* +* LISTVIEW__UpdateScrollPos +* +* Purpose: +* Checks whether if we must scroll up or scroll down to ensure +* that selection is in the visible area. This function also +* makes sure that scroll positions are in valid ranges. +* +* Return value: +* Difference between old and new vertical scroll pos. +*/ +int LISTVIEW__UpdateScrollPos(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj) { + int PrevScrollStateV; + PrevScrollStateV = pObj->ScrollStateV.v; + if (pObj->Sel >= 0) { + WM_CheckScrollPos(&pObj->ScrollStateV, pObj->Sel, 0, 0); + } else { + WM_CheckScrollBounds(&pObj->ScrollStateV); + } + WM_CheckScrollBounds(&pObj->ScrollStateH); + WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH); + return pObj->ScrollStateV.v - PrevScrollStateV; +} + +/********************************************************************* +* +* LISTVIEW__UpdateScrollParas +* +* Purpose: +* Calculates number of items and page size of both vertical +* and horizontal scrollbar. After this LISTVIEW__UpdateScrollPos will +* be called to ensure scroll positions are in valid ranges. +*/ +int LISTVIEW__UpdateScrollParas(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj) { + int NumRows; + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + /* update vertical scrollbar */ + pObj->ScrollStateV.PageSize = _GetNumVisibleRows(hObj, pObj); + pObj->ScrollStateV.NumItems = (NumRows) ? NumRows : 1; + /* update horizontal scrollbar */ + pObj->ScrollStateH.PageSize = _GetXSize(hObj); + pObj->ScrollStateH.NumItems = _GetHeaderWidth(pObj, pObj->hHeader); + return LISTVIEW__UpdateScrollPos(hObj, pObj); +} + +/********************************************************************* +* +* _FreeAttached +* +* Purpose: +* Delete attached objects (if any). +*/ +static void _FreeAttached(LISTVIEW_Obj * pObj) { + int i, j, NumRows, NumColumns; + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + NumColumns = GUI_ARRAY_GetNumItems(&pObj->AlignArray); + for (i = 0; i < NumRows; i++) { + GUI_ARRAY * pRow; + pRow = (GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, i); + /* Delete attached info items */ + for (j = 0; j < NumColumns; j++) { + LISTVIEW_ITEM * pItem; + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, j); + if (pItem->hItemInfo) { + GUI_ALLOC_Free(pItem->hItemInfo); + } + } + /* Delete row */ + GUI_ARRAY_Delete(pRow); + } + GUI_ARRAY_Delete(&pObj->AlignArray); + GUI_ARRAY_Delete(&pObj->RowArray); +} + +/********************************************************************* +* +* _AddKey +* +* Returns: 1 if Key has been consumed +* 0 else +*/ +static int _AddKey(LISTVIEW_Handle hObj, int Key) { + switch (Key) { + case GUI_KEY_DOWN: + LISTVIEW_IncSel(hObj); + return 1; /* Key has been consumed */ + case GUI_KEY_UP: + LISTVIEW_DecSel(hObj); + return 1; /* Key has been consumed */ + } + return 0; /* Key has NOT been consumed */ +} + +/********************************************************************* +* +* _LISTVIEW_Callback +*/ +static void _LISTVIEW_Callback (WM_MESSAGE *pMsg) { + LISTVIEW_Handle hObj; + LISTVIEW_Obj* pObj; + WM_SCROLL_STATE ScrollState; + hObj = pMsg->hWin; + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + pObj = LISTVIEW_H2P(hObj); + switch (pMsg->MsgId) { + case WM_NOTIFY_CLIENTCHANGE: + case WM_SIZE: + LISTVIEW__UpdateScrollParas(hObj, pObj); + return; + case WM_NOTIFY_PARENT: + switch (pMsg->Data.v) { + case WM_NOTIFICATION_CHILD_DELETED: + /* make sure we do not send any messages to the header child once it has been deleted */ + if (pMsg->hWinSrc == pObj->hHeader) { + pObj->hHeader = 0; + } + break; + case WM_NOTIFICATION_VALUE_CHANGED: + if (pMsg->hWinSrc == WM_GetScrollbarV(hObj)) { + WM_GetScrollState(pMsg->hWinSrc, &ScrollState); + pObj->ScrollStateV.v = ScrollState.v; + LISTVIEW__InvalidateInsideArea(hObj, pObj); + _NotifyOwner(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + } else if (pMsg->hWinSrc == WM_GetScrollbarH(hObj)) { + WM_GetScrollState(pMsg->hWinSrc, &ScrollState); + pObj->ScrollStateH.v = ScrollState.v; + LISTVIEW__UpdateScrollParas(hObj, pObj); + HEADER_SetScrollPos(pObj->hHeader, pObj->ScrollStateH.v); + _NotifyOwner(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + } + break; + case WM_NOTIFICATION_SCROLLBAR_ADDED: + LISTVIEW__UpdateScrollParas(hObj, pObj); + break; + } + return; + case WM_PAINT: + _Paint(hObj, pObj, pMsg); + return; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + return; /* Important: message handled ! */ + case WM_KEY: + if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt > 0) { + int Key; + Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + if (_AddKey(hObj, Key)) { + return; + } + } + break; /* No return here ... WM_DefaultProc needs to be called */ + case WM_DELETE: + _FreeAttached(pObj); + break; /* No return here ... WM_DefaultProc needs to be called */ + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* LISTVIEW_CreateEx +*/ +LISTVIEW_Handle LISTVIEW_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + LISTVIEW_Handle hObj; + GUI_USE_PARA(ExFlags); + /* Create the window */ + if ((xsize == 0) && (ysize == 0) && (x0 == 0) && (y0 == 0)) { + GUI_RECT Rect; + WM_GetClientRectEx(hParent, &Rect); + xsize = Rect.x1 - Rect.x0 + 1; + ysize = Rect.y1 - Rect.y0 + 1; + } + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, &_LISTVIEW_Callback, + sizeof(LISTVIEW_Obj) - sizeof(WM_Obj)); + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->RowArray); + GUI_ARRAY_CREATE(&pObj->AlignArray); + /* Init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + /* Init member variables */ + LISTVIEW_INIT_ID(pObj); + pObj->Props = LISTVIEW_DefaultProps; + pObj->ShowGrid = 0; + pObj->RowDistY = 0; + pObj->Sel = -1; + pObj->LBorder = 1; + pObj->RBorder = 1; + pObj->hHeader = HEADER_CreateEx(0, 0, 0, 0, hObj, WM_CF_SHOW, 0, 0); + LISTVIEW__UpdateScrollParas(hObj, pObj); + WM_UNLOCK(); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "LISTVIEW_Create failed") + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Member functions +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_IncSel +*/ +void LISTVIEW_IncSel(LISTVIEW_Handle hObj) { + int Sel = LISTVIEW_GetSel(hObj); + LISTVIEW_SetSel(hObj, Sel + 1); +} + +/********************************************************************* +* +* LISTVIEW_DecSel +*/ +void LISTVIEW_DecSel(LISTVIEW_Handle hObj) { + int Sel = LISTVIEW_GetSel(hObj); + if (Sel) { + LISTVIEW_SetSel(hObj, Sel - 1); + } +} + +/********************************************************************* +* +* LISTVIEW_AddColumn +*/ +void LISTVIEW_AddColumn(LISTVIEW_Handle hObj, int Width, const char * s, int Align) { + if (hObj) { + LISTVIEW_Obj* pObj; + unsigned NumRows; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + HEADER_AddItem(pObj->hHeader, Width, s, Align); /* Modify header */ + GUI_ARRAY_AddItem(&pObj->AlignArray, &Align, sizeof(int)); + NumRows = LISTVIEW_GetNumRows(hObj); + if (NumRows) { + GUI_ARRAY* pRow; + unsigned i; + for (i = 0; i < NumRows; i++) { + pRow = (GUI_ARRAY*) GUI_ARRAY_GetpItem(&pObj->RowArray, i); + GUI_ARRAY_AddItem(pRow, NULL, sizeof(LISTVIEW_ITEM) + 1); + } + } + LISTVIEW__UpdateScrollParas(hObj, pObj); + LISTVIEW__InvalidateInsideArea(hObj, pObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* LISTVIEW_AddRow +*/ +void LISTVIEW_AddRow(LISTVIEW_Handle hObj, const GUI_ConstString* ppText) { + if (hObj) { + LISTVIEW_Obj* pObj; + int NumRows; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + + /* Create GUI_ARRAY for the new row */ + if (GUI_ARRAY_AddItem(&pObj->RowArray, NULL, sizeof(GUI_ARRAY)) == 0) { + int i, NumColumns, NumBytes; + GUI_ARRAY* pRow; + const char* s; + GUI_ARRAY_CREATE((GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, NumRows)); /* For higher debug levels only */ + /* Add columns for the new row */ + NumColumns = HEADER_GetNumItems(pObj->hHeader); + for (i = 0; i < NumColumns; i++) { + LISTVIEW_ITEM * pItem; + pRow = (GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, NumRows); + s = (ppText) ? *ppText++ : 0; + if (s == 0) { + ppText = 0; + } + NumBytes = GUI__strlen(s) + 1; /* 0 if no string is specified (s == NULL) */ + GUI_ARRAY_AddItem(pRow, NULL, sizeof(LISTVIEW_ITEM) + NumBytes); + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, i); + if (NumBytes > 1) { + strcpy(pItem->acText, s); + } + } + LISTVIEW__UpdateScrollParas(hObj, pObj); + LISTVIEW__InvalidateRow(hObj, pObj, NumRows); + } + WM_UNLOCK(); + } +} + +#else + void LISTVIEW_C(void); + void LISTVIEW_C(void) {} +#endif /* #if GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW.h b/User/system/lib/lcd/gui/Widget/LISTVIEW.h new file mode 100644 index 0000000..453230e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW.h @@ -0,0 +1,127 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW.h +Purpose : LISTVIEW include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef LISTVIEW_H +#define LISTVIEW_H + +#include "WM.h" +#include "DIALOG.h" /* Req. for Create indirect data structure */ +#include "HEADER.h" + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Color indices +*/ +#define LISTVIEW_CI_UNSEL 0 +#define LISTVIEW_CI_SEL 1 +#define LISTVIEW_CI_SELFOCUS 2 + +/********************************************************************* +* +* Public Types +* +********************************************************************** +*/ + +typedef WM_HMEM LISTVIEW_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +LISTVIEW_Handle LISTVIEW_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int SpecialFlags); +LISTVIEW_Handle LISTVIEW_CreateAttached(WM_HWIN hParent, int Id, int SpecialFlags); +LISTVIEW_Handle LISTVIEW_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +LISTVIEW_Handle LISTVIEW_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define LISTVIEW_Delete(hObj) WM_DeleteWindow (hObj) +#define LISTVIEW_DisableMemdev(hObj) WM_DisableMemdev (hObj) +#define LISTVIEW_EnableMemdev(hObj) WM_EnableMemdev (hObj) +#define LISTVIEW_Invalidate(hObj) WM_InvalidateWindow(hObj) +#define LISTVIEW_Paint(hObj) WM_Paint (hObj) + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +void LISTVIEW_AddColumn (LISTVIEW_Handle hObj, int Width, const char * s, int Align); +void LISTVIEW_AddRow (LISTVIEW_Handle hObj, const GUI_ConstString * ppText); +void LISTVIEW_DecSel (LISTVIEW_Handle hObj); +void LISTVIEW_DeleteColumn (LISTVIEW_Handle hObj, unsigned Index); +void LISTVIEW_DeleteRow (LISTVIEW_Handle hObj, unsigned Index); +GUI_COLOR LISTVIEW_GetBkColor (LISTVIEW_Handle hObj, unsigned Index); +const GUI_FONT GUI_UNI_PTR * LISTVIEW_GetFont (LISTVIEW_Handle hObj); +HEADER_Handle LISTVIEW_GetHeader (LISTVIEW_Handle hObj); +unsigned LISTVIEW_GetNumColumns (LISTVIEW_Handle hObj); +unsigned LISTVIEW_GetNumRows (LISTVIEW_Handle hObj); +int LISTVIEW_GetSel (LISTVIEW_Handle hObj); +GUI_COLOR LISTVIEW_GetTextColor (LISTVIEW_Handle hObj, unsigned Index); +void LISTVIEW_IncSel (LISTVIEW_Handle hObj); +void LISTVIEW_SetBkColor (LISTVIEW_Handle hObj, unsigned int Index, GUI_COLOR Color); +void LISTVIEW_SetColumnWidth(LISTVIEW_Handle hObj, unsigned int Index, int Width); +void LISTVIEW_SetFont (LISTVIEW_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont); +int LISTVIEW_SetGridVis (LISTVIEW_Handle hObj, int Show); +void LISTVIEW_SetItemBkColor(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, unsigned int Index, GUI_COLOR Color); +void LISTVIEW_SetItemText (LISTVIEW_Handle hObj, unsigned Column, unsigned Row, const char * s); +void LISTVIEW_SetItemTextColor(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, unsigned int Index, GUI_COLOR Color); +void LISTVIEW_SetLBorder (LISTVIEW_Handle hObj, unsigned BorderSize); +void LISTVIEW_SetRBorder (LISTVIEW_Handle hObj, unsigned BorderSize); +unsigned LISTVIEW_SetRowHeight (LISTVIEW_Handle hObj, unsigned RowHeight); +void LISTVIEW_SetSel (LISTVIEW_Handle hObj, int Sel); +void LISTVIEW_SetTextAlign (LISTVIEW_Handle hObj, unsigned int Index, int Align); +void LISTVIEW_SetTextColor (LISTVIEW_Handle hObj, unsigned int Index, GUI_COLOR Color); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +GUI_COLOR LISTVIEW_SetDefaultBkColor (unsigned Index, GUI_COLOR Color); +const GUI_FONT GUI_UNI_PTR * LISTVIEW_SetDefaultFont (const GUI_FONT GUI_UNI_PTR * pFont); +GUI_COLOR LISTVIEW_SetDefaultGridColor(GUI_COLOR Color); +GUI_COLOR LISTVIEW_SetDefaultTextColor(unsigned Index, GUI_COLOR Color); + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* LISTVIEW_H */ diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_Create.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_Create.c new file mode 100644 index 0000000..e734ce7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_Create.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_Create.c +Purpose : Implementation of listview widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_Create +*/ +LISTVIEW_Handle LISTVIEW_Create(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int ExFlags) { + return LISTVIEW_CreateEx(x0, y0, xsize, ysize, hParent, Flags, ExFlags, Id); +} + +/********************************************************************* +* +* LISTVIEW_CreateAttached +*/ +LISTVIEW_Handle LISTVIEW_CreateAttached(WM_HWIN hParent, int Id, int SpecialFlags) { + return LISTVIEW_CreateEx(0, 0, 0, 0, hParent, WM_CF_SHOW, SpecialFlags, Id); +} + +#else /* avoid empty object files */ + void LISTVIEW_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_CreateIndirect.c new file mode 100644 index 0000000..1fadb98 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_CreateIndirect.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_CreateIndirect.c +Purpose : Implementation of listview widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_CreateIndirect +*/ +LISTVIEW_Handle LISTVIEW_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + LISTVIEW_Handle hThis; + GUI_USE_PARA(cb); + hThis = LISTVIEW_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else /* avoid empty object files */ + void LISTVIEW_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_Default.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_Default.c new file mode 100644 index 0000000..b8cbd12 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_Default.c @@ -0,0 +1,80 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_Default.c +Purpose : Implementation of listview widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * LISTVIEW_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + const GUI_FONT GUI_UNI_PTR * pOldFont = LISTVIEW_DefaultProps.pFont; + LISTVIEW_DefaultProps.pFont = pFont; + return pOldFont; +} + +/********************************************************************* +* +* LISTVIEW_SetDefaultTextColor +*/ +GUI_COLOR LISTVIEW_SetDefaultTextColor(unsigned Index, GUI_COLOR Color) { + GUI_COLOR OldColor = 0; + if (Index < GUI_COUNTOF(LISTVIEW_DefaultProps.aTextColor)) { + OldColor = LISTVIEW_DefaultProps.aTextColor[Index]; + LISTVIEW_DefaultProps.aTextColor[Index] = Color; + } + return OldColor; +} + +/********************************************************************* +* +* LISTVIEW_SetDefaultBkColor +*/ +GUI_COLOR LISTVIEW_SetDefaultBkColor(unsigned Index, GUI_COLOR Color) { + GUI_COLOR OldColor = 0; + if (Index < GUI_COUNTOF(LISTVIEW_DefaultProps.aBkColor)) { + OldColor = LISTVIEW_DefaultProps.aBkColor[Index]; + LISTVIEW_DefaultProps.aBkColor[Index] = Color; + } + return OldColor; +} + +/********************************************************************* +* +* LISTVIEW_SetDefaultGridColor +*/ +GUI_COLOR LISTVIEW_SetDefaultGridColor(GUI_COLOR Color) { + GUI_COLOR OldColor = LISTVIEW_DefaultProps.GridColor; + LISTVIEW_DefaultProps.GridColor = Color; + return OldColor; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_Default_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteColumn.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteColumn.c new file mode 100644 index 0000000..7278102 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteColumn.c @@ -0,0 +1,66 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_DeleteColumn.c +Purpose : Implementation of LISTVIEW_DeleteColumn +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_DeleteColumn +*/ +void LISTVIEW_DeleteColumn(LISTVIEW_Handle hObj, unsigned Index) { + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (Index < GUI_ARRAY_GetNumItems(&pObj->AlignArray)) { + unsigned NumRows, i; + GUI_ARRAY* pRow; + HEADER_DeleteItem(pObj->hHeader, Index); + GUI_ARRAY_DeleteItem(&pObj->AlignArray, Index); + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + for (i = 0; i < NumRows; i++) { + LISTVIEW_ITEM * pItem; + pRow = (GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, i); + /* Delete attached info items */ + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, Index); + if (pItem->hItemInfo) { + GUI_ALLOC_Free(pItem->hItemInfo); + } + /* Delete cell */ + GUI_ARRAY_DeleteItem(pRow, Index); + } + LISTVIEW__UpdateScrollParas(hObj, pObj); + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_DeleteColumn_C(void); + void LISTVIEW_DeleteColumn_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteRow.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteRow.c new file mode 100644 index 0000000..95750ec --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_DeleteRow.c @@ -0,0 +1,100 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_DeleteRow.c +Purpose : Implementation of LISTVIEW_DeleteRow +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _InvalidateRowAndBelow +*/ +static void _InvalidateRowAndBelow(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, int Sel) { + if (Sel >= 0) { + GUI_RECT Rect; + int HeaderHeight, RowDistY; + HeaderHeight = HEADER_GetHeight(pObj->hHeader); + RowDistY = LISTVIEW__GetRowDistY(pObj); + WM_GetInsideRectExScrollbar(hObj, &Rect); + Rect.y0 += HeaderHeight + (Sel - pObj->ScrollStateV.v) * RowDistY; + WM_InvalidateRect(hObj, &Rect); + } +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_DeleteRow +*/ +void LISTVIEW_DeleteRow(LISTVIEW_Handle hObj, unsigned Index) { + if (hObj) { + LISTVIEW_Obj* pObj; + unsigned NumRows; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + if (Index < NumRows) { + unsigned NumColumns, i; + GUI_ARRAY* pRow; + pRow = (GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, Index); + /* Delete attached info items */ + NumColumns = GUI_ARRAY_GetNumItems(pRow); + for (i = 0; i < NumColumns; i++) { + LISTVIEW_ITEM * pItem; + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, i); + if (pItem->hItemInfo) { + GUI_ALLOC_Free(pItem->hItemInfo); + } + } + /* Delete row */ + GUI_ARRAY_Delete(pRow); + GUI_ARRAY_DeleteItem(&pObj->RowArray, Index); + /* Adjust properties */ + if (pObj->Sel == (signed int)Index) { + pObj->Sel = -1; + } + if (pObj->Sel > (signed int)Index) { + pObj->Sel--; + } + if (LISTVIEW__UpdateScrollParas(hObj, pObj)) { + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } else { + _InvalidateRowAndBelow(hObj, pObj, Index); + } + } + WM_UNLOCK(); + } +} + + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_DeleteRow_C(void); + void LISTVIEW_DeleteRow_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetBkColor.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetBkColor.c new file mode 100644 index 0000000..be4c0e7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetBkColor.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetBkColor.c +Purpose : Implementation of LISTVIEW_GetBkColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetBkColor +*/ +GUI_COLOR LISTVIEW_GetBkColor(LISTVIEW_Handle hObj, unsigned Index) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (Index <= GUI_COUNTOF(pObj->Props.aBkColor)) { + Color = pObj->Props.aBkColor[Index]; + } + WM_UNLOCK(); + } + return Color; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetBkColor_C(void); + void LISTVIEW_GetBkColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetFont.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetFont.c new file mode 100644 index 0000000..0e8f301 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetFont.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetFont.c +Purpose : Implementation of LISTVIEW_GetFont +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetFont +*/ +const GUI_FONT GUI_UNI_PTR * LISTVIEW_GetFont(LISTVIEW_Handle hObj) { + const GUI_FONT GUI_UNI_PTR * pFont = NULL; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + pFont = pObj->Props.pFont; + WM_UNLOCK(); + } + return pFont; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetFont_C(void); + void LISTVIEW_GetFont_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetHeader.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetHeader.c new file mode 100644 index 0000000..f2d67b0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetHeader.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetHeader.c +Purpose : Implementation of LISTVIEW_GetHeader +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetHeader +*/ +HEADER_Handle LISTVIEW_GetHeader(LISTVIEW_Handle hObj) { + HEADER_Handle hHeader = 0; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + hHeader = pObj->hHeader; + WM_UNLOCK(); + } + return hHeader; +} + + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetHeader_C(void); + void LISTVIEW_GetHeader_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumColumns.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumColumns.c new file mode 100644 index 0000000..8c793b7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumColumns.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetNumColumns.c +Purpose : Implementation of LISTVIEW_GetNumColumns +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetNumColumns +*/ +unsigned LISTVIEW_GetNumColumns(LISTVIEW_Handle hObj) { + unsigned NumColumns = 0; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + NumColumns = GUI_ARRAY_GetNumItems(&pObj->AlignArray); + WM_UNLOCK(); + } + return NumColumns; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetNumColumns_C(void); + void LISTVIEW_GetNumColumns_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumRows.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumRows.c new file mode 100644 index 0000000..c798780 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetNumRows.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetNumRows.c +Purpose : Implementation of LISTVIEW_GetNumRows +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetNumRows +*/ +unsigned LISTVIEW_GetNumRows(LISTVIEW_Handle hObj) { + unsigned NumRows = 0; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); + WM_UNLOCK(); + } + return NumRows; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetNumRows(void); + void LISTVIEW_GetNumRows(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetSel.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetSel.c new file mode 100644 index 0000000..0103d48 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetSel.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetSel.c +Purpose : Implementation of LISTVIEW_GetSel +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetSel +*/ +int LISTVIEW_GetSel(LISTVIEW_Handle hObj) { + int r = -1; + if (hObj) { + LISTVIEW_Obj * pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + r = pObj->Sel; + WM_UNLOCK(); + } + return r; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetSel_C(void); + void LISTVIEW_GetSel_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_GetTextColor.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetTextColor.c new file mode 100644 index 0000000..586001b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_GetTextColor.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_GetTextColor.c +Purpose : Implementation of LISTVIEW_GetTextColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_GetTextColor +*/ +GUI_COLOR LISTVIEW_GetTextColor(LISTVIEW_Handle hObj, unsigned Index) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (Index <= GUI_COUNTOF(pObj->Props.aTextColor)) { + Color = pObj->Props.aTextColor[Index]; + } + WM_UNLOCK(); + } + return Color; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_GetTextColor_C(void); + void LISTVIEW_GetTextColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_Private.h b/User/system/lib/lcd/gui/Widget/LISTVIEW_Private.h new file mode 100644 index 0000000..8e42bc0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_Private.h @@ -0,0 +1,120 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_Private.h +Purpose : Private LISTVIEW include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef LISTVIEW_PRIVATE_H +#define LISTVIEW_PRIVATE_H + +#include "WM.h" +#include "LISTVIEW.h" +#include "GUI_ARRAY.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define LISTVIEW_ID 0x4567 /* Magic numer, should be unique if possible */ + +#define LISTVIEW_H2P(h) (LISTVIEW_Obj*) WM_H2P(h) + +#if GUI_DEBUG_LEVEL > 1 + #define LISTVIEW_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != LISTVIEW_ID, "xxx.c: Wrong handle type or Object not init'ed") + #define LISTVIEW_INIT_ID(p) p->DebugId = LISTVIEW_ID + #define LISTVIEW_DEINIT_ID(p) p->DebugId = LISTVIEW_ID+1 +#else + #define LISTVIEW_ASSERT_IS_VALID_PTR(p) + #define LISTVIEW_INIT_ID(p) + #define LISTVIEW_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + GUI_COLOR aBkColor[3]; + GUI_COLOR aTextColor[3]; +} LISTVIEW_ITEM_INFO; + +typedef struct { + WM_HMEM hItemInfo; + char acText[1]; +} LISTVIEW_ITEM; + +typedef struct { + GUI_COLOR aBkColor[3]; + GUI_COLOR aTextColor[3]; + GUI_COLOR GridColor; + const GUI_FONT GUI_UNI_PTR * pFont; +} LISTVIEW_PROPS; + +typedef struct { + WIDGET Widget; + HEADER_Handle hHeader; + GUI_ARRAY RowArray; /* One entry per line. Every entry is a handle of GUI_ARRAY of strings */ + GUI_ARRAY AlignArray; /* One entry per column */ + LISTVIEW_PROPS Props; + int Sel; + int ShowGrid; + unsigned RowDistY; + unsigned LBorder; + unsigned RBorder; + WM_SCROLL_STATE ScrollStateV; + WM_SCROLL_STATE ScrollStateH; + WM_HWIN hOwner; + #if GUI_DEBUG_LEVEL > 1 + int DebugId; + #endif +} LISTVIEW_Obj; + +/********************************************************************* +* +* Private (module internal) data +* +********************************************************************** +*/ + +extern LISTVIEW_PROPS LISTVIEW_DefaultProps; + +/********************************************************************* +* +* Private (module internal) functions +* +********************************************************************** +*/ +int LISTVIEW__UpdateScrollParas (LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj); +void LISTVIEW__InvalidateInsideArea(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj); +unsigned LISTVIEW__GetRowDistY (const LISTVIEW_Obj* pObj); +void LISTVIEW__InvalidateRow (LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, int Sel); +int LISTVIEW__UpdateScrollPos (LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj); + +#endif /* GUI_WINSUPPORT */ + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetBkColor.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetBkColor.c new file mode 100644 index 0000000..3789265 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetBkColor.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetBkColor.c +Purpose : Implementation of LISTVIEW_SetBkColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetBkColor +*/ +void LISTVIEW_SetBkColor(LISTVIEW_Handle hObj, unsigned int Index, GUI_COLOR Color) { + if (hObj) { + LISTVIEW_Obj* pObj; + if (Index < GUI_COUNTOF(pObj->Props.aBkColor)) { + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (Color != pObj->Props.aBkColor[Index]) { + pObj->Props.aBkColor[Index] = Color; + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } + } +} + + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetBkColor_C(void); + void LISTVIEW_SetBkColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetColumnWidth.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetColumnWidth.c new file mode 100644 index 0000000..3e7f5f6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetColumnWidth.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetColumnWidth.c +Purpose : Implementation of LISTVIEW_SetColumnWidth +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetColumnWidth +*/ +void LISTVIEW_SetColumnWidth(LISTVIEW_Handle hObj, unsigned int Index, int Width) { + if (hObj) { + LISTVIEW_Obj * pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + HEADER_SetItemWidth(pObj->hHeader, Index, Width); + WM_UNLOCK(); + } +} + + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetColumnWidth_C(void); + void LISTVIEW_SetColumnWidth_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetFont.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetFont.c new file mode 100644 index 0000000..5a9568b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetFont.c @@ -0,0 +1,51 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetFont.c +Purpose : Implementation of LISTVIEW_SetFont +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetFont +*/ +void LISTVIEW_SetFont(LISTVIEW_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (pFont != pObj->Props.pFont) { + pObj->Props.pFont = pFont; + LISTVIEW__UpdateScrollParas(hObj, pObj); + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetFont_C(void); + void LISTVIEW_SetFont_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetGridVis.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetGridVis.c new file mode 100644 index 0000000..e9a2f04 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetGridVis.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetGridVis.c +Purpose : Implementation of LISTVIEW_SetGridVis +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetGridVis +*/ +int LISTVIEW_SetGridVis(LISTVIEW_Handle hObj, int Show) { + int ShowGrid = 0; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + ShowGrid = pObj->ShowGrid; + if (Show != ShowGrid) { + pObj->ShowGrid = Show; + LISTVIEW__UpdateScrollParas(hObj, pObj); + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } + return ShowGrid; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetGridVis_C(void); + void LISTVIEW_SetGridVis_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemColor.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemColor.c new file mode 100644 index 0000000..2dab6ce --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemColor.c @@ -0,0 +1,91 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetItemColor.c +Purpose : Implementation of LISTVIEW_SetItemTextColor and LISTVIEW_SetItemBkColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* _GetpItemInfo +*/ +static LISTVIEW_ITEM_INFO * _GetpItemInfo(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, unsigned int Index) { + LISTVIEW_ITEM_INFO * pItemInfo = 0; + LISTVIEW_ITEM * pItem; + LISTVIEW_Obj * pObj; + if (hObj) { + if ((Column < LISTVIEW_GetNumColumns(hObj)) && (Row < LISTVIEW_GetNumRows(hObj)) && (Index < GUI_COUNTOF(pItemInfo->aTextColor))) { + pObj = LISTVIEW_H2P(hObj); + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem((GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, Row), Column); + if (!pItem->hItemInfo) { + int i; + pItem->hItemInfo = GUI_ALLOC_AllocZero(sizeof(LISTVIEW_ITEM_INFO)); + pItemInfo = (LISTVIEW_ITEM_INFO *)GUI_ALLOC_h2p(pItem->hItemInfo); + for (i = 0; i < GUI_COUNTOF(pItemInfo->aTextColor); i++) { + pItemInfo->aTextColor[i] = LISTVIEW_GetTextColor(hObj, i); + pItemInfo->aBkColor[i] = LISTVIEW_GetBkColor (hObj, i); + } + } else { + pItemInfo = (LISTVIEW_ITEM_INFO *)GUI_ALLOC_h2p(pItem->hItemInfo); + } + } + } + return pItemInfo; +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetItemTextColor +*/ +void LISTVIEW_SetItemTextColor(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, unsigned int Index, GUI_COLOR Color) { + LISTVIEW_ITEM_INFO * pItemInfo; + WM_LOCK(); + pItemInfo = _GetpItemInfo(hObj, Column, Row, Index); + if (pItemInfo) { + pItemInfo->aTextColor[Index] = Color; + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* LISTVIEW_SetItemBkColor +*/ +void LISTVIEW_SetItemBkColor(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, unsigned int Index, GUI_COLOR Color) { + LISTVIEW_ITEM_INFO * pItemInfo; + WM_LOCK(); + pItemInfo = _GetpItemInfo(hObj, Column, Row, Index); + if (pItemInfo) { + pItemInfo->aBkColor[Index] = Color; + } + WM_UNLOCK(); +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetItemColor_C(void); + void LISTVIEW_SetItemColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemText.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemText.c new file mode 100644 index 0000000..3e22cd7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetItemText.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetItemText.c +Purpose : Implementation of LISTVIEW_SetItemText +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetItemText +*/ +void LISTVIEW_SetItemText(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, const char * s) { + if (hObj) { + if ((Column < LISTVIEW_GetNumColumns(hObj)) && (Row < LISTVIEW_GetNumRows(hObj))) { + int NumBytes; + LISTVIEW_ITEM * pItem; + LISTVIEW_Obj * pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + NumBytes = GUI__strlen(s) + 1; + pItem = (LISTVIEW_ITEM *)GUI_ARRAY_ResizeItem((GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, Row), Column, sizeof(LISTVIEW_ITEM) + NumBytes); + if (NumBytes > 1) { + strcpy(pItem->acText, s); + } + LISTVIEW__InvalidateRow(hObj, pObj, Row); + WM_UNLOCK(); + } + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetItemText_C(void); + void LISTVIEW_SetItemText_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetLBorder.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetLBorder.c new file mode 100644 index 0000000..0c8efb1 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetLBorder.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetLBorder.c +Purpose : Implementation of LISTVIEW_SetLBorder +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetLBorder +*/ +void LISTVIEW_SetLBorder(LISTVIEW_Handle hObj, unsigned BorderSize) { + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (pObj->LBorder != BorderSize) { + pObj->LBorder = BorderSize; + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetLBorder_C(void); + void LISTVIEW_SetLBorder_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetRBorder.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetRBorder.c new file mode 100644 index 0000000..a83a488 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetRBorder.c @@ -0,0 +1,50 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetRBorder.c +Purpose : Implementation of LISTVIEW_SetRBorder +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetRBorder +*/ +void LISTVIEW_SetRBorder(LISTVIEW_Handle hObj, unsigned BorderSize) { + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (pObj->RBorder != BorderSize) { + pObj->RBorder = BorderSize; + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetRBorder_C(void); + void LISTVIEW_SetRBorder_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetRowHeight.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetRowHeight.c new file mode 100644 index 0000000..9c6fbfd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetRowHeight.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetRowHeight.c +Purpose : Implementation of LISTVIEW_SetRowHeight +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetRowHeight +*/ +unsigned LISTVIEW_SetRowHeight(LISTVIEW_Handle hObj, unsigned RowHeight) { + unsigned r = 0; + if (hObj) { + LISTVIEW_Obj* pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + r = pObj->RowDistY; + if (RowHeight != r) { + pObj->RowDistY = RowHeight; + LISTVIEW__UpdateScrollParas(hObj, pObj); + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } + return r; +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetRowHeight_C(void); + void LISTVIEW_SetRowHeight_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetSel.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetSel.c new file mode 100644 index 0000000..f214809 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetSel.c @@ -0,0 +1,66 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetSel.c +Purpose : Implementation of LISTVIEW_SetSel +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetSel +*/ +void LISTVIEW_SetSel(LISTVIEW_Handle hObj, int NewSel) { + if (hObj) { + LISTVIEW_Obj* pObj; + int MaxSel; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + MaxSel = GUI_ARRAY_GetNumItems(&pObj->RowArray) - 1; + if (NewSel > MaxSel) { + NewSel = MaxSel; + } + if (NewSel < 0) { + NewSel = -1; + } + if (NewSel != pObj->Sel) { + int OldSel; + OldSel = pObj->Sel; + pObj->Sel = NewSel; + if (LISTVIEW__UpdateScrollPos(hObj, pObj)) { + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } else { + LISTVIEW__InvalidateRow(hObj, pObj, OldSel); + LISTVIEW__InvalidateRow(hObj, pObj, NewSel); + } + WM_NotifyParent(hObj, WM_NOTIFICATION_SEL_CHANGED); + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetSel_C(void); + void LISTVIEW_SetSel_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextAlign.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextAlign.c new file mode 100644 index 0000000..8d65464 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextAlign.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetTextAlign.c +Purpose : Implementation of LISTVIEW_SetTextAlign +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetTextAlign +*/ +void LISTVIEW_SetTextAlign(LISTVIEW_Handle hObj, unsigned int Index, int Align) { + if (hObj) { + LISTVIEW_Obj * pObj; + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (Index < GUI_ARRAY_GetNumItems(&pObj->AlignArray)) { + int* pAlign; + pAlign = (int *)GUI_ARRAY_GetpItem(&pObj->AlignArray, Index); + if (Align != *pAlign) { + *pAlign = Align; + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + } + WM_UNLOCK(); + } +} + + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetTextAlign_C(void); + void LISTVIEW_SetTextAlign_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextColor.c b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextColor.c new file mode 100644 index 0000000..1f4afef --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/LISTVIEW_SetTextColor.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : LISTVIEW_SetTextColor.c +Purpose : Implementation of LISTVIEW_SetTextColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "LISTVIEW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* LISTVIEW_SetTextColor +*/ +void LISTVIEW_SetTextColor(LISTVIEW_Handle hObj, unsigned int Index, GUI_COLOR Color) { + if (hObj) { + LISTVIEW_Obj* pObj; + if (Index < GUI_COUNTOF(pObj->Props.aTextColor)) { + WM_LOCK(); + pObj = LISTVIEW_H2P(hObj); + if (Color != pObj->Props.aTextColor[Index]) { + pObj->Props.aTextColor[Index] = Color; + LISTVIEW__InvalidateInsideArea(hObj, pObj); + } + WM_UNLOCK(); + } + } +} + +#else /* Avoid problems with empty object modules */ + void LISTVIEW_SetTextColor_C(void); + void LISTVIEW_SetTextColor_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/MENU.c b/User/system/lib/lcd/gui/Widget/MENU.c new file mode 100644 index 0000000..47257a2 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU.c @@ -0,0 +1,1180 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#define MENU_C /* Required to generate intermodule data */ + +#include "MENU.h" +#include "MENU_Private.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default font */ +#ifndef MENU_FONT_DEFAULT + #define MENU_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define default effect */ +#ifndef MENU_EFFECT_DEFAULT + #define MENU_EFFECT_DEFAULT &WIDGET_Effect_3D1L +#endif + +/* Define colors, index 0, enabled, not selected */ +#ifndef MENU_TEXTCOLOR0_DEFAULT + #define MENU_TEXTCOLOR0_DEFAULT GUI_BLACK +#endif + +#ifndef MENU_BKCOLOR0_DEFAULT + #define MENU_BKCOLOR0_DEFAULT GUI_LIGHTGRAY +#endif + +/* Define colors, index 1, enabled, selected */ +#ifndef MENU_TEXTCOLOR1_DEFAULT + #define MENU_TEXTCOLOR1_DEFAULT GUI_WHITE +#endif + +#ifndef MENU_BKCOLOR1_DEFAULT + #define MENU_BKCOLOR1_DEFAULT 0x980000 +#endif + +/* Define colors, index 2, disabled, not selected */ +#ifndef MENU_TEXTCOLOR2_DEFAULT + #define MENU_TEXTCOLOR2_DEFAULT 0x7C7C7C +#endif + +#ifndef MENU_BKCOLOR2_DEFAULT + #define MENU_BKCOLOR2_DEFAULT GUI_LIGHTGRAY +#endif + +/* Define colors, index 3, disabled, selected */ +#ifndef MENU_TEXTCOLOR3_DEFAULT + #define MENU_TEXTCOLOR3_DEFAULT GUI_LIGHTGRAY +#endif + +#ifndef MENU_BKCOLOR3_DEFAULT + #define MENU_BKCOLOR3_DEFAULT 0x980000 +#endif + +/* Define colors, index 4, active submenu */ +#ifndef MENU_TEXTCOLOR4_DEFAULT + #define MENU_TEXTCOLOR4_DEFAULT GUI_WHITE +#endif + +#ifndef MENU_BKCOLOR4_DEFAULT + #define MENU_BKCOLOR4_DEFAULT 0x7C7C7C +#endif + +/* Define borders */ +#ifndef MENU_BORDER_LEFT_DEFAULT + #define MENU_BORDER_LEFT_DEFAULT 4 +#endif + +#ifndef MENU_BORDER_RIGHT_DEFAULT + #define MENU_BORDER_RIGHT_DEFAULT 4 +#endif + +#ifndef MENU_BORDER_TOP_DEFAULT + #define MENU_BORDER_TOP_DEFAULT 2 +#endif + +#ifndef MENU_BORDER_BOTTOM_DEFAULT + #define MENU_BORDER_BOTTOM_DEFAULT 2 +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +MENU_PROPS MENU__DefaultProps = { + MENU_TEXTCOLOR0_DEFAULT, + MENU_TEXTCOLOR1_DEFAULT, + MENU_TEXTCOLOR2_DEFAULT, + MENU_TEXTCOLOR3_DEFAULT, + MENU_TEXTCOLOR4_DEFAULT, + MENU_BKCOLOR0_DEFAULT, + MENU_BKCOLOR1_DEFAULT, + MENU_BKCOLOR2_DEFAULT, + MENU_BKCOLOR3_DEFAULT, + MENU_BKCOLOR4_DEFAULT, + MENU_BORDER_LEFT_DEFAULT, + MENU_BORDER_RIGHT_DEFAULT, + MENU_BORDER_TOP_DEFAULT, + MENU_BORDER_BOTTOM_DEFAULT, + MENU_FONT_DEFAULT +}; + +const WIDGET_EFFECT* MENU__pDefaultEffect = MENU_EFFECT_DEFAULT; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + #define OBJECT_ID 0x7843 /* Magic nubmer, should be unique if possible */ + #define INIT_ID(p) p->DebugId = OBJECT_ID + #define DEINIT_ID(p) p->DebugId = 0 +#else + #define INIT_ID(p) + #define DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Static routines, for higher debug level only +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_h2p +*/ +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL +MENU_Obj* MENU_h2p(MENU_Handle h) { + MENU_Obj* p = (MENU_Obj*)GUI_ALLOC_h2p(h); + if (p) { + if (p->DebugId != OBJECT_ID) { + GUI_DEBUG_ERROROUT("MENU.c: Wrong handle type or Object not init'ed"); + return 0; + } + } + return p; +} +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _IsTopLevelMenu +*/ +static char _IsTopLevelMenu(MENU_Handle hObj, const MENU_Obj* pObj) { + if (MENU__SendMenuMessage(hObj, pObj->hOwner, MENU_IS_MENU, 0) == 0) { + return 1; + } + return 0; +} + +/********************************************************************* +* +* _HasEffect +*/ +static int _HasEffect(MENU_Handle hObj, MENU_Obj* pObj) { + if (!(pObj->Flags & MENU_SF_POPUP)) { + if (_IsTopLevelMenu(hObj, pObj)) { + return 0; + } + } + return 1; +} + +/********************************************************************* +* +* _GetEffectSize +*/ +static int _GetEffectSize(MENU_Handle hObj, MENU_Obj* pObj) { + int r = 0; + if (_HasEffect(hObj, pObj)) { + r = pObj->Widget.pEffect->EffectSize; + } + return r; +} + +/********************************************************************* +* +* _CalcTextWidth +*/ +static int _CalcTextWidth(MENU_Obj* pObj, const char GUI_UNI_PTR* sText) { + int TextWidth = 0; + if (sText) { + const GUI_FONT GUI_UNI_PTR* pOldFont; + pOldFont = GUI_SetFont(pObj->Props.pFont); + TextWidth = GUI_GetStringDistX(sText); + GUI_SetFont(pOldFont); + } + return TextWidth; +} + +/********************************************************************* +* +* _GetItemWidth +*/ +static int _GetItemWidth(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) { + int ItemWidth; + if (pObj->Width && (pObj->Flags & MENU_SF_VERTICAL)) { + ItemWidth = pObj->Width - (_GetEffectSize(hObj, pObj) << 1); + } else { + MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if ((pObj->Flags & MENU_SF_VERTICAL) || !(pItem->Flags & MENU_IF_SEPARATOR)) { + ItemWidth = pItem->TextWidth; + } else { + ItemWidth = 3; + } + ItemWidth += pObj->Props.aBorder[MENU_BI_LEFT] + pObj->Props.aBorder[MENU_BI_RIGHT]; + } + return ItemWidth; +} + +/********************************************************************* +* +* _GetItemHeight +*/ +static int _GetItemHeight(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) { + int ItemHeight; + if (pObj->Height && !(pObj->Flags & MENU_SF_VERTICAL)) { + ItemHeight = pObj->Height - (_GetEffectSize(hObj, pObj) << 1); + } else { + ItemHeight = GUI_GetYDistOfFont(pObj->Props.pFont); + if (pObj->Flags & MENU_SF_VERTICAL) { + MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem->Flags & MENU_IF_SEPARATOR) { + ItemHeight = 3; + } + } + ItemHeight += pObj->Props.aBorder[MENU_BI_TOP] + pObj->Props.aBorder[MENU_BI_BOTTOM]; + } + return ItemHeight; +} + +/********************************************************************* +* +* _CalcMenuSizeX +*/ +static int _CalcMenuSizeX(MENU_Handle hObj, MENU_Obj* pObj) { + unsigned i, NumItems = MENU__GetNumItems(pObj); + int xSize = 0; + if (pObj->Flags & MENU_SF_VERTICAL) { + int ItemWidth; + for (i = 0; i < NumItems; i++) { + ItemWidth = _GetItemWidth(hObj, pObj, i); + if (ItemWidth > xSize) { + xSize = ItemWidth; + } + } + } else { + for (i = 0; i < NumItems; i++) { + xSize += _GetItemWidth(hObj, pObj, i); + } + } + xSize += (_GetEffectSize(hObj, pObj) << 1); + return xSize; +} + +/********************************************************************* +* +* _CalcMenuSizeY +*/ +static int _CalcMenuSizeY(MENU_Handle hObj, MENU_Obj* pObj) { + unsigned i, NumItems = MENU__GetNumItems(pObj); + int ySize = 0; + if (pObj->Flags & MENU_SF_VERTICAL) { + for (i = 0; i < NumItems; i++) { + ySize += _GetItemHeight(hObj, pObj, i); + } + } else { + int ItemHeight; + for (i = 0; i < NumItems; i++) { + ItemHeight = _GetItemHeight(hObj, pObj, i); + if (ItemHeight > ySize) { + ySize = ItemHeight; + } + } + } + ySize += (_GetEffectSize(hObj, pObj) << 1); + return ySize; +} + +/********************************************************************* +* +* _CalcWindowSizeX +*/ +static int _CalcWindowSizeX(MENU_Handle hObj, MENU_Obj* pObj) { + int xSize = pObj->Width; + if (xSize == 0) { + xSize = _CalcMenuSizeX(hObj, pObj); + } + return xSize; +} + +/********************************************************************* +* +* _CalcWindowSizeY +*/ +static int _CalcWindowSizeY(MENU_Handle hObj, MENU_Obj* pObj) { + int ySize = pObj->Height; + if (ySize == 0) { + ySize = _CalcMenuSizeY(hObj, pObj); + } + return ySize; +} + +/********************************************************************* +* +* _GetItemFromPos +* +* Return value: +* Zero based index of item at given position or -1. +* +* NOTE: +* This function has to ensure that index is always less than the +* maximum number of items. +*/ +static int _GetItemFromPos(MENU_Handle hObj, MENU_Obj* pObj, int x, int y) { + int xSize, ySize, EffectSize, r = -1; + ySize = _CalcMenuSizeY(hObj, pObj); + if ((pObj->Height) && (pObj->Height < ySize)) { + ySize = pObj->Height; + } + xSize = _CalcMenuSizeX(hObj, pObj); + if ((pObj->Width) && (pObj->Width < xSize)) { + xSize = pObj->Width; + } + EffectSize = _GetEffectSize(hObj, pObj); + x -= EffectSize; + y -= EffectSize; + xSize -= (EffectSize << 1); + ySize -= (EffectSize << 1); + if ((x >= 0) && (y >= 0) && (x < xSize) && (y < ySize)) { + unsigned i, NumItems = MENU__GetNumItems(pObj); + if (pObj->Flags & MENU_SF_VERTICAL) { + int yPos = 0; + for (i = 0; i < NumItems; i++) { + yPos += _GetItemHeight(hObj, pObj, i); + if (y < yPos) { + r = i; + break; + } + } + } else { + int xPos = 0; + for (i = 0; i < NumItems; i++) { + xPos += _GetItemWidth(hObj, pObj, i); + if (x < xPos) { + r = i; + break; + } + } + } + } + return r; +} + +/********************************************************************* +* +* _GetItemPos +*/ +static void _GetItemPos(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index, int* px, int* py) { + int i, EffectSize; + EffectSize = _GetEffectSize(hObj, pObj); + if (pObj->Flags & MENU_SF_VERTICAL) { + int yPos = 0; + for (i = 0; i < (int)Index; i++) { + yPos += _GetItemHeight(hObj, pObj, i); + } + *px = EffectSize; + *py = EffectSize + yPos; + } else { + int xPos = 0; + for (i = 0; i < (int)Index; i++) { + xPos += _GetItemWidth(hObj, pObj, i); + } + *px = EffectSize + xPos; + *py = EffectSize; + } +} + +/********************************************************************* +* +* _SetCapture +*/ +static void _SetCapture(MENU_Handle hObj, const MENU_Obj* pObj) { + if (pObj->IsSubmenuActive == 0) { + if (WM_HasCaptured(hObj) == 0) { + WM_SetCapture(hObj, 0); + } + } +} + +/********************************************************************* +* +* _ReleaseCapture +*/ +static void _ReleaseCapture(MENU_Handle hObj, const MENU_Obj* pObj) { + if (WM_HasCaptured(hObj)) { + if (_IsTopLevelMenu(hObj, pObj) && !(pObj->Flags & MENU_SF_POPUP)) { + WM_ReleaseCapture(); + } + } +} + +/********************************************************************* +* +* _CloseSubmenu +*/ +static void _CloseSubmenu(MENU_Handle hObj, MENU_Obj* pObj) { + if (pObj->Flags & MENU_SF_ACTIVE) { + if (pObj->IsSubmenuActive) { + MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, pObj->Sel); + /* Inform submenu about its deactivation and detach it */ + MENU__SendMenuMessage(hObj, pItem->hSubmenu, MENU_ON_CLOSE, 0); + WM_DetachWindow(pItem->hSubmenu); + pObj->IsSubmenuActive = 0; + /* + * Keep capture in menu widget. The capture may only released + * by clicking outside the menu or when mouse moved out. + * And it may only released from a top level menu. + */ + _SetCapture(hObj, pObj); + /* Invalidate menu item. This is needed because the appearance may have changed */ + MENU__InvalidateItem(hObj, pObj, pObj->Sel); + } + } +} + +/********************************************************************* +* +* _OpenSubmenu +*/ +static void _OpenSubmenu(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) { + if (pObj->Flags & MENU_SF_ACTIVE) { + MENU_ITEM* pItem; + char PrevActiveSubmenu; + PrevActiveSubmenu = pObj->IsSubmenuActive; + /* Close previous submenu (if needed) */ + _CloseSubmenu(hObj, pObj); + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem->hSubmenu) { + if ((pItem->Flags & MENU_IF_DISABLED) == 0) { + int x, y, EffectSize; + /* Calculate position of submenu */ + EffectSize = _GetEffectSize(hObj, pObj); + _GetItemPos(hObj, pObj, Index, &x, &y); + if (pObj->Flags & MENU_SF_VERTICAL) { + x += _CalcMenuSizeX(hObj, pObj) - (_GetEffectSize(hObj, pObj) << 1); + y -= EffectSize; + } else { + y += _CalcMenuSizeY(hObj, pObj) - (_GetEffectSize(hObj, pObj) << 1); + x -= EffectSize; + } + x += WM_GetWindowOrgX(hObj); + y += WM_GetWindowOrgY(hObj); + /* + * Notify owner window when for the first time open a menu (when no + * other submenu was open), so it can initialize the menu items. + */ + if (PrevActiveSubmenu == 0) { + if (_IsTopLevelMenu(hObj, pObj)) { + MENU__SendMenuMessage(hObj, pObj->hOwner, MENU_ON_INITMENU, 0); + } + } + /* Notify owner window when a submenu opens, so it can initialize the menu items. */ + MENU__SendMenuMessage(hObj, pObj->hOwner, MENU_ON_INITSUBMENU, pItem->Id); + /* Set active menu as owner of submenu. */ + MENU_SetOwner(pItem->hSubmenu, hObj); + /* Attach submenu and inform it about its activation. */ + WM_AttachWindowAt(pItem->hSubmenu, WM_HBKWIN, x, y); + MENU__SendMenuMessage(hObj, pItem->hSubmenu, MENU_ON_OPEN, 0); + pObj->IsSubmenuActive = 1; + /* Invalidate menu item. This is needed because the appearance may have changed. */ + MENU__InvalidateItem(hObj, pObj, Index); + } + } + } +} + +/********************************************************************* +* +* _ClosePopup +*/ +static void _ClosePopup(MENU_Handle hObj, MENU_Obj* pObj) { + if (pObj->Flags & MENU_SF_POPUP) { + pObj->Flags &= ~(MENU_SF_POPUP); + WM_DetachWindow(hObj); + WM_ReleaseCapture(); + } +} + +/********************************************************************* +* +* _SetSelection +*/ +static void _SetSelection(MENU_Handle hObj, MENU_Obj* pObj, int Index) { + if (Index != pObj->Sel) { + MENU__InvalidateItem(hObj, pObj, pObj->Sel); /* Invalidate previous selection */ + MENU__InvalidateItem(hObj, pObj, Index); /* Invalidate new selection */ + pObj->Sel = Index; + } +} + +/********************************************************************* +* +* _SelectItem +*/ +static void _SelectItem(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) { + if (pObj->Sel != (int)Index) { + _SetCapture(hObj, pObj); + _OpenSubmenu(hObj, pObj, Index); + _SetSelection(hObj, pObj, Index); + } +} + +/********************************************************************* +* +* _DeselectItem +*/ +static void _DeselectItem(MENU_Handle hObj, MENU_Obj* pObj) { + if (pObj->IsSubmenuActive == 0) { + _SetSelection(hObj, pObj, -1); + _ReleaseCapture(hObj, pObj); + } +} + +/********************************************************************* +* +* _ActivateItem +*/ +static void _ActivateItem(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) { + MENU_ITEM* pItem; + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem->hSubmenu == 0) { + if ((pItem->Flags & (MENU_IF_DISABLED | MENU_IF_SEPARATOR)) == 0) { + _ClosePopup(hObj, pObj); + /* Send item select message to owner. */ + MENU__SendMenuMessage(hObj, pObj->hOwner, MENU_ON_ITEMSELECT, pItem->Id); + } + } +} + +/********************************************************************* +* +* _ActivateMenu +*/ +static void _ActivateMenu(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) { + if ((pObj->Flags & MENU_SF_OPEN_ON_POINTEROVER) == 0) { + MENU_ITEM* pItem; + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + if (pItem->hSubmenu) { + if ((pItem->Flags & MENU_IF_DISABLED) == 0) { + if ((pObj->Flags & MENU_SF_ACTIVE) == 0) { + pObj->Flags |= MENU_SF_ACTIVE; + _OpenSubmenu(hObj, pObj, Index); + _SetSelection(hObj, pObj, Index); + } else if (pObj->Flags & MENU_SF_CLOSE_ON_SECOND_CLICK) { + if ((int)Index == pObj->Sel) { + _CloseSubmenu(hObj, pObj); + pObj->Flags &= ~MENU_SF_ACTIVE; + } + } + } + } + } +} + +/********************************************************************* +* +* _DeactivateMenu +*/ +static void _DeactivateMenu(MENU_Handle hObj, MENU_Obj* pObj) { + _CloseSubmenu(hObj, pObj); + if ((pObj->Flags & MENU_SF_OPEN_ON_POINTEROVER) == 0) { + pObj->Flags &= ~MENU_SF_ACTIVE; + } +} + +/******************************************************************* +* +* _ForwardMouseOverMsg +*/ +static int _ForwardMouseOverMsg(MENU_Handle hObj, MENU_Obj* pObj, int x, int y) { +#if (GUI_SUPPORT_MOUSE) + if ((pObj->IsSubmenuActive == 0) && !(pObj->Flags & MENU_SF_POPUP)) { + if (_IsTopLevelMenu(hObj, pObj)) { + WM_HWIN hBelow; + x += WM_GetWindowOrgX(hObj); + y += WM_GetWindowOrgY(hObj); + hBelow = WM_Screen2hWin(x, y); + if (hBelow && (hBelow != hObj)) { + WM_MESSAGE Msg; + GUI_PID_STATE State; + x -= WM_GetWindowOrgX(hBelow); + y -= WM_GetWindowOrgY(hBelow); + State.Pressed = 0; + State.x = x; + State.y = y; + Msg.Data.p = &State; + Msg.MsgId = WM_MOUSEOVER; + WM__SendMessage(hBelow, &Msg); + return 1; + } + } + } +#endif + return 0; +} + +/********************************************************************* +* +* _HandlePID +* +* Return values: +* 1 = We need to forward PID message to owner. +* 0 = We do not need to inform owner. +*/ +static char _HandlePID(MENU_Handle hObj, MENU_Obj* pObj, int x, int y, int Pressed) { + GUI_PID_STATE PrevState; + char XYInWidget = 0; + WM_PID__GetPrevState(&PrevState); + /* + * Check if coordinates are inside the widget. + */ + if ((x >= 0) && (y >= 0)) { + GUI_RECT r; + WM__GetClientRectWin(&pObj->Widget.Win, &r); + if ((x <= r.x1) && (y <= r.y1)) { + XYInWidget = 1; + } + } + + if (XYInWidget) { + int ItemIndex; + ItemIndex = _GetItemFromPos(hObj, pObj, x, y); + /* + * Handle PID when coordinates are inside the widget. + */ + if (ItemIndex >= 0) { + /* + * Coordinates are inside the menu. + */ + if (Pressed == 1) { + if (PrevState.Pressed == 0) { /* Clicked */ + _ActivateMenu(hObj, pObj, ItemIndex); + } + _SelectItem(hObj, pObj, ItemIndex); + } else if ((Pressed == 0) && (PrevState.Pressed == 1)) { /* Released */ + _ActivateItem(hObj, pObj, ItemIndex); + } else if (Pressed < 0) { /* Mouse moved */ + if (_ForwardMouseOverMsg(hObj, pObj, x, y) == 0) { + _SelectItem(hObj, pObj, ItemIndex); + } else { + _DeselectItem(hObj, pObj); + } + } + } else { + /* + * Coordinates are outside the menu but inside the widget. + */ + if (Pressed == 1) { + if (PrevState.Pressed == 0) { /* Clicked */ + /* + * User has clicked outside the menu. Close the active submenu. + * The widget itself must be closed (if needed) by the owner. + */ + _DeactivateMenu(hObj, pObj); + } + _DeselectItem(hObj, pObj); + } else if (Pressed < 0) { /* Moved out or mouse moved */ + _DeselectItem(hObj, pObj); + } + } + return 0; + } else { + /* + * Handle PID when coordinates are outside the widget. + */ + if ((Pressed == 1) && (PrevState.Pressed == 0)) { + /* + * User has clicked outside the menu. Close the active submenu. + * The widget itself must be closed (if needed) by the owner. + */ + _DeactivateMenu(hObj, pObj); + _ClosePopup(hObj, pObj); + } + _DeselectItem(hObj, pObj); + _ForwardMouseOverMsg(hObj, pObj, x, y); + } + return 1; /* Coordinates are not in widget, we need to forward PID message to owner */ +} + +/********************************************************************* +* +* _ForwardPIDMsgToOwner +*/ +static void _ForwardPIDMsgToOwner(MENU_Handle hObj, MENU_Obj* pObj, WM_MESSAGE* pMsg) { + if (_IsTopLevelMenu(hObj, pObj) == 0) { + WM_HWIN hOwner; + hOwner = pObj->hOwner ? pObj->hOwner : WM_GetParent(hObj); + if (hOwner) { + if (pMsg->Data.p) { + GUI_PID_STATE* pState; + pState = (GUI_PID_STATE*)pMsg->Data.p; + pState->x += WM_GetWindowOrgX(hObj) - WM_GetWindowOrgX(hOwner); + pState->y += WM_GetWindowOrgY(hObj) - WM_GetWindowOrgY(hOwner); + } + WM__SendMessage(hOwner, pMsg); + } + } +} + +/********************************************************************* +* +* Static routines, callback +* +********************************************************************** +*/ +/********************************************************************* +* +* _OnMenu +*/ +static void _OnMenu(MENU_Handle hObj, MENU_Obj* pObj, WM_MESSAGE* pMsg) { + const MENU_MSG_DATA* pData = (const MENU_MSG_DATA*)pMsg->Data.p; + if (pData) { + switch (pData->MsgType) { + case MENU_ON_ITEMSELECT: + _DeactivateMenu(hObj, pObj); + _DeselectItem(hObj, pObj); + _ClosePopup(hObj, pObj); + /* No break here. We need to forward message to owner. */ + case MENU_ON_INITMENU: + case MENU_ON_INITSUBMENU: + /* Forward message to owner. */ + { + WM_HWIN hOwner; + hOwner = pObj->hOwner ? pObj->hOwner : WM_GetParent(hObj); + if (hOwner) { + pMsg->hWinSrc = hObj; + WM__SendMessage(hOwner, pMsg); + } + } + break; + case MENU_ON_OPEN: + pObj->Sel = -1; + pObj->IsSubmenuActive = 0; + pObj->Flags |= MENU_SF_ACTIVE | MENU_SF_OPEN_ON_POINTEROVER; + _SetCapture(hObj, pObj); + MENU__ResizeMenu(hObj, pObj); + break; + case MENU_ON_CLOSE: + _CloseSubmenu(hObj, pObj); + break; + case MENU_IS_MENU: + pMsg->Data.v = 1; + break; + } + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static char _OnTouch(MENU_Handle hObj, MENU_Obj* pObj, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pState) { /* Something happened in our area (pressed or released) */ + return _HandlePID(hObj, pObj, pState->x, pState->y, pState->Pressed); + } + return _HandlePID(hObj, pObj, -1, -1, -1); /* Moved out */ +} + +/********************************************************************* +* +* _OnMouseOver +*/ +#if (GUI_SUPPORT_MOUSE) +static char _OnMouseOver(MENU_Handle hObj, MENU_Obj* pObj, WM_MESSAGE* pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE *)pMsg->Data.p; + if (pState) { + return _HandlePID(hObj, pObj, pState->x, pState->y, -1); + } + return 0; +} +#endif + +/********************************************************************* +* +* _SetPaintColors +*/ +static void _SetPaintColors(const MENU_Obj* pObj, const MENU_ITEM* pItem, int ItemIndex) { + char Selected; + unsigned ColorIndex; + Selected = (ItemIndex == pObj->Sel) ? 1 : 0; + if (pObj->IsSubmenuActive && Selected) { + ColorIndex = MENU_CI_ACTIVE_SUBMENU; + } else if (pItem->Flags & MENU_IF_SEPARATOR) { + ColorIndex = MENU_CI_ENABLED; + } else { + ColorIndex = (Selected) ? MENU_CI_SELECTED : MENU_CI_ENABLED; + if (pItem->Flags & MENU_IF_DISABLED) { + if (pObj->Flags & MENU_CF_HIDE_DISABLED_SEL) { + ColorIndex = MENU_CI_DISABLED; + } else { + ColorIndex += MENU_CI_DISABLED; + } + } + } + GUI_SetBkColor(pObj->Props.aBkColor[ColorIndex]); + GUI_SetColor(pObj->Props.aTextColor[ColorIndex]); +} + +/********************************************************************* +* +* _OnPaint +*/ +static void _OnPaint(MENU_Handle hObj, MENU_Obj* pObj) { + GUI_RECT FillRect, TextRect; + MENU_ITEM* pItem; + unsigned TextWidth, NumItems, i; + U8 BorderLeft = pObj->Props.aBorder[MENU_BI_LEFT]; + U8 BorderTop = pObj->Props.aBorder[MENU_BI_TOP]; + int FontHeight = GUI_GetYDistOfFont(pObj->Props.pFont); + int EffectSize = _GetEffectSize(hObj, pObj); + NumItems = MENU__GetNumItems(pObj); + WM__GetClientRectWin(&pObj->Widget.Win, &FillRect); + GUI__ReduceRect(&FillRect, &FillRect, EffectSize); + GUI_SetFont(pObj->Props.pFont); + if (pObj->Flags & MENU_SF_VERTICAL) { + int ItemHeight, xSize; + xSize = _CalcMenuSizeX(hObj, pObj); + FillRect.x1 = xSize - EffectSize - 1; + TextRect.x0 = FillRect.x0 + BorderLeft; + for (i = 0; i < NumItems; i++) { + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, i); + ItemHeight = _GetItemHeight(hObj, pObj, i); + _SetPaintColors(pObj, pItem, i); + FillRect.y1 = FillRect.y0 + ItemHeight - 1; + if (pItem->Flags & MENU_IF_SEPARATOR) { + GUI_ClearRectEx(&FillRect); + GUI_SetColor(0x7C7C7C); + GUI_DrawHLine(FillRect.y0 + BorderTop + 1, FillRect.x0 + 2, FillRect.x1 - 2); + } else { + TextWidth = pItem->TextWidth; + TextRect.x1 = TextRect.x0 + TextWidth - 1; + TextRect.y0 = FillRect.y0 + BorderTop; + TextRect.y1 = TextRect.y0 + FontHeight - 1; + WIDGET__FillStringInRect(pItem->acText, &FillRect, &TextRect, &TextRect); + } + FillRect.y0 += ItemHeight; + } + } else { + int ItemWidth, ySize; + ySize = _CalcMenuSizeY(hObj, pObj); + FillRect.y1 = ySize - EffectSize - 1; + TextRect.y0 = FillRect.y0 + BorderTop; + TextRect.y1 = TextRect.y0 + FontHeight - 1; + for (i = 0; i < NumItems; i++) { + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, i); + ItemWidth = _GetItemWidth(hObj, pObj, i); + _SetPaintColors(pObj, pItem, i); + FillRect.x1 = FillRect.x0 + ItemWidth - 1; + if (pItem->Flags & MENU_IF_SEPARATOR) { + GUI_ClearRectEx(&FillRect); + GUI_SetColor(0x7C7C7C); + GUI_DrawVLine(FillRect.x0 + BorderLeft + 1, FillRect.y0 + 2, FillRect.y1 - 2); + } else { + TextWidth = pItem->TextWidth; + TextRect.x0 = FillRect.x0 + BorderLeft; + TextRect.x1 = TextRect.x0 + TextWidth - 1; + WIDGET__FillStringInRect(pItem->acText, &FillRect, &TextRect, &TextRect); + } + FillRect.x0 += ItemWidth; + } + } + if (pObj->Width || pObj->Height) { + GUI_RECT r; + WM__GetClientRectWin(&pObj->Widget.Win, &r); + GUI__ReduceRect(&r, &r, EffectSize); + GUI_SetBkColor(pObj->Props.aBkColor[MENU_CI_ENABLED]); + GUI_ClearRect(FillRect.x1 + 1, EffectSize, r.x1, FillRect.y1); + GUI_ClearRect(EffectSize, FillRect.y1 + 1, r.x1, r.y1); + } + /* Draw 3D effect (if configured) */ + if (_HasEffect(hObj, pObj)) { + pObj->Widget.pEffect->pfDrawUp(); + } +} + +/********************************************************************* +* +* _MENU_Callback +*/ +static void _MENU_Callback(WM_MESSAGE* pMsg) { + MENU_Handle hObj; + MENU_Obj* pObj; + hObj = pMsg->hWin; + if (pMsg->MsgId != WM_PID_STATE_CHANGED) { + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + } + pObj = (MENU_Obj*) GUI_ALLOC_h2p(hObj); + switch (pMsg->MsgId) { + case WM_MENU: + _OnMenu(hObj, pObj, pMsg); + return; /* Message handled, do not call WM_DefaultProc() here. */ + case WM_TOUCH: + if (_OnTouch(hObj, pObj, pMsg)) { + _ForwardPIDMsgToOwner(hObj, pObj, pMsg); + } + break; +#if (GUI_SUPPORT_MOUSE) + case WM_MOUSEOVER: + if (_OnMouseOver(hObj, pObj, pMsg)) { + _ForwardPIDMsgToOwner(hObj, pObj, pMsg); + } + break; +#endif + case WM_PAINT: + _OnPaint(hObj, pObj); + break; + case WM_DELETE: + GUI_ARRAY_Delete(&pObj->ItemArray); + break; /* No return here ... WM_DefaultProc needs to be called */ + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Public code, Create +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_CreateEx +*/ +MENU_Handle MENU_CreateEx(int x0, int y0, int xSize, int ySize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id) { + MENU_Handle hObj; + /* Create the window */ + hObj = WM_CreateWindowAsChild(x0, y0, xSize, ySize, hParent, WM_CF_SHOW | WM_CF_STAYONTOP | WinFlags, &_MENU_Callback, + sizeof(MENU_Obj) - sizeof(WM_Obj)); + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = (MENU_Obj*)GUI_ALLOC_h2p(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->ItemArray); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + /* init member variables */ + if (ExFlags & MENU_SF_OPEN_ON_POINTEROVER) { + ExFlags |= MENU_SF_ACTIVE; + } else { + ExFlags &= ~(MENU_SF_ACTIVE); + } + pObj->Props = MENU__DefaultProps; + pObj->Flags = ExFlags; + pObj->Width = ((xSize > 0) ? xSize : 0); + pObj->Height = ((ySize > 0) ? ySize : 0); + pObj->Sel = -1; + pObj->hOwner = 0; + pObj->IsSubmenuActive = 0; + WIDGET_SetEffect(hObj, MENU__pDefaultEffect); + INIT_ID(pObj); + WM_UNLOCK(); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "MENU_CreateEx failed") + } + return hObj; +} + +/********************************************************************* +* +* Public code, modul internal functions +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU__GetNumItems +*/ +unsigned MENU__GetNumItems(MENU_Obj* pObj) { + return GUI_ARRAY_GetNumItems(&pObj->ItemArray); +} + +/********************************************************************* +* +* MENU__InvalidateItem +*/ +void MENU__InvalidateItem(MENU_Handle hObj, const MENU_Obj* pObj, unsigned Index) { + GUI_USE_PARA(pObj); + GUI_USE_PARA(Index); + WM_InvalidateWindow(hObj); /* Can be optimized, no need to invalidate all items */ +} + +/********************************************************************* +* +* MENU__RecalcTextWidthOfItems +*/ +void MENU__RecalcTextWidthOfItems(MENU_Obj* pObj) { + const GUI_FONT GUI_UNI_PTR* pOldFont; + MENU_ITEM* pItem; + unsigned i, NumItems; + NumItems = MENU__GetNumItems(pObj); + pOldFont = GUI_SetFont(pObj->Props.pFont); + for (i = 0; i < NumItems; i++) { + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, i); + pItem->TextWidth = GUI_GetStringDistX(pItem->acText); + } + GUI_SetFont(pOldFont); +} + +/********************************************************************* +* +* MENU__ResizeMenu +*/ +void MENU__ResizeMenu(MENU_Handle hObj, MENU_Obj* pObj) { + int xSize, ySize; + xSize = _CalcWindowSizeX(hObj, pObj); + ySize = _CalcWindowSizeY(hObj, pObj); + WM_SetSize(hObj, xSize, ySize); + WM_InvalidateWindow(hObj); +} + +/********************************************************************* +* +* MENU__SetItem +*/ +char MENU__SetItem(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index, const MENU_ITEM_DATA* pItemData) { + MENU_ITEM Item = {0}; + const char* pText; + pText = pItemData->pText; + if (!pText) { + pText = ""; + } + Item.Id = pItemData->Id; + Item.Flags = pItemData->Flags; + Item.hSubmenu = pItemData->hSubmenu; + Item.TextWidth = _CalcTextWidth(pObj, pText); + if (Item.Flags & MENU_IF_SEPARATOR) { + Item.hSubmenu = 0; /* Ensures that no separator is a submenu */ + } + if (GUI_ARRAY_SetItem(&pObj->ItemArray, Index, &Item, sizeof(MENU_ITEM) + strlen(pText)) != 0) { + MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + strcpy(pItem->acText, pText); + MENU_SetOwner(Item.hSubmenu, hObj); + return 1; + } + return 0; +} + +/********************************************************************* +* +* MENU__SetItemFlags +*/ +void MENU__SetItemFlags(MENU_Obj* pObj, unsigned Index, U16 Mask, U16 Flags) { + MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + pItem->Flags &= ~Mask; + pItem->Flags |= Flags; +} + +/********************************************************************* +* +* MENU__SendMenuMessage +*/ +int MENU__SendMenuMessage(MENU_Handle hObj, WM_HWIN hDestWin, U16 MsgType, U16 ItemId) { + MENU_MSG_DATA MsgData; + WM_MESSAGE Msg = {0}; + MsgData.MsgType = MsgType; + MsgData.ItemId = ItemId; + Msg.MsgId = WM_MENU; + Msg.Data.p = &MsgData; + Msg.hWinSrc = hObj; + if (!hDestWin) { + hDestWin = WM_GetParent(hObj); + } + if (hDestWin) { + WM__SendMessage(hDestWin, &Msg); + return Msg.Data.v; + } + return 0; +} + +/********************************************************************* +* +* Public code, member functions +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_AddItem +*/ +void MENU_AddItem(MENU_Handle hObj, const MENU_ITEM_DATA* pItemData) { + if (hObj && pItemData) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + if (GUI_ARRAY_AddItem(&pObj->ItemArray, NULL, 0) == 0) { + unsigned Index; + Index = MENU__GetNumItems(pObj) - 1; + if (MENU__SetItem(hObj, pObj, Index, pItemData) == 0) { + GUI_ARRAY_DeleteItem(&pObj->ItemArray, Index); + } else { + MENU__ResizeMenu(hObj, pObj); + } + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MENU_SetOwner +*/ +void MENU_SetOwner(MENU_Handle hObj, WM_HWIN hOwner) { + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + pObj->hOwner = hOwner; + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void Menu_C(void); + void Menu_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU.h b/User/system/lib/lcd/gui/Widget/MENU.h new file mode 100644 index 0000000..f529235 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU.h @@ -0,0 +1,199 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU.h +Purpose : MENU include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef MENU_H +#define MENU_H + +#include "WM.h" +#include "WIDGET.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ +/********************************************************************* +* +* Create flags +*/ +#define MENU_CF_HORIZONTAL (0<<0) +#define MENU_CF_VERTICAL (1<<0) +#define MENU_CF_OPEN_ON_POINTEROVER (1<<1) +#define MENU_CF_CLOSE_ON_SECOND_CLICK (1<<2) +#define MENU_CF_HIDE_DISABLED_SEL (1<<3) /* Hides the selection when a disabled item is selected */ + +/********************************************************************* +* +* Menu item flags +*/ +#define MENU_IF_DISABLED (1<<0) +#define MENU_IF_SEPARATOR (1<<1) + +/********************************************************************* +* +* Color indices +*/ +#define MENU_CI_ENABLED 0 +#define MENU_CI_SELECTED 1 +#define MENU_CI_DISABLED 2 +#define MENU_CI_DISABLED_SEL 3 +#define MENU_CI_ACTIVE_SUBMENU 4 + +/********************************************************************* +* +* Border indices +*/ +#define MENU_BI_LEFT 0 +#define MENU_BI_RIGHT 1 +#define MENU_BI_TOP 2 +#define MENU_BI_BOTTOM 3 + +/********************************************************************* +* +* Message types +*/ +#define MENU_ON_ITEMSELECT 0 /* Send to owner when selecting a menu item */ +#define MENU_ON_INITMENU 1 /* Send to owner when for the first time selecting a submenu */ +#define MENU_ON_INITSUBMENU 2 /* Send to owner when selecting a submenu */ +#define MENU_ON_OPEN 3 /* Internal message of menu widget (send to submenus) */ +#define MENU_ON_CLOSE 4 /* Internal message of menu widget (send to submenus) */ +#define MENU_IS_MENU 5 /* Internal message of menu widget. Owner must call */ + /* WM_DefaultProc() when not handle the message. */ + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef WM_HMEM MENU_Handle; + +/********************************************************************* +* +* menu message data +*/ +typedef struct { + U16 MsgType; + U16 ItemId; +} MENU_MSG_DATA; + +/********************************************************************* +* +* menu item data +*/ +typedef struct { + // const char* pText; + char* pText; + U16 Id; + U16 Flags; + MENU_Handle hSubmenu; +} MENU_ITEM_DATA; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +MENU_Handle MENU_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +MENU_Handle MENU_CreateEx (int x0, int y0, int xSize, int ySize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define MENU_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define MENU_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define MENU_Delete(hObj) WM_DeleteWindow(hObj) +#define MENU_Paint(hObj) WM_Paint(hObj) +#define MENU_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/********************************************************************* +* +* Individual member functions +* +********************************************************************** +*/ + +void MENU_Attach (MENU_Handle hObj, WM_HWIN hDestWin, int x, int y, int xSize, int ySize, int Flags); +void MENU_Popup (MENU_Handle hObj, WM_HWIN hDestWin, int x, int y, int xSize, int ySize, int Flags); +void MENU_SetOwner (MENU_Handle hObj, WM_HWIN hOwner); + +void MENU_AddItem (MENU_Handle hObj, const MENU_ITEM_DATA* pItemData); +void MENU_DeleteItem (MENU_Handle hObj, U16 ItemId); +void MENU_InsertItem (MENU_Handle hObj, U16 ItemId, const MENU_ITEM_DATA* pItemData); +void MENU_SetItem (MENU_Handle hObj, U16 ItemId, const MENU_ITEM_DATA* pItemData); +void MENU_GetItem (MENU_Handle hObj, U16 ItemId, MENU_ITEM_DATA* pItemData); +void MENU_GetItemText (MENU_Handle hObj, U16 ItemId, char* pBuffer, unsigned BufferSize); +unsigned MENU_GetNumItems (MENU_Handle hObj); + +void MENU_DisableItem (MENU_Handle hObj, U16 ItemId); +void MENU_EnableItem (MENU_Handle hObj, U16 ItemId); + +/********************************************************************* +* +* Member functions, get / set properties +* +********************************************************************** +*/ + +void MENU_SetTextColor (MENU_Handle hObj, unsigned ColorIndex, GUI_COLOR Color); +void MENU_SetBkColor (MENU_Handle hObj, unsigned ColorIndex, GUI_COLOR Color); +void MENU_SetBorderSize (MENU_Handle hObj, unsigned BorderIndex, U8 BorderSize); +void MENU_SetFont (MENU_Handle hObj, const GUI_FONT GUI_UNI_PTR* pFont); + +/********************************************************************* +* +* Member functions, get / set defaults +* +********************************************************************** +*/ + +GUI_COLOR MENU_GetDefaultTextColor (unsigned ColorIndex); +GUI_COLOR MENU_GetDefaultBkColor (unsigned ColorIndex); +U8 MENU_GetDefaultBorderSize (unsigned BorderIndex); +const WIDGET_EFFECT* MENU_GetDefaultEffect (void); +const GUI_FONT GUI_UNI_PTR* MENU_GetDefaultFont (void); +void MENU_SetDefaultTextColor (unsigned ColorIndex, GUI_COLOR Color); +void MENU_SetDefaultBkColor (unsigned ColorIndex, GUI_COLOR Color); +void MENU_SetDefaultBorderSize (unsigned BorderIndex, U8 BorderSize); +void MENU_SetDefaultEffect (const WIDGET_EFFECT* pEffect); +void MENU_SetDefaultFont (const GUI_FONT GUI_UNI_PTR* pFont); + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ +#endif /* MENU_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_Attach.c b/User/system/lib/lcd/gui/Widget/MENU_Attach.c new file mode 100644 index 0000000..e941699 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_Attach.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_Attach.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_Attach +*/ +void MENU_Attach(MENU_Handle hObj, WM_HWIN hDestWin, int x, int y, int xSize, int ySize, int Flags) { + GUI_USE_PARA(Flags); + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + pObj->Width = ((xSize > 0) ? xSize : 0); + pObj->Height = ((ySize > 0) ? ySize : 0); + WM_AttachWindowAt(hObj, hDestWin, x, y); + MENU__ResizeMenu(hObj, pObj); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_Attach_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/MENU_CreateIndirect.c new file mode 100644 index 0000000..c185787 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_CreateIndirect.c @@ -0,0 +1,46 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_CreateIndirect.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_CreateIndirect +*/ +MENU_Handle MENU_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + MENU_Handle hMenu; + GUI_USE_PARA(cb); + hMenu = MENU_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hMenu; +} + +#else /* avoid empty object files */ + void MENU_CreateIndirect_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_Default.c b/User/system/lib/lcd/gui/Widget/MENU_Default.c new file mode 100644 index 0000000..ca196fd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_Default.c @@ -0,0 +1,139 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_Default.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code, set defaults +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_SetDefaultTextColor +*/ +void MENU_SetDefaultTextColor(unsigned ColorIndex, GUI_COLOR Color) { + if (ColorIndex <= GUI_COUNTOF(MENU__DefaultProps.aTextColor)) { + MENU__DefaultProps.aTextColor[ColorIndex] = Color; + } +} + +/********************************************************************* +* +* MENU_SetDefaultBkColor +*/ +void MENU_SetDefaultBkColor(unsigned ColorIndex, GUI_COLOR Color) { + if (ColorIndex <= GUI_COUNTOF(MENU__DefaultProps.aBkColor)) { + MENU__DefaultProps.aBkColor[ColorIndex] = Color; + } +} + +/********************************************************************* +* +* MENU_SetDefaultBorderSize +*/ +void MENU_SetDefaultBorderSize(unsigned BorderIndex, U8 BorderSize) { + if (BorderIndex <= GUI_COUNTOF(MENU__DefaultProps.aBorder)) { + MENU__DefaultProps.aBorder[BorderIndex] = BorderSize; + } +} + +/********************************************************************* +* +* MENU_SetDefaultEffect +*/ +void MENU_SetDefaultEffect(const WIDGET_EFFECT* pEffect) { + MENU__pDefaultEffect = pEffect; +} + +/********************************************************************* +* +* MENU_SetDefaultFont +*/ +void MENU_SetDefaultFont(const GUI_FONT GUI_UNI_PTR* pFont) { + MENU__DefaultProps.pFont = pFont; +} + +/********************************************************************* +* +* Public code, get defaults +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_GetDefaultTextColor +*/ +GUI_COLOR MENU_GetDefaultTextColor(unsigned ColorIndex) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (ColorIndex <= GUI_COUNTOF(MENU__DefaultProps.aTextColor)) { + Color = MENU__DefaultProps.aTextColor[ColorIndex]; + } + return Color; +} + +/********************************************************************* +* +* MENU_GetDefaultBkColor +*/ +GUI_COLOR MENU_GetDefaultBkColor(unsigned ColorIndex) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (ColorIndex <= GUI_COUNTOF(MENU__DefaultProps.aBkColor)) { + Color = MENU__DefaultProps.aBkColor[ColorIndex]; + } + return Color; +} + +/********************************************************************* +* +* MENU_GetDefaultBorderSize +*/ +U8 MENU_GetDefaultBorderSize(unsigned BorderIndex) { + U8 BorderSize = 0; + if (BorderIndex <= GUI_COUNTOF(MENU__DefaultProps.aBorder)) { + BorderSize = MENU__DefaultProps.aBorder[BorderIndex]; + } + return BorderSize; +} + +/********************************************************************* +* +* MENU_GetDefaultEffect +*/ +const WIDGET_EFFECT* MENU_GetDefaultEffect(void) { + return MENU__pDefaultEffect; +} + +/********************************************************************* +* +* MENU_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR* MENU_GetDefaultFont(void) { + return MENU__DefaultProps.pFont; +} + +#else /* avoid empty object files */ + void MENU_Default_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_DeleteItem.c b/User/system/lib/lcd/gui/Widget/MENU_DeleteItem.c new file mode 100644 index 0000000..bd0f234 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_DeleteItem.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_DeleteItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_DeleteItem +*/ +void MENU_DeleteItem(MENU_Handle hObj, U16 ItemId) { + if (hObj) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + pObj = MENU_H2P(hObj); + GUI_ARRAY_DeleteItem(&pObj->ItemArray, Index); + MENU__ResizeMenu(hObj, pObj); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_DeleteItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_DisableItem.c b/User/system/lib/lcd/gui/Widget/MENU_DisableItem.c new file mode 100644 index 0000000..e44e10d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_DisableItem.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_DisableItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_DisableItem +*/ +void MENU_DisableItem(MENU_Handle hObj, U16 ItemId) { + if (hObj) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + pObj = MENU_H2P(hObj); + MENU__SetItemFlags(pObj, Index, MENU_IF_DISABLED, MENU_IF_DISABLED); + MENU__InvalidateItem(hObj, pObj, Index); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_DisableItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_EnableItem.c b/User/system/lib/lcd/gui/Widget/MENU_EnableItem.c new file mode 100644 index 0000000..edbe12c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_EnableItem.c @@ -0,0 +1,54 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_EnableItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_EnableItem +*/ +void MENU_EnableItem(MENU_Handle hObj, U16 ItemId) { + if (hObj) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + pObj = MENU_H2P(hObj); + MENU__SetItemFlags(pObj, Index, MENU_IF_DISABLED, 0); + MENU__InvalidateItem(hObj, pObj, Index); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_EnableItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_GetItem.c b/User/system/lib/lcd/gui/Widget/MENU_GetItem.c new file mode 100644 index 0000000..1c45fdf --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_GetItem.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_GetItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_GetItem +*/ +void MENU_GetItem(MENU_Handle hObj, U16 ItemId, MENU_ITEM_DATA* pItemData) { + if (hObj && pItemData) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + MENU_ITEM* pItem; + pObj = MENU_H2P(hObj); + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + pItemData->Flags = pItem->Flags; + pItemData->Id = pItem->Id; + pItemData->hSubmenu = pItem->hSubmenu; + pItemData->pText = 0; + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_GetItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_GetItemText.c b/User/system/lib/lcd/gui/Widget/MENU_GetItemText.c new file mode 100644 index 0000000..63ed891 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_GetItemText.c @@ -0,0 +1,58 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_GetItemText.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_GetItemText +*/ +void MENU_GetItemText(MENU_Handle hObj, U16 ItemId, char* pBuffer, unsigned BufferSize) { + if (hObj && pBuffer) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + MENU_ITEM* pItem; + pObj = MENU_H2P(hObj); + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index); + strncpy(pBuffer, pItem->acText, BufferSize); + pBuffer[BufferSize - 1] = 0; + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_GetItemText_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_GetNumItems.c b/User/system/lib/lcd/gui/Widget/MENU_GetNumItems.c new file mode 100644 index 0000000..5c44198 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_GetNumItems.c @@ -0,0 +1,53 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_GetNumItems.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_GetNumItems +*/ +unsigned MENU_GetNumItems(MENU_Handle hObj) { + unsigned r = 0; + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + r = MENU__GetNumItems(pObj); + } + WM_UNLOCK(); + } + return r; +} + +#else /* avoid empty object files */ + void MENU_GetNumItems_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_InsertItem.c b/User/system/lib/lcd/gui/Widget/MENU_InsertItem.c new file mode 100644 index 0000000..846689b --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_InsertItem.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_InsertItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_InsertItem +*/ +void MENU_InsertItem(MENU_Handle hObj, U16 ItemId, const MENU_ITEM_DATA* pItemData) { + if (hObj && pItemData) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + pObj = MENU_H2P(hObj); + if (GUI_ARRAY_InsertBlankItem(&pObj->ItemArray, Index) != 0) { + if (MENU__SetItem(hObj, pObj, Index, pItemData) == 0) { + GUI_ARRAY_DeleteItem(&pObj->ItemArray, Index); + } else { + MENU__ResizeMenu(hObj, pObj); + } + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_InsertItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_Popup.c b/User/system/lib/lcd/gui/Widget/MENU_Popup.c new file mode 100644 index 0000000..2063685 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_Popup.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_Popup.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_Popup +*/ +void MENU_Popup(MENU_Handle hObj, WM_HWIN hDestWin, int x, int y, int xSize, int ySize, int Flags) { + GUI_USE_PARA(Flags); + if (hObj && hDestWin) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + pObj->Flags |= MENU_SF_POPUP; + pObj->Width = ((xSize > 0) ? xSize : 0); + pObj->Height = ((ySize > 0) ? ySize : 0); + x += WM_GetWindowOrgX(hDestWin); + y += WM_GetWindowOrgY(hDestWin); + MENU_SetOwner(hObj, hDestWin); + WM_AttachWindowAt(hObj, WM_HBKWIN, x, y); + MENU__SendMenuMessage(hDestWin, hObj, MENU_ON_OPEN, 0); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_Popup_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_Private.h b/User/system/lib/lcd/gui/Widget/MENU_Private.h new file mode 100644 index 0000000..1fe1ff5 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_Private.h @@ -0,0 +1,131 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_Private.h +Purpose : Internal header file +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef MENU_PRIVATE_H +#define MENU_PRIVATE_H + +#if GUI_WINSUPPORT + +#include "WIDGET.h" +#include "GUI_ARRAY.h" + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ +/********************************************************************* +* +* Status flags +*/ +#define MENU_SF_HORIZONTAL MENU_CF_HORIZONTAL +#define MENU_SF_VERTICAL MENU_CF_VERTICAL +#define MENU_SF_OPEN_ON_POINTEROVER MENU_CF_OPEN_ON_POINTEROVER +#define MENU_SF_CLOSE_ON_SECOND_CLICK MENU_CF_CLOSE_ON_SECOND_CLICK +#define MENU_SF_HIDE_DISABLED_SEL MENU_CF_HIDE_DISABLED_SEL + +#define MENU_SF_ACTIVE (1<<6) /* Internal flag only */ +#define MENU_SF_POPUP (1<<7) /* Internal flag only */ + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ +/********************************************************************* +* +* menu item +*/ +typedef struct { + MENU_Handle hSubmenu; + U16 Id; + U16 Flags; + int TextWidth; + char acText[1]; +} MENU_ITEM; + +/********************************************************************* +* +* menu properties +*/ +typedef struct { + GUI_COLOR aTextColor[5]; + GUI_COLOR aBkColor[5]; + U8 aBorder[4]; + const GUI_FONT GUI_UNI_PTR* pFont; +} MENU_PROPS; + +/********************************************************************* +* +* menu object +*/ +typedef struct { + WIDGET Widget; + MENU_PROPS Props; + GUI_ARRAY ItemArray; + WM_HWIN hOwner; + U16 Flags; + char IsSubmenuActive; + int Width; + int Height; + int Sel; + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + int DebugId; + #endif +} MENU_Obj; + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + MENU_Obj* MENU_h2p(MENU_Handle h); + #define MENU_H2P(h) MENU_h2p(h) +#else + #define MENU_H2P(h) ((MENU_Obj*)GUI_ALLOC_h2p(h)) +#endif + +/********************************************************************* +* +* Public data (internal defaults) +* +********************************************************************** +*/ + +extern MENU_PROPS MENU__DefaultProps; +extern const WIDGET_EFFECT* MENU__pDefaultEffect; + +/********************************************************************* +* +* Public functions (internal) +* +********************************************************************** +*/ + +void MENU__RecalcTextWidthOfItems(MENU_Obj* pObj); +void MENU__ResizeMenu (MENU_Handle hObj, MENU_Obj* pObj); +unsigned MENU__GetNumItems (MENU_Obj* pObj); +char MENU__SetItem (MENU_Handle hObj, MENU_Obj* pObj, unsigned Index, const MENU_ITEM_DATA* pItemData); +void MENU__SetItemFlags (MENU_Obj* pObj, unsigned Index, U16 Mask, U16 Flags); +void MENU__InvalidateItem (MENU_Handle hObj, const MENU_Obj* pObj, unsigned Index); +int MENU__FindItem (MENU_Handle hObj, U16 ItemId, MENU_Handle* phMenu); +int MENU__SendMenuMessage (MENU_Handle hObj, WM_HWIN hDestWin, U16 MsgType, U16 ItemId); + +#endif /* GUI_WINSUPPORT */ +#endif /* MENU_PRIVATE_H */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_SetBkColor.c b/User/system/lib/lcd/gui/Widget/MENU_SetBkColor.c new file mode 100644 index 0000000..4dfbc77 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_SetBkColor.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_SetBkColor.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_SetBkColor +*/ +void MENU_SetBkColor(MENU_Handle hObj, unsigned ColorIndex, GUI_COLOR Color) { + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + if (ColorIndex < GUI_COUNTOF(pObj->Props.aBkColor)) { + if (Color != pObj->Props.aBkColor[ColorIndex]) { + pObj->Props.aBkColor[ColorIndex] = Color; + WM_InvalidateWindow(hObj); + } + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_SetBkColor_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_SetBorderSize.c b/User/system/lib/lcd/gui/Widget/MENU_SetBorderSize.c new file mode 100644 index 0000000..e16c046 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_SetBorderSize.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_SetBorderSize.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_SetBorderSize +*/ +void MENU_SetBorderSize(MENU_Handle hObj, unsigned BorderIndex, U8 BorderSize) { + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + if (BorderIndex < GUI_COUNTOF(pObj->Props.aBorder)) { + if (BorderSize != pObj->Props.aBorder[BorderIndex]) { + pObj->Props.aBorder[BorderIndex] = BorderSize; + MENU__ResizeMenu(hObj, pObj); + } + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_SetBorderSize_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_SetFont.c b/User/system/lib/lcd/gui/Widget/MENU_SetFont.c new file mode 100644 index 0000000..1d3b716 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_SetFont.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_SetFont.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_SetFont +*/ +void MENU_SetFont(MENU_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + if (pFont != pObj->Props.pFont) { + pObj->Props.pFont = pFont; + MENU__RecalcTextWidthOfItems(pObj); + MENU__ResizeMenu(hObj, pObj); + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_SetFont_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_SetItem.c b/User/system/lib/lcd/gui/Widget/MENU_SetItem.c new file mode 100644 index 0000000..99327a3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_SetItem.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_SetItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_SetItem +*/ +void MENU_SetItem(MENU_Handle hObj, U16 ItemId, const MENU_ITEM_DATA* pItemData) { + if (hObj && pItemData) { + int Index; + WM_LOCK(); + Index = MENU__FindItem(hObj, ItemId, &hObj); + if (Index >= 0) { + MENU_Obj* pObj; + pObj = MENU_H2P(hObj); + if (MENU__SetItem(hObj, pObj, Index, pItemData) != 0) { + MENU__ResizeMenu(hObj, pObj); + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_SetItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU_SetTextColor.c b/User/system/lib/lcd/gui/Widget/MENU_SetTextColor.c new file mode 100644 index 0000000..100e25f --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU_SetTextColor.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU_SetTextColor.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU_SetTextColor +*/ +void MENU_SetTextColor(MENU_Handle hObj, unsigned ColorIndex, GUI_COLOR Color) { + if (hObj) { + MENU_Obj* pObj; + WM_LOCK(); + pObj = MENU_H2P(hObj); + if (pObj) { + if (ColorIndex < GUI_COUNTOF(pObj->Props.aTextColor)) { + if (Color != pObj->Props.aTextColor[ColorIndex]) { + pObj->Props.aTextColor[ColorIndex] = Color; + WM_InvalidateWindow(hObj); + } + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + void MENU_SetTextColor_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MENU__FindItem.c b/User/system/lib/lcd/gui/Widget/MENU__FindItem.c new file mode 100644 index 0000000..56545e6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MENU__FindItem.c @@ -0,0 +1,60 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MENU__FindItem.c +Purpose : Implementation of menu widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MENU.h" +#include "MENU_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* MENU__FindItem +*/ +int MENU__FindItem(MENU_Handle hObj, U16 ItemId, MENU_Handle* phMenu) { + int ItemIndex = -1; + MENU_Obj* pObj; + pObj = MENU_H2P(hObj); + if (pObj) { + MENU_ITEM* pItem; + unsigned NumItems, i; + NumItems = MENU__GetNumItems(pObj); + for (i = 0; (i < NumItems) && (ItemIndex < 0); i++) { + pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, i); + if (pItem->Id == ItemId) { + *phMenu = hObj; + ItemIndex = i; + } else if (pItem->hSubmenu) { + ItemIndex = MENU__FindItem(pItem->hSubmenu, ItemId, phMenu); + } + } + } + return ItemIndex; +} + +#else /* avoid empty object files */ + void MENU__FindItem_C(void) {} +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/MESSAGEBOX.c b/User/system/lib/lcd/gui/Widget/MESSAGEBOX.c new file mode 100644 index 0000000..19ecfe7 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MESSAGEBOX.c @@ -0,0 +1,206 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MESSAGEBOX.c +Purpose : Implementation of Mesagebox +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include /* for memset */ +#include "GUI.h" +#include "BUTTON.h" +#include "FRAMEWIN.h" +#include "TEXT.h" +#include "DIALOG.h" +#include "MESSAGEBOX.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Defaults +* +********************************************************************** +*/ + +#ifndef MESSAGEBOX_BORDER + #define MESSAGEBOX_BORDER 4 +#endif + +#ifndef MESSAGEBOX_XSIZEOK + #define MESSAGEBOX_XSIZEOK 50 +#endif + +#ifndef MESSAGEBOX_YSIZEOK + #define MESSAGEBOX_YSIZEOK 20 +#endif + +#ifndef MESSAGEBOX_BKCOLOR + #define MESSAGEBOX_BKCOLOR GUI_WHITE +#endif + +#define ID_FRAME 100 + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ +/********************************************************************* +* +* _MESSAGEBOX_cbCallback +*/ +static void _MESSAGEBOX_cbCallback(WM_MESSAGE * pMsg) { + WM_HWIN hWin = pMsg->hWin; + switch (pMsg->MsgId) { + case WM_INIT_DIALOG: + FRAMEWIN_SetClientColor(hWin, MESSAGEBOX_BKCOLOR); + break; + case WM_KEY: + { + int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt) { + switch (Key) { + case GUI_KEY_ESCAPE: + GUI_EndDialog(hWin, 1); /* End dialog with return value 1 if is pressed */ + break; + case GUI_KEY_ENTER: + GUI_EndDialog(hWin, 0); /* End dialog with return value 0 if is pressed */ + break; + } + } + } + break; + case WM_NOTIFY_PARENT: + { + int NCode = pMsg->Data.v; /* Get notification code */ + int Id = WM_GetId(pMsg->hWinSrc); /* Get control ID */ + switch (NCode) { + case WM_NOTIFICATION_RELEASED: /* React only if released */ + if (Id == GUI_ID_OK) { + GUI_EndDialog(hWin, 0); /* End dialog with return value 0 if OK */ + } + break; + } + } + break; + default: + WM_DefaultProc(pMsg); + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* MESSAGEBOX_Create +*/ +WM_HWIN MESSAGEBOX_Create(const char * sMessage, const char * sCaption, int Flags) { + GUI_WIDGET_CREATE_INFO _aDialogCreate[3]; /* 0: FrameWin, 1: Text, 2: Button */ + int BorderSize = FRAMEWIN_GetDefaultBorderSize(); /* Default border size of frame window */ + int xSizeFrame = MESSAGEBOX_XSIZEOK + 2 * BorderSize + MESSAGEBOX_BORDER * 2; /* XSize of frame window */ + int ySizeFrame; /* YSize of frame window */ + int x0, y0; /* Position of frame window */ + int xSizeMessage; /* Length in pixels of message */ + int xSizeCaption; /* Length in pixels of caption */ + int ySizeCaption; /* YSize of caption */ + int ySizeMessage; /* YSize of message */ + GUI_RECT Rect; + const GUI_FONT GUI_UNI_PTR * pOldFont; + /* Zeroinit variables */ + memset(_aDialogCreate, 0, sizeof(_aDialogCreate)); + /* Get dimension of message */ + pOldFont = GUI_SetFont(TEXT_GetDefaultFont()); + GUI_GetTextExtend(&Rect, sMessage, 255); + xSizeMessage = Rect.x1 - Rect.x0 + MESSAGEBOX_BORDER * 2; + ySizeMessage = Rect.y1 - Rect.y0 + 1; + if (xSizeFrame < (xSizeMessage + 4 + MESSAGEBOX_BORDER * 2)) { + xSizeFrame = xSizeMessage + 4 + MESSAGEBOX_BORDER * 2; + } + ySizeCaption = GUI_GetYSizeOfFont(FRAMEWIN_GetDefaultFont()); + ySizeFrame = ySizeMessage + /* size of message */ + MESSAGEBOX_YSIZEOK + /* size of button */ + ySizeCaption + /* caption size */ + MESSAGEBOX_BORDER * 3 + /* inner border - text, text - button, button - bottom */ + BorderSize * 2 + /* top & bottom border */ + 1; /* inner border */ + /* Get xsize of caption */ + xSizeCaption = GUI_GetStringDistX(sCaption); + if (xSizeFrame < xSizeCaption + BorderSize * 2) { + xSizeFrame = xSizeCaption + BorderSize * 2; + } + /* Check maximum */ + if (xSizeFrame > LCD_GET_XSIZE()) { + xSizeFrame = LCD_GET_XSIZE(); + } + if (ySizeFrame > LCD_GET_YSIZE()) { + ySizeFrame = LCD_GET_YSIZE(); + } + /* Calculate position of framewin */ + x0 = (LCD_GET_XSIZE() - xSizeFrame) / 2; + y0 = (LCD_GET_YSIZE() - ySizeFrame) / 2; + /* restore modified Context */ + GUI_SetFont(pOldFont); + /* Fill frame win resource */ + _aDialogCreate[0].pfCreateIndirect = FRAMEWIN_CreateIndirect; + _aDialogCreate[0].pName = sCaption; + _aDialogCreate[0].x0 = x0; + _aDialogCreate[0].y0 = y0; + _aDialogCreate[0].xSize = xSizeFrame; + _aDialogCreate[0].ySize = ySizeFrame; + if (Flags & GUI_MESSAGEBOX_CF_MOVEABLE) { + _aDialogCreate[0].Flags = FRAMEWIN_CF_MOVEABLE; + } + /* Fill text resource */ + _aDialogCreate[1].pfCreateIndirect = TEXT_CreateIndirect; + _aDialogCreate[1].pName = sMessage; + _aDialogCreate[1].x0 = (xSizeFrame - xSizeMessage - BorderSize * 2) / 2; + _aDialogCreate[1].y0 = MESSAGEBOX_BORDER; + _aDialogCreate[1].xSize = xSizeMessage; + _aDialogCreate[1].ySize = ySizeMessage; + _aDialogCreate[1].Para = GUI_TA_TOP | GUI_TA_HCENTER; + /* Fill button resource */ + _aDialogCreate[2].pfCreateIndirect = BUTTON_CreateIndirect; + _aDialogCreate[2].pName = "OK"; + _aDialogCreate[2].Id = GUI_ID_OK; + _aDialogCreate[2].x0 = (xSizeFrame - MESSAGEBOX_XSIZEOK - BorderSize * 2) / 2; + _aDialogCreate[2].y0 = MESSAGEBOX_BORDER * 2 + ySizeMessage; + _aDialogCreate[2].xSize = MESSAGEBOX_XSIZEOK; + _aDialogCreate[2].ySize = MESSAGEBOX_YSIZEOK; + /* Create dialog */ + return GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _MESSAGEBOX_cbCallback, 0, 0, 0); +} + +/********************************************************************* +* +* GUI_MessageBox +*/ +int GUI_MessageBox(const char * sMessage, const char * sCaption, int Flags) { + WM_HWIN hWin; + hWin = MESSAGEBOX_Create(sMessage, sCaption, Flags); + /* Exec dialog */ + return GUI_ExecCreatedDialog(hWin); +} + +#else + +void GUI_MessageBox_C(void) {} /* avoid empty object files */ + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/MESSAGEBOX.h b/User/system/lib/lcd/gui/Widget/MESSAGEBOX.h new file mode 100644 index 0000000..a1f73f2 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MESSAGEBOX.h @@ -0,0 +1,39 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MESSAGEBOX.h +Purpose : Message box interface +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef MESSAGEBOX_H +#define MESSAGEBOX_H + +#include "WM.h" + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +WM_HWIN MESSAGEBOX_Create(const char * sMessage, const char * sCaption, int Flags); + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ + +#endif /* MESSAGEBOX */ diff --git a/User/system/lib/lcd/gui/Widget/MULTIEDIT.c b/User/system/lib/lcd/gui/Widget/MULTIEDIT.c new file mode 100644 index 0000000..d9814bf --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIEDIT.c @@ -0,0 +1,1827 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIEDIT.c +Purpose : Implementation of MULTIEDIT widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "MULTIEDIT.h" +#include "WIDGET.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef MULTIEDIT_FONT_DEFAULT + #define MULTIEDIT_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define colors */ +#ifndef MULTIEDIT_BKCOLOR0_DEFAULT + #define MULTIEDIT_BKCOLOR0_DEFAULT GUI_WHITE +#endif + +#ifndef MULTIEDIT_BKCOLOR1_DEFAULT + #define MULTIEDIT_BKCOLOR1_DEFAULT 0xC0C0C0 +#endif + +#ifndef MULTIEDIT_TEXTCOLOR0_DEFAULT + #define MULTIEDIT_TEXTCOLOR0_DEFAULT GUI_BLACK +#endif + +#ifndef MULTIEDIT_TEXTCOLOR1_DEFAULT + #define MULTIEDIT_TEXTCOLOR1_DEFAULT GUI_BLACK +#endif + +/* Define character for password mode */ +#define MULTIEDIT_PASSWORD_CHAR '*' + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +#define NUM_DISP_MODES 2 + +#define INVALID_NUMCHARS (1 << 0) +#define INVALID_NUMLINES (1 << 1) +#define INVALID_TEXTSIZE (1 << 2) +#define INVALID_CURSORXY (1 << 3) +#define INVALID_LINEPOSB (1 << 4) + +typedef struct { + WIDGET Widget; + GUI_COLOR aBkColor[NUM_DISP_MODES]; + GUI_COLOR aColor[NUM_DISP_MODES]; + WM_HMEM hText; + U16 MaxNumChars; /* Maximum number of characters including the prompt */ + U16 NumChars; /* Number of characters (text and prompt) in object */ + U16 NumCharsPrompt; /* Number of prompt characters */ + U16 NumLines; /* Number of text lines needed to show all data */ + U16 TextSizeX; /* Size in X of text depending of wrapping mode */ + U16 BufferSize; + U16 CursorLine; /* Number of current cursor line */ + U16 CursorPosChar; /* Character offset number of cursor */ + U16 CursorPosByte; /* Byte offset number of cursor */ + U16 CursorPosX; /* Cursor position in X */ + U16 CursorPosY; /* Cursor position in Y */ + U16 CacheLinePosByte; /* */ + U16 CacheLineNumber; /* */ + U16 CacheFirstVisibleLine; + U16 CacheFirstVisibleByte; + WM_SCROLL_STATE ScrollStateV; + WM_SCROLL_STATE ScrollStateH; + const GUI_FONT GUI_UNI_PTR * pFont; + U8 Flags; + U8 InvalidFlags; /* Flags to save validation status */ + U8 EditMode; + U8 HBorder; + GUI_WRAPMODE WrapMode; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif +} MULTIEDIT_OBJ; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_COLOR _aDefaultBkColor[2] = { + MULTIEDIT_BKCOLOR0_DEFAULT, + MULTIEDIT_BKCOLOR1_DEFAULT, +}; + +static GUI_COLOR _aDefaultColor[2] = { + MULTIEDIT_TEXTCOLOR0_DEFAULT, + MULTIEDIT_TEXTCOLOR1_DEFAULT, +}; + +static const GUI_FONT GUI_UNI_PTR * _pDefaultFont = MULTIEDIT_FONT_DEFAULT; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define MULTIEDIT_ID 0x8793 /* Magic numer, should be unique if possible */ + +#define MULTIEDIT_H2P(h) (MULTIEDIT_OBJ*) WM_H2P(h) + +#define MULTIEDIT_REALLOC_SIZE 16 + +#if GUI_DEBUG_LEVEL > 1 + #define MULTIEDIT_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != MULTIEDIT_ID, "MULTIEDIT.c: Wrong handle type or Object not init'ed") + #define MULTIEDIT_INIT_ID(p) p->DebugId = MULTIEDIT_ID + #define MULTIEDIT_DEINIT_ID(p) p->DebugId = MULTIEDIT_ID+1 +#else + #define MULTIEDIT_ASSERT_IS_VALID_PTR(p) + #define MULTIEDIT_INIT_ID(p) + #define MULTIEDIT_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* static code, helper functions +* +********************************************************************** +*/ + +/********************************************************************* +* +* _InvalidateNumChars +* +* Invalidates the number of characters including the prompt +*/ +static void _InvalidateNumChars(MULTIEDIT_OBJ * pObj) { + pObj->InvalidFlags |= INVALID_NUMCHARS; +} + +/********************************************************************* +* +* _GetNumChars +* +* Calculates (if needed) and returns the number of characters including the prompt +*/ +static int _GetNumChars(MULTIEDIT_OBJ * pObj) { + if (pObj->InvalidFlags & INVALID_NUMCHARS) { + char * pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + pObj->NumChars = GUI__GetNumChars(pText); + pObj->InvalidFlags &= ~INVALID_NUMCHARS; + } + return pObj->NumChars; +} + +/********************************************************************* +* +* _GetXSize +* +* Returns the x size for displaying text. +*/ +static int _GetXSize(MULTIEDIT_HANDLE hObj, const MULTIEDIT_OBJ* pObj) { + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + return Rect.x1 - Rect.x0 - (pObj->HBorder * 2) - 1; +} + +/********************************************************************* +* +* _GetNumCharsInPrompt +*/ +static int _GetNumCharsInPrompt(const MULTIEDIT_OBJ* pObj, const char GUI_UNI_PTR * pText) { + char *pString, *pEndPrompt; + int r = 0; + pString = (char*) GUI_ALLOC_h2p(pObj->hText); + pEndPrompt = pString + GUI_UC__NumChars2NumBytes(pString, pObj->NumCharsPrompt); + if (pText < pEndPrompt) { + r = GUI_UC__NumBytes2NumChars(pText, pEndPrompt - pText); + } + return r; +} + +/********************************************************************* +* +* _NumChars2XSize +*/ +static int _NumChars2XSize(const char GUI_UNI_PTR * pText, int NumChars) { + int xSize = 0; + U16 Char; + while (NumChars--) { + Char = GUI_UC__GetCharCodeInc(&pText); + xSize += GUI_GetCharDistX(Char); + } + return xSize; +} + +/********************************************************************* +* +* _WrapGetNumCharsDisp +*/ +static int _WrapGetNumCharsDisp(MULTIEDIT_HANDLE hObj, const MULTIEDIT_OBJ* pObj, const char GUI_UNI_PTR * pText) { + int xSize, r; + xSize = _GetXSize(hObj, pObj); + if (pObj->Flags & MULTIEDIT_SF_PASSWORD) { + int NumCharsPrompt; + NumCharsPrompt = _GetNumCharsInPrompt(pObj, pText); + r = GUI__WrapGetNumCharsDisp(pText, xSize, pObj->WrapMode); + if (r >= NumCharsPrompt) { + int x; + switch (pObj->WrapMode) { + case GUI_WRAPMODE_NONE: + r = GUI__GetNumChars(pText); + break; + default: + r = NumCharsPrompt; + x = _NumChars2XSize(pText, NumCharsPrompt); + pText += GUI_UC__NumChars2NumBytes(pText, NumCharsPrompt); + while (GUI_UC__GetCharCodeInc(&pText) != 0) { + x += GUI_GetCharDistX(MULTIEDIT_PASSWORD_CHAR); + if (r && (x > xSize)) { + break; + } + r++; + } + break; + } + } + } else { + r = GUI__WrapGetNumCharsDisp(pText, xSize, pObj->WrapMode); + } + return r; +} + +/********************************************************************* +* +* _WrapGetNumBytesToNextLine +*/ +static int _WrapGetNumBytesToNextLine(MULTIEDIT_HANDLE hObj, const MULTIEDIT_OBJ* pObj, const char* pText) { + int xSize, r; + xSize = _GetXSize(hObj, pObj); + if (pObj->Flags & MULTIEDIT_SF_PASSWORD) { + int NumChars, NumCharsPrompt; + NumCharsPrompt = _GetNumCharsInPrompt(pObj, pText); + NumChars = _WrapGetNumCharsDisp(hObj, pObj, pText); + r = GUI_UC__NumChars2NumBytes(pText, NumChars); + if (NumChars < NumCharsPrompt) { + if (*(pText + r) == '\n') { + r++; + } + } + } else { + r = GUI__WrapGetNumBytesToNextLine(pText, xSize, pObj->WrapMode); + } + return r; +} + +/********************************************************************* +* +* _GetCharDistX +*/ +static int _GetCharDistX(const MULTIEDIT_OBJ* pObj, const char* pText) { + int r; + if ((pObj->Flags & MULTIEDIT_SF_PASSWORD) && (_GetNumCharsInPrompt(pObj, pText) == 0)) { + r = GUI_GetCharDistX(MULTIEDIT_PASSWORD_CHAR); + } else { + U16 c; + c = GUI_UC_GetCharCode(pText); + r = GUI_GetCharDistX(c); + } + return r; +} + +/********************************************************************* +* +* _DispString +*/ +static void _DispString(MULTIEDIT_HANDLE hObj, const MULTIEDIT_OBJ* pObj, const char* pText, GUI_RECT* pRect) { + int NumCharsDisp; + NumCharsDisp = _WrapGetNumCharsDisp(hObj, pObj, pText); + if (pObj->Flags & MULTIEDIT_SF_PASSWORD) { + int x, NumCharsPrompt, NumCharsLeft = 0; + NumCharsPrompt = _GetNumCharsInPrompt(pObj, pText); + if (NumCharsDisp < NumCharsPrompt) { + NumCharsPrompt = NumCharsDisp; + } else { + NumCharsLeft = NumCharsDisp - NumCharsPrompt; + } + GUI_DispStringInRectMax(pText, pRect, GUI_TA_LEFT, NumCharsPrompt); + x = pRect->x0 + _NumChars2XSize(pText, NumCharsPrompt); + if (NumCharsLeft) { + GUI_DispCharAt(MULTIEDIT_PASSWORD_CHAR, x, pRect->y0); + GUI_DispChars(MULTIEDIT_PASSWORD_CHAR, NumCharsLeft - 1); + } + } else { + GUI_DispStringInRectMax(pText, pRect, GUI_TA_LEFT, NumCharsDisp); + } +} + +/********************************************************************* +* +* static code, cursor routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetpLine +* +* Returns a pointer to the beginning of the line with the +* given line number. +*/ +static char * _GetpLine(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj, unsigned LineNumber) { + char * pText, * pLine; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + if ((unsigned)pObj->CacheLineNumber != LineNumber) { + if (LineNumber > (unsigned)pObj->CacheLineNumber) { + /* If new line number > cache we can start with old pointer */ + int OldNumber = pObj->CacheLineNumber; + pLine = pText + pObj->CacheLinePosByte; + pObj->CacheLineNumber = LineNumber; + LineNumber -= OldNumber; + } else { + /* If new line number < cache we need to start with first byte */ + pLine = pText; + pObj->CacheLineNumber = LineNumber; + } + while (LineNumber--) { + pLine += _WrapGetNumBytesToNextLine(hObj, pObj, pLine); + } + pObj->CacheLinePosByte = pLine - pText; + } + return pText + pObj->CacheLinePosByte; +} + +/********************************************************************* +* +* _ClearCache +* +* Clears the cached position of the linenumber and the first byte +* of the line which holds the cursor. +*/ +static void _ClearCache(MULTIEDIT_OBJ* pObj) { + pObj->CacheLineNumber = 0; + pObj->CacheLinePosByte = 0; + pObj->CacheFirstVisibleByte = 0; + pObj->CacheFirstVisibleLine = 0; +} + +/********************************************************************* +* +* _GetCursorLine +* +* Returns the line number of the cursor position. +*/ +static int _GetCursorLine(MULTIEDIT_HANDLE hObj, const MULTIEDIT_OBJ* pObj, const char* pText, int CursorPosChar) { + const char *pCursor; + const char *pEndLine; + int NumChars, ByteOffsetNewCursor, LineNumber = 0; + ByteOffsetNewCursor = GUI_UC__NumChars2NumBytes(pText, CursorPosChar); + pCursor = pText + ByteOffsetNewCursor; + if (pObj->CacheLinePosByte < ByteOffsetNewCursor) { + /* If cache pos < new position we can use it as start position */ + pText += pObj->CacheLinePosByte; + LineNumber += pObj->CacheLineNumber; + } + while (*pText && (pCursor > pText)) { + NumChars = _WrapGetNumCharsDisp(hObj, pObj, pText); + pEndLine = pText + GUI_UC__NumChars2NumBytes(pText, NumChars); + pText += _WrapGetNumBytesToNextLine(hObj, pObj, pText); + if (pCursor <= pEndLine) { + if ((pCursor == pEndLine) && (pEndLine == pText) && *pText) { + LineNumber++; + } + break; + } + LineNumber++; + } + return LineNumber; +} + +/********************************************************************* +* +* _GetCursorXY +*/ +static void _GetCursorXY(MULTIEDIT_HANDLE hObj, /*const*/ MULTIEDIT_OBJ* pObj, int* px, int* py) { + if (pObj->InvalidFlags & INVALID_CURSORXY) { + int CursorLine = 0, x = 0; + GUI_SetFont(pObj->pFont); + if (pObj->hText) { + const char *pLine; + const char *pCursor; + pLine = (const char *)GUI_ALLOC_h2p(pObj->hText); + pCursor = pLine + pObj->CursorPosByte; + CursorLine = pObj->CursorLine; + pLine = _GetpLine(hObj, pObj, CursorLine); + while (pLine < pCursor) { + x += _GetCharDistX(pObj, pLine); + pLine += GUI_UC_GetCharSize(pLine); + } + } + pObj->CursorPosX = x; + pObj->CursorPosY = CursorLine * GUI_GetFontDistY(); + pObj->InvalidFlags &= ~INVALID_CURSORXY; + } + *px = pObj->CursorPosX; + *py = pObj->CursorPosY; +} + +/********************************************************************* +* +* _InvalidateCursorXY +*/ +static void _InvalidateCursorXY(MULTIEDIT_OBJ * pObj) { + pObj->InvalidFlags |= INVALID_CURSORXY; +} + +/********************************************************************* +* +* _SetScrollState +*/ +static void _SetScrollState(WM_HWIN hObj) { + MULTIEDIT_OBJ* pObj = MULTIEDIT_H2P(hObj); + WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH); +} + +/********************************************************************* +* +* _CalcScrollPos +* +* Purpose: +* Find out if the current position of the cursor is still in the +* visible area. If it is not, the scroll position is updated. +* Needs to be called every time the cursor is move, wrap, font or +* window size are changed. +*/ +static void _CalcScrollPos(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int xCursor, yCursor; + _GetCursorXY(hObj, pObj, &xCursor, &yCursor); + yCursor /= GUI_GetYDistOfFont(pObj->pFont); + WM_CheckScrollPos(&pObj->ScrollStateV, yCursor, 0, 0); /* Vertical */ + WM_CheckScrollPos(&pObj->ScrollStateH, xCursor, 30, 30); /* Horizontal */ + _SetScrollState(hObj); +} + +/********************************************************************* +* +* _GetTextSizeX +* +* Returns the width of the displayed text. +*/ +static int _GetTextSizeX(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + if (pObj->InvalidFlags & INVALID_TEXTSIZE) { + pObj->TextSizeX = 0; + if (pObj->hText) { + int NumChars, xSizeLine; + char *pText, *pLine; + GUI_SetFont(pObj->pFont); + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + do { + NumChars = _WrapGetNumCharsDisp(hObj, pObj, pText); + xSizeLine = 0; + pLine = pText; + while (NumChars--) { + xSizeLine += _GetCharDistX(pObj, pLine); + pLine += GUI_UC_GetCharSize(pLine); + } + if (xSizeLine > pObj->TextSizeX) { + pObj->TextSizeX = xSizeLine; + } + pText += _WrapGetNumBytesToNextLine(hObj, pObj, pText); + } while (*pText); + } + pObj->InvalidFlags &= ~INVALID_TEXTSIZE; + } + return pObj->TextSizeX; +} + +/********************************************************************* +* +* _GetNumVisLines +*/ +static int _GetNumVisLines(MULTIEDIT_HANDLE hObj, const MULTIEDIT_OBJ* pObj) { + GUI_RECT Rect; + WM_GetInsideRectExScrollbar(hObj, &Rect); + return (Rect.y1 - Rect.y0 + 1) / GUI_GetYDistOfFont(pObj->pFont); +} + +/********************************************************************* +* +* _GetNumLines +* +* Calculates (if needed) and returns the number of lines +*/ +static int _GetNumLines(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ * pObj) { + if (pObj->InvalidFlags & INVALID_NUMLINES) { + int NumLines = 0; + if (pObj->hText) { + int NumChars, NumBytes; + char *pText; + U16 Char; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + GUI_SetFont(pObj->pFont); + do { + NumChars = _WrapGetNumCharsDisp(hObj, pObj, pText); + NumBytes = GUI_UC__NumChars2NumBytes(pText, NumChars); + Char = GUI_UC_GetCharCode(pText + NumBytes); + if (Char) { + NumLines++; + } + pText += _WrapGetNumBytesToNextLine(hObj, pObj, pText); + } while (Char); + } + pObj->NumLines = NumLines + 1; + pObj->InvalidFlags &= ~INVALID_NUMLINES; + } + return pObj->NumLines; +} + +/********************************************************************* +* +* _InvalidateNumLines +* +* Invalidates the number of lines +*/ +static void _InvalidateNumLines(MULTIEDIT_OBJ * pObj) { + pObj->InvalidFlags |= INVALID_NUMLINES; +} + +/********************************************************************* +* +* _InvalidateTextSizeX +* +* Calculates the TextSizeX +*/ +static void _InvalidateTextSizeX(MULTIEDIT_OBJ * pObj) { + pObj->InvalidFlags |= INVALID_TEXTSIZE; +} + +/********************************************************************* +* +* _CalcScrollParas +* +* Purpose: +* Calculate page size ,number of items & position +*/ +static void _CalcScrollParas(MULTIEDIT_HANDLE hObj) { + MULTIEDIT_OBJ* pObj = MULTIEDIT_H2P(hObj); + /* Calc vertical scroll parameters */ + pObj->ScrollStateV.NumItems = _GetNumLines(hObj, pObj); + pObj->ScrollStateV.PageSize = _GetNumVisLines(hObj, pObj); + /* Calc horizontal scroll parameters */ + pObj->ScrollStateH.NumItems = _GetTextSizeX(hObj, pObj); + pObj->ScrollStateH.PageSize = _GetXSize(hObj, pObj); + _CalcScrollPos(hObj, pObj); +} + +/********************************************************************* +* +* _ManageAutoScrollV +*/ +static void _ManageAutoScrollV(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + if (pObj->Flags & MULTIEDIT_SF_AUTOSCROLLBAR_V) { + char IsRequired = _GetNumVisLines(hObj, pObj) < _GetNumLines(hObj, pObj); + if (WM_SetScrollbarV(hObj, IsRequired) != IsRequired) { + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + _InvalidateCursorXY(pObj); + _ClearCache(pObj); + } + } +} + +/********************************************************************* +* +* _ManageScrollers +* +* Function: +* If autoscroll mode is enabled, add or remove the horizonatal and +* vertical scrollbars as required. +* Caution: This routine should not be called as reaction to a message +* From the child, as this could lead to a recursion problem +*/ +static void _ManageScrollers(MULTIEDIT_HANDLE hObj) { + MULTIEDIT_OBJ* pObj; + pObj = MULTIEDIT_H2P(hObj); + /* 1. Step: Check if vertical scrollbar is required */ + _ManageAutoScrollV(hObj, pObj); + /* 2. Step: Check if horizontal scrollbar is required */ + if (pObj->Flags & MULTIEDIT_SF_AUTOSCROLLBAR_H) { + char IsRequired; + IsRequired = (_GetXSize(hObj, pObj) < _GetTextSizeX(hObj, pObj)); + if (WM_SetScrollbarH(hObj, IsRequired) != IsRequired) { + /* 3. Step: Check vertical scrollbar again if horizontal has changed */ + _ManageAutoScrollV(hObj, pObj); + } + } + _CalcScrollParas(hObj); +} + +/********************************************************************* +* +* _Invalidate +*/ +static void _Invalidate(MULTIEDIT_HANDLE hObj) { + _ManageScrollers(hObj); + WM_Invalidate(hObj); +} + +/********************************************************************* +* +* _InvalidateTextArea +* +* Invalidates the text area only +*/ +static void _InvalidateTextArea(MULTIEDIT_HANDLE hObj) { + GUI_RECT rInsideRect; + _ManageScrollers(hObj); + WM_GetInsideRectExScrollbar(hObj, &rInsideRect); + WM_InvalidateRect(hObj, &rInsideRect); +} + +/********************************************************************* +* +* _InvalidateCursorPos +* +* Sets the position of the cursor to an invalid value +*/ +static int _InvalidateCursorPos(MULTIEDIT_OBJ * pObj) { + int Value; + Value = pObj->CursorPosChar; + pObj->CursorPosChar = 0xffff; + return Value; +} + +/********************************************************************* +* +* _SetFlag +*/ +static void _SetFlag(MULTIEDIT_HANDLE hObj, int OnOff, U8 Flag) { + if (hObj) { + MULTIEDIT_OBJ * pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (OnOff) { + pObj->Flags |= Flag; + } else { + pObj->Flags &= ~Flag; + } + _InvalidateTextArea(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* _CalcNextValidCursorPos +* +* Purpose: +* Calculates the next valid cursor position of the desired position. +* +* Parameters: +* hObj, pObj : Obvious +* CursorPosChar : New character position of the cursor +* pCursorPosByte: Pointer to save the cursorposition in bytes. Used to abolish further calculations. Could be 0. +* pCursorLine : Pointer to save the line number of the cursor. Used to abolish further calculations. Could be 0. +*/ +static int _CalcNextValidCursorPos(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj, int CursorPosChar, int * pCursorPosByte, int * pCursorLine) { + if (pObj->hText) { + char *pNextLine, *pCursor, *pText; + int CursorLine, NumChars, CursorPosByte; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + NumChars = _GetNumChars(pObj); + /* Set offset in valid range */ + if (CursorPosChar < pObj->NumCharsPrompt) { + CursorPosChar = pObj->NumCharsPrompt; + } + if (CursorPosChar > NumChars) { + CursorPosChar = NumChars; + } + CursorPosByte = GUI_UC__NumChars2NumBytes(pText, CursorPosChar); + CursorLine = _GetCursorLine(hObj, pObj, pText, CursorPosChar); + pCursor = pText + CursorPosByte; + pNextLine = _GetpLine(hObj, pObj, CursorLine); + if (pNextLine > pCursor) { + if (pObj->CursorPosChar < CursorPosChar) { + pCursor = pNextLine; + } else { + char *pPrevLine; + int NumChars; + pPrevLine = _GetpLine(hObj, pObj, CursorLine - 1); + NumChars = _WrapGetNumCharsDisp(hObj, pObj, pPrevLine); + pPrevLine += GUI_UC__NumChars2NumBytes(pPrevLine, NumChars); + pCursor = pPrevLine; + } + CursorPosChar = GUI_UC__NumBytes2NumChars(pText, pCursor - pText); + CursorPosByte = GUI_UC__NumChars2NumBytes(pText, CursorPosChar); + CursorLine = _GetCursorLine(hObj, pObj, pText, CursorPosChar); + } + if (pCursorPosByte) { + *pCursorPosByte = CursorPosByte; + } + if (pCursorLine) { + *pCursorLine = CursorLine; + } + return CursorPosChar; + } + return 0; +} + +/********************************************************************* +* +* _SetCursorPos +* +* Sets a new cursor position. +*/ +static void _SetCursorPos(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj, int CursorPosChar) { + int CursorPosByte, CursorLine; + CursorPosChar = _CalcNextValidCursorPos(hObj, pObj, CursorPosChar, &CursorPosByte, &CursorLine); + /* Assign value and recalc whatever necessary */ + if (pObj->CursorPosChar != CursorPosChar) { + /* Save values */ + pObj->CursorPosByte = CursorPosByte; + pObj->CursorPosChar = CursorPosChar; + pObj->CursorLine = CursorLine; + _InvalidateCursorXY(pObj); /* Invalidate X/Y position */ + _CalcScrollPos(hObj, pObj); + } +} + +/********************************************************************* +* +* _SetWrapMode +*/ +static int _SetWrapMode(MULTIEDIT_HANDLE hObj, GUI_WRAPMODE WrapMode) { + int r; + r = 0; + if (hObj) { + MULTIEDIT_OBJ * pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + r = pObj->WrapMode; + if (pObj->WrapMode != WrapMode) { + int Position; + pObj->WrapMode = WrapMode; + _ClearCache(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + _InvalidateTextArea(hObj); + Position = _InvalidateCursorPos(pObj); + _SetCursorPos(hObj, pObj, Position); + } + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* _SetCursorXY +* +* Sets the cursor position from window coordinates. +*/ +static void _SetCursorXY(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj, int x, int y) { + int CursorPosChar = 0; + if ((x < 0) || (y < 0)) { + return; + } + if (pObj->hText) { + char *pLine, *pText; + int CursorLine, WrapChars; + int SizeX = 0; + U16 Char; + GUI_SetFont(pObj->pFont); + CursorLine = y / GUI_GetFontDistY(); + pLine = _GetpLine(hObj, pObj, CursorLine); + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + WrapChars = _WrapGetNumCharsDisp(hObj, pObj, pLine); + Char = GUI_UC__GetCharCode(pLine + GUI_UC__NumChars2NumBytes(pLine, WrapChars)); + if (pObj->Flags & MULTIEDIT_SF_PASSWORD) { + if (!Char) { + WrapChars++; + } + } else { + if (!Char || (Char == '\n') || ((Char == ' ') && (pObj->WrapMode == GUI_WRAPMODE_WORD))) { + WrapChars++; + } + } + while (--WrapChars > 0) { + Char = GUI_UC_GetCharCode(pLine); + SizeX += _GetCharDistX(pObj, pLine); + if (!Char || (SizeX > x)) { + break; + } + pLine += GUI_UC_GetCharSize(pLine); + } + CursorPosChar = GUI_UC__NumBytes2NumChars(pText, pLine - pText); + } + _SetCursorPos(hObj, pObj, CursorPosChar); +} + +/********************************************************************* +* +* _MoveCursorUp +*/ +static void _MoveCursorUp(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int xPos, yPos; + _GetCursorXY(hObj, pObj, &xPos, &yPos); + yPos -= GUI_GetYDistOfFont(pObj->pFont); + _SetCursorXY(hObj, pObj, xPos, yPos); +} + +/********************************************************************* +* +* _MoveCursorDown +*/ +static void _MoveCursorDown(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int xPos, yPos; + _GetCursorXY(hObj, pObj, &xPos, &yPos); + yPos += GUI_GetYDistOfFont(pObj->pFont); + _SetCursorXY(hObj, pObj, xPos, yPos); +} + +/********************************************************************* +* +* _MoveCursor2NextLine +*/ +static void _MoveCursor2NextLine(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int xPos, yPos; + _GetCursorXY(hObj, pObj, &xPos, &yPos); + yPos += GUI_GetYDistOfFont(pObj->pFont); + _SetCursorXY(hObj, pObj, 0, yPos); +} + +/********************************************************************* +* +* _MoveCursor2LineEnd +*/ +static void _MoveCursor2LineEnd(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int xPos, yPos; + _GetCursorXY(hObj, pObj, &xPos, &yPos); + _SetCursorXY(hObj, pObj, 0x7FFF, yPos); +} + +/********************************************************************* +* +* _MoveCursor2LinePos1 +*/ +static void _MoveCursor2LinePos1(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int xPos, yPos; + _GetCursorXY(hObj, pObj, &xPos, &yPos); + _SetCursorXY(hObj, pObj, 0, yPos); +} + +/********************************************************************* +* +* _IsOverwriteAtThisChar +*/ +static int _IsOverwriteAtThisChar(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + int r = 0; + if (pObj->hText && !(pObj->Flags & MULTIEDIT_CF_INSERT)) { + const char *pText; + int CurPos, Line1, Line2; + U16 Char; + pText = (const char *)GUI_ALLOC_h2p(pObj->hText); + Line1 = pObj->CursorLine; + CurPos = _CalcNextValidCursorPos(hObj, pObj, pObj->CursorPosChar + 1, 0, 0); + Line2 = _GetCursorLine(hObj, pObj, pText, CurPos); + pText += pObj->CursorPosByte; + Char = GUI_UC_GetCharCode(pText); + if (Char) { + if ((Line1 == Line2) || (pObj->Flags & MULTIEDIT_SF_PASSWORD)) { + r = 1; + } else { + if (Char != '\n') { + if ((Char != ' ') || (pObj->WrapMode == GUI_WRAPMODE_CHAR)) { + r = 1; + } + } + } + } + } + return r; +} + +/********************************************************************* +* +* _GetCursorSizeX +* +* Returns the width of the cursor to be draw according to the +* insert mode flag and the cursor position. +*/ +static int _GetCursorSizeX(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + if (_IsOverwriteAtThisChar(hObj, pObj)) { + const char *pText; + pText = (const char *)GUI_ALLOC_h2p(pObj->hText); + pText += pObj->CursorPosByte; + return _GetCharDistX(pObj, pText); + } else { + return 2; + } +} + +/********************************************************************* +* +* static code, buffer management +* +********************************************************************** +*/ +/********************************************************************* +* +* _IncrementBuffer +* +* Increments the buffer size by AddBytes. +*/ +static int _IncrementBuffer(MULTIEDIT_OBJ* pObj, unsigned AddBytes) { + WM_HMEM hNew; + int NewSize; + NewSize = pObj->BufferSize + AddBytes; + hNew = GUI_ALLOC_Realloc(pObj->hText, NewSize); + if (hNew) { + if (!(pObj->hText)) { + char* pText; + pText = (char*) GUI_ALLOC_h2p(hNew); + *pText = 0; + } + pObj->BufferSize = NewSize; + pObj->hText = hNew; + return 1; + } + return 0; +} + +/********************************************************************* +* +* _IsSpaceInBuffer +* +* Checks the available space in the buffer. If there is not enough +* space left this function attempts to get more. +* +* Returns: +* 1 = requested space is available +* 0 = failed to get enough space +*/ +static int _IsSpaceInBuffer(MULTIEDIT_OBJ* pObj, int BytesNeeded) { + int NumBytes = 0; + if (pObj->hText) { + NumBytes = strlen((char*)GUI_ALLOC_h2p(pObj->hText)); + } + BytesNeeded = (BytesNeeded + NumBytes + 1) - pObj->BufferSize; + if (BytesNeeded > 0) { + if (!_IncrementBuffer(pObj, BytesNeeded + MULTIEDIT_REALLOC_SIZE)) { + return 0; + } + } + return 1; +} + +/********************************************************************* +* +* _IsCharsAvailable +* +* Checks weither the maximum number of characters is reached or not. +* +* Returns: +* 1 = requested number of chars is available +* 0 = maximum number of chars have reached +*/ +static int _IsCharsAvailable(MULTIEDIT_OBJ* pObj, int CharsNeeded) { + if ((CharsNeeded > 0) && (pObj->MaxNumChars > 0)) { + int NumChars = 0; + if (pObj->hText) { + NumChars = _GetNumChars(pObj); + } + if ((CharsNeeded + NumChars) > pObj->MaxNumChars) { + return 0; + } + } + return 1; +} + +/********************************************************************* +* +* static code, string manipulation routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _DeleteChar +* +* Deletes a character at the current cursor position and moves +* all bytes after the cursor position. +*/ +static void _DeleteChar(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj) { + if (pObj->hText) { + unsigned CursorOffset; + char* s; + s = (char*) GUI_ALLOC_h2p(pObj->hText); + CursorOffset = pObj->CursorPosByte; + if (CursorOffset < strlen(s)) { + char *pCursor, *pLine, *pEndLine; + int CursorLine, NumChars, NumBytes; + pCursor = s + CursorOffset; + CursorLine = pObj->CursorLine; + pLine = _GetpLine(hObj, pObj, CursorLine); + NumChars = _WrapGetNumCharsDisp(hObj, pObj, pLine); + pEndLine = pLine + GUI_UC__NumChars2NumBytes(pLine, NumChars); + pLine = pLine + _WrapGetNumBytesToNextLine(hObj, pObj, pLine); + if (pCursor == pEndLine) { + NumBytes = pLine - pEndLine; + } else { + NumBytes = GUI_UC_GetCharSize(pCursor); + } + NumChars = GUI_UC__NumBytes2NumChars(pCursor, NumBytes); + strcpy(pCursor, pCursor + NumBytes); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + pObj->NumChars -= NumChars; + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + _InvalidateCursorXY(pObj); /* Invalidate X/Y position */ + _ClearCache(pObj); + pObj->CursorLine = _GetCursorLine(hObj, pObj, s, pObj->CursorPosChar); + } + } +} + +/********************************************************************* +* +* _InsertChar +* +* Create space at the current cursor position and inserts a character. +*/ +static int _InsertChar(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj, U16 Char) { + if (_IsCharsAvailable(pObj, 1)) { + int BytesNeeded; + BytesNeeded = GUI_UC__CalcSizeOfChar(Char); + if (_IsSpaceInBuffer(pObj, BytesNeeded)) { + int CursorOffset; + char* pText; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + CursorOffset = pObj->CursorPosByte; + pText += CursorOffset; + memmove(pText + BytesNeeded, pText, strlen(pText) + 1); + GUI_UC_Encode(pText, Char); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + pObj->NumChars += 1; + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + _ClearCache(pObj); + return 1; + } + } + return 0; +} + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _MULTIEDIT_Paint +*/ +static void _MULTIEDIT_Paint(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ * pObj) { + int ScrollPosX, ScrollPosY, EffectSize, HBorder; + int x, y, xOff, yOff, ColorIndex, FontSizeY; + GUI_RECT r, rClip; + const GUI_RECT *prOldClip; + /* Init some values */ + GUI_SetFont(pObj->pFont); + FontSizeY = GUI_GetFontDistY(); + ScrollPosX = pObj->ScrollStateH.v; + ScrollPosY = pObj->ScrollStateV.v; + EffectSize = pObj->Widget.pEffect->EffectSize; + HBorder = pObj->HBorder; + xOff = EffectSize + HBorder - ScrollPosX ; + yOff = EffectSize - ScrollPosY * FontSizeY; + ColorIndex = ((pObj->Flags & MULTIEDIT_SF_READONLY) ? 1 : 0); + /* Set colors and draw the background */ + LCD_SetBkColor(pObj->aBkColor[ColorIndex]); + LCD_SetColor(pObj->aColor[ColorIndex]); + GUI_Clear(); + /* Draw the text if necessary */ + rClip.x0 = EffectSize + HBorder; + rClip.y0 = EffectSize; + rClip.x1 = WM_GetWindowSizeX(hObj) - EffectSize - HBorder - 1; + rClip.y1 = WM_GetWindowSizeY(hObj) - EffectSize - 1; + prOldClip = WM_SetUserClipRect(&rClip); + if (pObj->hText) { + const char* pText; + int Line = 0; + int xSize = _GetXSize(hObj, pObj); + int NumVisLines = _GetNumVisLines(hObj, pObj); + /* Get the text */ + pText = (const char *)GUI_ALLOC_h2p(pObj->hText); + /* Set the rectangle for drawing */ + r.x0 = xOff; + r.y0 = EffectSize; + r.x1 = xSize + EffectSize + HBorder - 1; + r.y1 = pObj->Widget.Win.Rect.y1 - pObj->Widget.Win.Rect.y0 + 1; + /* Use cached position of first visible byte if possible */ + if (ScrollPosY >= pObj->CacheFirstVisibleLine) { + if (pObj->CacheFirstVisibleByte) { + pText += pObj->CacheFirstVisibleByte; + Line = pObj->CacheFirstVisibleLine; + } + } + /* Do the drawing of the text */ + do { + /* Cache the position of the first visible byte and the depending line number */ + if (pObj->CacheFirstVisibleLine != ScrollPosY) { + if (Line == ScrollPosY) { + pObj->CacheFirstVisibleByte = pText - (const char *)GUI_ALLOC_h2p(pObj->hText); + pObj->CacheFirstVisibleLine = ScrollPosY; + } + } + /* Draw it */ + if ((Line >= ScrollPosY) && ((Line - ScrollPosY) <= NumVisLines)) { + _DispString(hObj, pObj, pText, &r); + r.y0 += FontSizeY; /* Next line */ + } + pText += _WrapGetNumBytesToNextLine(hObj, pObj, pText); + Line++; + } while (GUI_UC_GetCharCode(pText) && ((Line - ScrollPosY) <= NumVisLines)); + } + /* Draw cursor if necessary */ + if (WM_HasFocus(hObj)) { + _GetCursorXY(hObj, pObj, &x, &y); + r.x0 = x + xOff; + r.y0 = y + yOff; + r.x1 = r.x0 + _GetCursorSizeX(hObj, pObj) - 1; + r.y1 = r.y0 + FontSizeY - 1; + GUI_InvertRect(r.x0, r.y0, r.x1, r.y1); + } + WM_SetUserClipRect(prOldClip); + /* Draw the 3D effect (if configured) */ + WIDGET__EFFECT_DrawDown(&pObj->Widget); +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(MULTIEDIT_HANDLE hObj, MULTIEDIT_OBJ* pObj, WM_MESSAGE*pMsg) { + int Notification; + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + int Effect, xPos, yPos; + Effect = pObj->Widget.pEffect->EffectSize; + xPos = pState->x + pObj->ScrollStateH.v - Effect - pObj->HBorder; + yPos = pState->y + pObj->ScrollStateV.v * GUI_GetYDistOfFont(pObj->pFont) - Effect; + _SetCursorXY(hObj, pObj, xPos, yPos); + _Invalidate(hObj); + Notification = WM_NOTIFICATION_CLICKED; + } else { + Notification = WM_NOTIFICATION_RELEASED; + } + } else { + Notification = WM_NOTIFICATION_MOVED_OUT; + } + WM_NotifyParent(hObj, Notification); +} + +/********************************************************************* +* +* _AddKey +* +* Returns: 1 if Key has been consumed +* 0 else +*/ +static int _AddKey(MULTIEDIT_HANDLE hObj, U16 Key) { + int r = 0; /* Key has not been consumed */ + MULTIEDIT_OBJ* pObj; + pObj = MULTIEDIT_H2P(hObj); + switch (Key) { + case GUI_KEY_UP: + _MoveCursorUp(hObj, pObj); + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_DOWN: + _MoveCursorDown(hObj, pObj); + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_RIGHT: + _SetCursorPos(hObj, pObj, pObj->CursorPosChar + 1); + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_LEFT: + _SetCursorPos(hObj, pObj, pObj->CursorPosChar - 1); + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_END: + _MoveCursor2LineEnd(hObj, pObj); + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_HOME: + _MoveCursor2LinePos1(hObj, pObj); + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_BACKSPACE: + if (!(pObj->Flags & MULTIEDIT_SF_READONLY)) { + if (pObj->CursorPosChar > pObj->NumCharsPrompt) { + _SetCursorPos(hObj, pObj, pObj->CursorPosChar - 1); + _DeleteChar(hObj, pObj); + } + r = 1; /* Key has been consumed */ + } + break; + case GUI_KEY_DELETE: + if (!(pObj->Flags & MULTIEDIT_SF_READONLY)) { + _DeleteChar(hObj, pObj); + r = 1; /* Key has been consumed */ + } + break; + case GUI_KEY_INSERT: + if (!(pObj->Flags & MULTIEDIT_CF_INSERT)) { + pObj->Flags |= MULTIEDIT_CF_INSERT; + } else { + pObj->Flags &= ~MULTIEDIT_CF_INSERT; + } + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_ENTER: + if (pObj->Flags & MULTIEDIT_SF_READONLY) { + _MoveCursor2NextLine(hObj, pObj); + } else { + if (_InsertChar(hObj, pObj, (U8)('\n'))) { + if (pObj->Flags & MULTIEDIT_SF_PASSWORD) { + _SetCursorPos(hObj, pObj, pObj->CursorPosChar + 1); + } else { + _MoveCursor2NextLine(hObj, pObj); + } + } + } + r = 1; /* Key has been consumed */ + break; + case GUI_KEY_ESCAPE: + break; + default: + if (!(pObj->Flags & MULTIEDIT_SF_READONLY) && (Key >= 0x20)) { + if (_IsOverwriteAtThisChar(hObj, pObj)) { + _DeleteChar(hObj, pObj); + } + if (_InsertChar(hObj, pObj, Key)) { + _SetCursorPos(hObj, pObj, pObj->CursorPosChar + 1); + } + r = 1; /* Key has been consumed */ + } + } + _InvalidateTextArea(hObj); + return r; +} + +/********************************************************************* +* +* _MULTIEDIT_Callback +*/ +static void _MULTIEDIT_Callback (WM_MESSAGE *pMsg) { + MULTIEDIT_HANDLE hObj; + MULTIEDIT_OBJ* pObj; + WM_SCROLL_STATE ScrollState; + hObj = pMsg->hWin; + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + pObj = MULTIEDIT_H2P(hObj); + switch (pMsg->MsgId) { + case WM_NOTIFY_CLIENTCHANGE: + _InvalidateCursorXY(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + _ClearCache(pObj); + _CalcScrollParas(hObj); + break; + case WM_SIZE: + _InvalidateCursorXY(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + _ClearCache(pObj); + _Invalidate(hObj); + break; + case WM_NOTIFY_PARENT: + switch (pMsg->Data.v) { + case WM_NOTIFICATION_VALUE_CHANGED: + if (pMsg->hWinSrc == WM_GetScrollbarV(hObj)) { + WM_GetScrollState(pMsg->hWinSrc, &ScrollState); + pObj->ScrollStateV.v = ScrollState.v; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + } else if (pMsg->hWinSrc == WM_GetScrollbarH(hObj)) { + WM_GetScrollState(pMsg->hWinSrc, &ScrollState); + pObj->ScrollStateH.v = ScrollState.v; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_SCROLL_CHANGED); + } + break; + case WM_NOTIFICATION_SCROLLBAR_ADDED: + _SetScrollState(hObj); + break; + } + break; + case WM_PAINT: + _MULTIEDIT_Paint(hObj, pObj); + return; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + case WM_DELETE: + GUI_ALLOC_FreePtr(&pObj->hText); + break; + case WM_KEY: + if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) { + int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + /* Leave code for test purpose + switch (Key) { + case '1': Key = GUI_KEY_LEFT; break; + case '2': Key = GUI_KEY_UP; break; + case '3': Key = GUI_KEY_RIGHT; break; + case '4': Key = GUI_KEY_DOWN; break; + } + */ + if (_AddKey(hObj, Key)) { + return; + } + } else { + if (!(pObj->Flags & MULTIEDIT_SF_READONLY)) { + return; /* Key release is consumed (not sent to parent) */ + } + } + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* MULTIEDIT_CreateEx +*/ +MULTIEDIT_HANDLE MULTIEDIT_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, + int Id, int BufferSize, const char* pText) +{ + MULTIEDIT_HANDLE hObj; + /* Create the window */ + WM_LOCK(); + if ((xsize == 0) && (ysize == 0) && (x0 == 0) && (y0 == 0)) { + GUI_RECT Rect; + WM_GetClientRectEx(hParent, &Rect); + xsize = Rect.x1 - Rect.x0 + 1; + ysize = Rect.y1 - Rect.y0 + 1; + } + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, &_MULTIEDIT_Callback, + sizeof(MULTIEDIT_OBJ) - sizeof(WM_Obj)); + if (hObj) { + int i; + MULTIEDIT_OBJ* pObj = MULTIEDIT_H2P(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + /* init member variables */ + MULTIEDIT_INIT_ID(pObj); + for (i = 0; i < NUM_DISP_MODES; i++) { + pObj->aBkColor[i] = _aDefaultBkColor[i]; + pObj->aColor[i] = _aDefaultColor[i]; + } + pObj->pFont = _pDefaultFont; + pObj->Flags = ExFlags; + pObj->CursorPosChar = 0; + pObj->CursorPosByte = 0; + pObj->HBorder = 1; + pObj->MaxNumChars = 0; + pObj->NumCharsPrompt = 0; + pObj->BufferSize = 0; + pObj->hText = 0; + if (BufferSize > 0) { + WM_HWIN hText; + if ((hText = GUI_ALLOC_AllocZero(BufferSize)) != 0) { + pObj->BufferSize = BufferSize; + pObj->hText = hText; + } else { + GUI_DEBUG_ERROROUT("MULTIEDIT_CreateEx failed to alloc buffer"); + WM_DeleteWindow(hObj); + hObj = 0; + } + } + MULTIEDIT_SetText(hObj, pText); + _ManageScrollers(hObj); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "MULTIEDIT_CreateEx failed") + } + WM_UNLOCK(); + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIEDIT_AddKey +*/ +int MULTIEDIT_AddKey(MULTIEDIT_HANDLE hObj, U16 Key) { + int r = 0; + if (hObj) { + WM_LOCK(); + r = _AddKey(hObj, Key); + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* MULTIEDIT_SetText +*/ +void MULTIEDIT_SetText(MULTIEDIT_HANDLE hObj, const char* pNew) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + int NumCharsNew = 0, NumCharsOld = 0; + int NumBytesNew = 0, NumBytesOld = 0; + char* pText; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (pObj->hText) { + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt); + NumCharsOld = GUI__GetNumChars(pText); + NumBytesOld = GUI_UC__NumChars2NumBytes(pText, NumCharsOld); + } + if (pNew) { + NumCharsNew = GUI__GetNumChars(pNew); + NumBytesNew = GUI_UC__NumChars2NumBytes(pNew, NumCharsNew); + } + if (_IsCharsAvailable(pObj, NumCharsNew - NumCharsOld)) { + if (_IsSpaceInBuffer(pObj, NumBytesNew - NumBytesOld)) { + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt); + if (pNew) { + strcpy(pText, pNew); + } else { + *pText = 0; + } + _SetCursorPos(hObj, pObj, pObj->NumCharsPrompt); + _InvalidateTextArea(hObj); + _InvalidateNumChars(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_GetText +*/ +void MULTIEDIT_GetText(MULTIEDIT_HANDLE hObj, char* sDest, int MaxLen) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (pObj) { + char* pText; + int Len; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt); + Len = strlen(pText); + if (Len > (MaxLen - 1)) { + Len = MaxLen - 1; + } + memcpy(sDest, pText, Len); + *(sDest + Len) = 0; + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_GetPrompt +*/ +void MULTIEDIT_GetPrompt(MULTIEDIT_HANDLE hObj, char * sDest, int MaxLen) { + if (hObj) { + MULTIEDIT_OBJ * pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (pObj) { + char* sSource = (char*)GUI_ALLOC_h2p(pObj->hText); + int Len = GUI_UC__NumChars2NumBytes(sSource, pObj->NumCharsPrompt); + if (Len > (MaxLen - 1)) { + Len = MaxLen - 1; + } + memcpy(sDest, sSource, Len); + *(sDest + Len) = 0; + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetWrapWord +*/ +void MULTIEDIT_SetWrapWord(MULTIEDIT_HANDLE hObj) { + _SetWrapMode(hObj, GUI_WRAPMODE_WORD); +} + +/********************************************************************* +* +* MULTIEDIT_SetWrapChar +*/ +void MULTIEDIT_SetWrapChar(MULTIEDIT_HANDLE hObj) { + _SetWrapMode(hObj, GUI_WRAPMODE_CHAR); +} + +/********************************************************************* +* +* MULTIEDIT_SetWrapNone +*/ +void MULTIEDIT_SetWrapNone(MULTIEDIT_HANDLE hObj) { + _SetWrapMode(hObj, GUI_WRAPMODE_NONE); +} + +/********************************************************************* +* +* MULTIEDIT_SetInsertMode +*/ +void MULTIEDIT_SetInsertMode(MULTIEDIT_HANDLE hObj, int OnOff) { + _SetFlag(hObj, OnOff, MULTIEDIT_SF_INSERT); +} + +/********************************************************************* +* +* MULTIEDIT_SetReadOnly +*/ +void MULTIEDIT_SetReadOnly(MULTIEDIT_HANDLE hObj, int OnOff) { + _SetFlag(hObj, OnOff, MULTIEDIT_SF_READONLY); +} + +/********************************************************************* +* +* MULTIEDIT_SetPasswordMode +*/ +void MULTIEDIT_SetPasswordMode(MULTIEDIT_HANDLE hObj, int OnOff) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + _SetFlag(hObj, OnOff, MULTIEDIT_SF_PASSWORD); + _InvalidateCursorXY(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetAutoScrollV +*/ +void MULTIEDIT_SetAutoScrollV(MULTIEDIT_HANDLE hObj, int OnOff) { + _SetFlag(hObj, OnOff, MULTIEDIT_SF_AUTOSCROLLBAR_V); +} + +/********************************************************************* +* +* MULTIEDIT_SetAutoScrollH +*/ +void MULTIEDIT_SetAutoScrollH(MULTIEDIT_HANDLE hObj, int OnOff) { + _SetFlag(hObj, OnOff, MULTIEDIT_SF_AUTOSCROLLBAR_H); +} + +/********************************************************************* +* +* MULTIEDIT_SetHBorder +*/ +void MULTIEDIT_SetHBorder(MULTIEDIT_HANDLE hObj, unsigned HBorder) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if ((unsigned)pObj->HBorder != HBorder) { + pObj->HBorder = HBorder; + _Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetFont +*/ +void MULTIEDIT_SetFont(MULTIEDIT_HANDLE hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (pObj->pFont != pFont) { + pObj->pFont = pFont; + _InvalidateTextArea(hObj); + _InvalidateCursorXY(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetBkColor +*/ +void MULTIEDIT_SetBkColor(MULTIEDIT_HANDLE hObj, unsigned Index, GUI_COLOR color) { + if (hObj && (Index < NUM_DISP_MODES)) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + pObj->aBkColor[Index] = color; + _InvalidateTextArea(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetCursorOffset +*/ +void MULTIEDIT_SetCursorOffset(MULTIEDIT_HANDLE hObj, int Offset) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + _SetCursorPos(hObj, pObj, Offset); + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetTextColor +*/ +void MULTIEDIT_SetTextColor(MULTIEDIT_HANDLE hObj, unsigned Index, GUI_COLOR color) { + if (hObj && (Index < NUM_DISP_MODES)) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + pObj->aColor[Index] = color; + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetPrompt +*/ +void MULTIEDIT_SetPrompt(MULTIEDIT_HANDLE hObj, const char* pPrompt) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + int NumCharsNew = 0, NumCharsOld = 0; + int NumBytesNew = 0, NumBytesOld = 0; + char* pText; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (pObj->hText) { + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + NumCharsOld = pObj->NumCharsPrompt; + NumBytesOld = GUI_UC__NumChars2NumBytes(pText, NumCharsOld); + } + if (pPrompt) { + NumCharsNew = GUI__GetNumChars(pPrompt); + NumBytesNew = GUI_UC__NumChars2NumBytes(pPrompt, NumCharsNew); + } + if (_IsCharsAvailable(pObj, NumCharsNew - NumCharsOld)) { + if (_IsSpaceInBuffer(pObj, NumBytesNew - NumBytesOld)) { + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + memmove(pText + NumBytesNew, pText + NumBytesOld, strlen(pText + NumBytesOld) + 1); + if (pPrompt) { + memcpy(pText, pPrompt, NumBytesNew); + } + pObj->NumCharsPrompt = NumCharsNew; + _SetCursorPos(hObj, pObj, NumCharsNew); + _InvalidateTextArea(hObj); + _InvalidateNumChars(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetBufferSize +*/ +void MULTIEDIT_SetBufferSize(MULTIEDIT_HANDLE hObj, int BufferSize) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_HMEM hText; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if ((hText = GUI_ALLOC_AllocZero(BufferSize)) == 0) { + GUI_DEBUG_ERROROUT("MULTIEDIT_SetBufferSize failed to alloc buffer"); + } else { + GUI_ALLOC_FreePtr(&pObj->hText); + pObj->hText = hText; + pObj->BufferSize = BufferSize; + pObj->NumCharsPrompt = 0; + _SetCursorPos(hObj, pObj, 0); + _InvalidateNumChars(pObj); + _InvalidateCursorXY(pObj); + _InvalidateNumLines(pObj); + _InvalidateTextSizeX(pObj); + } + _InvalidateTextArea(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_SetMaxNumChars +*/ +void MULTIEDIT_SetMaxNumChars(MULTIEDIT_HANDLE hObj, unsigned MaxNumChars) { + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + pObj->MaxNumChars = MaxNumChars; + if (MaxNumChars < (unsigned)pObj->NumCharsPrompt) { + pObj->NumCharsPrompt = MaxNumChars; + } + if (pObj->hText && MaxNumChars) { + char* pText; + int Offset; + pText = (char*) GUI_ALLOC_h2p(pObj->hText); + Offset = GUI_UC__NumChars2NumBytes(pText, MaxNumChars); + if (Offset < pObj->BufferSize) { + pText += Offset; + *pText = 0; + _SetCursorPos(hObj, pObj, Offset); + _InvalidateTextArea(hObj); + _InvalidateNumChars(pObj); + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIEDIT_GetTextSize +* +* Purpose: +* Returns the number of bytes required to store the text. +* It is typically used when allocating a buffer to pass to +* MULTIEDIT_GetText(). +*/ +int MULTIEDIT_GetTextSize(MULTIEDIT_HANDLE hObj) { + int r = 0; + if (hObj) { + MULTIEDIT_OBJ* pObj; + WM_LOCK(); + pObj = MULTIEDIT_H2P(hObj); + if (pObj->hText) { + const char* s; + s = (const char*)GUI_ALLOC_h2p(pObj->hText); + s += GUI_UC__NumChars2NumBytes(s, pObj->NumCharsPrompt); + r = 1 + strlen(s); + } + WM_UNLOCK(); + } + return r; +} + + +#else /* avoid empty object files */ + +void MULTIEDIT_C(void); +void MULTIEDIT_C(void){} + +#endif /* #if GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/MULTIEDIT.h b/User/system/lib/lcd/gui/Widget/MULTIEDIT.h new file mode 100644 index 0000000..0ad0e3d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIEDIT.h @@ -0,0 +1,122 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIEDIT.h +Purpose : MULTIEDIT include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef MULTIEDIT_H +#define MULTIEDIT_H + +#include "WM.h" +#include "DIALOG.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +#define MULTIEDIT_CF_READONLY (1 << 0) +#define MULTIEDIT_CF_INSERT (1 << 2) +#define MULTIEDIT_CF_AUTOSCROLLBAR_V (1 << 3) +#define MULTIEDIT_CF_AUTOSCROLLBAR_H (1 << 4) +#define MULTIEDIT_CF_PASSWORD (1 << 5) + +#define MULTIEDIT_SF_READONLY MULTIEDIT_CF_READONLY +#define MULTIEDIT_SF_INSERT MULTIEDIT_CF_INSERT +#define MULTIEDIT_SF_AUTOSCROLLBAR_V MULTIEDIT_CF_AUTOSCROLLBAR_V +#define MULTIEDIT_SF_AUTOSCROLLBAR_H MULTIEDIT_CF_AUTOSCROLLBAR_H +#define MULTIEDIT_SF_PASSWORD MULTIEDIT_CF_PASSWORD + +/********************************************************************* +* +* Color indices +*/ +#define MULTIEDIT_CI_EDIT 0 +#define MULTIEDIT_CI_READONLY 1 + +/********************************************************************* +* +* Public Types +* +********************************************************************** +*/ + +typedef WM_HMEM MULTIEDIT_HANDLE; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +MULTIEDIT_HANDLE MULTIEDIT_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, + int Id, int BufferSize, const char* pText); +MULTIEDIT_HANDLE MULTIEDIT_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int Id, int Flags, int ExFlags, const char* pText, + int BufferSize); +MULTIEDIT_HANDLE MULTIEDIT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, + WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +int MULTIEDIT_AddKey (MULTIEDIT_HANDLE hObj, U16 Key); +void MULTIEDIT_GetPrompt (MULTIEDIT_HANDLE hObj, char* sDest, int MaxNumChars); +int MULTIEDIT_GetTextSize (MULTIEDIT_HANDLE hObj); +void MULTIEDIT_GetText (MULTIEDIT_HANDLE hObj, char* sDest, int MaxNumChars); +void MULTIEDIT_SetAutoScrollH (MULTIEDIT_HANDLE hObj, int OnOff); +void MULTIEDIT_SetAutoScrollV (MULTIEDIT_HANDLE hObj, int OnOff); +void MULTIEDIT_SetBkColor (MULTIEDIT_HANDLE hObj, unsigned Index, GUI_COLOR color); +void MULTIEDIT_SetCursorCharPos (MULTIEDIT_HANDLE hObj, int x, int y); /* Not yet implemented */ +void MULTIEDIT_SetCursorPixelPos(MULTIEDIT_HANDLE hObj, int x, int y); /* Not yet implemented */ +void MULTIEDIT_SetCursorOffset (MULTIEDIT_HANDLE hObj, int Offset); +void MULTIEDIT_SetHBorder (MULTIEDIT_HANDLE hObj, unsigned HBorder); +void MULTIEDIT_SetFont (MULTIEDIT_HANDLE hObj, const GUI_FONT GUI_UNI_PTR * pFont); +void MULTIEDIT_SetInsertMode (MULTIEDIT_HANDLE hObj, int OnOff); +void MULTIEDIT_SetBufferSize (MULTIEDIT_HANDLE hObj, int BufferSize); +void MULTIEDIT_SetMaxNumChars (MULTIEDIT_HANDLE hObj, unsigned MaxNumChars); +void MULTIEDIT_SetPrompt (MULTIEDIT_HANDLE hObj, const char* sPrompt); +void MULTIEDIT_SetReadOnly (MULTIEDIT_HANDLE hObj, int OnOff); +void MULTIEDIT_SetPasswordMode (MULTIEDIT_HANDLE hObj, int OnOff); +void MULTIEDIT_SetText (MULTIEDIT_HANDLE hObj, const char* s); +void MULTIEDIT_SetTextColor (MULTIEDIT_HANDLE hObj, unsigned Index, GUI_COLOR color); +void MULTIEDIT_SetWrapNone (MULTIEDIT_HANDLE hObj); +void MULTIEDIT_SetWrapChar (MULTIEDIT_HANDLE hObj); +void MULTIEDIT_SetWrapWord (MULTIEDIT_HANDLE hObj); + +/********************************************************************* +* +* Macros for compatibility with older versions +* +********************************************************************** +*/ + +#define MULTIEDIT_SetMaxLen(hObj, MaxLen) MULTIEDIT_SetBufferSize(hObj, MaxLen) +#define MULTIEDIT_GetStringSize MULTIEDIT_GetTextSize + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ + +#endif /* MULTIEDIT_H */ diff --git a/User/system/lib/lcd/gui/Widget/MULTIEDIT_Create.c b/User/system/lib/lcd/gui/Widget/MULTIEDIT_Create.c new file mode 100644 index 0000000..0aeed01 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIEDIT_Create.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIEDIT_Create.c +Purpose : Implementation of multiedit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MULTIEDIT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIEDIT_Create +*/ +MULTIEDIT_HANDLE MULTIEDIT_Create(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int ExFlags, const char * pText, int MaxLen) { + return MULTIEDIT_CreateEx(x0, y0, xsize, ysize, hParent, Flags, ExFlags, Id, MaxLen, pText); +} + +#else /* avoid empty object files */ + void MULTIEDIT_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/MULTIEDIT_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/MULTIEDIT_CreateIndirect.c new file mode 100644 index 0000000..77b3e64 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIEDIT_CreateIndirect.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIEDIT_CreateIndirect.c +Purpose : Implementation of multiedit widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "MULTIEDIT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIEDIT_CreateIndirect +*/ +MULTIEDIT_HANDLE MULTIEDIT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + MULTIEDIT_HANDLE hThis; + GUI_USE_PARA(cb); + hThis = MULTIEDIT_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id, pCreateInfo->Para, NULL); + return hThis; +} + +#else /* avoid empty object files */ + void MULTIEDIT_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/MULTIPAGE.c b/User/system/lib/lcd/gui/Widget/MULTIPAGE.c new file mode 100644 index 0000000..ac7c883 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIPAGE.c @@ -0,0 +1,975 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIPAGE.c +Purpose : Implementation of MULTIPAGE widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "GUI_ARRAY.h" +#include "MULTIPAGE_Private.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define MAX(a, b) ((a > b) ? a : b) + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef MULTIPAGE_FONT_DEFAULT + #define MULTIPAGE_FONT_DEFAULT &GUI_Font13_1 +#endif + +#ifndef MULTIPAGE_ALIGN_DEFAULT + #define MULTIPAGE_ALIGN_DEFAULT (MULTIPAGE_ALIGN_LEFT | MULTIPAGE_ALIGN_TOP) +#endif + +/* Define colors */ +#define MULTIPAGE_NUMCOLORS 2 + +#ifndef MULTIPAGE_BKCOLOR0_DEFAULT + #define MULTIPAGE_BKCOLOR0_DEFAULT 0xD0D0D0 /* disabled page */ +#endif + +#ifndef MULTIPAGE_BKCOLOR1_DEFAULT + #define MULTIPAGE_BKCOLOR1_DEFAULT 0xC0C0C0 /* enabled page */ +#endif + +#ifndef MULTIPAGE_TEXTCOLOR0_DEFAULT + #define MULTIPAGE_TEXTCOLOR0_DEFAULT 0x808080 /* disabled page */ +#endif + +#ifndef MULTIPAGE_TEXTCOLOR1_DEFAULT + #define MULTIPAGE_TEXTCOLOR1_DEFAULT 0x000000 /* enabled page */ +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + WM_HWIN hWin; + U8 Status; + char acText; +} MULTIPAGE_PAGE; + +typedef struct { + WIDGET Widget; + WM_HWIN hClient; + GUI_ARRAY Handles; + unsigned Selection; + int ScrollState; + unsigned Align; + const GUI_FONT GUI_UNI_PTR * Font; + GUI_COLOR aBkColor[MULTIPAGE_NUMCOLORS]; + GUI_COLOR aTextColor[MULTIPAGE_NUMCOLORS]; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif +} MULTIPAGE_Obj; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +const GUI_FONT GUI_UNI_PTR * MULTIPAGE__pDefaultFont = MULTIPAGE_FONT_DEFAULT; +unsigned MULTIPAGE__DefaultAlign = MULTIPAGE_ALIGN_DEFAULT; +GUI_COLOR MULTIPAGE__DefaultBkColor[2] = { MULTIPAGE_BKCOLOR0_DEFAULT, MULTIPAGE_BKCOLOR1_DEFAULT }; +GUI_COLOR MULTIPAGE__DefaultTextColor[2] = { MULTIPAGE_TEXTCOLOR0_DEFAULT, MULTIPAGE_TEXTCOLOR1_DEFAULT }; + +/********************************************************************* +* +* Static code, helper functions +* +********************************************************************** +*/ +/********************************************************************* +* +* _AddScrollbar +*/ +static void _AddScrollbar(MULTIPAGE_Handle hObj, MULTIPAGE_Obj* pObj, int x, int y, int w, int h) { + SCROLLBAR_Handle hScroll; + if ((hScroll = WM_GetScrollbarH(hObj)) == 0) { + hScroll = SCROLLBAR_Create(x, y, w, h, hObj, GUI_ID_HSCROLL, WM_CF_SHOW, 0); + WIDGET_SetEffect(hScroll, pObj->Widget.pEffect); + } else { + WM_MoveChildTo(hScroll, x, y); + WM_SetSize(hScroll, w, h); + } + pObj->Widget.State |= MULTIPAGE_STATE_SCROLLMODE; +} + +/********************************************************************* +* +* _SetScrollbar +*/ +static void _SetScrollbar(MULTIPAGE_Handle hObj, MULTIPAGE_Obj* pObj, int NumItems) { + SCROLLBAR_Handle hScroll; + hScroll = WM_GetScrollbarH(hObj); + SCROLLBAR_SetNumItems(hScroll, NumItems); + SCROLLBAR_SetPageSize(hScroll, 1); + if (pObj->ScrollState >= NumItems) { + pObj->ScrollState = 0; + } + SCROLLBAR_SetValue(hScroll, pObj->ScrollState); +} + +/********************************************************************* +* +* _DeleteScrollbar +*/ +static void _DeleteScrollbar(MULTIPAGE_Handle hObj, MULTIPAGE_Obj* pObj) { + WM_DeleteWindow(WM_GetScrollbarH(hObj)); + pObj->Widget.State &= ~MULTIPAGE_STATE_SCROLLMODE; +} + +/********************************************************************* +* +* _ShowPage +*/ +static void _ShowPage(MULTIPAGE_Obj* pObj, unsigned Index) { + WM_HWIN hWin = 0; + WM_HWIN hChild; + WM_Obj* pChild; + WM_Obj* pClient = WM_H2P(pObj->hClient); + if ((int)Index < pObj->Handles.NumItems) { + MULTIPAGE_PAGE* pPage; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + hWin = pPage->hWin; + } + for (hChild = pClient->hFirstChild; hChild; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + if (hChild == hWin) { + WM_ShowWindow(hChild); + WM_SetFocus(hChild); + } else { + WM_HideWindow(hChild); + } + } +} + +/********************************************************************* +* +* _SetEnable +*/ +static void _SetEnable(MULTIPAGE_Obj* pObj, unsigned Index, int State) { + if ((int)Index < pObj->Handles.NumItems) { + MULTIPAGE_PAGE* pPage; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + if (State) { + pPage->Status |= MULTIPAGE_STATE_ENABLED; + } else { + pPage->Status &= ~MULTIPAGE_STATE_ENABLED; + } + } +} + +/********************************************************************* +* +* _GetEnable +*/ +static int _GetEnable(MULTIPAGE_Obj* pObj, unsigned Index) { + int r = 0; + if ((int)Index < pObj->Handles.NumItems) { + MULTIPAGE_PAGE* pPage; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + r = (pPage->Status & MULTIPAGE_STATE_ENABLED) ? 1 : 0; + } + return r; +} + +/********************************************************************* +* +* _CalcClientRect +* +* Calculates the rect of the client area. +*/ +static void _CalcClientRect(MULTIPAGE_Obj* pObj, GUI_RECT* pRect) { + WIDGET__GetInsideRect(&pObj->Widget, pRect); + if (pObj->Align & MULTIPAGE_ALIGN_BOTTOM) { + pRect->y1 -= GUI_GetYSizeOfFont(pObj->Font) + 6; + } else { + pRect->y0 += GUI_GetYSizeOfFont(pObj->Font) + 6; + } +} + +/********************************************************************* +* +* _CalcBorderRect +* +* Calculates the border rect of the client area. +*/ +static void _CalcBorderRect(MULTIPAGE_Obj* pObj, GUI_RECT* pRect) { + WM__GetClientRectWin(&pObj->Widget.Win, pRect); + if (pObj->Align & MULTIPAGE_ALIGN_BOTTOM) { + pRect->y1 -= GUI_GetYSizeOfFont(pObj->Font) + 6; + } else { + pRect->y0 += GUI_GetYSizeOfFont(pObj->Font) + 6; + } +} + +/********************************************************************* +* +* _GetPageSizeX +* +* Returns the width of a page item. +*/ +static int _GetPageSizeX(MULTIPAGE_Obj* pObj, unsigned Index) { + int r = 0; + if ((int)Index < pObj->Handles.NumItems) { + MULTIPAGE_PAGE* pPage; + GUI_SetFont(pObj->Font); + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + r = GUI_GetStringDistX(&pPage->acText) + 10; + } + return r; +} + +/********************************************************************* +* +* _GetPagePosX +* +* Returns the x-position of a page item. +*/ +static int _GetPagePosX(MULTIPAGE_Obj* pObj, unsigned Index) { + unsigned i, r = 0; + for (i = 0; i < Index; i++) { + r += _GetPageSizeX(pObj, i); + } + return r; +} + +/********************************************************************* +* +* _GetTextWidth +* +* Returns the width of all text items. +*/ +static int _GetTextWidth(MULTIPAGE_Obj* pObj) { + return _GetPagePosX(pObj, pObj->Handles.NumItems); +} + +/********************************************************************* +* +* _GetTextRect +*/ +static void _GetTextRect(MULTIPAGE_Obj* pObj, GUI_RECT* pRect) { + GUI_RECT rBorder; + int Width, Height; + Height = GUI_GetYSizeOfFont(pObj->Font) + 6; + _CalcBorderRect(pObj, &rBorder); + /* Calculate Y-Position of text item */ + if (pObj->Align & MULTIPAGE_ALIGN_BOTTOM) { + pRect->y0 = rBorder.y1; + } else { + pRect->y0 = 0; + } + pRect->y1 = pRect->y0 + Height; + /* Calculate width of text items */ + if (pObj->Widget.State & MULTIPAGE_STATE_SCROLLMODE) { + Width = rBorder.x1 - ((Height * 3) >> 1) - 3; + } else { + Width = _GetTextWidth(pObj); + } + /* Calculate X-Position of text item */ + if (pObj->Align & MULTIPAGE_ALIGN_RIGHT) { + pRect->x0 = rBorder.x1 - Width; + pRect->x1 = rBorder.x1; + } else { + pRect->x0 = 0; + pRect->x1 = Width; + } +} + +/********************************************************************* +* +* _UpdatePositions +*/ +static void _UpdatePositions(MULTIPAGE_Handle hObj, MULTIPAGE_Obj* pObj) { + GUI_RECT rBorder; + int Width; + Width = _GetTextWidth(pObj); + _CalcBorderRect(pObj, &rBorder); + /* Set scrollmode according to the text width */ + if (Width > rBorder.x1) { + GUI_RECT rText; + int Size, x0, y0, NumItems = 0; + Size = ((GUI_GetYSizeOfFont(pObj->Font) + 6) * 3) >> 2; + x0 = (pObj->Align & MULTIPAGE_ALIGN_RIGHT) ? (rBorder.x0) : (rBorder.x1 - 2*Size + 1); + y0 = (pObj->Align & MULTIPAGE_ALIGN_BOTTOM) ? (rBorder.y1) : (rBorder.y0 - Size + 1); + /* A scrollbar is required so we add one to the multipage */ + _AddScrollbar(hObj, pObj, x0, y0, 2 * Size, Size); + _GetTextRect(pObj, &rText); + while (Width >= MAX((rText.x1 - rText.x0 + 1), 1)) { + Width -= _GetPageSizeX(pObj, NumItems++); + } + _SetScrollbar(hObj, pObj, NumItems + 1); + } else { + /* Scrollbar is no longer required. We delete it if there was one */ + _DeleteScrollbar(hObj, pObj); + } + /* Move and resize the client area to the updated positions */ + _CalcClientRect(pObj, &rBorder); + WM_MoveChildTo(pObj->hClient, rBorder.x0, rBorder.y0); + WM_SetSize(pObj->hClient, rBorder.x1 - rBorder.x0 + 1, rBorder.y1 - rBorder.y0 + 1); + WM_InvalidateWindow(hObj); +} + +/********************************************************************* +* +* Static code, drawing functions +* +********************************************************************** +*/ +/********************************************************************* +* +* _DrawTextItem +*/ +static void _DrawTextItem(MULTIPAGE_Obj* pObj, const char* pText, unsigned Index, + const GUI_RECT* pRect, int x0, int w, int ColorIndex) { + GUI_RECT r; + r = *pRect; + r.x0 += x0; + r.x1 = r.x0 + w; + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &r); + GUI__ReduceRect(&r, &r, pObj->Widget.pEffect->EffectSize); + if (pObj->Selection == Index) { + if (pObj->Align & MULTIPAGE_ALIGN_BOTTOM) { + r.y0 -= pObj->Widget.pEffect->EffectSize + 1; + if (pObj->Widget.pEffect->EffectSize > 1) { + LCD_SetColor(GUI_WHITE); + GUI_DrawVLine(r.x0 - 1, r.y0, r.y0 + 1); + LCD_SetColor(0x555555); + GUI_DrawVLine(r.x1 + 1, r.y0, r.y0 + 1); + } + } else { + r.y1 += pObj->Widget.pEffect->EffectSize + 1; + if (pObj->Widget.pEffect->EffectSize > 1) { + LCD_SetColor(GUI_WHITE); + GUI_DrawVLine(r.x0 - 1, r.y1 - 2, r.y1 - 1); + LCD_SetColor(0x555555); + GUI_DrawVLine(r.x1 + 1, r.y1 - 2, r.y1 - 1); + } + } + } + LCD_SetColor(pObj->aBkColor[ColorIndex]); + WIDGET__FillRectEx(&pObj->Widget, &r); + LCD_SetBkColor(pObj->aBkColor[ColorIndex]); + LCD_SetColor(pObj->aTextColor[ColorIndex]); + GUI_DispStringAt(pText, r.x0 + 4, pRect->y0 + 3); +} + +/********************************************************************* +* +* Static code, multipage callbacks +* +********************************************************************** +*/ +/********************************************************************* +* +* _Paint +*/ +static void _Paint(MULTIPAGE_Obj* pObj) { + GUI_RECT rBorder; + /* Draw border of multipage */ + _CalcBorderRect(pObj, &rBorder); + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &rBorder); + /* Draw text items */ + if (pObj->Handles.NumItems > 0) { + MULTIPAGE_PAGE* pPage; + GUI_RECT rText, rClip; + int i, w = 0, x0 = 0; + if (pObj->Widget.State & MULTIPAGE_STATE_SCROLLMODE) { + if (pObj->Align & MULTIPAGE_ALIGN_RIGHT) { + x0 = -_GetPagePosX(pObj, pObj->ScrollState); + } else { + x0 = -_GetPagePosX(pObj, pObj->ScrollState); + } + } + _GetTextRect(pObj, &rText); + rClip = rText; + rClip.y0 = rText.y0 - 1; + rClip.y1 = rText.y1 + 1; + WM_SetUserClipRect(&rClip); + GUI_SetFont(pObj->Font); + for (i = 0; i < pObj->Handles.NumItems; i++) { + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, i); + x0 += w; + w = GUI_GetStringDistX(&pPage->acText) + 10; + _DrawTextItem(pObj, &pPage->acText, i, &rText, x0, w, (pPage->Status & MULTIPAGE_STATE_ENABLED) ? 1 : 0); + } + WM_SetUserClipRect(NULL); + } +} + +/********************************************************************* +* +* _ClickedOnMultipage +*/ +static int _ClickedOnMultipage(MULTIPAGE_Handle hObj, MULTIPAGE_Obj* pObj, int x, int y) { + GUI_RECT rText; + _GetTextRect(pObj, &rText); + if ((y >= rText.y0) && (y <= rText.y1)) { + if ((pObj->Handles.NumItems > 0) && (x >= rText.x0) && (x <= rText.x1)) { + int i, w = 0, x0 = rText.x0; + /* Check if another page must be selected */ + if (pObj->Widget.State & MULTIPAGE_STATE_SCROLLMODE) { + x0 -= _GetPagePosX(pObj, pObj->ScrollState); + } + for (i = 0; i < pObj->Handles.NumItems; i++) { + x0 += w; + w = _GetPageSizeX(pObj, i); + if (x >= x0 && x <= (x0 + w - 1)) { + MULTIPAGE_SelectPage(hObj, i); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + return 1; + } + } + } + return 0; + } + return 1; +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(MULTIPAGE_Handle hObj, MULTIPAGE_Obj* pObj, WM_MESSAGE*pMsg) { + GUI_PID_STATE* pState; + int Notification; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + pState = (GUI_PID_STATE*)pMsg->Data.p; + if (pState->Pressed) { + int x = pState->x; + int y = pState->y; + if (!_ClickedOnMultipage(hObj, pObj, x, y)) { + WM_HWIN hBelow; + x += WM_GetWindowOrgX(hObj); + y += WM_GetWindowOrgY(hObj); + hBelow = WM_Screen2hWinEx(hObj, x, y); + if (hBelow) { + pState->x = x - WM_GetWindowOrgX(hBelow); + pState->y = y - WM_GetWindowOrgY(hBelow); + pMsg->hWin = hBelow; + (*WM_H2P(hBelow)->cb)(pMsg); + } + } else { + WM_BringToTop(hObj); + } + Notification = WM_NOTIFICATION_CLICKED; + } else { + Notification = WM_NOTIFICATION_RELEASED; + } + } else { + Notification = WM_NOTIFICATION_MOVED_OUT; + } + WM_NotifyParent(hObj, Notification); +} + +/********************************************************************* +* +* _Callback +*/ +static void _Callback (WM_MESSAGE *pMsg) { + MULTIPAGE_Handle hObj = pMsg->hWin; + MULTIPAGE_Obj* pObj; + int Handled; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + Handled = WIDGET_HandleActive(hObj, pMsg); + switch (pMsg->MsgId) { + case WM_PAINT: + _Paint(pObj); + break; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + case WM_NOTIFY_PARENT: + if (pMsg->Data.v == WM_NOTIFICATION_VALUE_CHANGED) { + if (WM_GetId(pMsg->hWinSrc) == GUI_ID_HSCROLL) { + pObj->ScrollState = SCROLLBAR_GetValue(pMsg->hWinSrc); + WM_InvalidateWindow(hObj); + } + } + break; + case WM_GET_CLIENT_WINDOW: + pMsg->Data.v = (int)pObj->hClient; + break; + case WM_GET_INSIDE_RECT: + _CalcClientRect(pObj, (GUI_RECT*)(pMsg->Data.p)); + break; + case WM_WIDGET_SET_EFFECT: + WIDGET_SetEffect(WM_GetScrollbarH(hObj), (WIDGET_EFFECT const *)pMsg->Data.p); + case WM_SIZE: + _UpdatePositions(hObj, pObj); + break; + case WM_DELETE: + GUI_ARRAY_Delete(&pObj->Handles); + /* No break here ... WM_DefaultProc needs to be called */ + default: + /* Let widget handle the standard messages */ + if (Handled) { + WM_DefaultProc(pMsg); + } + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* _ClientCallback +*/ +static void _ClientCallback(WM_MESSAGE* pMsg) { + WM_HWIN hObj = pMsg->hWin; + WM_HWIN hParent = WM_GetParent(hObj); + MULTIPAGE_Obj* pParent; + WM_LOCK(); + pParent = MULTIPAGE_H2P(hParent); + switch (pMsg->MsgId) { + case WM_PAINT: + LCD_SetBkColor(pParent->aBkColor[1]); + GUI_Clear(); + break; + case WM_TOUCH: + WM_SetFocus(hParent); + WM_BringToTop(hParent); + break; + case WM_GET_CLIENT_WINDOW: + pMsg->Data.v = (int)hObj; + break; + case WM_GET_INSIDE_RECT: + WM_DefaultProc(pMsg); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* MULTIPAGE_CreateEx +*/ +MULTIPAGE_Handle MULTIPAGE_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + MULTIPAGE_Handle hObj; + GUI_USE_PARA(ExFlags); + /* Create the window */ + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags | WM_CF_HASTRANS, &_Callback, + sizeof(MULTIPAGE_Obj) - sizeof(WM_Obj)); + if (hObj) { + MULTIPAGE_Obj* pObj; + GUI_RECT rClient; + int Flags; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->Handles); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE); + /* init member variables */ + MULTIPAGE_INIT_ID(pObj); + pObj->aBkColor[0] = MULTIPAGE__DefaultBkColor[0]; + pObj->aBkColor[1] = MULTIPAGE__DefaultBkColor[1]; + pObj->aTextColor[0] = MULTIPAGE__DefaultTextColor[0]; + pObj->aTextColor[1] = MULTIPAGE__DefaultTextColor[1]; + pObj->Font = MULTIPAGE__pDefaultFont; + pObj->Align = MULTIPAGE__DefaultAlign; + pObj->Selection = 0xffff; + pObj->ScrollState = 0; + pObj->Widget.State = 0; + _CalcClientRect(pObj, &rClient); + Flags = WM_CF_SHOW | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_TOP | WM_CF_ANCHOR_BOTTOM; + pObj->hClient = WM_CreateWindowAsChild(rClient.x0, rClient.y0, + rClient.x1 - rClient.x0 + 1, + rClient.y1 - rClient.y0 + 1, + hObj, Flags, &_ClientCallback, 0); + _UpdatePositions(hObj, pObj); + WM_UNLOCK(); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "MULTIPAGE_Create failed") + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Page management +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIPAGE_AddPage +*/ +void MULTIPAGE_AddPage(MULTIPAGE_Handle hObj, WM_HWIN hWin ,const char* pText) { + MULTIPAGE_Obj* pObj; + GUI_USE_PARA(hWin); + if (hObj) { + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (!hWin) { + /* If we get no handle we must find it. To do this, we search */ + /* all children until we found one that has not yet become a page. */ + MULTIPAGE_PAGE* pPage; + WM_HWIN hChild; + WM_Obj* pChild; + WM_Obj* pClient = WM_H2P(pObj->hClient); + int i; + for (hChild = pClient->hFirstChild; hChild && !hWin; hChild = pChild->hNext) { + pChild = WM_H2P(hChild); + hWin = hChild; + for (i = 0; i < pObj->Handles.NumItems; i++) { + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, i); + if (pPage->hWin == hChild) { + hWin = 0; + break; + } + } + } + } else { + /* If we get a handle we must ensure that it was attached to the multipage */ + WM_AttachWindowAt(hWin, pObj->hClient, 0, 0); + } + if (hWin) { + MULTIPAGE_PAGE Page; + char NullByte = 0; + if (!pText) { + pText = &NullByte; + } + Page.hWin = hWin; + Page.Status = MULTIPAGE_STATE_ENABLED; + if (GUI_ARRAY_AddItem(&pObj->Handles, &Page, sizeof(MULTIPAGE_PAGE) + strlen(pText)) == 0) { + MULTIPAGE_PAGE* pPage; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, pObj->Handles.NumItems - 1); + memcpy(&pPage->acText, pText, strlen(pText) + 1); + } + MULTIPAGE_SelectPage(hObj, pObj->Handles.NumItems - 1); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_DeletePage +*/ +void MULTIPAGE_DeletePage(MULTIPAGE_Handle hObj, unsigned Index, int Delete) { + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + if ((int)Index < pObj->Handles.NumItems) { + WM_HWIN hWin; + MULTIPAGE_PAGE* pPage; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + hWin = pPage->hWin; + /* Remove the page from the multipage object */ + if (Index == pObj->Selection) { + if (Index == ((unsigned)pObj->Handles.NumItems - 1)) { + _ShowPage(pObj, Index - 1); + pObj->Selection--; + } else { + _ShowPage(pObj, Index + 1); + } + } else { + if (Index < pObj->Selection) { + pObj->Selection--; + } + } + GUI_ARRAY_DeleteItem(&pObj->Handles, Index); + _UpdatePositions(hObj, pObj); + /* Delete the window of the page */ + if (Delete) { + WM_DeleteWindow(hWin); + } + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_SelectPage +*/ +void MULTIPAGE_SelectPage(MULTIPAGE_Handle hObj, unsigned Index) { + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + if ((int)Index < pObj->Handles.NumItems) { + if (Index != pObj->Selection && _GetEnable(pObj, Index)) { + _ShowPage(pObj, Index); + pObj->Selection = Index; + _UpdatePositions(hObj, pObj); + } + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_DisablePage +*/ +void MULTIPAGE_DisablePage(MULTIPAGE_Handle hObj, unsigned Index) { + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + _SetEnable(pObj, Index, 0); + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_EnablePage +*/ +void MULTIPAGE_EnablePage(MULTIPAGE_Handle hObj, unsigned Index) { + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + _SetEnable(pObj, Index, 1); + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIPAGE_SetText +*/ +void MULTIPAGE_SetText(MULTIPAGE_Handle hObj, const char* pText, unsigned Index) { + MULTIPAGE_Obj* pObj; + if (hObj && pText) { + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + if ((int)Index < pObj->Handles.NumItems) { + MULTIPAGE_PAGE* pPage; + MULTIPAGE_PAGE Page; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + Page.hWin = pPage->hWin; + Page.Status = pPage->Status; + if (GUI_ARRAY_SetItem(&pObj->Handles, Index, &Page, sizeof(MULTIPAGE_PAGE) + strlen(pText))) { + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + memcpy(&pPage->acText, pText, strlen(pText) + 1); + _UpdatePositions(hObj, pObj); + } + } + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_SetBkColor +*/ +void MULTIPAGE_SetBkColor(MULTIPAGE_Handle hObj, GUI_COLOR Color, unsigned Index) { + MULTIPAGE_Obj* pObj; + if (hObj && ((int)Index < MULTIPAGE_NUMCOLORS)) { + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + pObj->aBkColor[Index] = Color; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_SetTextColor +*/ +void MULTIPAGE_SetTextColor(MULTIPAGE_Handle hObj, GUI_COLOR Color, unsigned Index) { + MULTIPAGE_Obj* pObj; + if (hObj && ((int)Index < MULTIPAGE_NUMCOLORS)) { + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + pObj->aTextColor[Index] = Color; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_SetFont +*/ +void MULTIPAGE_SetFont(MULTIPAGE_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + MULTIPAGE_Obj* pObj; + if (hObj && pFont) { + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + pObj->Font = pFont; + _UpdatePositions(hObj, pObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_SetAlign +*/ +void MULTIPAGE_SetAlign(MULTIPAGE_Handle hObj, unsigned Align) { + MULTIPAGE_Obj* pObj; + GUI_RECT rClient; + if (hObj) { + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + pObj->Align = Align; + _CalcClientRect(pObj, &rClient); + WM_MoveTo(pObj->hClient, rClient.x0 + pObj->Widget.Win.Rect.x0, + rClient.y0 + pObj->Widget.Win.Rect.y0); + _UpdatePositions(hObj, pObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* MULTIPAGE_GetSelection +*/ +int MULTIPAGE_GetSelection(MULTIPAGE_Handle hObj) { + int r = 0; + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + r = pObj->Selection; + } + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* MULTIPAGE_GetWindow +*/ +WM_HWIN MULTIPAGE_GetWindow(MULTIPAGE_Handle hObj, unsigned Index) { + WM_HWIN r = 0; + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + if ((int)Index < pObj->Handles.NumItems) { + MULTIPAGE_PAGE* pPage; + pPage = (MULTIPAGE_PAGE*) GUI_ARRAY_GetpItem(&pObj->Handles, Index); + r = pPage->hWin; + } + } + WM_UNLOCK(); + } + return r; +} + +/********************************************************************* +* +* MULTIPAGE_IsPageEnabled +*/ +int MULTIPAGE_IsPageEnabled(MULTIPAGE_Handle hObj, unsigned Index) { + int r = 0; + if (hObj) { + MULTIPAGE_Obj* pObj; + WM_LOCK(); + pObj = MULTIPAGE_H2P(hObj); + MULTIPAGE_ASSERT_IS_VALID_PTR(pObj); + if (pObj) { + r = _GetEnable(pObj, Index); + } + WM_UNLOCK(); + } + return r; +} + +#else /* avoid empty object files */ + +void MULTIPAGE_C(void); +void MULTIPAGE_C(void){} + +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/MULTIPAGE.h b/User/system/lib/lcd/gui/Widget/MULTIPAGE.h new file mode 100644 index 0000000..405da32 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIPAGE.h @@ -0,0 +1,113 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIPAGE.h +Purpose : MULTIPAGE include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef MULTIPAGE_H +#define MULTIPAGE_H + +#include "WM.h" +#include "DIALOG.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ +/********************************************************************* +* +* Create / Status flags +*/ + +#define MULTIPAGE_ALIGN_LEFT (0<<0) +#define MULTIPAGE_ALIGN_RIGHT (1<<0) +#define MULTIPAGE_ALIGN_TOP (0<<2) +#define MULTIPAGE_ALIGN_BOTTOM (1<<2) + +/********************************************************************* +* +* Public Types +* +********************************************************************** +*/ + +typedef WM_HMEM MULTIPAGE_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +MULTIPAGE_Handle MULTIPAGE_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int SpecialFlags); +MULTIPAGE_Handle MULTIPAGE_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +MULTIPAGE_Handle MULTIPAGE_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +/* Methods changing properties */ +void MULTIPAGE_AddPage (MULTIPAGE_Handle hObj, WM_HWIN hWin ,const char* pText); +void MULTIPAGE_DeletePage (MULTIPAGE_Handle hObj, unsigned Index, int Delete); +void MULTIPAGE_SelectPage (MULTIPAGE_Handle hObj, unsigned Index); +void MULTIPAGE_EnablePage (MULTIPAGE_Handle hObj, unsigned Index); +void MULTIPAGE_DisablePage (MULTIPAGE_Handle hObj, unsigned Index); +void MULTIPAGE_SetText (MULTIPAGE_Handle hObj, const char* pText, unsigned Index); +void MULTIPAGE_SetBkColor (MULTIPAGE_Handle hObj, GUI_COLOR Color, unsigned Index); +void MULTIPAGE_SetTextColor (MULTIPAGE_Handle hObj, GUI_COLOR Color, unsigned Index); +void MULTIPAGE_SetFont (MULTIPAGE_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont); +void MULTIPAGE_SetAlign (MULTIPAGE_Handle hObj, unsigned Align); +int MULTIPAGE_GetSelection (MULTIPAGE_Handle hObj); +WM_HWIN MULTIPAGE_GetWindow (MULTIPAGE_Handle hObj, unsigned Index); +int MULTIPAGE_IsPageEnabled (MULTIPAGE_Handle hObj, unsigned Index); + +/********************************************************************* +* +* Get/Set defaults +* +********************************************************************** +*/ + +unsigned MULTIPAGE_GetDefaultAlign(void); +GUI_COLOR MULTIPAGE_GetDefaultBkColor(unsigned Index); +const GUI_FONT GUI_UNI_PTR * MULTIPAGE_GetDefaultFont(void); +GUI_COLOR MULTIPAGE_GetDefaultTextColor(unsigned Index); + +void MULTIPAGE_SetDefaultAlign(unsigned Align); +void MULTIPAGE_SetDefaultBkColor(GUI_COLOR Color, unsigned Index); +void MULTIPAGE_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont); +void MULTIPAGE_SetDefaultTextColor(GUI_COLOR Color, unsigned Index); + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* MULTIPAGE_H */ diff --git a/User/system/lib/lcd/gui/Widget/MULTIPAGE_Create.c b/User/system/lib/lcd/gui/Widget/MULTIPAGE_Create.c new file mode 100644 index 0000000..ac7a4dd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIPAGE_Create.c @@ -0,0 +1,42 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIPAGE_Create.c +Purpose : Implementation of multipage widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MULTIPAGE.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIPAGE_Create +*/ +MULTIPAGE_Handle MULTIPAGE_Create(int x0, int y0, int xsize, int ysize, + WM_HWIN hParent, int Id, int Flags, int ExFlags) +{ + return MULTIPAGE_CreateEx(x0, y0, xsize, ysize, hParent, Flags, ExFlags, Id); +} + +#else /* avoid empty object files */ + void MULTIPAGE_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/MULTIPAGE_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/MULTIPAGE_CreateIndirect.c new file mode 100644 index 0000000..18b7486 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIPAGE_CreateIndirect.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIPAGE_CreateIndirect.c +Purpose : Implementation of multipage widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MULTIPAGE.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIPAGE_CreateIndirect +*/ +MULTIPAGE_Handle MULTIPAGE_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, + WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + MULTIPAGE_Handle hThis; + GUI_USE_PARA(cb); + hThis = MULTIPAGE_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else /* avoid empty object files */ + void MULTIPAGE_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/MULTIPAGE_Default.c b/User/system/lib/lcd/gui/Widget/MULTIPAGE_Default.c new file mode 100644 index 0000000..1843c5a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIPAGE_Default.c @@ -0,0 +1,109 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIPAGE_Default.c +Purpose : Implementation of MULTIPAGE widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "MULTIPAGE_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* MULTIPAGE_GetDefaultAlign +*/ +unsigned MULTIPAGE_GetDefaultAlign(void) { + return MULTIPAGE__DefaultAlign; +} + +/********************************************************************* +* +* MULTIPAGE_GetDefaultBkColor +*/ +GUI_COLOR MULTIPAGE_GetDefaultBkColor(unsigned Index) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (Index < GUI_COUNTOF(MULTIPAGE__DefaultBkColor)) { + Color = MULTIPAGE__DefaultBkColor[Index]; + } + return Color; +} + +/********************************************************************* +* +* MULTIPAGE_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * MULTIPAGE_GetDefaultFont(void) { + return MULTIPAGE__pDefaultFont; +} + +/********************************************************************* +* +* MULTIPAGE_GetDefaultTextColor +*/ +GUI_COLOR MULTIPAGE_GetDefaultTextColor(unsigned Index) { + GUI_COLOR Color = GUI_INVALID_COLOR; + if (Index < GUI_COUNTOF(MULTIPAGE__DefaultTextColor)) { + Color = MULTIPAGE__DefaultTextColor[Index]; + } + return Color; +} + +/********************************************************************* +* +* MULTIPAGE_SetDefaultAlign +*/ +void MULTIPAGE_SetDefaultAlign(unsigned Align) { + MULTIPAGE__DefaultAlign = Align; +} + +/********************************************************************* +* +* MULTIPAGE_SetDefaultBkColor +*/ +void MULTIPAGE_SetDefaultBkColor(GUI_COLOR Color, unsigned Index) { + if (Index < GUI_COUNTOF(MULTIPAGE__DefaultBkColor)) { + MULTIPAGE__DefaultBkColor[Index] = Color; + } +} + +/********************************************************************* +* +* MULTIPAGE_SetDefaultFont +*/ +void MULTIPAGE_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + MULTIPAGE__pDefaultFont = pFont; +} + +/********************************************************************* +* +* MULTIPAGE_SetDefaultTextColor +*/ +void MULTIPAGE_SetDefaultTextColor(GUI_COLOR Color, unsigned Index) { + if (Index < GUI_COUNTOF(MULTIPAGE__DefaultTextColor)) { + MULTIPAGE__DefaultTextColor[Index] = Color; + } +} + +#else + void MULTIPAGE_Default_C(void); + void MULTIPAGE_Default_C(void) {} /* avoid empty object files */ +#endif diff --git a/User/system/lib/lcd/gui/Widget/MULTIPAGE_Private.h b/User/system/lib/lcd/gui/Widget/MULTIPAGE_Private.h new file mode 100644 index 0000000..889fbb3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/MULTIPAGE_Private.h @@ -0,0 +1,61 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : MULTIPAGE_Private.h +Purpose : Private MULTIPAGE include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef MULTIPAGE_PRIVATE_H + +#include "GUIDebug.h" +#include "MULTIPAGE.h" + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define MULTIPAGE_STATE_ENABLED (1<<0) +#define MULTIPAGE_STATE_SCROLLMODE WIDGET_STATE_USER0 + +#define MULTIPAGE_ID 0x4544 /* Magic number, should be unique if possible */ + +#define MULTIPAGE_H2P(h) (MULTIPAGE_Obj*) WM_H2P(h) + +#if GUI_DEBUG_LEVEL > 1 + #define MULTIPAGE_ASSERT_IS_VALID_PTR(p) GUI_DEBUG_ERROROUT_IF(p->DebugId != MULTIPAGE_ID, "MULTIPAGE.c: Wrong handle type or Object not init'ed") + #define MULTIPAGE_INIT_ID(p) p->DebugId = MULTIPAGE_ID + #define MULTIPAGE_DEINIT_ID(p) p->DebugId = MULTIPAGE_ID+1 +#else + #define MULTIPAGE_ASSERT_IS_VALID_PTR(p) + #define MULTIPAGE_INIT_ID(p) + #define MULTIPAGE_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Externals +* +********************************************************************** +*/ + +extern const GUI_FONT GUI_UNI_PTR * MULTIPAGE__pDefaultFont; +extern unsigned MULTIPAGE__DefaultAlign; +extern GUI_COLOR MULTIPAGE__DefaultBkColor[2]; +extern GUI_COLOR MULTIPAGE__DefaultTextColor[2]; + +#endif /* MULTIPAGE_PRIVATE_H */ diff --git a/User/system/lib/lcd/gui/Widget/PROGBAR.c b/User/system/lib/lcd/gui/Widget/PROGBAR.c new file mode 100644 index 0000000..5205bd6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/PROGBAR.c @@ -0,0 +1,488 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : ProgBar.c +Purpose : Implementation of progress bar +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "PROGBAR.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +#ifndef PROGBAR_DEFAULT_FONT + #define PROGBAR_DEFAULT_FONT GUI_DEFAULT_FONT +#endif + +#ifndef PROGBAR_DEFAULT_BARCOLOR0 + #define PROGBAR_DEFAULT_BARCOLOR0 0x555555 +#endif + +#ifndef PROGBAR_DEFAULT_BARCOLOR1 + #define PROGBAR_DEFAULT_BARCOLOR1 0xAAAAAA +#endif + +#ifndef PROGBAR_DEFAULT_TEXTCOLOR0 + #define PROGBAR_DEFAULT_TEXTCOLOR0 0xFFFFFF +#endif + +#ifndef PROGBAR_DEFAULT_TEXTCOLOR1 + #define PROGBAR_DEFAULT_TEXTCOLOR1 0x000000 +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + WIDGET Widget; + int v; + const GUI_FONT GUI_UNI_PTR * pFont; + GUI_COLOR BarColor[2]; + GUI_COLOR TextColor[2]; + WM_HMEM hpText; + I16 XOff, YOff; + I16 TextAlign; + int Min, Max; +/* I16 Options; */ + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + int DebugId; + #endif +} PROGBAR_Obj; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define Invalidate(h) WM_InvalidateWindow(h) + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + #define OBJECT_ID 0x4569 /* Magic nubmer, should be unique if possible */ + #define INIT_ID(p) p->DebugId = OBJECT_ID + #define DEINIT_ID(p) p->DebugId = OBJECT_ID+1 +#else + #define INIT_ID(p) + #define DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + PROGBAR_Obj* PROGBAR_h2p(PROGBAR_Handle h) { + PROGBAR_Obj* p = (PROGBAR_Obj*)GUI_ALLOC_h2p(h); + if (p) { + if (p->DebugId != OBJECT_ID) { + GUI_DEBUG_ERROROUT("PROGBAR.C: Wrong handle type or Object not init'ed"); + return 0; + } + } + return p; + } + #define PROGBAR_H2P(h) PROGBAR_h2p(h) +#else + #define PROGBAR_H2P(h) (PROGBAR_Obj*) GUI_ALLOC_h2p(h) +#endif + +/********************************************************************* +* +* _FreeText +*/ +static void _FreeText(PROGBAR_Handle hObj) { + PROGBAR_Obj* pObj = PROGBAR_H2P(hObj); + GUI_ALLOC_FreePtr(&pObj->hpText); +} + +/********************************************************************* +* +* _Value2X +*/ +static int _Value2X(const PROGBAR_Obj* pObj, int v) { + int EffectSize = pObj->Widget.pEffect->EffectSize; + int xSize = pObj->Widget.Win.Rect.x1 - pObj->Widget.Win.Rect.x0 + 1; + int Min = pObj->Min; + int Max = pObj->Max; + if (v < Min) { + v = Min; + } + if (v > Max) { + v = Max; + } + return EffectSize + ((xSize - 2 * EffectSize) * (I32)(v - Min)) / (Max - Min); +} + +/********************************************************************* +* +* _DrawPart +*/ +static void _DrawPart(const PROGBAR_Obj* pObj, int Index, + int xText, int yText, const char* pText) { + LCD_SetBkColor(pObj->BarColor[Index]); + LCD_SetColor(pObj->TextColor[Index]); + GUI_Clear(); + GUI_GotoXY(xText, yText); + GUI_DispString(pText); +} + +/********************************************************************* +* +* _GetText +*/ +static const char* _GetText(const PROGBAR_Obj* pObj, char* pBuffer) { + char* pText; + if (pObj->hpText) { + pText = (char*) GUI_ALLOC_h2p(pObj->hpText); + } else { + pText = pBuffer; + GUI_AddDecMin((100 * (I32)(pObj->v - pObj->Min)) / (pObj->Max - pObj->Min), &pBuffer); + *pBuffer++ = '%'; + *pBuffer = 0; + } + return (const char*)pText; +} + +/********************************************************************* +* +* _GetTextRect +*/ +static void _GetTextRect(const PROGBAR_Obj* pObj, GUI_RECT* pRect, const char* pText) { + int xSize = pObj->Widget.Win.Rect.x1 - pObj->Widget.Win.Rect.x0 + 1; + int ySize = pObj->Widget.Win.Rect.y1 - pObj->Widget.Win.Rect.y0 + 1; + int TextWidth = GUI_GetStringDistX(pText); + int TextHeight = GUI_GetFontSizeY(); + int EffectSize = pObj->Widget.pEffect->EffectSize; + switch (pObj->TextAlign & GUI_TA_HORIZONTAL) { + case GUI_TA_CENTER: + pRect->x0 = (xSize - TextWidth) / 2; + break; + case GUI_TA_RIGHT: + pRect->x0 = xSize - TextWidth - 1 - EffectSize; + break; + default: + pRect->x0 = EffectSize; + } + pRect->y0 = (ySize - TextHeight) / 2; + pRect->x0 += pObj->XOff; + pRect->y0 += pObj->YOff; + pRect->x1 = pRect->x0 + TextWidth - 1; + pRect->y1 = pRect->y0 + TextHeight - 1; +} + +/********************************************************************* +* +* _Paint +*/ +static void _Paint(PROGBAR_Handle hObj) { + PROGBAR_Obj* pObj; + GUI_RECT r, rInside, rClient, rText; + const char* pText; + char ac[5]; + int tm, xPos; + pObj = PROGBAR_H2P(hObj); + WM_GetClientRect(&rClient); + GUI__ReduceRect(&rInside, &rClient, pObj->Widget.pEffect->EffectSize); + xPos = _Value2X(pObj, pObj->v); + pText = _GetText(pObj, ac); + GUI_SetFont(pObj->pFont); + _GetTextRect(pObj, &rText, pText); + tm = GUI_SetTextMode(GUI_TM_TRANS); + /* Draw left bar */ + r = rInside; + r.x1 = xPos - 1; + WM_SetUserClipArea(&r); + _DrawPart(pObj, 0, rText.x0, rText.y0, pText); + /* Draw right bar */ + r = rInside; + r.x0 = xPos; + WM_SetUserClipArea(&r); + _DrawPart(pObj, 1, rText.x0, rText.y0, pText); + WM_SetUserClipArea(NULL); + GUI_SetTextMode(tm); + WIDGET__EFFECT_DrawDownRect(&pObj->Widget, &rClient); +} + +/********************************************************************* +* +* _Delete +*/ +static void _Delete(PROGBAR_Handle hObj) { + _FreeText(hObj); + DEINIT_ID(PROGBAR_H2P(hObj)); +} + +/********************************************************************* +* +* _Callback +*/ +static void _PROGBAR_Callback(WM_MESSAGE*pMsg) { + PROGBAR_Handle hObj = (PROGBAR_Handle)pMsg->hWin; + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_PAINT: + _Paint(hObj); + return; + case WM_DELETE: + _Delete(hObj); + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ +/********************************************************************* +* +* PROGBAR_CreateEx +*/ +PROGBAR_Handle PROGBAR_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + PROGBAR_Handle hObj; + GUI_USE_PARA(ExFlags); + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _PROGBAR_Callback, + sizeof(PROGBAR_Obj) - sizeof(WM_Obj)); + if (hObj) { + PROGBAR_Obj* pObj; + WM_LOCK(); + pObj = (PROGBAR_Obj*) GUI_ALLOC_h2p(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, 0); + WIDGET_SetEffect(hObj, &WIDGET_Effect_None); /* Standard effect for progbar: None */ + INIT_ID(pObj); + /* init member variables */ + pObj->pFont = GUI_DEFAULT_FONT; + pObj->BarColor[0] = PROGBAR_DEFAULT_BARCOLOR0; + pObj->BarColor[1] = PROGBAR_DEFAULT_BARCOLOR1; + pObj->TextColor[0] = PROGBAR_DEFAULT_TEXTCOLOR0; + pObj->TextColor[1] = PROGBAR_DEFAULT_TEXTCOLOR1; + pObj->TextAlign = GUI_TA_CENTER; + pObj->Max = 100; + pObj->Min = 0; + WM_UNLOCK(); + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* PROGBAR_SetValue +*/ +void PROGBAR_SetValue(PROGBAR_Handle hObj, int v) { + if (hObj) { + PROGBAR_Obj* pObj; + WM_LOCK(); + pObj= PROGBAR_H2P(hObj); + /* Put v into legal range */ + if (v < pObj->Min) { + v = pObj->Min; + } + if (v > pObj->Max) { + v = pObj->Max; + } + if (pObj->v != v) { + GUI_RECT r; + /* Get x values */ + if (v < pObj->v) { + r.x0 = _Value2X(pObj, v); + r.x1 = _Value2X(pObj, pObj->v); + } else { + r.x0 = _Value2X(pObj, pObj->v); + r.x1 = _Value2X(pObj, v); + } + r.y0 = 0; + r.y1 = 4095; + if (pObj->hpText == 0) { + const GUI_FONT GUI_UNI_PTR * pOldFont; + char acBuffer[5]; + GUI_RECT rText; + pOldFont = GUI_SetFont(pObj->pFont); + _GetTextRect(pObj, &rText, _GetText(pObj, acBuffer)); + GUI_MergeRect(&r, &r, &rText); + pObj->v = v; + _GetTextRect(pObj, &rText, _GetText(pObj, acBuffer)); + GUI_MergeRect(&r, &r, &rText); + GUI_SetFont(pOldFont); + } else { + pObj->v = v; + } + WM_InvalidateRect(hObj, &r); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetFont +*/ +void PROGBAR_SetFont(PROGBAR_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont) { + PROGBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + pObj->pFont = pfont; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetBarColor +*/ +void PROGBAR_SetBarColor(PROGBAR_Handle hObj, unsigned int Index, GUI_COLOR color) { + PROGBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + if (Index < GUI_COUNTOF(pObj->BarColor)) { + pObj->BarColor[Index] = color; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetTextColor +*/ +void PROGBAR_SetTextColor(PROGBAR_Handle hObj, unsigned int Index, GUI_COLOR color) { + PROGBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + if (Index < GUI_COUNTOF(pObj->TextColor)) { + pObj->TextColor[Index] = color; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetText +*/ +void PROGBAR_SetText(PROGBAR_Handle hObj, const char* s) { + if (hObj) { + PROGBAR_Obj* pObj; + const GUI_FONT GUI_UNI_PTR * pOldFont; + GUI_RECT r1; + char acBuffer[5]; + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + pOldFont = GUI_SetFont(pObj->pFont); + _GetTextRect(pObj, &r1, _GetText(pObj, acBuffer)); + if (GUI__SetText(&pObj->hpText, s)) { + GUI_RECT r2; + _GetTextRect(pObj, &r2, _GetText(pObj, acBuffer)); + GUI_MergeRect(&r1, &r1, &r2); + WM_InvalidateRect(hObj, &r1); + } + GUI_SetFont(pOldFont); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetTextAlign +*/ +void PROGBAR_SetTextAlign(PROGBAR_Handle hObj, int Align) { + PROGBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + pObj->TextAlign = Align; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetTextPos +*/ +void PROGBAR_SetTextPos(PROGBAR_Handle hObj, int XOff, int YOff) { + PROGBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + pObj->XOff = XOff; + pObj->YOff = YOff; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* PROGBAR_SetMinMax +*/ +void PROGBAR_SetMinMax(PROGBAR_Handle hObj, int Min, int Max) { + PROGBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = PROGBAR_H2P(hObj); + if (Max > Min) { + if ((Max != pObj->Max) || (Min != pObj->Min)) { + pObj->Min = Min; + pObj->Max = Max; + WM_InvalidateWindow(hObj); + } + } + WM_UNLOCK(); + } +} + +#else + +void WIDGET_Progbar(void) {} /* avoid empty object files */ + +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/PROGBAR.h b/User/system/lib/lcd/gui/Widget/PROGBAR.h new file mode 100644 index 0000000..220bfc9 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/PROGBAR.h @@ -0,0 +1,82 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : PROGBAR.h +Purpose : Progressbar include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef PROGBAR_H /* Avoid multiple inclusion */ +#define PROGBAR_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +typedef WM_HMEM PROGBAR_Handle; + + +/************************************************************ +* +* Create +* +************************************************************* +*/ + +PROGBAR_Handle PROGBAR_Create (int x0, int y0, int xsize, int ysize, int Flags); +PROGBAR_Handle PROGBAR_CreateAsChild (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags); +PROGBAR_Handle PROGBAR_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +PROGBAR_Handle PROGBAR_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/************************************************************ +* +* Standard member functions +* +************************************************************* +*/ + +#define PROGBAR_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define PROGBAR_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define PROGBAR_Delete(hObj) WM_DeleteWindow(hObj) +#define PROGBAR_Paint(hObj) WM_Paint(hObj) + + +/************************************************************ +* +* Individual member functions +* +************************************************************* +*/ + +void PROGBAR_SetBarColor (PROGBAR_Handle hObj, unsigned int index, GUI_COLOR color); +void PROGBAR_SetFont (PROGBAR_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont); +void PROGBAR_SetMinMax (PROGBAR_Handle hObj, int Min, int Max); +void PROGBAR_SetText (PROGBAR_Handle hObj, const char* s); +void PROGBAR_SetTextAlign(PROGBAR_Handle hObj, int Align); +void PROGBAR_SetTextColor(PROGBAR_Handle hObj, unsigned int index, GUI_COLOR color); +void PROGBAR_SetTextPos (PROGBAR_Handle hObj, int XOff, int YOff); +void PROGBAR_SetValue (PROGBAR_Handle hObj, int v); + +#if defined(__cplusplus) + } +#endif + +#endif /* GUI_WINSUPPORT */ +#endif /* PROGBAR_H */ diff --git a/User/system/lib/lcd/gui/Widget/PROGBAR_Create.c b/User/system/lib/lcd/gui/Widget/PROGBAR_Create.c new file mode 100644 index 0000000..a28a328 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/PROGBAR_Create.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : PROGBAR_Create.c +Purpose : Implementation of progbar widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "PROGBAR.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* PROGBAR_Create +*/ +PROGBAR_Handle PROGBAR_Create(int x0, int y0, int xsize, int ysize, int Flags) { + return PROGBAR_CreateEx(x0, y0, xsize, ysize, 0, Flags, 0, 0); +} + +/********************************************************************* +* +* PROGBAR_CreateAsChild +*/ +PROGBAR_Handle PROGBAR_CreateAsChild(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags) { + return PROGBAR_CreateEx(x0, y0, xsize, ysize, hParent, Flags, 0, Id); +} + +#else /* avoid empty object files */ + void PROGBAR_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/PROGBAR_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/PROGBAR_CreateIndirect.c new file mode 100644 index 0000000..0a4b2db --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/PROGBAR_CreateIndirect.c @@ -0,0 +1,45 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : PROGBAR_CreateIndirect.c +Purpose : Implementation of progbar widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "PROGBAR.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* PROGBAR_CreateIndirect +*/ +PROGBAR_Handle PROGBAR_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + PROGBAR_Handle hThis; + GUI_USE_PARA(cb); + hThis = PROGBAR_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else /* avoid empty object files */ + void PROGBAR_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/RADIO.c b/User/system/lib/lcd/gui/Widget/RADIO.c new file mode 100644 index 0000000..c41ac3a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO.c @@ -0,0 +1,470 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO.c +Purpose : Implementation of radio button widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "GUI_Protected.h" +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default image inactiv */ +#ifndef RADIO_IMAGE0_DEFAULT + #define RADIO_IMAGE0_DEFAULT &RADIO__abmRadio[0] +#endif + +/* Define default image activ */ +#ifndef RADIO_IMAGE1_DEFAULT + #define RADIO_IMAGE1_DEFAULT &RADIO__abmRadio[1] +#endif + +/* Define default image check */ +#ifndef RADIO_IMAGE_CHECK_DEFAULT + #define RADIO_IMAGE_CHECK_DEFAULT &RADIO__bmCheck +#endif + +/* Define default font */ +#ifndef RADIO_FONT_DEFAULT + #define RADIO_FONT_DEFAULT &GUI_Font13_1 +#endif + +/* Define default text color */ +#ifndef RADIO_DEFAULT_TEXT_COLOR + #define RADIO_DEFAULT_TEXT_COLOR GUI_BLACK +#endif + +/* Define default background color */ +#ifndef RADIO_DEFAULT_BKCOLOR + #define RADIO_DEFAULT_BKCOLOR 0xC0C0C0 +#endif + +#define RADIO_BORDER 2 + +/********************************************************************* +* +* Public data, modul internal +* +********************************************************************** +*/ + +tRADIO_SetValue* RADIO__pfHandleSetValue; + +GUI_COLOR RADIO__DefaultTextColor = RADIO_DEFAULT_TEXT_COLOR; +const GUI_FONT GUI_UNI_PTR* RADIO__pDefaultFont = RADIO_FONT_DEFAULT; +const GUI_BITMAP* RADIO__apDefaultImage[] = {RADIO_IMAGE0_DEFAULT, RADIO_IMAGE1_DEFAULT}; +const GUI_BITMAP* RADIO__pDefaultImageCheck = RADIO_IMAGE_CHECK_DEFAULT; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define RADIO_ID 0x4544 /* Magic numer, should be unique if possible */ + +#if GUI_DEBUG_LEVEL > 1 + #define RADIO_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != RADIO_ID, "xxx.c: Wrong handle type or Object not init'ed") + #define RADIO_INIT_ID(p) p->DebugId = RADIO_ID + #define RADIO_DEINIT_ID(p) p->DebugId = RADIO_ID+1 +#else + #define RADIO_ASSERT_IS_VALID_PTR(p) + #define RADIO_INIT_ID(p) + #define RADIO_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _ResizeRect +*/ +static void _ResizeRect(GUI_RECT* pDest, const GUI_RECT* pSrc, int Diff) { + pDest->y0 = pSrc->y0 - Diff; + pDest->y1 = pSrc->y1 + Diff; + pDest->x0 = pSrc->x0 - Diff; + pDest->x1 = pSrc->x1 + Diff; +} + +/********************************************************************* +* +* _OnPaint +* +* Purpose: +* Paints the RADIO button. +* The button can actually consist of multiple buttons (NumItems). +* The focus rectangle will be drawn on top of the text if any text is set, +* otherwise around the entire buttons. +*/ +static void _OnPaint(RADIO_Handle hObj, RADIO_Obj* pObj) { + const GUI_BITMAP* pBmRadio; + const GUI_BITMAP* pBmCheck; + const char* pText; + GUI_FONTINFO FontInfo; + GUI_RECT Rect, r, rFocus = {0}; + int i, y, HasFocus, FontDistY; + U8 SpaceAbove, CHeight, FocusBorder; + + /* Init some data */ + WIDGET__GetClientRect(&pObj->Widget, &rFocus); + HasFocus = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 1 : 0; + pBmRadio = pObj->apBmRadio[WM__IsEnabled(hObj)]; + pBmCheck = pObj->pBmCheck; + rFocus.x1 = pBmRadio->XSize + RADIO_BORDER * 2 - 1; + rFocus.y1 = pObj->Height + ((pObj->NumItems - 1) * pObj->Spacing) - 1; + + /* Select font and text color */ + LCD_SetColor(pObj->TextColor); + GUI_SetFont(pObj->pFont); + GUI_SetTextMode(GUI_TM_TRANS); + + /* Get font infos */ + GUI_GetFontInfo(pObj->pFont, &FontInfo); + FontDistY = GUI_GetFontDistY(); + CHeight = FontInfo.CHeight; + SpaceAbove = FontInfo.Baseline - CHeight; + Rect.x0 = pBmRadio->XSize + RADIO_BORDER * 2 + 2; + Rect.y0 = (CHeight <= pObj->Height) ? ((pObj->Height - CHeight) / 2) : 0; + Rect.y1 = Rect.y0 + CHeight - 1; + FocusBorder = (FontDistY <= 12) ? 2 : 3; + if (Rect.y0 < FocusBorder) { + FocusBorder = Rect.y0; + } + + /* Clear inside ... Just in case */ + /* Fill with parents background color */ +#if WM_SUPPORT_TRANSPARENCY + if (!WM_GetHasTrans(hObj)) +#endif + { + if (pObj->BkColor != GUI_INVALID_COLOR) { + LCD_SetBkColor(pObj->BkColor); + } else { + LCD_SetBkColor(RADIO_DEFAULT_BKCOLOR); + } + GUI_Clear(); + } + + /* Iterate over all items */ + for (i = 0; i < pObj->NumItems; i++) { + y = i * pObj->Spacing; + /* Draw the radio button bitmap */ + GUI_DrawBitmap(pBmRadio, RADIO_BORDER, RADIO_BORDER + y); + /* Draw the check bitmap */ + if (pObj->Sel == i) { + GUI_DrawBitmap(pBmCheck, RADIO_BORDER + (pBmRadio->XSize - pBmCheck->XSize) / 2, + RADIO_BORDER + ((pBmRadio->YSize - pBmCheck->YSize) / 2) + y); + } + /* Draw text if available */ + pText = (const char*)GUI_ARRAY_GetpItem(&pObj->TextArray, i); + if (pText) { + if (*pText) { + r = Rect; + r.x1 = r.x0 + GUI_GetStringDistX(pText) - 2; + GUI_MoveRect(&r, 0, y); + GUI_DispStringAt(pText, r.x0, r.y0 - SpaceAbove); + /* Calculate focus rect */ + if (HasFocus && (pObj->Sel == i)) { + _ResizeRect(&rFocus, &r, FocusBorder); + } + } + } + } + + /* Draw the focus rect */ + if (HasFocus) { + LCD_SetColor(GUI_BLACK); + WIDGET__DrawFocusRect(&pObj->Widget, &rFocus, 0); + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(RADIO_Handle hObj, RADIO_Obj* pObj, WM_MESSAGE*pMsg) { + int Notification; + int Hit = 0; + GUI_PID_STATE* pState = (GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + int y, Sel; + y = pState->y; + Sel = y / pObj->Spacing; + y -= Sel * pObj->Spacing; + if (y <= pObj->Height) { + RADIO_SetValue(hObj, Sel); + } + if (WM_IsFocussable(hObj)) { + WM_SetFocus(hObj); + } + Notification = WM_NOTIFICATION_CLICKED; + } else { + Hit = 1; + Notification = WM_NOTIFICATION_RELEASED; + } + } else { + Notification = WM_NOTIFICATION_MOVED_OUT; + } + WM_NotifyParent(hObj, Notification); + if (Hit == 1) { + GUI_DEBUG_LOG("RADIO: Hit\n"); + GUI_StoreKey(pObj->Widget.Id); + } +} + +/********************************************************************* +* +* _OnKey +*/ +static void _OnKey(RADIO_Handle hObj, WM_MESSAGE* pMsg) { + WM_KEY_INFO* pKeyInfo; + pKeyInfo = (WM_KEY_INFO*)(pMsg->Data.p); + if (pKeyInfo->PressedCnt > 0) { + switch (pKeyInfo->Key) { + case GUI_KEY_RIGHT: + case GUI_KEY_DOWN: + RADIO_Inc(hObj); + break; /* Send to parent by not doing anything */ + case GUI_KEY_LEFT: + case GUI_KEY_UP: + RADIO_Dec(hObj); + break; /* Send to parent by not doing anything */ + default: + return; + } + } +} + +/********************************************************************* +* +* _RADIO_Callback +*/ +static void _RADIO_Callback (WM_MESSAGE* pMsg) { + RADIO_Handle hObj; + RADIO_Obj* pObj; + hObj = pMsg->hWin; + pObj = RADIO_H2P(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_PAINT: + GUI_DEBUG_LOG("RADIO: _Callback(WM_PAINT)\n"); + _OnPaint(hObj, pObj); + return; + case WM_GET_RADIOGROUP: + pMsg->Data.v = pObj->GroupId; + return; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + case WM_KEY: + _OnKey(hObj, pMsg); + break; + case WM_DELETE: + GUI_ARRAY_Delete(&pObj->TextArray); + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines, modul internal +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO__SetValue +*/ +void RADIO__SetValue(RADIO_Handle hObj, RADIO_Obj* pObj, int v) { + if (v >= pObj->NumItems) { + v = (int)pObj->NumItems - 1; + } + if (v != pObj->Sel) { + pObj->Sel = v; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* RADIO_CreateEx +*/ +RADIO_Handle RADIO_CreateEx(int x0, int y0, int xSize, int ySize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, int NumItems, int Spacing) +{ + RADIO_Handle hObj; + int Height, i; + /* Calculate helper variables */ + Height = RADIO__apDefaultImage[0]->YSize + RADIO_BORDER * 2; + Spacing = (Spacing <= 0) ? 20 : Spacing; + NumItems = (NumItems <= 0) ? 2 : NumItems; + if (ySize == 0) { + ySize = Height + ((NumItems - 1) * Spacing); + } + if (xSize == 0) { + xSize = RADIO__apDefaultImage[0]->XSize + RADIO_BORDER * 2; + } +#if WM_SUPPORT_TRANSPARENCY + WinFlags |= WM_CF_HASTRANS; +#endif + /* Create the window */ + hObj = WM_CreateWindowAsChild(x0, y0, xSize, ySize, hParent, WinFlags, _RADIO_Callback, sizeof(RADIO_Obj) - sizeof(WM_Obj)); + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + /* Init sub-classes */ + GUI_ARRAY_CREATE(&pObj->TextArray); + for (i = 0; i < NumItems; i++) { + GUI_ARRAY_AddItem(&pObj->TextArray, NULL, 0); + } + /* Init widget specific variables */ + ExFlags &= RADIO_TEXTPOS_LEFT; + WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE | ExFlags); + /* Init member variables */ + RADIO_INIT_ID(pObj); + pObj->apBmRadio[0] = RADIO__apDefaultImage[0]; + pObj->apBmRadio[1] = RADIO__apDefaultImage[1]; + pObj->pBmCheck = RADIO__pDefaultImageCheck; + pObj->pFont = RADIO__pDefaultFont; + pObj->TextColor = RADIO__DefaultTextColor; + pObj->BkColor = WM_GetBkColor(hParent); + pObj->NumItems = NumItems; + pObj->Spacing = Spacing; + pObj->Height = Height; + WM_UNLOCK(); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "RADIO_Create failed") + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_AddValue +*/ +void RADIO_AddValue(RADIO_Handle hObj, int Add) { + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + RADIO_SetValue(hObj, pObj->Sel + Add); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* RADIO_Dec +*/ +void RADIO_Dec(RADIO_Handle hObj) { + RADIO_AddValue(hObj, -1); +} + +/********************************************************************* +* +* RADIO_Inc +*/ +void RADIO_Inc(RADIO_Handle hObj) { + RADIO_AddValue(hObj, 1); +} + +/********************************************************************* +* +* RADIO_SetValue +*/ +void RADIO_SetValue(RADIO_Handle hObj, int v) { + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + if (pObj->GroupId && RADIO__pfHandleSetValue) { + (*RADIO__pfHandleSetValue)(hObj, pObj, v); + } else { + if (v < 0) { + v = 0; + } + RADIO__SetValue(hObj, pObj, v); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* Exported routines: Query state +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_GetValue +*/ +int RADIO_GetValue(RADIO_Handle hObj) { + int r = 0; + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + r = pObj->Sel; + WM_UNLOCK(); + } + return r; +} + +#else /* avoid empty object files */ + +void RADIO_C(void); +void RADIO_C(void){} + +#endif /* #if GUI_WINSUPPORT */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO.h b/User/system/lib/lcd/gui/Widget/RADIO.h new file mode 100644 index 0000000..ce89352 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO.h @@ -0,0 +1,128 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO.h +Purpose : RADIO include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef RADIO_H +#define RADIO_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Bitmap indices +*/ +#define RADIO_BI_INACTIV 0 +#define RADIO_BI_ACTIV 1 +#define RADIO_BI_CHECK 2 + +/********************************************************************* +* +* Defaults for public configuration switches +* +********************************************************************** + +The following are defaults for config switches which affect the +interface specified in this module +*/ + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ + +#define RADIO_TEXTPOS_RIGHT 0 +#define RADIO_TEXTPOS_LEFT WIDGET_STATE_USER0 /* Not implemented, TBD */ + +/********************************************************************* +* +* Public Types +* +********************************************************************** +*/ + +typedef WM_HMEM RADIO_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +RADIO_Handle RADIO_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, unsigned Para); +RADIO_Handle RADIO_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +RADIO_Handle RADIO_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, int NumItems, int Spacing); + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +void RADIO_SetDefaultFont (const GUI_FONT GUI_UNI_PTR* pFont); +void RADIO_SetDefaultImage (const GUI_BITMAP * pBitmap, unsigned int Index); +void RADIO_SetDefaultTextColor (GUI_COLOR TextColor); + +const GUI_FONT GUI_UNI_PTR* RADIO_GetDefaultFont (void); +GUI_COLOR RADIO_GetDefaultTextColor (void); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +void RADIO_AddValue (RADIO_Handle hObj, int Add); +void RADIO_Dec (RADIO_Handle hObj); +void RADIO_Inc (RADIO_Handle hObj); +void RADIO_SetBkColor (RADIO_Handle hObj, GUI_COLOR Color); +void RADIO_SetFont (RADIO_Handle hObj, const GUI_FONT GUI_UNI_PTR* pFont); +void RADIO_SetGroupId (RADIO_Handle hObj, U8 GroupId); +void RADIO_SetImage (RADIO_Handle hObj, const GUI_BITMAP * pBitmap, unsigned int Index); +void RADIO_SetText (RADIO_Handle hObj, const char* pText, unsigned Index); +void RADIO_SetTextColor (RADIO_Handle hObj, GUI_COLOR Color); +void RADIO_SetValue (RADIO_Handle hObj, int v); + +/********************************************************************* +* +* Query state +* +********************************************************************** +*/ +int RADIO_GetValue(RADIO_Handle hObj); + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* RADIO_H */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_Create.c b/User/system/lib/lcd/gui/Widget/RADIO_Create.c new file mode 100644 index 0000000..1fe13ea --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_Create.c @@ -0,0 +1,42 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_Create.c +Purpose : Implementation of radio widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_Create +*/ +RADIO_Handle RADIO_Create(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, unsigned Para) { + return RADIO_CreateEx(x0, y0, xsize, ysize, hParent, Flags, 0, Id, Para & 0xFF, (Para >> 8) & 0xFF); +} + +#else /* avoid empty object files */ + void RADIO_Create_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/RADIO_CreateIndirect.c new file mode 100644 index 0000000..6e34ef3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_CreateIndirect.c @@ -0,0 +1,49 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_Create.c +Purpose : Implementation of radio widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI.h" +#include "RADIO.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_CreateIndirect +*/ +RADIO_Handle RADIO_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + RADIO_Handle hThis; + int NumItems = (pCreateInfo->Para) & 0xFF; + int Spacing = (pCreateInfo->Para >> 8) & 0xFF; + GUI_USE_PARA(cb); + hThis = RADIO_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, pCreateInfo->Flags, 0, pCreateInfo->Id, NumItems, Spacing); + return hThis; +} + +#else /* avoid empty object files */ + void RADIO_CreateIndirect_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_Default.c b/User/system/lib/lcd/gui/Widget/RADIO_Default.c new file mode 100644 index 0000000..5779b3e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_Default.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_Default.c +Purpose : Implementation of radio widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO.h" +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR* RADIO_GetDefaultFont(void) { + return RADIO__pDefaultFont; +} + +/********************************************************************* +* +* RADIO_GetDefaultTextColor +*/ +GUI_COLOR RADIO_GetDefaultTextColor(void) { + return RADIO__DefaultTextColor; +} + +/********************************************************************* +* +* RADIO_SetDefaultFont +*/ +void RADIO_SetDefaultFont(const GUI_FONT GUI_UNI_PTR* pFont) { + RADIO__pDefaultFont = pFont; +} + +/********************************************************************* +* +* RADIO_SetDefaultTextColor +*/ +void RADIO_SetDefaultTextColor(GUI_COLOR TextColor) { + RADIO__DefaultTextColor = TextColor; +} + +#else /* Avoid problems with empty object modules */ + void RADIO_Default_C(void); + void RADIO_Default_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_Image.c b/User/system/lib/lcd/gui/Widget/RADIO_Image.c new file mode 100644 index 0000000..d930067 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_Image.c @@ -0,0 +1,121 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_Image.c +Purpose : Implementation of radio widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "GUI_Protected.h" +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +/* Define colors */ +#ifndef RADIO_BKCOLOR0_DEFAULT + #define RADIO_BKCOLOR0_DEFAULT 0xc0c0c0 /* Inactive color */ +#endif + +#ifndef RADIO_BKCOLOR1_DEFAULT + #define RADIO_BKCOLOR1_DEFAULT GUI_WHITE /* Active color */ +#endif + +/********************************************************************* +* +* Static const data +* +********************************************************************** +*/ + +/* Colors */ +static const GUI_COLOR _aColorDisabled[] = {0xC0C0C0, 0x808080, 0x000000, RADIO_BKCOLOR0_DEFAULT}; +static const GUI_COLOR _aColorEnabled[] = {0xC0C0C0, 0x808080, 0x000000, RADIO_BKCOLOR1_DEFAULT}; +static const GUI_COLOR _ColorsCheck[] = {0xFFFFFF, 0x000000}; + +/* Palettes */ +static const GUI_LOGPALETTE _PalRadioDisabled = { + 4, /* number of entries */ + 1, /* Transparency */ + _aColorDisabled +}; + +static const GUI_LOGPALETTE _PalRadioEnabled = { + 4, /* number of entries */ + 1, /* Transparency */ + _aColorEnabled +}; + +static const GUI_LOGPALETTE _PalCheck = { + 2, /* number of entries */ + 1, /* Transparency */ + &_ColorsCheck[0] +}; + +/* Pixel data */ +static const unsigned char _acRadio[] = { + 0x00, 0x55, 0x00, + 0x05, 0xAA, 0x50, + 0x1A, 0xFF, 0xAC, + 0x1B, 0xFF, 0xCC, + 0x6F, 0xFF, 0xF3, + 0x6F, 0xFF, 0xF3, + 0x6F, 0xFF, 0xF3, + 0x6F, 0xFF, 0xF3, + 0x1B, 0xFF, 0xCC, + 0x10, 0xFF, 0x0C, + 0x0F, 0x00, 0xF0, + 0x00, 0xFF, 0x00 +}; + +static const unsigned char _acCheck[] = { + _XX_____, + XXXX____, + XXXX____, + _XX_____ +}; + +/********************************************************************* +* +* Exported const data +* +********************************************************************** +*/ +/* Bitmaps */ +const GUI_BITMAP RADIO__abmRadio[] = { + { 12, 12, 3, 2, _acRadio, &_PalRadioDisabled}, + { 12, 12, 3, 2, _acRadio, &_PalRadioEnabled} +}; + +const GUI_BITMAP RADIO__bmCheck = { + 4, /* XSize */ + 4, /* YSize */ + 1, /* BytesPerLine */ + 1, /* BitsPerPixel */ + _acCheck, /* Pointer to picture data (indices) */ + &_PalCheck /* Pointer to palette */ +}; + +#else /* Avoid problems with empty object modules */ + void RADIO_Image_C(void); + void RADIO_Image_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_Private.h b/User/system/lib/lcd/gui/Widget/RADIO_Private.h new file mode 100644 index 0000000..11212ea --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_Private.h @@ -0,0 +1,101 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_Private.h +Purpose : RADIO private header file +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef RADIO_PRIVATE_H +#define RADIO_PRIVATE_H + +#include "WM.h" + +#if GUI_WINSUPPORT + +#include "RADIO.h" +#include "WIDGET.h" +#include "GUI_ARRAY.h" + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + WIDGET Widget; + const GUI_BITMAP* apBmRadio[2]; + const GUI_BITMAP* pBmCheck; + GUI_ARRAY TextArray; + I16 Sel; /* current selection */ + U16 Spacing; + U16 Height; + U16 NumItems; + U8 GroupId; + GUI_COLOR BkColor; + GUI_COLOR TextColor; + const GUI_FONT GUI_UNI_PTR* pFont; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif +} RADIO_Obj; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define RADIO_H2P(h) (RADIO_Obj*) GUI_ALLOC_h2p(h) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef void tRADIO_SetValue(RADIO_Handle hObj, RADIO_Obj* pObj, int v); + +/********************************************************************* +* +* Extern data +* +********************************************************************** +*/ + +extern const GUI_BITMAP RADIO__abmRadio[2]; +extern const GUI_BITMAP RADIO__bmCheck; +extern const GUI_BITMAP* RADIO__apDefaultImage[2]; +extern const GUI_BITMAP* RADIO__pDefaultImageCheck; +extern const GUI_FONT GUI_UNI_PTR* RADIO__pDefaultFont; +extern GUI_COLOR RADIO__DefaultTextColor; +extern tRADIO_SetValue* RADIO__pfHandleSetValue; + +/********************************************************************* +* +* public functions (internal) +* +********************************************************************** +*/ + +void RADIO__SetValue(RADIO_Handle hObj, RADIO_Obj* pObj, int v); + +#endif /* GUI_WINSUPPORT */ +#endif /* RADIO_PRIVATE_H */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetBkColor.c b/User/system/lib/lcd/gui/Widget/RADIO_SetBkColor.c new file mode 100644 index 0000000..19f83fc --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetBkColor.c @@ -0,0 +1,61 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetBkColor.c +Purpose : Implementation of RADIO_SetBkColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetBkColor +*/ +void RADIO_SetBkColor(RADIO_Handle hObj, GUI_COLOR Color) { + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + if (Color != pObj->BkColor) { + pObj->BkColor = Color; + #if WM_SUPPORT_TRANSPARENCY + if (Color <= 0xFFFFFF) { + WM_SetTransState(hObj, 0); + } else { + WM_SetTransState(hObj, WM_CF_HASTRANS); + } + #endif + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void RADIO_SetBkColor_c(void); +void RADIO_SetBkColor_c(void) {} + +#endif /* #if GUI_WINSUPPORT */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetDefaultImage.c b/User/system/lib/lcd/gui/Widget/RADIO_SetDefaultImage.c new file mode 100644 index 0000000..b2302ab --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetDefaultImage.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetDefaultImage.c +Purpose : Implementation of radio widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO.h" +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetDefaultImage +*/ +void RADIO_SetDefaultImage(const GUI_BITMAP * pBitmap, unsigned int Index) { + switch (Index) { + case RADIO_BI_INACTIV: + case RADIO_BI_ACTIV: + RADIO__apDefaultImage[Index] = pBitmap; + break; + case RADIO_BI_CHECK: + RADIO__pDefaultImageCheck = pBitmap; + break; + } +} + +#else /* Avoid problems with empty object modules */ + void RADIO_SetDefaultImage_C(void); + void RADIO_SetDefaultImage_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetFont.c b/User/system/lib/lcd/gui/Widget/RADIO_SetFont.c new file mode 100644 index 0000000..6286d9a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetFont.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetFont.c +Purpose : Implementation of RADIO_SetFont +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetFont +*/ +void RADIO_SetFont(RADIO_Handle hObj, const GUI_FONT GUI_UNI_PTR* pFont) { + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + if (pFont != pObj->pFont) { + pObj->pFont = pFont; + if (GUI_ARRAY_GetNumItems(&pObj->TextArray)) { + WM_InvalidateWindow(hObj); + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void RADIO_SetFont_c(void); +void RADIO_SetFont_c(void) {} + +#endif /* #if GUI_WINSUPPORT */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetGroupId.c b/User/system/lib/lcd/gui/Widget/RADIO_SetGroupId.c new file mode 100644 index 0000000..fe501f0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetGroupId.c @@ -0,0 +1,181 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetGroupId.c +Purpose : Implementation of RADIO widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "RADIO.h" +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _SetValue +*/ +static void _SetValue(RADIO_Handle hObj, int v) { + RADIO_Obj* pObj; + pObj = RADIO_H2P(hObj); + RADIO__SetValue(hObj, pObj, v); +} + +/********************************************************************* +* +* _IsInGroup +*/ +static int _IsInGroup(WM_HWIN hWin, U8 GroupId) { + if (GroupId) { + WM_MESSAGE Msg; + Msg.MsgId = WM_GET_RADIOGROUP; + WM_SendMessage(hWin, &Msg); + return (Msg.Data.v == GroupId); + } + return 0; +} + +/********************************************************************* +* +* _GetPrevInGroup +*/ +static WM_HWIN _GetPrevInGroup(WM_HWIN hWin, U8 GroupId) { + for (hWin = WM__GetPrevSibling(hWin); hWin; hWin = WM__GetPrevSibling(hWin)) { + if (_IsInGroup(hWin, GroupId)) { + return hWin; + } + } + return 0; +} + +/********************************************************************* +* +* _GetNextInGroup +*/ +static WM_HWIN _GetNextInGroup(WM_HWIN hWin, U8 GroupId) { + for (; hWin; hWin = WM_GetNextSibling(hWin)) { + if (_IsInGroup(hWin, GroupId)) { + return hWin; + } + } + return 0; +} + +/********************************************************************* +* +* _ClearSelection +*/ +static void _ClearSelection(RADIO_Handle hObj, U8 GroupId) { + WM_HWIN hWin; + WM_Obj* pWin; + for (hWin = WM__GetFirstSibling(hObj); hWin; hWin = pWin->hNext) { + pWin = WM_H2P(hWin); + if (hWin != hObj) { + if (_IsInGroup(hWin, GroupId)) { + RADIO__SetValue(hWin, (RADIO_Obj*)pWin, -1); + } + } + } +} + +/********************************************************************* +* +* _HandleSetValue +*/ +static void _HandleSetValue(RADIO_Handle hObj, RADIO_Obj* pObj, int v) { + if (v < 0) { + WM_HWIN hWin = _GetPrevInGroup(hObj, pObj->GroupId); + if (hWin) { + WM_SetFocus(hWin); + _SetValue(hWin, 0x7FFF); + RADIO__SetValue(hObj, pObj, -1); + } + } else if (v >= pObj->NumItems) { + WM_HWIN hWin = _GetNextInGroup(pObj->Widget.Win.hNext, pObj->GroupId); + if (hWin) { + WM_SetFocus(hWin); + _SetValue(hWin, 0); + RADIO__SetValue(hObj, pObj, -1); + } + } else { + if (pObj->Sel != v) { + _ClearSelection(hObj, pObj->GroupId); + RADIO__SetValue(hObj, pObj, v); + } + } +} + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetGroupId +*/ +void RADIO_SetGroupId(RADIO_Handle hObj, U8 NewGroupId) { + if (hObj) { + RADIO_Obj* pObj; + U8 OldGroupId; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + OldGroupId = pObj->GroupId; + if (NewGroupId != OldGroupId) { + WM_HWIN hFirst; + hFirst = WM__GetFirstSibling(hObj); + /* Set function pointer if necessary */ + if (NewGroupId && (RADIO__pfHandleSetValue == NULL)) { + RADIO__pfHandleSetValue = _HandleSetValue; + } + /* Pass our selection, if we have one, to another radio button in */ + /* our old group. So the group have a valid selection when we leave it. */ + if (OldGroupId && (pObj->Sel >= 0)) { + WM_HWIN hWin; + pObj->GroupId = 0; /* Leave group first, so _GetNextInGroup() could */ + /* not find a handle to our own window. */ + hWin = _GetNextInGroup(hFirst, OldGroupId); + if (hWin) { + _SetValue(hWin, 0); + } + } + /* Make sure we have a valid selection according to our new group */ + if (_GetNextInGroup(hFirst, NewGroupId) != 0) { + /* Join an existing group with an already valid selection, so clear our own one */ + RADIO__SetValue(hObj, pObj, -1); + } else if (pObj->Sel < 0) { + /* We are the first window in group, so we must have a valid selection at our own. */ + RADIO__SetValue(hObj, pObj, 0); + } + /* Change the group */ + pObj->GroupId = NewGroupId; + } + WM_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void RADIO_SetGroupId_C(void); + void RADIO_SetGroupId_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetImage.c b/User/system/lib/lcd/gui/Widget/RADIO_SetImage.c new file mode 100644 index 0000000..c4f24ad --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetImage.c @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetImage.c +Purpose : Implementation of RADIO widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO.h" +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetImage +*/ +void RADIO_SetImage(RADIO_Handle hObj, const GUI_BITMAP * pBitmap, unsigned int Index) { + if (hObj) { + RADIO_Obj * pObj; + GUI_LOCK(); + pObj = RADIO_H2P(hObj); + switch (Index) { + case RADIO_BI_INACTIV: + case RADIO_BI_ACTIV: + pObj->apBmRadio[Index] = pBitmap; + break; + case RADIO_BI_CHECK: + pObj->pBmCheck = pBitmap; + break; + } + WM_InvalidateWindow(hObj); + GUI_UNLOCK(); + } +} + +#else /* Avoid problems with empty object modules */ + void RADIO_SetImage_C(void); + void RADIO_SetImage_C(void) {} +#endif + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetText.c b/User/system/lib/lcd/gui/Widget/RADIO_SetText.c new file mode 100644 index 0000000..833498d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetText.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetText.c +Purpose : Implementation of RADIO_SetText +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetText +*/ +void RADIO_SetText(RADIO_Handle hObj, const char* pText, unsigned Index) { + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + if (Index < (unsigned)pObj->NumItems) { + GUI_ARRAY_SetItem(&pObj->TextArray, Index, pText, pText ? (GUI__strlen(pText) + 1) : 0); + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void RADIO_SetText_c(void); +void RADIO_SetText_c(void) {} + +#endif /* #if GUI_WINSUPPORT */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/RADIO_SetTextColor.c b/User/system/lib/lcd/gui/Widget/RADIO_SetTextColor.c new file mode 100644 index 0000000..3f30b03 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/RADIO_SetTextColor.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : RADIO_SetTextColor.c +Purpose : Implementation of RADIO_SetTextColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "RADIO_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* RADIO_SetTextColor +*/ +void RADIO_SetTextColor(RADIO_Handle hObj, GUI_COLOR Color) { + if (hObj) { + RADIO_Obj* pObj; + WM_LOCK(); + pObj = RADIO_H2P(hObj); + if (Color != pObj->TextColor) { + pObj->TextColor = Color; + if (GUI_ARRAY_GetNumItems(&pObj->TextArray)) { + WM_InvalidateWindow(hObj); + } + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void RADIO_SetTextColor_c(void); +void RADIO_SetTextColor_c(void) {} + +#endif /* #if GUI_WINSUPPORT */ + +/************************* end of file ******************************/ diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR.c b/User/system/lib/lcd/gui/Widget/SCROLLBAR.c new file mode 100644 index 0000000..a47edd5 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR.c @@ -0,0 +1,616 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR.c +Purpose : Implementation of scrollbar widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "SCROLLBAR_Private.h" +#include "WIDGET.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Support for 3D effects */ +#ifndef SCROLLBAR_USE_3D + #define SCROLLBAR_USE_3D 1 +#endif + +/* Define colors */ +#ifndef SCROLLBAR_BKCOLOR0_DEFAULT + #define SCROLLBAR_BKCOLOR0_DEFAULT 0x808080 +#endif + +#ifndef SCROLLBAR_BKCOLOR1_DEFAULT + #define SCROLLBAR_BKCOLOR1_DEFAULT GUI_BLACK +#endif + +#ifndef SCROLLBAR_COLOR0_DEFAULT + #define SCROLLBAR_COLOR0_DEFAULT 0xc0c0c0 +#endif + +#ifndef SCROLLBAR_COLOR1_DEFAULT + #define SCROLLBAR_COLOR1_DEFAULT GUI_BLACK +#endif + +#ifndef SCROLLBAR_DEFAULT_WIDTH + #define SCROLLBAR_DEFAULT_WIDTH 11 +#endif + +/********************************************************************* +* +* Module internal data +* +********************************************************************** +*/ + +GUI_COLOR SCROLLBAR__aDefaultBkColor[2] = {SCROLLBAR_BKCOLOR0_DEFAULT, SCROLLBAR_BKCOLOR1_DEFAULT}; +GUI_COLOR SCROLLBAR__aDefaultColor[2] = {SCROLLBAR_COLOR0_DEFAULT, SCROLLBAR_COLOR1_DEFAULT}; +I16 SCROLLBAR__DefaultWidth = SCROLLBAR_DEFAULT_WIDTH; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _GetArrowSize +* +*/ +static int _GetArrowSize(SCROLLBAR_Obj* pObj) { + unsigned int r; + unsigned int xSize = WIDGET__GetXSize(&pObj->Widget); + unsigned int ySize = WIDGET__GetYSize(&pObj->Widget); + r = ySize/2 + 5; + if (r > xSize-5) + r = xSize-5; + return r; +} + +/********************************************************************* +* +* _WIDGET__RECT2VRECT +* +* Purpose: +* Convert rectangle in real coordinates into virtual coordinates +* +* Add. info: +* This function could eventualy be made none-static and move into +* a module of its own. +*/ +static void _WIDGET__RECT2VRECT(const WIDGET* pWidget, GUI_RECT* pRect) { + if (pWidget->State & WIDGET_STATE_VERTICAL) { + int xSize = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0 + 1; + int x0, x1; + x0 = pRect->x0; + x1 = pRect->x1; + pRect->x0 = pRect->y0; + pRect->x1 = pRect->y1; + pRect->y1 = xSize - 1 - x0; + pRect->y0 = xSize - 1 - x1; + } +} + +/********************************************************************* +* +* _CalcPositions +* +* Calculates all positions required for drawing or for mouse / touch +* evaluation. +*/ +static void _CalcPositions(SCROLLBAR_Obj* pObj, SCROLLBAR_POSITIONS* pPos) { + int xSizeArrow, xSize, xSizeMoveable, ThumbSize, NumItems, xSizeThumbArea; + WM_HWIN hWin; + GUI_RECT r, rSub; + int x0, y0; + r = pObj->Widget.Win.Rect; + x0 = r.x0; + y0 = r.y0; + pPos->x1 = (pObj->Widget.State & WIDGET_STATE_VERTICAL) ? r.y1 : r.x1; + /* Subtract the rectangle of the other scrollbar (if existing and visible) */ + if (pObj->Widget.Id == GUI_ID_HSCROLL) { + hWin = WM_GetScrollbarV(pObj->Widget.Win.hParent); + if (hWin) { + WM_GetWindowRectEx(hWin, &rSub); + if (r.x1 == rSub.x1) { + r.x1 = rSub.x0 -1; + } + } + } + if (pObj->Widget.Id == GUI_ID_VSCROLL) { + hWin = WM_GetScrollbarH(pObj->Widget.Win.hParent); + if (hWin) { + WM_GetWindowRectEx(hWin, &rSub); + if (r.y1 == rSub.y1) { + r.y1 = rSub.y0 -1; + } + } + } + /* Convert coordinates of this window */ + GUI_MoveRect(&r, -x0, -y0); + /* Convert real into virtual coordinates */ + _WIDGET__RECT2VRECT(&pObj->Widget, &r); + NumItems = pObj->NumItems; + xSize = r.x1 - r.x0 + 1; + xSizeArrow = _GetArrowSize(pObj); + xSizeThumbArea= xSize - 2 * xSizeArrow; /* Number of pixels available for thumb and movement */ + ThumbSize = GUI__DivideRound(xSizeThumbArea * pObj->PageSize, NumItems); + if (ThumbSize < 4) { + ThumbSize = 4; + } + if (ThumbSize > xSizeThumbArea) { + ThumbSize = xSizeThumbArea; + } + xSizeMoveable = xSizeThumbArea - ThumbSize; + pPos->x0_LeftArrow = r.x0; + pPos->x1_LeftArrow = xSizeArrow - 1; + pPos->x1_RightArrow = xSize - 1; + pPos->x0_RightArrow = xSize - xSizeArrow; + pPos->x0_Thumb = pPos->x1_LeftArrow + 1+ GUI__DivideRound(xSizeMoveable * pObj->v, NumItems - pObj->PageSize); + pPos->x1_Thumb = pPos->x0_Thumb + ThumbSize - 1; + pPos->xSizeMoveable = xSizeMoveable; + pPos->ThumbSize = ThumbSize; +} + +/********************************************************************* +* +* _DrawTriangle +*/ +static void _DrawTriangle(WIDGET* pWidget, int x, int y, int Size, int Inc) { + if (pWidget->State & WIDGET_STATE_VERTICAL) { + for (; Size >= 0; Size--, x += Inc) { + GUI_DrawHLine(x, y - Size, y + Size); + } + } else { + for (; Size >= 0; Size--, x += Inc) { + GUI_DrawVLine(x, y - Size, y + Size); + } + } +} + +/********************************************************************* +* +* _Paint +*/ +static void _Paint(SCROLLBAR_Obj* pObj) { + int ArrowSize, ArrowOff; + SCROLLBAR_POSITIONS Pos; + GUI_RECT r, rClient; + /* + Get / calc position info + */ + _CalcPositions(pObj, &Pos); + WIDGET__GetClientRect(&pObj->Widget, &rClient); + r = rClient; + ArrowSize = ((r.y1 - r.y0) /3) - 1; + ArrowOff = 3 + ArrowSize+ ArrowSize/3; + /* + Draw left Arrow + */ + LCD_SetColor(pObj->aColor[0]); + r = rClient; + r.x0 = Pos.x0_LeftArrow; + r.x1 = Pos.x1_LeftArrow; + WIDGET__FillRectEx(&pObj->Widget, &r); + LCD_SetColor(pObj->aBkColor[1]); + _DrawTriangle(&pObj->Widget, r.x0 + ArrowOff, (r.y1 - r.y0) >> 1, ArrowSize, -1); + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &r); + /* + Draw the thumb area which is not covered by the thumb + */ + LCD_SetColor(pObj->aBkColor[0]); + r.x0 = Pos.x1_LeftArrow + 1; + r.x1 = Pos.x0_Thumb - 1; + WIDGET__FillRectEx(&pObj->Widget, &r); + r = rClient; + r.x0 = Pos.x1_Thumb + 1; + r.x1 = Pos.x0_RightArrow - 1; + WIDGET__FillRectEx(&pObj->Widget, &r); + /* + Draw Thumb + */ + r = rClient; + r.x0 = Pos.x0_Thumb; + r.x1 = Pos.x1_Thumb; + LCD_SetColor(pObj->aColor[0]); + WIDGET__FillRectEx(&pObj->Widget, &r); + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &r); + /* + Draw right Arrow + */ + LCD_SetColor(pObj->aColor[0]); + r.x0 = Pos.x0_RightArrow; + r.x1 = Pos.x1_RightArrow; + WIDGET__FillRectEx(&pObj->Widget, &r); + LCD_SetColor(pObj->aBkColor[1]); + _DrawTriangle(&pObj->Widget, r.x1 - ArrowOff, (r.y1 - r.y0) >> 1, ArrowSize, 1); + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &r); + /* + Draw overlap area (if any ...) + */ + if (Pos.x1_RightArrow != Pos.x1) { + r.x0 = Pos.x1_RightArrow + 1; + r.x1 = Pos.x1; + LCD_SetColor(pObj->aColor[0]); + WIDGET__FillRectEx(&pObj->Widget, &r); + } +} + +/********************************************************************* +* +* _ScrollbarPressed +*/ +static void _ScrollbarPressed(SCROLLBAR_Handle hObj, SCROLLBAR_Obj* pObj) { + WIDGET_OrState(hObj, SCROLLBAR_STATE_PRESSED); + if (pObj->Widget.Win.Status & WM_SF_ISVIS) { + WM_NotifyParent(hObj, WM_NOTIFICATION_CLICKED); + } +} + +/********************************************************************* +* +* _ScrollbarReleased +*/ +static void _ScrollbarReleased(SCROLLBAR_Handle hObj, SCROLLBAR_Obj* pObj) { + WIDGET_AndState(hObj, SCROLLBAR_STATE_PRESSED); + if (pObj->Widget.Win.Status & WM_SF_ISVIS) { + WM_NotifyParent(hObj, WM_NOTIFICATION_RELEASED); + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(SCROLLBAR_Handle hObj, SCROLLBAR_Obj* pObj, WM_MESSAGE*pMsg) { + SCROLLBAR_POSITIONS Pos; + GUI_PID_STATE* pState = (GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + int Sel; + int Range; + int x; + Sel = pObj->v; + _CalcPositions(pObj, &Pos); + Range = pObj->NumItems - pObj->PageSize; + /* Swap mouse coordinates if necessary */ + if (pObj->Widget.State & WIDGET_STATE_VERTICAL) { + int t = pState->x; + pState->x = pState->y; + pState->y = t; + } + x = pState->x; + if (x <= Pos.x1_LeftArrow) { /* left arrow (line left) */ + Sel--; + } else if (x < Pos.x0_Thumb) { /* left area (page left) */ + Sel -= pObj->PageSize; + } else if (x <= Pos.x1_Thumb) { /* Thumb area */ + if (Pos.xSizeMoveable > 0) { + x = x - Pos.ThumbSize/2 - Pos.x1_LeftArrow-1; + Sel = GUI__DivideRound(Range * x, Pos.xSizeMoveable); + } + } else if (x < Pos.x0_RightArrow) { /* right area (page right) */ + Sel += pObj->PageSize; + } else if (x <= Pos.x1_RightArrow) { + Sel++; + } + /* WM_SetFocus(hObj); */ + WM_SetCapture(hObj, 1); + SCROLLBAR_SetValue(hObj, Sel); + if ((pObj->Widget.State & SCROLLBAR_STATE_PRESSED) == 0){ + _ScrollbarPressed(hObj, pObj); + } + } else { + /* React only if button was pressed before ... avoid problems with moving / hiding windows above (such as dropdown) */ + if (pObj->Widget.State & SCROLLBAR_STATE_PRESSED) { + _ScrollbarReleased(hObj, pObj); + } + } + } +} + +/********************************************************************* +* +* _OnKey +*/ +static void _OnKey(SCROLLBAR_Handle hObj, WM_MESSAGE*pMsg) { + const WM_KEY_INFO* pKeyInfo; + int Key; + pKeyInfo = (const WM_KEY_INFO*)(pMsg->Data.p); + Key = pKeyInfo->Key; + if (pKeyInfo->PressedCnt > 0) { + switch (Key) { + case GUI_KEY_RIGHT: + case GUI_KEY_DOWN: + SCROLLBAR_Inc(hObj); + break; /* Send to parent by not doing anything */ + case GUI_KEY_LEFT: + case GUI_KEY_UP: + SCROLLBAR_Dec(hObj); + break; /* Send to parent by not doing anything */ + default: + return; + } + } +} + +/********************************************************************* +* +* _OnSetScrollState +*/ +static void _OnSetScrollState(SCROLLBAR_Handle hObj, SCROLLBAR_Obj* pObj, const WM_SCROLL_STATE* pState) { + if ( (pState->NumItems != pObj->NumItems) + || (pObj->PageSize != pState->PageSize) + || (pObj->v != pState->v)) + { + pObj->NumItems = pState->NumItems; + pObj->PageSize = pState->PageSize; + pObj->v = pState->v; + WM_InvalidateWindow(hObj); + } +} + +/********************************************************************* +* +* SCROLLBAR__InvalidatePartner +*/ +void SCROLLBAR__InvalidatePartner(SCROLLBAR_Handle hObj) { /* Invalidate the partner, since it is also affected */ + WM_InvalidateWindow(WM_GetScrollPartner(hObj)); + WM_SendMessageNoPara(WM_GetParent(hObj), WM_NOTIFY_CLIENTCHANGE); /* Client area may have changed */ +} + +/********************************************************************* +* +* _SCROLLBAR_Callback +*/ +static void _SCROLLBAR_Callback (WM_MESSAGE *pMsg) { + SCROLLBAR_Handle hObj; + SCROLLBAR_Obj* pObj; + hObj = pMsg->hWin; + pObj = SCROLLBAR_H2P(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_DELETE: + SCROLLBAR__InvalidatePartner(hObj); + break; + case WM_PAINT: + GUI_DEBUG_LOG("SCROLLBAR: _Callback(WM_PAINT)\n"); + _Paint(pObj); + return; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + case WM_KEY: + _OnKey(hObj, pMsg); + break; + case WM_SET_SCROLL_STATE: + _OnSetScrollState(hObj, pObj, (const WM_SCROLL_STATE*)pMsg->Data.p); + break; + case WM_GET_SCROLL_STATE: + ((WM_SCROLL_STATE*)pMsg->Data.p)->NumItems = pObj->NumItems; + ((WM_SCROLL_STATE*)pMsg->Data.p)->PageSize = pObj->PageSize; + ((WM_SCROLL_STATE*)pMsg->Data.p)->v = pObj->v; + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* SCROLLBAR_CreateEx +*/ +SCROLLBAR_Handle SCROLLBAR_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + SCROLLBAR_Handle hObj; + WM_LOCK(); + /* Set defaults if necessary */ + if ((xsize == 0) && (ysize == 0)) { + GUI_RECT Rect; + WM_GetInsideRectEx(hParent, &Rect); + if (ExFlags & SCROLLBAR_CF_VERTICAL) { + xsize = SCROLLBAR__DefaultWidth; + x0 = Rect.x1 + 1 - xsize; + y0 = Rect.y0; + ysize = Rect.y1 - Rect.y0 + 1; + } else { + ysize = SCROLLBAR__DefaultWidth; + y0 = Rect.y1 + 1 - ysize; + x0 = Rect.x0; + xsize = Rect.x1 - Rect.x0 + 1; + } + } + /* Create the window */ + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _SCROLLBAR_Callback, + sizeof(SCROLLBAR_Obj) - sizeof(WM_Obj)); + if (hObj) { + SCROLLBAR_Obj* pObj = SCROLLBAR_H2P(hObj); + U16 InitState; + /* Handle SpecialFlags */ + InitState = 0; + if (ExFlags & SCROLLBAR_CF_VERTICAL) { + InitState |= WIDGET_CF_VERTICAL; + } + if (ExFlags & SCROLLBAR_CF_FOCUSSABLE) { + InitState |= WIDGET_STATE_FOCUSSABLE; + } + if ((Id != GUI_ID_HSCROLL) && (Id != GUI_ID_VSCROLL)) { + InitState |= WIDGET_STATE_FOCUSSABLE; + } + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, InitState); + /* init member variables */ + SCROLLBAR_INIT_ID(pObj); + pObj->aBkColor[0] = SCROLLBAR__aDefaultBkColor[0]; + pObj->aBkColor[1] = SCROLLBAR__aDefaultBkColor[1]; + pObj->aColor[0] = SCROLLBAR__aDefaultColor[0]; + pObj->aColor[1] = SCROLLBAR__aDefaultColor[1]; + pObj->NumItems = 100; + pObj->PageSize = 10; + pObj->v = 0; + SCROLLBAR__InvalidatePartner(hObj); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "SCROLLBAR_Create failed") + } + WM_UNLOCK(); + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* SCROLLBAR_Dec +*/ +void SCROLLBAR_Dec(SCROLLBAR_Handle hObj) { + SCROLLBAR_AddValue(hObj, -1); +} + +/********************************************************************* +* +* SCROLLBAR_Inc +*/ +void SCROLLBAR_Inc(SCROLLBAR_Handle hObj) { + SCROLLBAR_AddValue(hObj, 1); +} + +/********************************************************************* +* +* SCROLLBAR_AddValue +*/ +void SCROLLBAR_AddValue(SCROLLBAR_Handle hObj, int Add) { + SCROLLBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SCROLLBAR_H2P(hObj); + SCROLLBAR_SetValue(hObj, pObj->v + Add); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SCROLLBAR_SetValue +*/ +void SCROLLBAR_SetValue(SCROLLBAR_Handle hObj, int v) { + SCROLLBAR_Obj* pObj; + int Max; + if (hObj) { + WM_LOCK(); + pObj = SCROLLBAR_H2P(hObj); + Max = pObj->NumItems - pObj->PageSize; + if (Max < 0) + Max =0; + /* Put in min/max range */ + if (v < 0) { + v = 0; + } + if (v > Max) { + v = Max; + } + if (pObj->v != v) { + pObj->v = v; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SCROLLBAR_SetNumItems +*/ +void SCROLLBAR_SetNumItems(SCROLLBAR_Handle hObj, int NumItems) { + SCROLLBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SCROLLBAR_H2P(hObj); + if (pObj->NumItems != NumItems) { + pObj->NumItems = NumItems; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SCROLLBAR_SetPageSize +*/ +void SCROLLBAR_SetPageSize(SCROLLBAR_Handle hObj, int PageSize) { + SCROLLBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SCROLLBAR_H2P(hObj); + if (pObj->PageSize != PageSize) { + pObj->PageSize = PageSize; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SCROLLBAR_SetState +*/ +void SCROLLBAR_SetState (SCROLLBAR_Handle hObj, const WM_SCROLL_STATE* pState) { + if (hObj) { + SCROLLBAR_SetPageSize(hObj, pState->PageSize); + SCROLLBAR_SetNumItems(hObj, pState->NumItems); + SCROLLBAR_SetValue (hObj, pState->v); + } +} + + +#else /* avoid empty object files */ + +void SCROLLBAR_C(void); +void SCROLLBAR_C(void){} + +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR.h b/User/system/lib/lcd/gui/Widget/SCROLLBAR.h new file mode 100644 index 0000000..180ad80 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR.h @@ -0,0 +1,121 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR.h +Purpose : SCROLLBAR include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef SCROLLBAR_H +#define SCROLLBAR_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/************************************************************ +* +* #defines +* +************************************************************* +*/ + +/************************************************************ +* +* States +*/ +#define SCROLLBAR_STATE_PRESSED WIDGET_STATE_USER0 + +/************************************************************ +* +* Create / Status flags +*/ +#define SCROLLBAR_CF_VERTICAL WIDGET_CF_VERTICAL +#define SCROLLBAR_CF_FOCUSSABLE WIDGET_STATE_FOCUSSABLE + +/********************************************************************* +* +* Public Types +* +********************************************************************** + +*/ +typedef WM_HMEM SCROLLBAR_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +SCROLLBAR_Handle SCROLLBAR_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int WinFlags, int SpecialFlags); +SCROLLBAR_Handle SCROLLBAR_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +SCROLLBAR_Handle SCROLLBAR_CreateAttached(WM_HWIN hParent, int SpecialFlags); +SCROLLBAR_Handle SCROLLBAR_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +/* Methods changing properties */ + +void SCROLLBAR_AddValue (SCROLLBAR_Handle hObj, int Add); +void SCROLLBAR_Dec (SCROLLBAR_Handle hObj); +void SCROLLBAR_Inc (SCROLLBAR_Handle hObj); +void SCROLLBAR_SetNumItems (SCROLLBAR_Handle hObj, int NumItems); +void SCROLLBAR_SetPageSize (SCROLLBAR_Handle hObj, int PageSize); +void SCROLLBAR_SetValue (SCROLLBAR_Handle hObj, int v); +int SCROLLBAR_SetWidth (SCROLLBAR_Handle hObj, int Width); +void SCROLLBAR_SetState (SCROLLBAR_Handle hObj, const WM_SCROLL_STATE* pState); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +GUI_COLOR SCROLLBAR_GetDefaultBkColor(unsigned int Index); /* Not yet documented */ +GUI_COLOR SCROLLBAR_GetDefaultColor (unsigned int Index); /* Not yet documented */ +int SCROLLBAR_GetDefaultWidth (void); + +GUI_COLOR SCROLLBAR_SetDefaultBkColor(GUI_COLOR Color, unsigned int Index); /* Not yet documented */ +GUI_COLOR SCROLLBAR_SetDefaultColor (GUI_COLOR Color, unsigned int Index); /* Not yet documented */ +int SCROLLBAR_SetDefaultWidth (int DefaultWidth); + +/********************************************************************* +* +* Query state +* +********************************************************************** +*/ +int SCROLLBAR_GetValue(SCROLLBAR_Handle hObj); + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* SCROLLBAR_H */ diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR_Create.c b/User/system/lib/lcd/gui/Widget/SCROLLBAR_Create.c new file mode 100644 index 0000000..7d9c6ab --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR_Create.c @@ -0,0 +1,60 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR_Create.c +Purpose : Implementation of scrollbar widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SCROLLBAR.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* SCROLLBAR_Create +*/ +SCROLLBAR_Handle SCROLLBAR_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int WinFlags, int SpecialFlags) { + return SCROLLBAR_CreateEx(x0, y0, xsize, ysize, hParent, WinFlags, SpecialFlags, Id); +} + +/********************************************************************* +* +* SCROLLBAR_CreateAttached +*/ +SCROLLBAR_Handle SCROLLBAR_CreateAttached(WM_HWIN hParent, int SpecialFlags) { + SCROLLBAR_Handle hThis; + int Id; + int WinFlags; + if (SpecialFlags & SCROLLBAR_CF_VERTICAL) { + Id = GUI_ID_VSCROLL; + WinFlags = WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_TOP | WM_CF_ANCHOR_BOTTOM; + } else { + Id = GUI_ID_HSCROLL; + WinFlags = WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_ANCHOR_BOTTOM | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_RIGHT; + } + hThis = SCROLLBAR_CreateEx(0, 0, 0, 0, hParent, WinFlags, SpecialFlags, Id); + WM_NotifyParent(hThis, WM_NOTIFICATION_SCROLLBAR_ADDED); + return hThis; +} + +#else /* avoid empty object files */ + void SCROLLBAR_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/SCROLLBAR_CreateIndirect.c new file mode 100644 index 0000000..90df7f8 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR_CreateIndirect.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR_Create.c +Purpose : Implementation of scrollbar widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SCROLLBAR.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* SCROLLBAR_CreateIndirect +*/ +SCROLLBAR_Handle SCROLLBAR_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + SCROLLBAR_Handle hThis; + GUI_USE_PARA(cb); + hThis = SCROLLBAR_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else /* avoid empty object files */ + void SCROLLBAR_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR_Defaults.c b/User/system/lib/lcd/gui/Widget/SCROLLBAR_Defaults.c new file mode 100644 index 0000000..5ac908e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR_Defaults.c @@ -0,0 +1,91 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR_Defaults.c +Purpose : SCROLLBAR, optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SCROLLBAR_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* SCROLLBAR_GetDefaultWidth +*/ +int SCROLLBAR_GetDefaultWidth(void) { return SCROLLBAR__DefaultWidth; } + +/********************************************************************* +* +* SCROLLBAR_GetDefaultBkColor +*/ +GUI_COLOR SCROLLBAR_GetDefaultBkColor(unsigned int Index) { + if (Index < GUI_COUNTOF(SCROLLBAR__aDefaultBkColor)) { + return SCROLLBAR__aDefaultBkColor[Index]; + } + return 0; +} + +/********************************************************************* +* +* SCROLLBAR_GetDefaultColor +*/ +GUI_COLOR SCROLLBAR_GetDefaultColor(unsigned int Index) { + if (Index < GUI_COUNTOF(SCROLLBAR__aDefaultColor)) { + return SCROLLBAR__aDefaultColor[Index]; + } + return 0; +} + +/********************************************************************* +* +* SCROLLBAR_SetDefaultWidth +*/ +int SCROLLBAR_SetDefaultWidth(int DefaultWidth) { + int OldWidth = SCROLLBAR__DefaultWidth; + SCROLLBAR__DefaultWidth = DefaultWidth; + return OldWidth; +} + +/********************************************************************* +* +* SCROLLBAR_SetDefaultBkColor +*/ +GUI_COLOR SCROLLBAR_SetDefaultBkColor(GUI_COLOR Color, unsigned int Index) { + GUI_COLOR OldColor = 0; + if (Index < GUI_COUNTOF(SCROLLBAR__aDefaultBkColor)) { + SCROLLBAR__aDefaultBkColor[Index] = Color; + } + return OldColor; +} + +/********************************************************************* +* +* SCROLLBAR_SetDefaultColor +*/ +GUI_COLOR SCROLLBAR_SetDefaultColor(GUI_COLOR Color, unsigned int Index) { + GUI_COLOR OldColor = 0; + if (Index < GUI_COUNTOF(SCROLLBAR__aDefaultColor)) { + SCROLLBAR__aDefaultColor[Index] = Color; + } + return OldColor; +} + +#else + void SCROLLBAR_Defaults_c(void) {} /* Avoid empty object files */ +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR_GetValue.c b/User/system/lib/lcd/gui/Widget/SCROLLBAR_GetValue.c new file mode 100644 index 0000000..2e2feb3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR_GetValue.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR_GetValue.c +Purpose : SCROLLBAR, optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SCROLLBAR_Private.h" + + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* SCROLLBAR_GetValue +*/ +int SCROLLBAR_GetValue(SCROLLBAR_Handle hObj) { + int r = 0; + SCROLLBAR_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SCROLLBAR_H2P(hObj); + r = pObj->v; + WM_UNLOCK(); + } + return r; +} + + +#else + void SCROLLBAR_GetValue_c(void) {} /* Avoid empty object files */ +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR_Private.h b/User/system/lib/lcd/gui/Widget/SCROLLBAR_Private.h new file mode 100644 index 0000000..79d404a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR_Private.h @@ -0,0 +1,96 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR_Private.h +Purpose : SCROLLBAR internal header file +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef SCROLLBAR_PRIVATE_H +#define SCROLLBAR_PRIVATE_H + +#include "SCROLLBAR.h" +#include "WIDGET.h" +#include "GUIDebug.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define SCROLLBAR_ID 0x4544 /* Magic numer, should be unique if possible */ + +#define SCROLLBAR_H2P(h) (SCROLLBAR_Obj*) GUI_ALLOC_h2p(h) + +#if GUI_DEBUG_LEVEL > 1 + #define SCROLLBAR_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != SCROLLBAR_ID, "xxx.c: Wrong handle type or Object not init'ed") + #define SCROLLBAR_INIT_ID(p) p->DebugId = SCROLLBAR_ID + #define SCROLLBAR_DEINIT_ID(p) p->DebugId = SCROLLBAR_ID+1 +#else + #define SCROLLBAR_ASSERT_IS_VALID_PTR(p) + #define SCROLLBAR_INIT_ID(p) + #define SCROLLBAR_DEINIT_ID(p) +#endif + +/********************************************************************* +* +* Module internal data +* +********************************************************************** +*/ +extern GUI_COLOR SCROLLBAR__aDefaultBkColor[2]; +extern GUI_COLOR SCROLLBAR__aDefaultColor[2]; +extern I16 SCROLLBAR__DefaultWidth; + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + WIDGET Widget; + GUI_COLOR aBkColor[2]; + GUI_COLOR aColor[2]; + int NumItems, v, PageSize; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif +} SCROLLBAR_Obj; + +typedef struct { + int x0_LeftArrow; + int x1_LeftArrow; + int x0_Thumb; + int x1_Thumb; + int x0_RightArrow; + int x1_RightArrow; + int x1; + int xSizeMoveable; + int ThumbSize; +} SCROLLBAR_POSITIONS; + + +void SCROLLBAR__InvalidatePartner(SCROLLBAR_Handle hObj); + +#endif /* GUI_WINSUPPORT */ +#endif /* Avoid multiple inclusion */ + + + diff --git a/User/system/lib/lcd/gui/Widget/SCROLLBAR_SetWidth.c b/User/system/lib/lcd/gui/Widget/SCROLLBAR_SetWidth.c new file mode 100644 index 0000000..d44c5ab --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SCROLLBAR_SetWidth.c @@ -0,0 +1,47 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SCROLLBAR_SetWidth.c +Purpose : SCROLLBAR, optional routine +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SCROLLBAR_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* SCROLLBAR_SetWidth +*/ +int SCROLLBAR_SetWidth(SCROLLBAR_Handle hObj, int Width) { + int r = 0; + if (hObj) { + WM_LOCK(); + r = WIDGET_SetWidth(hObj, Width); + SCROLLBAR__InvalidatePartner(hObj); /* Invalidate the partner, since it is also affected */ + WM_UNLOCK(); + } + return r; +} + + + + +#else + void SCROLLBAR_SetWidth_c(void) {} /* Avoid empty object files */ +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/SLIDER.c b/User/system/lib/lcd/gui/Widget/SLIDER.c new file mode 100644 index 0000000..79874d0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SLIDER.c @@ -0,0 +1,534 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SLIDER.c +Purpose : Implementation of slider widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "GUI_Protected.h" +#include "SLIDER.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +#ifndef SLIDER_SUPPORT_TRANSPARENCY + #define SLIDER_SUPPORT_TRANSPARENCY WM_SUPPORT_TRANSPARENCY +#endif + +/* Support for 3D effects */ +#ifndef SLIDER_USE_3D + #define SLIDER_USE_3D 1 +#endif + +/* Define colors */ +#ifndef SLIDER_BKCOLOR0_DEFAULT + #define SLIDER_BKCOLOR0_DEFAULT 0xc0c0c0 +#endif + +#ifndef SLIDER_BKCOLOR1_DEFAULT + #define SLIDER_BKCOLOR1_DEFAULT GUI_WHITE +#endif + +#ifndef SLIDER_COLOR0_DEFAULT + #define SLIDER_COLOR0_DEFAULT 0xc0c0c0 +#endif + +#ifndef SLIDER_COLOR1_DEFAULT + #define SLIDER_COLOR1_DEFAULT GUI_BLACK +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + WIDGET Widget; + GUI_COLOR aBkColor[2]; + GUI_COLOR aColor[2]; + int Min, Max, v; + int Flags; + int NumTicks; + I16 Width; + #if GUI_DEBUG_LEVEL >1 + int DebugId; + #endif +} SLIDER_Obj; + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define SLIDER_ID 0x4544 /* Magic numer, should be unique if possible */ + +#define SLIDER_H2P(h) (SLIDER_Obj*) GUI_ALLOC_h2p(h) + +#if GUI_DEBUG_LEVEL > 1 + #define SLIDER_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != SLIDER_ID, "SLIDER.c: Wrong handle type or Object not init'ed") + #define SLIDER_INIT_ID(p) p->DebugId = SLIDER_ID + #define SLIDER_DEINIT_ID(p) p->DebugId = SLIDER_ID+1 +#else + #define SLIDER_ASSERT_IS_VALID_PTR(p) + #define SLIDER_INIT_ID(p) + #define SLIDER_DEINIT_ID(p) +#endif + + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static GUI_COLOR _DefaultBkColor = SLIDER_BKCOLOR0_DEFAULT; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _Paint +*/ +static void _Paint(SLIDER_Obj* pObj, WM_HWIN hObj) { + GUI_RECT r, rFocus, rSlider, rSlot; + int x0, xsize, i, Range, NumTicks; + WIDGET__GetClientRect(&pObj->Widget, &rFocus); + GUI__ReduceRect(&r, &rFocus, 1); + NumTicks = pObj->NumTicks; + xsize = r.x1 - r.x0 + 1 - pObj->Width; + x0 = r.x0 + pObj->Width / 2; + Range = pObj->Max - pObj->Min; + if (Range == 0) { + Range = 1; + } + /* Fill with parents background color */ + #if !SLIDER_SUPPORT_TRANSPARENCY /* Not needed any more, since window is transparent*/ + if (pObj->aBkColor[0] == GUI_INVALID_COLOR) { + LCD_SetBkColor(WIDGET__GetBkColor(hObj)); + } else { + LCD_SetBkColor(pObj->aBkColor[0]); + } + GUI_Clear(); + #else + if (!WM_GetHasTrans(hObj)) { + LCD_SetBkColor(pObj->aBkColor[0]); + GUI_Clear(); + } + #endif + /* Calculate Slider position */ + rSlider = r; + rSlider.y0 = 5; + rSlider.x0 = x0 + (U32)xsize * (U32)(pObj->v - pObj->Min) / Range - pObj->Width / 2; + rSlider.x1 = rSlider.x0 + pObj->Width; + /* Calculate Slot position */ + rSlot.x0 = x0; + rSlot.x1 = x0 + xsize; + rSlot.y0 = (rSlider.y0 + rSlider.y1) / 2 - 1; + rSlot.y1 = rSlot.y0 + 3; + WIDGET__EFFECT_DrawDownRect(&pObj->Widget, &rSlot); /* Draw slot */ + /* Draw the ticks */ + if (NumTicks < 0) { + NumTicks = Range + 1; + if (NumTicks > (xsize / 5)) { + NumTicks = 11; + } + } + if (NumTicks > 1) { + LCD_SetColor(GUI_BLACK); + for (i = 0; i < NumTicks; i++) { + int x = x0 + xsize * i / (NumTicks - 1); + WIDGET__DrawVLine(&pObj->Widget, x, 1, 3); + } + } + /* Draw the slider itself */ + LCD_SetColor(pObj->aColor[0]); + WIDGET__FillRectEx(&pObj->Widget, &rSlider); + LCD_SetColor(GUI_BLACK); + WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &rSlider); + /* Draw focus */ + if (pObj->Widget.State & WIDGET_STATE_FOCUS) { + LCD_SetColor(GUI_BLACK); + WIDGET__DrawFocusRect(&pObj->Widget, &rFocus, 0); + } +} + +/********************************************************************* +* +* _SliderPressed +*/ +static void _SliderPressed(SLIDER_Handle hObj, SLIDER_Obj* pObj) { + WIDGET_OrState(hObj, SLIDER_STATE_PRESSED); + if (pObj->Widget.Win.Status & WM_SF_ISVIS) { + WM_NotifyParent(hObj, WM_NOTIFICATION_CLICKED); + } +} + +/********************************************************************* +* +* _SliderReleased +*/ +static void _SliderReleased(SLIDER_Handle hObj, SLIDER_Obj* pObj) { + WIDGET_AndState(hObj, SLIDER_STATE_PRESSED); + if (pObj->Widget.Win.Status & WM_SF_ISVIS) { + WM_NotifyParent(hObj, WM_NOTIFICATION_RELEASED); + } +} + +/********************************************************************* +* +* _OnTouch +*/ +static void _OnTouch(SLIDER_Handle hObj, SLIDER_Obj* pObj, WM_MESSAGE*pMsg) { + const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p; + if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */ + if (pState->Pressed) { + int x0, xsize, x, Sel, Range; + Range = (pObj->Max - pObj->Min); + x0 = 1 + pObj->Width / 2; /* 1 pixel focus rectangle + width of actual slider */ + x = (pObj->Widget.State & WIDGET_STATE_VERTICAL) ? pState->y : pState->x; + x -= x0; + xsize = WIDGET__GetWindowSizeX(hObj) - 2 * x0; + if (x <= 0) { + Sel = pObj->Min; + } else if (x >= xsize) { + Sel = pObj->Max; + } else { + int Div; + Div = xsize ? xsize : 1; /* Make sure we do not divide by 0, even though xsize should never be 0 in this case anyhow */ + Sel = pObj->Min + ((U32)Range * (U32)x + Div / 2) / Div; + } + if (WM_IsFocussable(hObj)) { + WM_SetFocus(hObj); + } + WM_SetCapture(hObj, 1); + SLIDER_SetValue(hObj, Sel); + if ((pObj->Widget.State & SLIDER_STATE_PRESSED) == 0){ + _SliderPressed(hObj, pObj); + } + } else { + /* React only if button was pressed before ... avoid problems with moving / hiding windows above (such as dropdown) */ + if (pObj->Widget.State & SLIDER_STATE_PRESSED) { + _SliderReleased(hObj, pObj); + } + } + } +} + +/********************************************************************* +* +* _OnKey +*/ +static void _OnKey(SLIDER_Handle hObj, WM_MESSAGE*pMsg) { + const WM_KEY_INFO* pKeyInfo; + int Key; + pKeyInfo = (const WM_KEY_INFO*)(pMsg->Data.p); + Key = pKeyInfo->Key; + if (pKeyInfo->PressedCnt > 0) { + switch (Key) { + case GUI_KEY_RIGHT: + SLIDER_Inc(hObj); + break; /* Send to parent by not doing anything */ + case GUI_KEY_LEFT: + SLIDER_Dec(hObj); + break; /* Send to parent by not doing anything */ + default: + return; + } + } +} + +/********************************************************************* +* +* _SLIDER_Callback +*/ +static void _SLIDER_Callback (WM_MESSAGE *pMsg) { + SLIDER_Handle hObj; + SLIDER_Obj* pObj; + hObj = pMsg->hWin; + pObj = SLIDER_H2P(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_PAINT: + GUI_DEBUG_LOG("SLIDER: _Callback(WM_PAINT)\n"); + _Paint(pObj, hObj); + return; + case WM_TOUCH: + _OnTouch(hObj, pObj, pMsg); + break; + case WM_KEY: + _OnKey(hObj, pMsg); + break; + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* SLIDER_CreateEx +*/ +SLIDER_Handle SLIDER_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id) +{ + SLIDER_Handle hObj; + /* Create the window */ + WM_LOCK(); + #if SLIDER_SUPPORT_TRANSPARENCY + WinFlags |= WM_CF_HASTRANS; + #endif + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _SLIDER_Callback, sizeof(SLIDER_Obj) - sizeof(WM_Obj)); + if (hObj) { + SLIDER_Obj* pObj = SLIDER_H2P(hObj); + U16 InitState; + /* Handle SpecialFlags */ + InitState = WIDGET_STATE_FOCUSSABLE; + if (ExFlags & SLIDER_CF_VERTICAL) { + InitState |= WIDGET_CF_VERTICAL; + } + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, InitState); + /* init member variables */ + SLIDER_INIT_ID(pObj); + pObj->aBkColor[0] = _DefaultBkColor; + pObj->aBkColor[1] = SLIDER_BKCOLOR1_DEFAULT; + pObj->aColor[0] = SLIDER_COLOR0_DEFAULT; + pObj->aColor[1] = SLIDER_COLOR1_DEFAULT; + pObj->Width = 8; + pObj->Max = 100; + pObj->Min = 0; + pObj->NumTicks = -1; + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "SLIDER_Create failed") + } + WM_UNLOCK(); + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* SLIDER_Dec +*/ +void SLIDER_Dec(SLIDER_Handle hObj) { + SLIDER_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + if (pObj->v > pObj->Min) { + pObj->v--; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_Inc +*/ +void SLIDER_Inc(SLIDER_Handle hObj) { + SLIDER_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + if (pObj->v < pObj->Max) { + pObj->v++; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_SetWidth +*/ +void SLIDER_SetWidth(SLIDER_Handle hObj, int Width) { + SLIDER_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + if (pObj->Width != Width) { + pObj->Width = Width; + WM_InvalidateWindow(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_SetValue +*/ +void SLIDER_SetValue(SLIDER_Handle hObj, int v) { + SLIDER_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + /* Put in min/max range */ + if (v < pObj->Min) { + v = pObj->Min; + } + if (v > pObj->Max) { + v = pObj->Max; + } + if (pObj->v != v) { + pObj->v = v; + WM_InvalidateWindow(hObj); + WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_SetRange +*/ +void SLIDER_SetRange(SLIDER_Handle hObj, int Min, int Max) { + if (hObj) { + SLIDER_Obj* pObj; + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + if (Max < Min) { + Max = Min; + } + pObj->Min = Min; + pObj->Max = Max; + if (pObj->v < Min) { + pObj->v = Min; + } + if (pObj->v > Max) { + pObj->v = Max; + } + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_SetNumTicks +*/ +void SLIDER_SetNumTicks(SLIDER_Handle hObj, int NumTicks) { + if (hObj && (NumTicks >= 0)) { + SLIDER_Obj* pObj; + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + pObj->NumTicks = NumTicks; + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_SetBkColor +*/ +void SLIDER_SetBkColor(SLIDER_Handle hObj, GUI_COLOR Color) { + if (hObj) { + SLIDER_Obj * pObj; + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + pObj->aBkColor[0] = Color; + #if SLIDER_SUPPORT_TRANSPARENCY + if (Color <= 0xFFFFFF) { + WM_ClrHasTrans(hObj); + } else { + WM_SetHasTrans(hObj); + } + #endif + WM_InvalidateWindow(hObj); + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* SLIDER_SetDefaultBkColor +*/ +void SLIDER_SetDefaultBkColor(GUI_COLOR Color) { + _DefaultBkColor = Color; +} + +/********************************************************************* +* +* Query state +* +********************************************************************** +*/ +/********************************************************************* +* +* SLIDER_GetValue +*/ +int SLIDER_GetValue(SLIDER_Handle hObj) { + int r = 0; + SLIDER_Obj* pObj; + if (hObj) { + WM_LOCK(); + pObj = SLIDER_H2P(hObj); + r = pObj->v; + WM_UNLOCK(); + } + return r; +} + + +#else /* avoid empty object files */ + +void SLIDER_C(void); +void SLIDER_C(void){} + +#endif /* #if GUI_WINSUPPORT */ + + + diff --git a/User/system/lib/lcd/gui/Widget/SLIDER.h b/User/system/lib/lcd/gui/Widget/SLIDER.h new file mode 100644 index 0000000..d11af72 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SLIDER.h @@ -0,0 +1,114 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SLIDER.h +Purpose : SLIDER include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef SLIDER_H +#define SLIDER_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ +#include "WIDGET.h" /* Req. for Create indirect data structure */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/************************************************************ +* +* #defines +* +************************************************************* +*/ + +/************************************************************ +* +* States +*/ +#define SLIDER_STATE_PRESSED WIDGET_STATE_USER0 + +/************************************************************ +* +* Create / Status flags +*/ +#define SLIDER_CF_VERTICAL WIDGET_CF_VERTICAL + +/********************************************************************* +* +* Public Types +* +********************************************************************** + +*/ +typedef WM_HMEM SLIDER_Handle; + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +SLIDER_Handle SLIDER_Create (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int WinFlags, int SpecialFlags); +SLIDER_Handle SLIDER_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +SLIDER_Handle SLIDER_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +/* Methods changing properties */ + +/* Note: These are just examples. The actual methods available for the + widget will depend on the type of widget. */ +void SLIDER_Inc (SLIDER_Handle hObj); +void SLIDER_Dec (SLIDER_Handle hObj); +void SLIDER_SetBkColor (SLIDER_Handle hObj, GUI_COLOR Color); +void SLIDER_SetWidth (SLIDER_Handle hObj, int Width); +void SLIDER_SetValue (SLIDER_Handle hObj, int v); +void SLIDER_SetRange (SLIDER_Handle hObj, int Min, int Max); +void SLIDER_SetNumTicks (SLIDER_Handle hObj, int NumTicks); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +void SLIDER_SetDefaultBkColor(GUI_COLOR Color); + +/********************************************************************* +* +* Query state +* +********************************************************************** +*/ +int SLIDER_GetValue(SLIDER_Handle hObj); + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* SLIDER_H */ diff --git a/User/system/lib/lcd/gui/Widget/SLIDER_Create.c b/User/system/lib/lcd/gui/Widget/SLIDER_Create.c new file mode 100644 index 0000000..945c62c --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SLIDER_Create.c @@ -0,0 +1,40 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SLIDER_Create.c +Purpose : Implementation of slider widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SLIDER.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* SLIDER_Create +*/ +SLIDER_Handle SLIDER_Create(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int WinFlags, int SpecialFlags) { + return SLIDER_CreateEx(x0, y0, xsize, ysize, hParent, WinFlags, SpecialFlags, Id); +} + +#else /* avoid empty object files */ + void SLIDER_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/SLIDER_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/SLIDER_CreateIndirect.c new file mode 100644 index 0000000..76b3718 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/SLIDER_CreateIndirect.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : SLIDER_CreateIndirect.c +Purpose : Implementation of slider widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "SLIDER.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* SLIDER_CreateIndirect +*/ +SLIDER_Handle SLIDER_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + SLIDER_Handle hThis; + GUI_USE_PARA(cb); + hThis = SLIDER_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, 0, pCreateInfo->Flags, pCreateInfo->Id); + return hThis; +} + +#else /* avoid empty object files */ + void SLIDER_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/TEXT.c b/User/system/lib/lcd/gui/Widget/TEXT.c new file mode 100644 index 0000000..b29c78f --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT.c @@ -0,0 +1,224 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT.c +Purpose : Implementation of text widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "TEXT_Private.h" +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +/* Define default fonts */ +#ifndef TEXT_FONT_DEFAULT + #define TEXT_FONT_DEFAULT &GUI_Font13_1 +#endif + +#ifndef TEXT_DEFAULT_TEXT_COLOR + #define TEXT_DEFAULT_TEXT_COLOR GUI_BLACK +#endif + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +static const GUI_FONT GUI_UNI_PTR * _pDefaultFont = TEXT_FONT_DEFAULT; +static GUI_COLOR _DefaultTextColor = TEXT_DEFAULT_TEXT_COLOR; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _FreeAttached +*/ +static void _FreeAttached(TEXT_Obj* pObj) { + GUI_ALLOC_FreePtr(&pObj->hpText); +} + +/********************************************************************* +* +* _Paint +*/ +static void _Paint(TEXT_Handle hObj, TEXT_Obj* pObj) { + const char * s; + GUI_RECT Rect; + GUI_USE_PARA(hObj); + LCD_SetColor(pObj->TextColor); + GUI_SetFont (pObj->pFont); + /* Fill with parents background color */ + #if !TEXT_SUPPORT_TRANSPARENCY /* Not needed any more, since window is transparent*/ + if (pObj->BkColor == GUI_INVALID_COLOR) { + LCD_SetBkColor(WIDGET__GetBkColor(hObj)); + } else { + LCD_SetBkColor(pObj->BkColor); + } + GUI_Clear(); + #else + if (!WM_GetHasTrans(hObj)) { + LCD_SetBkColor(pObj->BkColor); + GUI_Clear(); + } + #endif + /* Show the text */ + if (pObj->hpText) { + s = (const char*) GUI_ALLOC_h2p(pObj->hpText); + GUI_SetTextMode(GUI_TM_TRANS); + WM_GetClientRect(&Rect); + GUI_DispStringInRect(s, &Rect, pObj->Align); + } +} + +/********************************************************************* +* +* _Delete +*/ +static void _Delete(TEXT_Obj* pObj) { + /* Delete attached objects (if any) */ + GUI_DEBUG_LOG("TEXT: Delete() Deleting attached items"); + _FreeAttached(pObj); +} + +/********************************************************************* +* +* _TEXT_Callback +*/ +static void _TEXT_Callback (WM_MESSAGE*pMsg) { + TEXT_Handle hObj = pMsg->hWin; + TEXT_Obj* pObj = TEXT_H2P(hObj); + /* Let widget handle the standard messages */ + if (WIDGET_HandleActive(hObj, pMsg) == 0) { + return; + } + switch (pMsg->MsgId) { + case WM_PAINT: + GUI_DEBUG_LOG("TEXT: _Callback(WM_PAINT)\n"); + _Paint(hObj, pObj); + return; + case WM_DELETE: + GUI_DEBUG_LOG("TEXT: _Callback(WM_DELETE)\n"); + _Delete(pObj); + break; /* No return here ... WM_DefaultProc needs to be called */ + } + WM_DefaultProc(pMsg); +} + +/********************************************************************* +* +* Exported routines: Create +* +********************************************************************** +*/ + +/* Note: the parameters to a create function may vary. + Some widgets may have multiple create functions */ + +/********************************************************************* +* +* TEXT_CreateEx +*/ +TEXT_Handle TEXT_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, const char* pText) +{ + TEXT_Handle hObj; + /* Create the window */ + #if TEXT_SUPPORT_TRANSPARENCY + WinFlags |= WM_CF_HASTRANS; + #endif + hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _TEXT_Callback, + sizeof(TEXT_Obj) - sizeof(WM_Obj)); + if (hObj) { + TEXT_Obj* pObj; + WM_HMEM hMem = 0; + WM_LOCK(); + pObj = TEXT_H2P(hObj); + /* init widget specific variables */ + WIDGET__Init(&pObj->Widget, Id, 0); + /* init member variables */ + TEXT_INIT_ID(pObj); + if (pText) { + hMem = GUI_ALLOC_AllocZero(strlen(pText) + 1); + if (hMem) { + strcpy((char*) GUI_ALLOC_h2p(hMem), pText); + } + } + pObj->hpText = hMem; + pObj->Align = ExFlags; + pObj->pFont = _pDefaultFont; + pObj->BkColor = GUI_INVALID_COLOR; + pObj->TextColor = _DefaultTextColor; + WM_UNLOCK(); + } else { + GUI_DEBUG_ERROROUT_IF(hObj==0, "TEXT_Create failed") + } + return hObj; +} + +/********************************************************************* +* +* Exported routines: Various methods +* +********************************************************************** +*/ +/********************************************************************* +* +* TEXT_SetDefaultFont +*/ +void TEXT_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont) { + _pDefaultFont = pFont; +} + +/********************************************************************* +* +* TEXT_SetDefaultTextColor +*/ +void TEXT_SetDefaultTextColor(GUI_COLOR Color) { + _DefaultTextColor = Color; +} + +/********************************************************************* +* +* TEXT_GetDefaultFont +*/ +const GUI_FONT GUI_UNI_PTR * TEXT_GetDefaultFont(void) { + return _pDefaultFont; +} + +#else /* avoid empty object files */ + +void TEXT_C(void); +void TEXT_C(void){} + +#endif /* #if GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/TEXT.h b/User/system/lib/lcd/gui/Widget/TEXT.h new file mode 100644 index 0000000..56d436d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT.h @@ -0,0 +1,141 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT.h +Purpose : TEXT include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef TEXT_H +#define TEXT_H + +#include "WM.h" +#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */ +#include "WIDGET.h" /* Req. for Create indirect data structure */ +#include "GUIDebug.h" /* Req. for GUI_DEBUG_LEVEL */ + +#if GUI_WINSUPPORT + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/************************************************************ +* +* #defines +* +************************************************************* +*/ + +/************************************************************ +* +* Create / Status flags +*/ +#define TEXT_CF_LEFT GUI_TA_LEFT +#define TEXT_CF_RIGHT GUI_TA_RIGHT +#define TEXT_CF_HCENTER GUI_TA_HCENTER + +#define TEXT_CF_VCENTER GUI_TA_VCENTER +#define TEXT_CF_TOP GUI_TA_TOP +#define TEXT_CF_BOTTOM GUI_TA_BOTTOM + + +/********************************************************************* +* +* Public Types +* +********************************************************************** + +*/ +typedef WM_HMEM TEXT_Handle; + +/********************************************************************* +* +* Standard member functions +* +********************************************************************** +*/ + +#define TEXT_EnableMemdev(hObj) WM_EnableMemdev(hObj) +#define TEXT_DisableMemdev(hObj) WM_DisableMemdev(hObj) +#define TEXT_Delete(hObj) WM_DeleteWindow(hObj) +#define TEXT_Paint(hObj) WM_Paint(hObj) +#define TEXT_Invalidate(hObj) WM_InvalidateWindow(hObj) + +/********************************************************************* +* +* Create functions +* +********************************************************************** +*/ + +TEXT_Handle TEXT_Create (int x0, int y0, int xsize, int ysize, int Id, int Flags, const char * s, int Align); +TEXT_Handle TEXT_CreateAsChild (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, const char * s, int Align); +TEXT_Handle TEXT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb); +TEXT_Handle TEXT_CreateEx (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, + int WinFlags, int ExFlags, int Id, const char* pText); + +/********************************************************************* +* +* Member functions +* +********************************************************************** +*/ + +/* Methods changing properties */ + +void TEXT_SetBkColor (TEXT_Handle pObj, GUI_COLOR Color); /* Obsolete. Left in GUI for compatibility to older versions */ +void TEXT_SetFont (TEXT_Handle pObj, const GUI_FONT GUI_UNI_PTR * pFont); +void TEXT_SetText (TEXT_Handle pObj, const char* s); +void TEXT_SetTextAlign(TEXT_Handle pObj, int Align); +void TEXT_SetTextColor(TEXT_Handle pObj, GUI_COLOR Color); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +void TEXT_SetDefaultFont(const GUI_FONT GUI_UNI_PTR * pFont); +const GUI_FONT GUI_UNI_PTR * TEXT_GetDefaultFont(void); +void TEXT_SetDefaultTextColor(GUI_COLOR Color); + +/********************************************************************* +* +* Internal: Object definition +* +********************************************************************** +*/ + +typedef struct { + WIDGET Widget; + WM_HMEM hpText; + const GUI_FONT GUI_UNI_PTR * pFont; + I16 Align; + GUI_COLOR TextColor; + GUI_COLOR BkColor; + #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + int DebugId; + #endif +} TEXT_Obj; + +#define TEXT_H2P(h) (TEXT_Obj*) GUI_ALLOC_h2p(h) + +#if defined(__cplusplus) + } +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* TEXT_H */ diff --git a/User/system/lib/lcd/gui/Widget/TEXT_Create.c b/User/system/lib/lcd/gui/Widget/TEXT_Create.c new file mode 100644 index 0000000..4cdb1ed --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_Create.c @@ -0,0 +1,48 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_Create.c +Purpose : Implementation of text widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "TEXT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* TEXT_Create +*/ +TEXT_Handle TEXT_Create(int x0, int y0, int xsize, int ysize, int Id, int Flags, const char * s, int Align) { + return TEXT_CreateEx(x0, y0, xsize, ysize, WM_HMEM_NULL, Flags, Align, Id, s); +} + +/********************************************************************* +* +* TEXT_CreateAsChild +*/ +TEXT_Handle TEXT_CreateAsChild(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, const char * s, int Align) { + return TEXT_CreateEx(x0, y0, xsize, ysize, hParent, Flags, Align, Id, s); +} + +#else /* avoid empty object files */ + void TEXT_Create_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/TEXT_CreateIndirect.c b/User/system/lib/lcd/gui/Widget/TEXT_CreateIndirect.c new file mode 100644 index 0000000..c068e80 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_CreateIndirect.c @@ -0,0 +1,44 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_CreateIndirect.c +Purpose : Implementation of text widget +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "TEXT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* TEXT_CreateIndirect +*/ +TEXT_Handle TEXT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + TEXT_Handle hThis; + GUI_USE_PARA(cb); + hThis = TEXT_CreateEx(pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, + hWinParent, WM_CF_SHOW, pCreateInfo->Flags, pCreateInfo->Id, pCreateInfo->pName); + return hThis; +} + +#else /* avoid empty object files */ + void TEXT_CreateIndirect_C(void) {} +#endif diff --git a/User/system/lib/lcd/gui/Widget/TEXT_Private.h b/User/system/lib/lcd/gui/Widget/TEXT_Private.h new file mode 100644 index 0000000..180a07d --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_Private.h @@ -0,0 +1,59 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT.h +Purpose : TEXT include +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef TEXT_PRIVATE_H +#define TEXT_PRIVATE_H + +#include "TEXT.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +#ifndef TEXT_SUPPORT_TRANSPARENCY + #define TEXT_SUPPORT_TRANSPARENCY WM_SUPPORT_TRANSPARENCY +#endif + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define TEXT_ID 0x4544 /* Magic numer, should be unique if possible */ + + +#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL + #define TEXT_ASSERT_IS_VALID_PTR(p) DEBUG_ERROROUT_IF(p->DebugId != TEXT_ID, "xxx.c: Wrong handle type or Object not init'ed") + #define TEXT_INIT_ID(p) p->DebugId = TEXT_ID + #define TEXT_DEINIT_ID(p) p->DebugId = TEXT_ID+1 +#else + #define TEXT_ASSERT_IS_VALID_PTR(p) + #define TEXT_INIT_ID(p) + #define TEXT_DEINIT_ID(p) +#endif + +#endif /* if GUI_WINSUPPORT */ +#endif /* TEXT_PRIVATE_H */ diff --git a/User/system/lib/lcd/gui/Widget/TEXT_SetBkColor.c b/User/system/lib/lcd/gui/Widget/TEXT_SetBkColor.c new file mode 100644 index 0000000..023af21 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_SetBkColor.c @@ -0,0 +1,62 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_SetBkColor.c +Purpose : Implementation of TEXT_SetBkColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "TEXT_Private.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* TEXT_SetBkColor +*/ +void TEXT_SetBkColor(TEXT_Handle hObj, GUI_COLOR Color) { + if (hObj) { + TEXT_Obj* pObj; + WM_LOCK(); + pObj = TEXT_H2P(hObj); + pObj->BkColor = Color; + #if TEXT_SUPPORT_TRANSPARENCY + if (Color <= 0xFFFFFF) { + WM_ClrHasTrans(hObj); + } else { + WM_SetHasTrans(hObj); + } + #endif + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + + +#else /* avoid empty object files */ + +void TEXT_SetBkColor_c(void); +void TEXT_SetBkColor_c(void){} + +#endif /* #if GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/TEXT_SetFont.c b/User/system/lib/lcd/gui/Widget/TEXT_SetFont.c new file mode 100644 index 0000000..55a14f6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_SetFont.c @@ -0,0 +1,66 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_SetFont.c +Purpose : Implementation of TEXT_SetFont +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "TEXT.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* TEXT_SetFont +*/ +void TEXT_SetFont(TEXT_Handle hObj, const GUI_FONT GUI_UNI_PTR * pFont) { + if (hObj) { + TEXT_Obj* pObj; + WM_LOCK(); + pObj = TEXT_H2P(hObj); + pObj->pFont = pFont; + /* + GUI_ALLOC_FreePtr(&pObj->hpText); + if (s) { + hMem = GUI_ALLOC_AllocZero(strlen(s)+1); + if (hMem) { + strcpy((char *) GUI_ALLOC_h2p(hMem), s); + } + pObj->hpText = hMem; + } + */ + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + + +#else /* avoid empty object files */ + +void TEXT_SetFont_c(void); +void TEXT_SetFont_c(void){} + +#endif /* #if GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/TEXT_SetText.c b/User/system/lib/lcd/gui/Widget/TEXT_SetText.c new file mode 100644 index 0000000..13645c6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_SetText.c @@ -0,0 +1,56 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_SetText.c +Purpose : Implementation of TEXT_SetText +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "TEXT.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* TEXT_SetText +*/ +void TEXT_SetText(TEXT_Handle hObj, const char* s) { + if (hObj) { + TEXT_Obj* pObj; + WM_LOCK(); + pObj = TEXT_H2P(hObj); + if (GUI__SetText(&pObj->hpText, s)) { + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void TEXT_SetText_c(void); +void TEXT_SetText_c(void){} + +#endif /* #if GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/TEXT_SetTextAlign.c b/User/system/lib/lcd/gui/Widget/TEXT_SetTextAlign.c new file mode 100644 index 0000000..d67fc9a --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_SetTextAlign.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_SetTextAlign.c +Purpose : Implementation of TEXT_SetTextAlign +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include +#include "TEXT.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* TEXT_SetTextAlign +*/ +void TEXT_SetTextAlign(TEXT_Handle hObj, int Align) { + if (hObj) { + TEXT_Obj* pObj; + WM_LOCK(); + pObj = TEXT_H2P(hObj); + pObj->Align = Align; + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + +#else /* avoid empty object files */ + +void TEXT_SetTextAlign_c(void); +void TEXT_SetTextAlign_c(void){} + +#endif /* #if GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/TEXT_SetTextColor.c b/User/system/lib/lcd/gui/Widget/TEXT_SetTextColor.c new file mode 100644 index 0000000..814528e --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/TEXT_SetTextColor.c @@ -0,0 +1,55 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : TEXT_SetTextColor.c +Purpose : Implementation of TEXT_SetTextColor +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "TEXT.h" +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* TEXT_SetTextColor +*/ +void TEXT_SetTextColor(TEXT_Handle hObj, GUI_COLOR Color) { + if (hObj) { + TEXT_Obj* pObj; + WM_LOCK(); + pObj = TEXT_H2P(hObj); + pObj->TextColor = Color; + WM_Invalidate(hObj); + WM_UNLOCK(); + } +} + + +#else /* avoid empty object files */ + +void TEXT_SetTextColor_c(void); +void TEXT_SetTextColor_c(void){} + +#endif /* #if GUI_WINSUPPORT */ + + diff --git a/User/system/lib/lcd/gui/Widget/WIDGET.c b/User/system/lib/lcd/gui/Widget/WIDGET.c new file mode 100644 index 0000000..056c047 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET.c @@ -0,0 +1,475 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET.c +Purpose : Widget core routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +const WIDGET_EFFECT* _pEffectDefault = &WIDGET_Effect_3D; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _UpdateChildPositions +*/ +static void _UpdateChildPostions(WM_HWIN hObj, int Diff) { + WM_Obj* pObj; + WM_LOCK(); + pObj = (WM_Obj*)WM_H2P(hObj); + WM__UpdateChildPositions(pObj, -Diff, -Diff, Diff, Diff); + WM_UNLOCK(); +} + +/********************************************************************* +* +* _EffectRequiresRedraw +* +* Purpose +* Check if the effect to draw is inside the invalid rectangle. +* Returns: +* 0 if nothing need to be done. +* 1 if the effect needs to be drawn +*/ +static int _EffectRequiresRedraw(const WIDGET* pWidget, const GUI_RECT * pRect) { + int EffectSize = pWidget->pEffect->EffectSize; + GUI_RECT InvalidRect; + InvalidRect = pWidget->Win.InvalidRect; + WM__Client2Screen(&pWidget->Win, &InvalidRect); + /* Check if there a part of the effect is inside the invalid rectangle */ + if ((pRect->x0 + EffectSize) > InvalidRect.x0) { + return 1; /* Overlap ... Drawing required */ + } + if ((pRect->x1 - EffectSize) < InvalidRect.x1) { + return 1; /* Overlap ... Drawing required */ + } + if ((pRect->y0 + EffectSize) > InvalidRect.y0) { + return 1; /* Overlap ... Drawing required */ + } + if ((pRect->y1 - EffectSize) < InvalidRect.y1) { + return 1; /* Overlap ... Drawing required */ + } + return 0; /* No overlap ! */ +} + + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET__RotateRect90 +*/ +void WIDGET__RotateRect90(WIDGET* pWidget, GUI_RECT* pDest, const GUI_RECT* pRect) { + int x0, x1, XSize; + x0 = pRect->x0; + x1 = pRect->x1; + XSize = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0; + pDest->x0 = XSize - pRect->y1; + pDest->x1 = XSize - pRect->y0; + pDest->y0 = x0; + pDest->y1 = x1; + +} + +/********************************************************************* +* +* WIDGET__GetClientRect + + Returns the logical client rectangle, which means the normal + client rectangle for widgets with their standard orientation + and the rotated one for rotated widgets. +*/ +void WIDGET__GetClientRect(WIDGET* pWidget, GUI_RECT* pRect) { + if (pWidget->State & WIDGET_STATE_VERTICAL) { + GUI_RECT Rect; + WM_GetClientRect(&Rect); + pRect->x0 = Rect.y0; + pRect->x1 = Rect.y1; + pRect->y0 = Rect.x0; + pRect->y1 = Rect.x1; + } else { + WM_GetClientRect(pRect); + } +} + +/********************************************************************* +* +* WIDGET__GetBkColor +*/ +GUI_COLOR WIDGET__GetBkColor(WM_HWIN hObj) { + GUI_COLOR BkColor = WM_GetBkColor(WM_GetParent(hObj)); + if (BkColor == GUI_INVALID_COLOR) { + BkColor = DIALOG_GetBkColor(); + } + return BkColor; +} + +/********************************************************************* +* +* WIDGET__GetInsideRect +*/ +void WIDGET__GetInsideRect(WIDGET* pWidget, GUI_RECT* pRect) { + WM__GetClientRectWin(&pWidget->Win, pRect); + GUI__ReduceRect(pRect, pRect, pWidget->pEffect->EffectSize); +} + +/********************************************************************* +* +* WIDGET__GetXSize +*/ +int WIDGET__GetXSize(const WIDGET* pWidget) { + int r; + if (pWidget->State & WIDGET_STATE_VERTICAL) { + r = pWidget->Win.Rect.y1 - pWidget->Win.Rect.y0; + } else { + r = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0; + } + return r + 1; +} + +/********************************************************************* +* +* WIDGET__GetYSize +*/ +int WIDGET__GetYSize(const WIDGET* pWidget) { + int r; + if (pWidget->State & WIDGET_STATE_VERTICAL) { + r = pWidget->Win.Rect.x1 - pWidget->Win.Rect.x0; + } else { + r = pWidget->Win.Rect.y1 - pWidget->Win.Rect.y0; + } + return r + 1; +} + +/******************************************************************* +* +* WIDGET__GetWindowSizeX + + Return width (or height in case of rotation) of window in pixels +*/ +int WIDGET__GetWindowSizeX(WM_HWIN hWin) { + WIDGET* pWidget = WIDGET_H2P(hWin); + if (pWidget->State & WIDGET_STATE_VERTICAL) { + return WM_GetWindowSizeY(hWin); + } else { + return WM_GetWindowSizeX(hWin); + } +} + +/********************************************************************* +* +* WIDGET_SetState +*/ +void WIDGET_SetState(WM_HWIN hObj, int State) { + WIDGET* pWidget; + WM_LOCK(); + pWidget = WIDGET_H2P(hObj); + if (State != pWidget->State) { + pWidget->State = State; + WM_Invalidate(hObj); + } + WM_UNLOCK(); +} + +/********************************************************************* +* +* WIDGET_GetState +*/ +int WIDGET_GetState(WM_HWIN hObj) { + int Ret = 0; + WIDGET * pWidget; + if (hObj) { + WM_LOCK(); + pWidget = WIDGET_H2P(hObj); + Ret = pWidget->State; + WM_UNLOCK(); + } + return Ret; +} + +/********************************************************************* +* +* WIDGET_OrState +*/ +void WIDGET_OrState(WM_HWIN hObj, int State) { + if (hObj) { + WIDGET* pWidget; + WM_LOCK(); + pWidget = WIDGET_H2P(hObj); + if (State != (pWidget->State & State)) { + pWidget->State |= State; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* WIDGET_AndState + + Purpose: + Clear flags in the State element of the widget. + The bits to be cleared are set. + Example: + ...(..., 3); // Clears bit 0, 1 int the state member + +*/ +void WIDGET_AndState(WM_HWIN hObj, int Mask) { + U16 StateNew; + if (hObj) { + WIDGET* pWidget; + WM_LOCK(); + pWidget = WIDGET_H2P(hObj); + StateNew = pWidget->State & (~Mask); + if (pWidget->State != StateNew) { + pWidget->State = StateNew; + WM_Invalidate(hObj); + } + WM_UNLOCK(); + } +} + +/********************************************************************* +* +* WIDGET__Init +*/ +void WIDGET__Init(WIDGET* pWidget, int Id, U16 State) { + pWidget->pEffect = _pEffectDefault; + pWidget->State = State; + pWidget->Id = Id; +} + + +/********************************************************************* +* +* WIDGET_HandleActive +*/ +int WIDGET_HandleActive(WM_HWIN hObj, WM_MESSAGE* pMsg) { + int Diff, Notification; + WIDGET* pWidget = WIDGET_H2P(hObj); + switch (pMsg->MsgId) { + case WM_WIDGET_SET_EFFECT: + Diff = pWidget->pEffect->EffectSize; + pWidget->pEffect = (const WIDGET_EFFECT*)pMsg->Data.p; + Diff -= pWidget->pEffect->EffectSize; + _UpdateChildPostions(hObj, Diff); + WM_InvalidateWindow(hObj); + return 0; /* Message handled -> Return */ + case WM_GET_ID: + pMsg->Data.v = pWidget->Id; + return 0; /* Message handled -> Return */ + case WM_PID_STATE_CHANGED: + if (pWidget->State & WIDGET_STATE_FOCUSSABLE) { + const WM_PID_STATE_CHANGED_INFO * pInfo = (const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p; + if (pInfo->State) { + WM_SetFocus(hObj); + } + } + break; + case WM_TOUCH_CHILD: + /* A descendent (child) has been touched or released. + If it has been touched, we need to get to top. + */ + { + const WM_MESSAGE * pMsgOrg; + const GUI_PID_STATE * pState; + pMsgOrg = (const WM_MESSAGE*)pMsg->Data.p; /* The original touch message */ + pState = (const GUI_PID_STATE*)pMsgOrg->Data.p; + if (pState) { /* Message may not have a valid pointer (moved out) ! */ + if (pState->Pressed) { + WM_BringToTop(hObj); + return 0; /* Message handled -> Return */ + } + } + } + break; + case WM_SET_ID: + pWidget->Id = pMsg->Data.v; + return 0; /* Message handled -> Return */ + case WM_SET_FOCUS: + if (pMsg->Data.v == 1) { + WIDGET_SetState(hObj, pWidget->State | WIDGET_STATE_FOCUS); + Notification = WM_NOTIFICATION_GOT_FOCUS; + } else { + WIDGET_SetState(hObj, pWidget->State & ~WIDGET_STATE_FOCUS); + Notification = WM_NOTIFICATION_LOST_FOCUS; + } + WM_NotifyParent(hObj, Notification); + pMsg->Data.v = 0; /* Focus change accepted */ + return 0; + case WM_GET_ACCEPT_FOCUS: + pMsg->Data.v = (pWidget->State & WIDGET_STATE_FOCUSSABLE) ? 1 : 0; /* Can handle focus */ + return 0; /* Message handled */ + case WM_GET_INSIDE_RECT: + WIDGET__GetInsideRect(pWidget, (GUI_RECT*)pMsg->Data.p); + return 0; /* Message handled */ + } + return 1; /* Message NOT handled */ +} + +/********************************************************************* +* +* WIDGET__SetScrollState +*/ +void WIDGET__SetScrollState(WM_HWIN hWin, const WM_SCROLL_STATE* pVState, const WM_SCROLL_STATE* pHState) { + WM_HWIN hScroll; + /* vertical scrollbar */ + hScroll = WM_GetDialogItem(hWin, GUI_ID_VSCROLL); + WM_SetScrollState(hScroll, pVState); + /* horizontal scrollbar */ + hScroll = WM_GetDialogItem(hWin, GUI_ID_HSCROLL); + WM_SetScrollState(hScroll, pHState); +} + +/********************************************************************* +* +* WIDGET__DrawFocusRect +*/ +void WIDGET__DrawFocusRect(WIDGET* pWidget, const GUI_RECT* pRect, int Dist) { + GUI_RECT Rect; + if (pWidget->State & WIDGET_STATE_VERTICAL) { + WIDGET__RotateRect90(pWidget, &Rect, pRect); + pRect = &Rect; + } + GUI_DrawFocusRect(pRect, Dist); +} + +/********************************************************************* +* +* WIDGET__DrawVLine +*/ +void WIDGET__DrawVLine(WIDGET* pWidget, int x, int y0, int y1) { + if (pWidget->State & WIDGET_STATE_VERTICAL) { + GUI_RECT r0, r1; + r0.x0 = x; + r0.x1 = x; + r0.y0 = y0; + r0.y1 = y1; + WIDGET__RotateRect90(pWidget, &r1, &r0); + GUI_DrawHLine(r1.y0, r1.x0, r1.x1); + } else { + GUI_DrawVLine(x, y0, y1); + } +} + +/********************************************************************* +* +* WIDGET__FillRectEx +*/ +void WIDGET__FillRectEx(WIDGET* pWidget, const GUI_RECT* pRect) { + if (pWidget->State & WIDGET_STATE_VERTICAL) { + GUI_RECT r; + WIDGET__RotateRect90(pWidget, &r, pRect); + pRect = &r; + } + GUI_FillRectEx(pRect); +} + +/********************************************************************* +* +* WIDGET__EFFECT_DrawDownRect +*/ +void WIDGET__EFFECT_DrawDownRect(WIDGET* pWidget, GUI_RECT* pRect) { + GUI_RECT Rect; + if (pRect == NULL) { + WM_GetClientRect(&Rect); + pRect = &Rect; + } + if (pWidget->State & WIDGET_STATE_VERTICAL) { + WIDGET__RotateRect90(pWidget, &Rect, pRect); + pRect = &Rect; + } + if (_EffectRequiresRedraw(pWidget, pRect)) { + pWidget->pEffect->pfDrawDownRect(pRect); + } +} + +/********************************************************************* +* +* WIDGET__EFFECT_DrawDown +*/ +void WIDGET__EFFECT_DrawDown(WIDGET* pWidget) { + WIDGET__EFFECT_DrawDownRect(pWidget, NULL); +} + +/********************************************************************* +* +* WIDGET__EFFECT_DrawUpRect +*/ +void WIDGET__EFFECT_DrawUpRect(WIDGET* pWidget, GUI_RECT* pRect) { + GUI_RECT Rect; + if (pWidget->State & WIDGET_STATE_VERTICAL) { + WIDGET__RotateRect90(pWidget, &Rect, pRect); + pRect = &Rect; + } + if (_EffectRequiresRedraw(pWidget, pRect)) { + pWidget->pEffect->pfDrawUpRect(pRect); + } +} + +/********************************************************************* +* +* WIDGET_SetDefaultEffect +*/ +const WIDGET_EFFECT* WIDGET_SetDefaultEffect(const WIDGET_EFFECT* pEffect) { + const WIDGET_EFFECT* r; + r = _pEffectDefault; + _pEffectDefault = pEffect; + return r; +} + +/********************************************************************* +* +* WIDGET_GetDefaultEffect +*/ +const WIDGET_EFFECT* WIDGET_GetDefaultEffect(void) { + return _pEffectDefault; +} + + +#else /* Avoid problems with empty object modules */ + void WIDGET_C(void) {} +#endif /* GUI_WINSUPPORT */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/WIDGET.h b/User/system/lib/lcd/gui/Widget/WIDGET.h new file mode 100644 index 0000000..6156b30 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET.h @@ -0,0 +1,231 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET.h +Purpose : Widget interface +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef WIDGET_H /* Avoid multiple inclusion */ +#define WIDGET_H + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +#include "WM_Intern.h" /* Window manager, including some internals, which speed things up */ + +#if GUI_WINSUPPORT + +#include "SCROLLBAR.h" + + +/********************************************************************* +* +* defines +* +********************************************************************** +*/ +#define WIDGET_H2P(hWin) ((WIDGET*)GUI_ALLOC_h2p(hWin)) + + +/********************************************************************* +* +* States +*/ + +#define WIDGET_STATE_FOCUS (1<<0) +#define WIDGET_STATE_VERTICAL (1<<3) +#define WIDGET_STATE_FOCUSSABLE (1<<4) + +#define WIDGET_STATE_USER0 (1<<8) /* Freely available for derived widget */ +#define WIDGET_STATE_USER1 (1<<9) /* Freely available for derived widget */ +#define WIDGET_STATE_USER2 (1<<10) /* Freely available for derived widget */ + +#define WIDGET_ITEM_DRAW 0 +#define WIDGET_ITEM_GET_XSIZE 1 +#define WIDGET_ITEM_GET_YSIZE 2 + +/********************************************************************* +* +* Messages +*/ + +#define WM_WIDGET_SET_EFFECT WM_WIDGET + 0 + +/********************************************************************* +* +* Create flags +*/ + +#define WIDGET_CF_VERTICAL WIDGET_STATE_VERTICAL + +/********************************************************************* +* +* typedefs +* +********************************************************************** +*/ + +typedef struct { + WM_HWIN hWin; + int Cmd; /* WIDGET_ITEM_GET_XSIZE, WIDGET_ITEM_GET_YSIZE, WIDGET_ITEM_DRAW, */ + int ItemIndex; + int x0, y0; +} WIDGET_ITEM_DRAW_INFO; + +typedef int WIDGET_DRAW_ITEM_FUNC(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo); + + +/********************************************************************* +* +* Widget object +* +* The widget object is the base class for most widgets +*/ +typedef struct { + void (*pfDrawUp)(void); + void (*pfDrawDown)(void); + void (*pfDrawUpRect) (const GUI_RECT *pRect); + void (*pfDrawDownRect)(const GUI_RECT *pRect); + void (*pfGetRect)(GUI_RECT *pRect); + int EffectSize; +} WIDGET_EFFECT; + +typedef struct { + WM_Obj Win; + const WIDGET_EFFECT* pEffect; + I16 Id; + U16 State; +} WIDGET; + + +/********************************************************************* +* +* GUI_DRAW +* +* The GUI_DRAW object is used as base class for selfdrawing, +* non-windows objects. They are used as content of different widgets, +* such as the bitmap or header widgets. +*/ +/* Declare Object struct */ +typedef struct GUI_DRAW GUI_DRAW; +typedef void GUI_DRAW_SELF_CB (void); +/* Declare Object constants (member functions etc) */ +typedef struct { + void (* pfDraw) (const GUI_DRAW * pObj, int x, int y); + int (* pfGetXSize)(const GUI_DRAW * pObj); + int (* pfGetYSize)(const GUI_DRAW * pObj); +} GUI_DRAW_CONSTS; + +/* Declare Object */ +struct GUI_DRAW { + const GUI_DRAW_CONSTS* pConsts; + union { + const void * pData; + GUI_DRAW_SELF_CB* pfDraw; + } Data; + I16 xOff, yOff; +}; + +typedef WM_HMEM GUI_DRAW_HANDLE; + +/* GUI_DRAW_ API */ +void GUI_DRAW__Draw (GUI_DRAW_HANDLE hDrawObj, int x, int y); +int GUI_DRAW__GetXSize(GUI_DRAW_HANDLE hDrawObj); +int GUI_DRAW__GetYSize(GUI_DRAW_HANDLE hDrawObj); + +/* GUI_DRAW_ Constructurs for different objects */ +WM_HMEM GUI_DRAW_BITMAP_Create (const GUI_BITMAP* pBitmap, int x, int y); +WM_HMEM GUI_DRAW_BMP_Create (const void* pBMP, int x, int y); +WM_HMEM GUI_DRAW_STREAMED_Create(const GUI_BITMAP_STREAM * pBitmap, int x, int y); +WM_HMEM GUI_DRAW_SELF_Create(GUI_DRAW_SELF_CB* pfDraw, int x, int y); + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ + +extern const WIDGET_EFFECT WIDGET_Effect_3D; +extern const WIDGET_EFFECT WIDGET_Effect_3D1L; +extern const WIDGET_EFFECT WIDGET_Effect_3D2L; +extern const WIDGET_EFFECT WIDGET_Effect_None; +extern const WIDGET_EFFECT WIDGET_Effect_Simple; + +/********************************************************************* +* +* Internal API routines +* +********************************************************************** +*/ + +void WIDGET__DrawFocusRect(WIDGET* pWidget, const GUI_RECT* pRect, int Dist); +void WIDGET__DrawVLine(WIDGET* pWidget, int x, int y0, int y1); +void WIDGET__EFFECT_DrawDownRect(WIDGET* pWidget, GUI_RECT* pRect); +void WIDGET__EFFECT_DrawDown(WIDGET* pWidget); +void WIDGET__EFFECT_DrawUpRect(WIDGET* pWidget, GUI_RECT* pRect); +void WIDGET__FillRectEx(WIDGET* pWidget, const GUI_RECT* pRect); +int WIDGET__GetWindowSizeX(WM_HWIN hWin); +GUI_COLOR WIDGET__GetBkColor(WM_HWIN hObj); +int WIDGET__GetXSize(const WIDGET* pWidget); +int WIDGET__GetYSize(const WIDGET* pWidget); +void WIDGET__GetClientRect(WIDGET* pWidget, GUI_RECT* pRect); +void WIDGET__GetInsideRect(WIDGET* pWidget, GUI_RECT* pRect); +void WIDGET__Init(WIDGET* pWidget, int Id, U16 State); +void WIDGET__RotateRect90(WIDGET* pWidget, GUI_RECT* pDest, const GUI_RECT* pRect); +void WIDGET__SetScrollState(WM_HWIN hWin, const WM_SCROLL_STATE* pVState, const WM_SCROLL_STATE* pState); +void WIDGET__FillStringInRect(const char GUI_UNI_PTR * pText, const GUI_RECT * pFillRect, const GUI_RECT * pTextRectMax, const GUI_RECT * pTextRectAct); + +/********************************************************************* +* +* API routines +* +********************************************************************** +*/ +void WIDGET_SetState (WM_HWIN hObj, int State); +void WIDGET_AndState (WM_HWIN hObj, int State); +void WIDGET_OrState (WM_HWIN hObj, int State); +int WIDGET_HandleActive (WM_HWIN hObj, WM_MESSAGE* pMsg); +int WIDGET_GetState (WM_HWIN hObj); +int WIDGET_SetWidth (WM_HWIN hObj, int Width); + +void WIDGET_EFFECT_3D_DrawUp(void); + +void WIDGET_SetDefaultEffect_3D (void); +void WIDGET_SetDefaultEffect_3D1L (void); +void WIDGET_SetDefaultEffect_3D2L (void); +void WIDGET_SetDefaultEffect_None (void); +void WIDGET_SetDefaultEffect_Simple(void); + +const WIDGET_EFFECT* WIDGET_SetDefaultEffect(const WIDGET_EFFECT* pEffect); + +void WIDGET_SetEffect (WM_HWIN hObj, const WIDGET_EFFECT* pEffect); + +const WIDGET_EFFECT* WIDGET_GetDefaultEffect(void); +int WIDGET_SetWidth(WM_HWIN hObj, int Width); + + +#endif /* GUI_WINSUPPORT */ + +#if defined(__cplusplus) + } +#endif + +#endif /* SLIDER_H */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D.c b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D.c new file mode 100644 index 0000000..27d24d3 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D.c @@ -0,0 +1,163 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_Effect_3D.c +Purpose : Effect routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define WIDGET_H2P(hWin) ((WIDGET*)GUI_ALLOC_h2p(hWin)) + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _WIDGET_EFFECT_3D_DrawUpRect +* +* Add. info: +* This routine does not preserve the drawing colors for speed +* reasons. If this is required, it should be done in the calling +* routine. +*/ +static void _WIDGET_EFFECT_3D_DrawUpRect(const GUI_RECT* pRect) { + GUI_RECT r; +/* Saving of context no longer required ... Speeds up the system + GUI_CONTEXT Context; + GUI_SaveContext(&Context); +*/ + r = *pRect; + LCD_SetColor(0x000000); + GUI_DrawRect(r.x0, r.y0, r.x1, r.y1); /* Draw rectangle around it */ + /* Draw the bright sides */ + LCD_SetColor(0xffffff); + GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2); /* Draw top line */ + GUI_DrawVLine(r.x0 + 1, r.y0 + 1, r.y1 - 2); + /* Draw the dark sides */ + LCD_SetColor(0x555555); + GUI_DrawHLine(r.y1-1, r.x0 + 1, r.x1 - 1); + GUI_DrawVLine(r.x1-1, r.y0 + 1, r.y1 - 2); +/* GUI_RestoreContext(&Context); */ +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D_DrawDownRect +*/ +static void _WIDGET_EFFECT_3D_DrawDownRect(const GUI_RECT* pRect) { + GUI_RECT r; + r = *pRect; + LCD_SetColor(0x000000); /* TBD: Use halftone */ +/* GUI_DrawRect(0, 0, r.x1, r.y1);*/ + /* Draw the upper left sides */ + LCD_SetColor(0x808080); + GUI_DrawHLine(r.y0, r.x0, r.x1); + GUI_DrawVLine(r.x0, r.y0 + 1, r.y1); + LCD_SetColor(0x0); + GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 1); + GUI_DrawVLine(r.x0 + 1, r.y0 + 2, r.y1 - 1); + /* Draw the lower right sides */ + LCD_SetColor(0xffffff); + GUI_DrawHLine(r.y1, r.x0 + 1, r.x1); + GUI_DrawVLine(r.x1, r.y0 + 1, r.y1); + LCD_SetColor(0xc0c0c0); + GUI_DrawHLine(r.y1 - 1, r. x0 + 2, r.x1-1); + GUI_DrawVLine(r.x1 - 1, r. y0 + 2, r.y1-1); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D_DrawDown +*/ +static void _WIDGET_EFFECT_3D_DrawDown(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_3D_DrawDownRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D_GetRect +*/ +static void _WIDGET_EFFECT_3D_GetRect(GUI_RECT* pRect) { + WM_GetClientRect(pRect); + GUI__ReduceRect(pRect, pRect, 2); +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_EFFECT_3D_DrawUp +*/ +void WIDGET_EFFECT_3D_DrawUp(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_3D_DrawUpRect(&r); +} + +/********************************************************************* +* +* WIDGET_SetDefaultEffect_3D +*/ +void WIDGET_SetDefaultEffect_3D(void) { + WIDGET_SetDefaultEffect(&WIDGET_Effect_3D); +} + +/********************************************************************* +* +* Effect tables --- Mainly function pointers +* +********************************************************************** +*/ + +const WIDGET_EFFECT WIDGET_Effect_3D = { + WIDGET_EFFECT_3D_DrawUp, + _WIDGET_EFFECT_3D_DrawDown, + _WIDGET_EFFECT_3D_DrawUpRect, + _WIDGET_EFFECT_3D_DrawDownRect, + _WIDGET_EFFECT_3D_GetRect, + 2 +}; + +#else /* Avoid problems with empty object modules */ + void WIDGET_Effect_3D_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D1L.c b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D1L.c new file mode 100644 index 0000000..6e6fee0 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D1L.c @@ -0,0 +1,148 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_Effect_3D1L.c +Purpose : Effect routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define WIDGET_H2P(hWin) ((WIDGET*)GUI_ALLOC_h2p(hWin)) + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _WIDGET_EFFECT_3D1L_DrawUpRect +* +* Add. info: +* This routine does not preserve the drawing colors for speed +* reasons. If this is required, it should be done in the calling +* routine. +*/ +static void _WIDGET_EFFECT_3D1L_DrawUpRect(const GUI_RECT* pRect) { + GUI_RECT r; + r = *pRect; + /* Draw the upper left sides */ + LCD_SetColor(0xE7E7E7); + GUI_DrawHLine(r.y0, r.x0, r.x1 - 1); + GUI_DrawVLine(r.x0, r.y0 + 1, r.y1 - 1); + /* Draw the lower right sides */ + LCD_SetColor(0x606060); + GUI_DrawHLine(r.y1, r.x0, r.x1); + GUI_DrawVLine(r.x1, r.y0, r.y1 - 1); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D1L_DrawUp +*/ +static void _WIDGET_EFFECT_3D1L_DrawUp(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_3D1L_DrawUpRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D1L_DrawDownRect +*/ +static void _WIDGET_EFFECT_3D1L_DrawDownRect(const GUI_RECT* pRect) { + GUI_RECT r; + r = *pRect; + /* Draw the upper left sides */ + LCD_SetColor(0x606060); + GUI_DrawHLine(r.y0, r.x0, r.x1 - 1); + GUI_DrawVLine(r.x0, r.y0 + 1, r.y1 - 1); + /* Draw the lower right sides */ + LCD_SetColor(0xE7E7E7); + GUI_DrawHLine(r.y1, r.x0, r.x1); + GUI_DrawVLine(r.x1, r.y0, r.y1 - 1); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D1L_DrawDown +*/ +static void _WIDGET_EFFECT_3D1L_DrawDown(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_3D1L_DrawDownRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D1L_GetRect +*/ +static void _WIDGET_EFFECT_3D1L_GetRect(GUI_RECT* pRect) { + WM_GetClientRect(pRect); + GUI__ReduceRect(pRect, pRect, 1); +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_SetDefaultEffect_3D1L +*/ +void WIDGET_SetDefaultEffect_3D1L(void) { + WIDGET_SetDefaultEffect(&WIDGET_Effect_3D1L); +} + +/********************************************************************* +* +* Effect tables --- Mainly function pointers +* +********************************************************************** +*/ + +const WIDGET_EFFECT WIDGET_Effect_3D1L = { + _WIDGET_EFFECT_3D1L_DrawUp, + _WIDGET_EFFECT_3D1L_DrawDown, + _WIDGET_EFFECT_3D1L_DrawUpRect, + _WIDGET_EFFECT_3D1L_DrawDownRect, + _WIDGET_EFFECT_3D1L_GetRect, + 1 +}; + +#else /* Avoid problems with empty object modules */ + void WIDGET_Effect_3D1L_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D2L.c b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D2L.c new file mode 100644 index 0000000..b593bf9 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_3D2L.c @@ -0,0 +1,160 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_Effect_3D2L.c +Purpose : Effect routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define WIDGET_H2P(hWin) ((WIDGET*)GUI_ALLOC_h2p(hWin)) + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _WIDGET_EFFECT_3D2L_DrawUpRect +* +* Add. info: +* This routine does not preserve the drawing colors for speed +* reasons. If this is required, it should be done in the calling +* routine. +*/ +static void _WIDGET_EFFECT_3D2L_DrawUpRect(const GUI_RECT* pRect) { + GUI_RECT r; + r = *pRect; + /* Draw the upper left sides */ + LCD_SetColor(0xD0D0D0); + GUI_DrawHLine(r.y0, r.x0, r.x1 - 1); + GUI_DrawVLine(r.x0, r.y0 + 1, r.y1 - 1); + LCD_SetColor(0xE7E7E7); + GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2); + GUI_DrawVLine(r.x0 + 1, r.y0 + 2, r.y1 - 2); + /* Draw the lower right sides */ + LCD_SetColor(0x606060); + GUI_DrawHLine(r.y1, r.x0, r.x1); + GUI_DrawVLine(r.x1, r.y0, r.y1 - 1); + LCD_SetColor(0x9A9A9A); + GUI_DrawHLine(r.y1 - 1, r.x0 + 1, r.x1 - 1); + GUI_DrawVLine(r.x1 - 1, r.y0 + 1, r.y1 - 2); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D2L_DrawUp +*/ +static void _WIDGET_EFFECT_3D2L_DrawUp(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_3D2L_DrawUpRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D2L_DrawDownRect +*/ +static void _WIDGET_EFFECT_3D2L_DrawDownRect(const GUI_RECT* pRect) { + GUI_RECT r; + r = *pRect; + /* Draw the upper left sides */ + LCD_SetColor(0x9A9A9A); + GUI_DrawHLine(r.y0, r.x0, r.x1 - 1); + GUI_DrawVLine(r.x0, r.y0 + 1, r.y1 - 1); + LCD_SetColor(0x606060); + GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2); + GUI_DrawVLine(r.x0 + 1, r.y0 + 2, r.y1 - 2); + /* Draw the lower right sides */ + LCD_SetColor(0xE7E7E7); + GUI_DrawHLine(r.y1, r.x0, r.x1); + GUI_DrawVLine(r.x1, r.y0, r.y1 - 1); + LCD_SetColor(0xD0D0D0); + GUI_DrawHLine(r.y1 - 1, r.x0 + 1, r.x1 - 1); + GUI_DrawVLine(r.x1 - 1, r.y0 + 1, r.y1 - 2); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D2L_DrawDown +*/ +static void _WIDGET_EFFECT_3D2L_DrawDown(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_3D2L_DrawDownRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_3D2L_GetRect +*/ +static void _WIDGET_EFFECT_3D2L_GetRect(GUI_RECT* pRect) { + WM_GetClientRect(pRect); + GUI__ReduceRect(pRect, pRect, 2); +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_SetDefaultEffect_3D2L +*/ +void WIDGET_SetDefaultEffect_3D2L(void) { + WIDGET_SetDefaultEffect(&WIDGET_Effect_3D2L); +} + +/********************************************************************* +* +* Effect tables --- Mainly function pointers +* +********************************************************************** +*/ + +const WIDGET_EFFECT WIDGET_Effect_3D2L = { + _WIDGET_EFFECT_3D2L_DrawUp, + _WIDGET_EFFECT_3D2L_DrawDown, + _WIDGET_EFFECT_3D2L_DrawUpRect, + _WIDGET_EFFECT_3D2L_DrawDownRect, + _WIDGET_EFFECT_3D2L_GetRect, + 2 +}; + +#else /* Avoid problems with empty object modules */ + void WIDGET_Effect_3D2L_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_Effect_None.c b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_None.c new file mode 100644 index 0000000..38c92e1 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_None.c @@ -0,0 +1,118 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_Effect_None.c +Purpose : Effect routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Macros for internal use +* +********************************************************************** +*/ + +#define WIDGET_H2P(hWin) ((WIDGET*)GUI_ALLOC_h2p(hWin)) + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _WIDGET_EFFECT_None_DrawDown +*/ +static void _WIDGET_EFFECT_None_DrawDown(void) { +} + +/********************************************************************* +* +* _WIDGET_EFFECT_None_DrawUp +*/ +static void _WIDGET_EFFECT_None_DrawUp(void) { +} + +/********************************************************************* +* +* _WIDGET_EFFECT_None_DrawDownRect +*/ +static void _WIDGET_EFFECT_None_DrawDownRect(const GUI_RECT* pRect) { + GUI_USE_PARA(pRect); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_None_DrawUpRect +*/ +static void _WIDGET_EFFECT_None_DrawUpRect(const GUI_RECT* pRect) { + GUI_USE_PARA(pRect); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_None_GetRect +*/ +static void _WIDGET_EFFECT_None_GetRect(GUI_RECT * pRect) { + WM_GetClientRect(pRect); +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_SetDefaultEffect_None +*/ +void WIDGET_SetDefaultEffect_None(void) { + WIDGET_SetDefaultEffect(&WIDGET_Effect_None); +} + +/********************************************************************* +* +* Effect tables --- Mainly function pointers +* +********************************************************************** +*/ + +const WIDGET_EFFECT WIDGET_Effect_None = { + _WIDGET_EFFECT_None_DrawUp, + _WIDGET_EFFECT_None_DrawDown, + _WIDGET_EFFECT_None_DrawUpRect, + _WIDGET_EFFECT_None_DrawDownRect, + _WIDGET_EFFECT_None_GetRect, + 0 +}; + +#else /* Avoid problems with empty object modules */ + void WIDGET_Effect_None_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_Effect_Simple.c b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_Simple.c new file mode 100644 index 0000000..65c26f6 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_Effect_Simple.c @@ -0,0 +1,124 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_Effect_Simple.c +Purpose : Effect routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _WIDGET_EFFECT_Simple_DrawUpRect +*/ +static void _WIDGET_EFFECT_Simple_DrawUpRect(const GUI_RECT* pRect) { + GUI_CONTEXT Context; + GUI_SaveContext(&Context); + LCD_SetColor(GUI_BLACK); + GUI_DrawRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1); /* Draw rectangle around it */ + GUI_RestoreContext(&Context); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_Simple_DrawUp +*/ +static void _WIDGET_EFFECT_Simple_DrawUp(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_Simple_DrawUpRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_Simple_DrawDownRect +*/ +static void _WIDGET_EFFECT_Simple_DrawDownRect(const GUI_RECT* pRect) { + GUI_CONTEXT Context; + GUI_SaveContext(&Context); + LCD_SetColor(GUI_BLACK); + GUI_DrawRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1); /* Draw rectangle around it */ + GUI_RestoreContext(&Context); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_Simple_DrawDown +*/ +static void _WIDGET_EFFECT_Simple_DrawDown(void) { + GUI_RECT r; + WM_GetClientRect(&r); + _WIDGET_EFFECT_Simple_DrawDownRect(&r); +} + +/********************************************************************* +* +* _WIDGET_EFFECT_Simple_GetRect +*/ +static void _WIDGET_EFFECT_Simple_GetRect(GUI_RECT* pRect) { + WM_GetClientRect(pRect); + GUI__ReduceRect(pRect, pRect, 1); +} + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_SetDefaultEffect_Simple +*/ +void WIDGET_SetDefaultEffect_Simple(void) { + WIDGET_SetDefaultEffect(&WIDGET_Effect_Simple); +} + +/********************************************************************* +* +* Effect tables --- Mainly function pointers +* +********************************************************************** +*/ + +const WIDGET_EFFECT WIDGET_Effect_Simple = { + _WIDGET_EFFECT_Simple_DrawUp, + _WIDGET_EFFECT_Simple_DrawDown, + _WIDGET_EFFECT_Simple_DrawUpRect, + _WIDGET_EFFECT_Simple_DrawDownRect, + _WIDGET_EFFECT_Simple_GetRect, + 1 +}; + +#else /* Avoid problems with empty object modules */ + void WIDGET_Effect_Simple_C(void) {} +#endif /* GUI_WINSUPPORT */ + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_FillStringInRect.c b/User/system/lib/lcd/gui/Widget/WIDGET_FillStringInRect.c new file mode 100644 index 0000000..264e6ba --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_FillStringInRect.c @@ -0,0 +1,111 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_FillStringInRect.c +Purpose : Implementation of widget function +---------------------------END-OF-HEADER------------------------------ +*/ + +#include + +#include "GUI_Protected.h" + +#if GUI_WINSUPPORT + +#include "WM.h" +#include "WIDGET.h" + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +#ifndef WIDGET_FILL_TEXT_USES_TRANS + #define WIDGET_FILL_TEXT_USES_TRANS 0 +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET__FillStringInRect +* +* Purpose +* +* Parameters +* +* Notes +*/ +void WIDGET__FillStringInRect(const char GUI_UNI_PTR * pText, const GUI_RECT * pFillRect, const GUI_RECT * pTextRectMax, const GUI_RECT * pTextRectAct) { + /* Check if we have anything to do at all ... */ + if (GUI_Context.pClipRect_HL) { + GUI_RECT r; + r = *pFillRect; + WM_ADDORG(r.x0, r.y0); + WM_ADDORG(r.x1, r.y1); + if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, &r) == 0) + return; + } + + if (pText) { + if (*pText) { /* Speed optimization, not required */ + const GUI_RECT* pOldClipRect; + + + /* Fill border */ + #if WIDGET_FILL_TEXT_USES_TRANS + GUI_ClearRectEx(pFillRect); + #else + { + GUI_RECT rText; + GUI__IntersectRects(&rText, pTextRectMax, pTextRectAct); + GUI_ClearRect(pFillRect->x0, pFillRect->y0, pFillRect->x1, rText.y0 - 1); /* Top */ + GUI_ClearRect(pFillRect->x0, rText.y0, rText.x0 - 1 , rText.y1); /* Left */ + GUI_ClearRect(rText.x1 + 1, rText.y0, pFillRect->x1, rText.y1); /* Right */ + GUI_ClearRect(pFillRect->x0, rText.y1 + 1, pFillRect->x1, pFillRect->y1);/* Bottom */ + } + #endif + + /* Set clipping rectangle */ + pOldClipRect = WM_SetUserClipRect(pTextRectMax); + + /* Display text */ + #if WIDGET_FILL_TEXT_USES_TRANS + GUI_SetTextMode(GUI_TM_TRANS); + #else + GUI_SetTextMode(GUI_TM_NORMAL); + #endif + GUI_DispStringAt(pText, pTextRectAct->x0, pTextRectAct->y0); + + /* Restore clipping rectangle */ + WM_SetUserClipRect(pOldClipRect); + return; + } + } + GUI_ClearRectEx(pFillRect); +} + +#else /* avoid empty object files */ + +void WIDGET__FillStringInRect_C(void) {} + +#endif + +/*************************** End of file ****************************/ diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_SetEffect.c b/User/system/lib/lcd/gui/Widget/WIDGET_SetEffect.c new file mode 100644 index 0000000..af88d20 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_SetEffect.c @@ -0,0 +1,52 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_SetEffect.c +Purpose : Effect routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "GUI.h" +#include "WIDGET.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_SetEffect +*/ +void WIDGET_SetEffect(WM_HWIN hObj, const WIDGET_EFFECT* pEffect) { + WM_MESSAGE Msg; + Msg.hWinSrc = 0; + Msg.MsgId = WM_WIDGET_SET_EFFECT; + Msg.Data.p = (const void*)pEffect; + WM_SendMessage(hObj, &Msg); +} + +#else + void WIDGET_SetEffect_c(void) {} /* Avoid problems with empty object modules */ +#endif /* GUI_WINSUPPORT */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/WIDGET_SetWidth.c b/User/system/lib/lcd/gui/Widget/WIDGET_SetWidth.c new file mode 100644 index 0000000..abce5a2 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WIDGET_SetWidth.c @@ -0,0 +1,68 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WIDGET_SetWidth.c +Purpose : Implementation of WIDGET_SetWidth +---------------------------END-OF-HEADER------------------------------ +*/ + +#include +#include + +#include "WIDGET.h" +#include "GUIDebug.h" +#include "GUI.h" +#include "GUI_Protected.h" +#include "WM_Intern.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Public routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WIDGET_SetWidth +* +* Function: +* Set width of the given widget. Width can be X-Size or Y-Size, +* depending on if the widget is rotated. +*/ +int WIDGET_SetWidth(WM_HWIN hObj, int Width) { + WIDGET* pWidget; + int r = 0; + if (hObj) { + WM_LOCK(); + pWidget = WIDGET_H2P(hObj); + if (pWidget->State & WIDGET_STATE_VERTICAL) { + r = WM_SetXSize(hObj, Width); + } else { + r = WM_SetYSize(hObj, Width); + } + WM_UNLOCK(); + } + return r; +} + + +#else /* Avoid problems with empty object modules */ + void WIDGET_SetWidth_C(void) {} +#endif /* GUI_WINSUPPORT */ + + + + diff --git a/User/system/lib/lcd/gui/Widget/WINDOW.c b/User/system/lib/lcd/gui/Widget/WINDOW.c new file mode 100644 index 0000000..b9fc1b4 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WINDOW.c @@ -0,0 +1,175 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WINDOW.c +Purpose : Window routines +---------------------------END-OF-HEADER------------------------------ +*/ + + +#include +#include +#include "DIALOG.h" +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Private config defaults +* +********************************************************************** +*/ + +#ifndef WINDOW_BKCOLOR_DEFAULT + #define WINDOW_BKCOLOR_DEFAULT 0xC0C0C0 +#endif + +/********************************************************************* +* +* Object definition +* +********************************************************************** +*/ + +typedef struct { + WIDGET Widget; + WM_CALLBACK* cb; + WM_HWIN hFocussedChild; + WM_DIALOG_STATUS* pDialogStatus; +} WINDOW_OBJ; + +#define WINDOW_H2P(h) (WINDOW_OBJ*)WM_H2P(h) + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +GUI_COLOR WINDOW__DefaultBkColor = WINDOW_BKCOLOR_DEFAULT; + +/********************************************************************* +* +* Static routines +* +********************************************************************** +*/ +/********************************************************************* +* +* _OnChildHasFocus +*/ +static void _OnChildHasFocus(WM_HWIN hWin, WINDOW_OBJ* pObj, const WM_MESSAGE* pMsg) { + if (pMsg->Data.p) { + const WM_NOTIFY_CHILD_HAS_FOCUS_INFO * pInfo = (const WM_NOTIFY_CHILD_HAS_FOCUS_INFO *)pMsg->Data.p; + int IsDesc = WM__IsAncestorOrSelf(pInfo->hNew, hWin); + if (!IsDesc) { /* A child has received the focus, Framewindow needs to be activated */ + /* Remember the child which had the focus so we can reactive this child */ + if (WM__IsAncestor(pInfo->hOld, hWin)) { + pObj->hFocussedChild = pInfo->hOld; + } + } + } +} + +/********************************************************************* +* +* _cb +*/ +static void _cb(WM_MESSAGE* pMsg) { + WM_HWIN hObj; + WINDOW_OBJ* pObj; + WM_CALLBACK* cb; + hObj = pMsg->hWin; + pObj = WINDOW_H2P(hObj); + cb = pObj->cb; + switch (pMsg->MsgId) { + case WM_HANDLE_DIALOG_STATUS: + if (pMsg->Data.p) { /* set pointer to Dialog status */ + pObj->pDialogStatus = (WM_DIALOG_STATUS*)pMsg->Data.p; + } else { /* return pointer to Dialog status */ + pMsg->Data.p = pObj->pDialogStatus; + } + return; + case WM_SET_FOCUS: + if (pMsg->Data.v) { /* Focus received */ + if (pObj->hFocussedChild && (pObj->hFocussedChild != hObj)) { + WM_SetFocus(pObj->hFocussedChild); + } else { + pObj->hFocussedChild = WM_SetFocusOnNextChild(hObj); + } + pMsg->Data.v = 0; /* Focus change accepted */ + } + return; + case WM_GET_ACCEPT_FOCUS: + WIDGET_HandleActive(hObj, pMsg); + return; + case WM_NOTIFY_CHILD_HAS_FOCUS: + _OnChildHasFocus(hObj, pObj, pMsg); + return; + case WM_KEY: + if (((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt > 0) { + int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; + switch (Key) { + case GUI_KEY_TAB: + pObj->hFocussedChild = WM_SetFocusOnNextChild(hObj); + break; /* Send to parent by not doing anything */ + } + } + break; + case WM_PAINT: + LCD_SetBkColor(WINDOW__DefaultBkColor); + GUI_Clear(); + break; + case WM_GET_BKCOLOR: + pMsg->Data.Color = WINDOW__DefaultBkColor; + return; /* Message handled */ + } + if (cb) { + (*cb)(pMsg); + } else { + WM_DefaultProc(pMsg); + } +} + +/********************************************************************* +* +* Exported routines +* +********************************************************************** +*/ +/********************************************************************* +* +* WINDOW_CreateIndirect +*/ +WM_HWIN WINDOW_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* cb) { + WM_HWIN hObj; + hObj = WM_CreateWindowAsChild( + pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, hWinParent, + pCreateInfo->Flags, _cb, sizeof(WINDOW_OBJ) - sizeof(WM_Obj)); + if (hObj) { + WINDOW_OBJ* pObj; + WM_LOCK(); + pObj = WINDOW_H2P(hObj); + WIDGET__Init(&pObj->Widget, pCreateInfo->Id, WIDGET_STATE_FOCUSSABLE); + pObj->cb = cb; + pObj->hFocussedChild = 0; + WM_UNLOCK(); + } + return hObj; +} + +#else + void WINDOW_c(void); + void WINDOW_c(void) {} /* avoid empty object files */ +#endif /* GUI_WINSUPPORT */ diff --git a/User/system/lib/lcd/gui/Widget/WINDOW_Default.c b/User/system/lib/lcd/gui/Widget/WINDOW_Default.c new file mode 100644 index 0000000..66b3bcd --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WINDOW_Default.c @@ -0,0 +1,36 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WINDOW.c +Purpose : Window routines +---------------------------END-OF-HEADER------------------------------ +*/ + +#include "DIALOG.h" +#include "WINDOW_Private.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* WINDOW_SetDefaultBkColor +*/ +void WINDOW_SetDefaultBkColor(GUI_COLOR Color) { + WINDOW__DefaultBkColor = Color; +} + +#else + void WINDOW_Default_C(void); + void WINDOW_Default_C(void) {} /* avoid empty object files */ +#endif diff --git a/User/system/lib/lcd/gui/Widget/WINDOW_Private.h b/User/system/lib/lcd/gui/Widget/WINDOW_Private.h new file mode 100644 index 0000000..8bf39a4 --- /dev/null +++ b/User/system/lib/lcd/gui/Widget/WINDOW_Private.h @@ -0,0 +1,37 @@ +/* +********************************************************************************************************* +* uC/GUI +* Universal graphic software for embedded applications +* +* (c) Copyright 2002, Micrium Inc., Weston, FL +* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH +* +* C/GUI is protected by international copyright laws. Knowledge of the +* source code may not be used to write a similar product. This file may +* only be used in accordance with a license and should not be redistributed +* in any way. We appreciate your understanding and fairness. +* +---------------------------------------------------------------------- +File : WINDOW_Private.h +Purpose : WINDOW private header file +--------------------END-OF-HEADER------------------------------------- +*/ + +#ifndef WINDOW_PRIVATE_H +#define WINDOW_PRIVATE_H + +#include "WM.h" + +#if GUI_WINSUPPORT + +/********************************************************************* +* +* Externals +* +********************************************************************** +*/ + +extern GUI_COLOR WINDOW__DefaultBkColor; + +#endif /* GUI_WINSUPPORT */ +#endif /* WINDOW_PRIVATE_H */ diff --git a/User/system/lib/lcd/gui/Widget/vssver.scc b/User/system/lib/lcd/gui/Widget/vssver.scc new file mode 100644 index 0000000000000000000000000000000000000000..ddd4948c04535119e3bea917db72be2f11336be8 GIT binary patch literal 3952 zcmX}vdpMVO9|v$fok$TQhsIj*$cl2PH94-tvT9LuklK>UIXY59E&VVxa>_XrBFEA} zIg})uFp@N;J+0D8D-&B`Z_jnTzrTN6FYnL&y?*!i@VW1wvEmphpFGVsa^uWwL-UUp z_ZMz_cuYOSE^4gQ|3A_A`}X(dmS9z{xH0(8NqF#x{zEzjesfnxhK_|5J$fI|aj>3@ zUj`iyABre0p%Y-Awd!x^Q?P=(v;mz6j~#BCKqtW_&Z&xYGVHi|vjv?3=j3cPq*LLx z$Tg4YGtYgy=}b8C*KM|R7Mx;dT27yV zZ#$H9(`VtZn$7__8?FkJOQdt)XBAIV>0DT8XYO7492{Zk=|kti#b&R1=zRE|dxNMy z52rU5Z)RQq_q>qbM;F4s-MO4c7s0kC8uru0@Uzma6?6>+4zUT?)@LlG{mNfD3;~ z3Z*Z?>)M*O&}Hycr|;*}m*Dyvd$ZjuD+)*F`!ej&dg?UuD{!!P*~*Wj(P*6H+hc)f3&n4bzbrOUB`c_rMFJ9{r(1s{ygY@@4Ti|ET;^bPo3Z=61T z6JGFow+dYYXO&I*oW2FO4KFmNYvE(wj$%D-!x;mW1eUHCzPMhx8u*T2d;OgF)M%T#aE&G6Bh$Kt&F z4DU;ORn5Ewt`4~3MYqB&74hP{-GeRn*Q79Sga3C>K|L2e88h zDJ8lC?%X<8tmi{m<$AXm|1Df#lpyxU0KCPrUYyTCxNP!cBaZhse7qs&CjAfW@0h7e zzk_?Cy2SPG;gSM_R^~&n?*Yw9dKi{gtL>#n;7QiUooK0XQc}5D3q}7N16Q1O?_mBP zc(vJi(I3acS9J_mF&_szk2Dn0!-kqRv~}WaP!)4k zxbSSzYg!Ffl0+)d>ZAFld~u3Q3z!?i%a-a~qK#k+uWm)!7; zJ{Q7Qt(`@`_!QO)Ju%GsMet^ciRf3K!9N5=m@qeiUF}WV>BVsTxlcFJrtn)^M>X0E zb}N;hO`F3JGH=BBv4FduKFelq3CGv%k*2NS84~3w^yjel4vFX|OJJRP%V_3H;h}yH zalWkKlA9NPXTA(psat-5wt>B4v&8N?(Sup1ziZ+8=9W#&9bx_X(?z`#9G{mV=4&0?)b+=9)~|;j#?8D;Zy3FPt??0h zBm7z?)0B3G6Q{3SM{j~#-Haq`!v4UbhX>-@ri< zCvo1k!aeD+66UV3=GWWA``R|RAvSy$b2s=muf1aZw!?MnYKoZefS0)ctV8dFZ|w^G zgLa3XOfD1m>j76MX@oQPgd=VmmeXEvTvOtE+8d74atNS(;Ex@K#QUQ!d{ytS@$TWu zt)uUIyWog967f9tgKe~J#Ph`;p15krn&a(;Gx~DH^J5QOGevTR`Cj;e-?V;uA3WVK zu#?^oH-+V2qz}Nx-<8ME0kH4O5^?{5u=2iqF<%Gap7xjOtUm-dUYaKMyduzYyw3+5qkkKv1C`Y^o6E?az`Bd~g1?|J6m!B0YiW9g%C)5O7hbSRva z(rcQ{`lo8>AK+s3g<}4r;KDlF)y$*e*s8&O^hr4FdWI(*14r%}FsEbT zwjDB=bR4{Bjl1Y4@v#4P195!<+@t2Up7p2Ti_VGP(uuH*d80d>1aDD&?oTJfwb)XNQxM=ybT#e8orfzx#Oy-T(jq literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/image/readme/1719196693709.png b/User/system/lib/lcd/image/readme/1719196693709.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9ab71ba7fa6e2a295d52c542a16111ee94a645 GIT binary patch literal 35517 zcmb4q2UJsCw=Gr#MHEn)6bm3Apd!5l1w`pc2LTn4-b;W`L=dHkihz{RRC*PufzZ2z z-bq65Bm@Y7gphYYzyE&YzI(@b?~K6!lC#g*W$m@*oNMhcZA}$AS~glLDk{3ikCdKJ zQJr$8qB{2I%yHn8G~pyI;MXztCn^u93K3V9fqza~-`BWLMO6}gcK`V);C~vIN5<|{ zROg!xe~z^|XTPMP3V-rg>As$~`8t`-TYtnygs53xe8J?=@ndSogLXd(9cw)q;_6U- zJ^7WTZvP-VpGFnDFq%WcQGG4b8ccdgl0tNR=$S8_J9G1cz zAyQx63u!704Y@pz=Lc+<1{!S+TLw-nIS|KnE0W1YXzv4#qK*4n$o?v)`Y_&#f!kZ6 z7UY#EN6JP;)YZH0RZh7R(xWq)(~@^908! z)6Ntgm(xQyEqM>*)L1i&a%1H~%ziVMpKRGnRNaBXAUWT6%G6Y~g{?`*4KtErw~?6K zKyU6gqJAf@2fm$}g3jYCnhi)C;R;xDrnKZel5pB1VwuS^MX7-h?RzY9TF-}qDHCy@ z!IS5lbW>l-jI$5L&#@z!c( z=jYE!A2rjDq!7DKJ)BQWOl)Yl|DUF9A2?!2XCh%Q@2_CwOwA3h2{bH4_tI=FbTf(_ zwtJn&?99~;HZU{_%xfZcW|c)n^g~vjEtbsA}ds5iFYg?s;E#q zU%PFmht|*P+3rr%5fCt7T@Khz%t%8HsUUYcc3^ z7-EN%&f%V*s=Ou~J*hIa+5bZg0)e&dtRCH4 zrq0n4ayj5tCadNQmbB(-`)AB(}#Vyc@rf+^~P>*b6!qPP71@T zr>{TF^)dYdFm@SfX{A%#rYlZw!XZ{cJOYcFA}PGUAanEblVQRi)uPtlja{eD-&@evYw<+;SM%?t$?jgPmUx}T!HvT0j;K?n~* z5SBFYxqITgOj7*NM#V#5P~tM(6DHN;CTte2D;2zV{g#i6oJyfw-h4a9hW*&w%mq4E zk%t>|DaWP+;z&*p@@I(NhF!)w?sOc!JN4-ZBfrdBkZ$N>f^SIYH85jPm$~R+kEs+6 zG!hvcufOiQ;A5ePVWlcGm%{Sq=Vp73o6g5v3`}3J2K-33#bnpyv`fgobRG+ zicmhIl#%v6#O171?-?2$32iDo0xDxTc*1Y!x&SSLVj+trp$PI@2|e1^dG;Hb;q}Kp zs#M&{gS%d|2!+aR#h-MOaGhx;5{VE@)#5^uGlHCFDkvZzPa5m#hh;08AW|L7u6Y(S z8?qk0w_bnwgA8Ujua21462Tnd%M=?MTU%R8B48H1nYtSAwIG-tYX*l0l)N@5o$MuSU zZbY_`zx8xYoW7dB#bC>wF#Z?{j%eq*C@^MnXBF|2K?kQDA^sGet#&d>k&#dHX_?(n zUH~gJif~LX5=XkCbf9sOP5ZGeHcEru*39_kQ1(Jid#Q-IE35fW{4gB$nBBs zKnj*32aVb9M(=ljx~`(M`e;FyWf1`-Eq#lQi;s7Y)m+m`ku}!U-Rcx9+K;B-KudlH zS_gAlOTQ=`e5v2fQL5ex3D!%{YH?@O{-k>kuvg#YYRTf1)YQ771NUcp{1!w9<$X3c zI?`9ZMazFq@R1Y?m>0Cz>vj%sC#_fHF?N5w6WlfO#@%8+i=R5+nm`Jrczz%WR5r65 zkM>?>mS;9pV~#_Ll2rl~PKgGuRJFmq_dU=ODU_;g!Iz=jVM=cTsAq7yMSUu= zf(leMe%MquXAn(BqIqIaBN)h<*7HcMUl3a`owq}c-vOy1C8^!gjiG=aCjs3Lh3Z-K| zSPdi>71iz}+H5l7`6KHfBd2vrI&CGc!k-%}`lwvTJUv{Y*Cp$2=h4gc?6iP&c{E~S z=@+)4=PfA2k>ztCnwx;3hw=l8=i3-{A97tZ+DdJ{!0FdlwZ6rc>)>Y!Z6VLvFL>(&& z%aqV-Z&^)>+1$_ck4UEnS2s`%Aj%eqvYiF`v4RAn$)q|8Y5d?#(eZU&bpb&^#+G(f z1HY2FT`d`3m(&x7vm2@9zVKTr@IaPAdak8KFJUKa0pBm85Q~6C{=rzM`0hMZ%Kf3o z_t-CAdUIge-}`8OM@gV0ftW5`v3EeIqYzh%2F4ERzPrXI%YdEM$IAdi*iT-JN!@>G zYrD(=o@~$;;F9;-tq(d8!7O54>2ej?qb~ zl@(xx*mj{i@vEur^p8K4NL zynl6B8GbezbQzffm|e0Q`>u0^F0Xp!HxFW=JDJR^l6-@rRcZ|nD5q@H_ku5XlMrFL zT31&6GFP{)+ViV zRj~@;;o&wo%t6DWNx`%ElJat6L!R49C6Psw7>~mRr(&U>;}3z{e{=138BHWY|6r}> zzyVd`L)imS7A@PFZTYrp#qZ1025CM+Buib#>Za9^DZ6bT1Cg6kw_jC>-+y(xLx!U= z*Sx*nP!NdT;p5D=jOt6>NAxA;x~9e@JnPK8zvOlwiLwU+PU0kfHt;c$Yjmp3#tSf}{324po2ha2B#W-4CP z@^ZcRjZN-Lg)Kco9>#tv8B1`G7AQu%m;|JZeiSJ2Md?obrBO z1K5|p=zBocz|xb(22Vsi!?CuMh0UL4i^MV+?pv++QU<^IpQoOozZ(6r(UIlMqGYZS zG+z2Sygat->56mDstDETp+dV*{i`(n4i4+4+7 zwNU;o=hf{xUEVWL==t;K!^3B_jVDx#BeasewS1O~5Icd^)3W$3wrnz2Q4y*woJDu zoBA7Nhq4rX@LrQ7no+!AN@H5?ut!Ey$nkP|X}L=*bfX%F^Fmep$&@Cp$g_B~_<7T! zJV8pnmOc>iY=(RW#cZ@ZeOIjWolK%Uap@Zuc}XR3ZLGxdolWh|WWc}-`igwXUZ8)F zc^zff9g4IzG_%mZ<4#c&@-(2Rgoe zlbh>W{(IEXK3m_$aBQ2s#Wt3td`_{b7AdguVQYLsXy8Rm z;64#1c)7=aeIiiWdwMp`l8;0^`Ht5n09!s^x1aQGnLI|>2_*MXR=HArm*eXQT!9-f zN*B7$GmWgKMP3@PAfW3n)SIf({JGVwh5ezhn2Z#!fnOPX z%zAD?B9ANc9HhYsy8@vj&NT-KhyfCjdP&T`Ux_WleA%TNn6oGD?puA|RGh1qdEt!V zC>5~aG(rYDS^WG2+2|(q*bog{$o8Q-wv*g<6^w zcSaUa(Wjq4{P(Y|tyPP=mEJ0W^0ovxot+!n!BB9WHGDd!N24+;f4--#cS8c?M2wdZ zwUFO{R0u6jrEU+~_GqMWh3s!?;-6pkg7;{Q0zi9f-YU?$7|Io~0e!n=zA8sBDIyKg zgX3cJZ>3b1VzS7%#x6>}q(}#O8rc?$h;s$>cI!b{Eq;-%gLtBwlA1$igvxU7S zxYrXAn(A7Q9^n>1Dbref)!%9E(=2S|)7&3^(^)6&`UIkIJ*Cm6ft~hKIYTQOpeGz& zFPArOuJhL4?Cf%S@PXCsB}J3^^~Y8uSh_hElf>oS5cdipk;k=XTtM{kuLRG9#hE0X7mbvV@5 zs9x7pdp9I7G0tz;oS}PJWldG-d+CM5RRd28v!S*0AbI139jdO>Lh{UST{PK2ur^@% zcO50EiP@o>Y|w48*t94P$KR-hOZ(M+SZF>zuIQvSj>xiA*bDh27Kj}bWT=BnS5yv33bW(C|E**kz62Hu|^g^C2u zgr2w#X5=*4ZI+{{=%q}%r)s5ajNeE_hR85P%a#}a7UbOPFa_-g8UEZvY8dI)+J2KL znEk%9WYP+V_0A>I=4@hFX_>=F{lj+JY$# z#D*ST0_dyv%Th>ZpjXc)Inl+qx_)u8NL+Z)^o1v|)N#uAYQ_wPe^Tti3yJhO)Vdl6 zO39_-(krro21EU%h6|WF+!QZ(W^(o70>@nUar}75qj>g>0HvQ}P=t_-o7#~{ZLYXA zc>NW)mM66ak8Mr^+s)tKzjE!A8?&dx^O;SJj2TJX4m9KC&B;GTExIvN;-rJ;!Pr;2 zO!T}W_`zx+r4VRigO*-=9fP0a@w33Le4e`WY3L(CV+lsHQW*3?AD=mKdLW*`21etF zI~RZB(e-jpf%5!<_485}4oy3wDu0c)y)pcfpk|6}!mQJAs(K@FKp8A76h__W9?ZC0 z^YQsKn31+3NP6(obHN}Ukz_v?;{Nq4)TmUI?440}rF)Allc!n`pMT82ILpyLZNqG$ zc@0cfzH7b(HGwAfAHYgqSs9?|jy&wCtb_H0&YA-56)Gx2j`e6scj~J$-yl-MGe%*v zzm0DX<*BC_%Z{$E^LtP`1t@`cPY_7l{Y4w}9#_N%7Xze}nf8$vCcGrp`3u`Z59hI- zd*_-Tv z{rrO9etp{DEYL}n@@nj= z?TRO$?y(JLTNC$Pl;X#E>N4+(KT)&a>+}&qxifwd@kmR#*yH4p+OEyPg=?Yn2A1tm zU~Y;hb%KBT;#U?H7FG*k!kp0q7O<^N2?v1Ezdm?BYhNUPuxokH)Q!}9#5@OkbxZc` zoiDavNRNe|q6HWBk6)d;NJg4mu6$}?QD@!5X*@413~*Kpx2$?3h@~pH{?u3o4TbL0 zH%L~n`$4xHqO<5r_w;yh7>sL<;c%7|P&t8~3wHwxzLDbX0iEp2K4UaG!32T0X^}K# za^SI^#q3@}h)>nP5NQAE+O!I=)6W4O>s*VE%g;SU^%|$_>XT)?-gd{7>F76%7L@yWsZvlfV)?LUt;_xPjK_g zgEiiBo;9Njllm5hVp*7J_StSBjx42jsdy`Uh7PW(k?WN^b)P-rF853yCXx=XNaeQy zP7eY*%VVb`yCnFC0M6jI`%qe1*UevGijCz0ob- z1c}MbnXuC--{P|5*Uaux5HgdQLp^>k97m|HjCo6zbWD7HW+f3g1H?!j5)h9sqs1nj z#wSp}`1DKqkWBBLjh?Lj0z_?fDa{czk_m|cZ>l;e6xuz6Nbv_m_hiJ&ft{Cr-JcUx z!R#3UIzN3(A@Ps?=+RWS5ll;(@8Uk_mSj9JUho(--tOlIU0U6G#$F{$t8fXr3!^_EhD z_Bk?_{9-p`20u{SqCC7x{Y2*cy$T*Xi5qq!k_APTrZg$(iaq5XLba88{XKKvk>39ftd_GIv z$*X97(@=U+=brADjEEtJ0{8NY@5A}(AcY3q1e?*NN_JZMNN>ppfQ#NbU;Yb`A49MG z_Z2MB55W@C?H~PWg0`l%_qO41?@yvPFp*1KQ>0@CAkmreke>;ts$GsS70hFAx(9|@ zxemq&^N*?DfV-N;A)zv%Y5*4@; zOtPq11`}|y+_oyL>A&8c3cNe$My8|;2_c+9X@@G3K78>fiZmO_ChxYETyHsBH-}s< zE?iXfaePDi8qA}HoZ#XV9LF=_>K}T|u)p(?dC~qJ>(NVByR!!d8+tzmVrb3-*_&50 zc0;Y`HeG2Tut`3VYKwsjd1KX2 z@hmw}+ssTT{2~&9U1VctSLQJtz#NRNr8rmAmFNx*_(DX&|G4UgeA5c2kwUYK<5Vu) zNxC}53?i2=<>|o1r}vW}$*~svNlj(cj9^gvk*)wdou%|4N%LI{+JRzq7uS+HB>$kO z8_}?+Ec4G|>wi0#JlQrzu~`L!x{Brk`i^p3z_*seEPq)z0H-_}#}0rxq|{zA^hfBEfSATDdXXhr_2 z4*`Z|VZh&Nwkt2p7s7`-3Pp)P@v1k{`~lz-^sL& z;TJaD_;^vYdWJntEI$nFh(-eYWz;C9@`rW=KLBtG8zZmC-<*Hs&;JheV*dU*JQQTK zPJPkpXc?|fX#y!I{aqOjUO=7?d!ZzO)SDO{-odqTMG%W4tOMN(=Tfu=e+#F0ZY4+5 z1z;b+mNrV^Yv2(AWm|2LSUa8*6p=bA`D1Gyh3PVf3WcM8I&GG4?Tl-22nJTzH7JZ= zMoI%_9{4FbI`&Xg$Xp*d_lK%J_Y5JmJ*vsYN%=3-$l*b8tynJBG4m&sXF99pCm?~I zHKjIQ|G;5NV{bE<8_biKCtltx6CoqxGtKVQHBAanfqcdsip;|*Ce z*3lJGxXrJo`Raqhs%4nDKu*v^HQ%K=_-|4LuC#k%eD59zZw?NZ-%>5gc%)NmW|aZ2 z`PNtYk{kZ~@p2L@$?M$vYBL1}@Vsb~*_CO5oI1y1et)HKqi)BR`-aE#9E@ShxD{HR z>x%DEG*mEh1M|&lwea20+;I4g0i5&5OQcpbk{sj!XellS&u`t`mQ~E*)cINTH)<7r z2LQwd^gI9>_)Os=0E{pcGxhlTUjg_{YLW{@0*d)Q;;u6D2@(zl;fG_`(Y~8G^pINd z5yi9d@KrGJy_DTCce{FeQd z4ZDh&5gpYZ!kC@-p}QAOR)2A6qzz{Ba1xxhsxBT?b0-LhDQ7&vC(b@%u+ZVex(bx{ z)6|jdMsNEa$1XaQV&RHbV>SH&)~BEw5TA11Mh;lIwF0k}XI8VO#w(t!%RfHUEjr@n z?EiYOkEMS>QopN!!JNF!>#j*B6VQ)eflFUR*D>9?1b-MlUL_g+jmx!X1#(&1nag+G zvyeYvW12pYI~-e+ZwP`g!v$zOLUa`7ifAm#cf-0eHg$qh$Y60Rtl6?_E=0cfs2qvdOU^l+3JH^?pOK` z0f5s$k>rN3QCd%N;e&wU;n+Xktv*(-QidZ`+FW*6sPl5iSw600c}jbZgqNnU*14T4 z7rPr&F&gNqjb^!JKK!Y#u(VO*pL!=D6%RsmfOz|LX}mBQ9cLf`Cla=nnBo!Yhgp*i^S3lTaiJ7DNQpsCrM|M zch^1|o{StELEUnqVwK*0)t~SEEE!6f-IjrA_$Ry#7N)jCGgN7hrI zspr01k^R)E|LR=(AHI3OOs3B2$s*ueB9hZ}Jyu3z1WXMUkS$a4Bn5w3OK1Aju((N? z&GC~~?_CZ-oLbx~-`$zwZG#6y61LiJgcvEq@CW}5Z zwaTT%mcTsNNqs?ShBF|;K-T?v^EBfuf25n>)eYk?%)5nO*(C1atlQF;R`X^ZttYic ztN#YY%Fn!dhK3O@ln!N2i~Skq;NakllqkFvA+Tlaz~6e-;)W_QhV(fsHUer{^y^@I z4~2>V=JcT1gkUPH3rm$2UoA=Ca@gPC$d&tb+do**jxa&CkEfF*?9I^>Va%%P6>HQO zcJD`mZ*a1rBGdFp{wXco-mnuHYma~Qgj)it({OckkjoRdqJ{}y7M#}nQKaLfBX<`NP@C~Hfi?hZBKaTala3zmoq*_kIochx zrw=J*?gotJe!!I(nU#7a2byZ2*eS@5F0T0~#_M zu9k7+MYV6|85RXBauAk*OuB+<=PSf5!Hbvj`r!Ym;A%}uF4VAbaA1n{Ytm&oe9#na z{ox;avkUx@N1X#|BryM~=V~}&_lMso=~f~`0BX3^r7RT#&`PhmtDnuav=}w$h5Tmb zo1f~?SwuQXPMc zh(Lj?j{DE0oB5+qQ)X%BI?`Ng#S*@W>%GC>2ef~`0Haal5Gj`e4~^(|=RkH_z1`IS zurzJ$KbEMpsS=&CIDTOG8PPu@^)zg4ja~wdpIeOKQyLN$&y&PYjJ#8#`}?Ryfo*q2 zqHcM?$u?uSR3E_v`&h?48A^84v_<;r`ciU2_e9T$a3*1G!?Y z(r$=ijWN8_(D!YZAPruorqBpx7^zfBgKto{860CB4&>8o;1r zJ<%1Wfj-U4GQ>|y*8t8&7%Fv|#-q?XZO)a7PeZ390oDVZrj}Dlo*8qCZ`khr-SQ4} zp-0IZ2q?wzbJSd$3lEB7#>rnQ`Y!A&oca4g?zgak=h?F@mdFf;Pc<%^4a-~6$-b70 zbDPc2dM@_K_V?xp>$q`Xd{n+54qRprM$DNn4FKXC=Iyy<84huwi-25pbbSm4Fmg!A z|Kv+UpO=hX((LKWPx$kkzhe)dW<7JNhruTl~cpub)O?oQ^+MclFwVn#oc=$-LX);3sWc+_b=H z*KDZy#Wc!k&bHDIfF*Xrk$XSc_kJYJ&J3SEc=c{12JOiOzlrhiegPveJ^b7G_KuL1 z6+4~CB@_fSGCF!wU@Xy#a3qJ4>Bz&Ofam&WFaBFq`KN--?n{w|BxQlqdfu>e!DYRn z8AN_B;&{Xtm^cr4h&GQ_>f_&uR|O3IO>{(1 ze;CYR>5RjRwR^Fj$4Br0^y_)aa<4aP~Rc;B-5^joQyG^;+V}0ByxUmp`{bbw%;*+e_$Thk-Z- z9h!$-c@{jKmRk9*R*lTfJz~Q`+m;DI=0leM&Op3wX&Ge2x4cqwHU^NLcAxiRdG`2y>@>aBQLs0oat}a zo0MY>-koJDVee0H7%zw6-tK(KKAXcq%~rAQH2zJDIt~49o7(ha&+Wxh`+1<>vnzFf zN<&Ms{y*FgD~EMpC9Z%Elq!2Q_wB8~fCo%K;Ei%#+`@+KI<=1vZd= zRqzRhO56%PFSjaIy-qHpf7+6j2!KtVq~+07+Kr^)5e!DPlKldry=Nnz6zna|>SUVn zaeUWMnfwQwy>?K~E-bv<@*Y!5aF2?L%E*Y&M}jT!9s=7Hl+o&>V!#Af(T;#zoUtMq z1Hyl+LJ$bG#Ipiz7{5J6`-m#Ju}WMMc=Ca^Wz^PMiE*@$S^lpgKoHbGP-_L~@9S3P zBgn&>BHgk(b1>1=O1}H+wSZ4YI-k>NaI71XX^@na?Zo#!_`pO2`C+y?7ze#a6lQ~r zlWMLezmyFA{(~*&Zr=tKbds1n)FyGu-st*W&qJ0vBBX6u>t0#rXGPAK_LA5nVluaL z#$ARqDnxP?A6*?<5sqZbBbI}ECYI=?Z#1#q z5Q?P-KcDA_BEF>o#6dxOwW@p`SC}fAsf{yqQ>W5$kz;b?R};D6v>yV4lV0xe`no%L z>s`}Xdsp$zHl8?+-QbN}X{@Nn&ihN%V6WcC^7F>}wH-+JX?-8A53>OauB^`@qe3^) z;-lMZ3hT3?AMD#$T&9kJB!k=6IEo-lh>fE_I7KIY~Td2!0N?(&ZHWT3bIBJz9b%LO|OST#=A^+QdPypGY&?XW|wQx^0% z4*9g>4j;TEH55cB-x(o%hF~9G*$Yb=TU8bB6l4x(c1ra5ZKf_wV{Ie5<|JIXzD>_9OsWn)|Ef!O3QU!sx8?JDK!Xr!l80 zDNN{oeG{`T<_hYk!{#MF3g1xXhgVm|g?n6P%Gj50=ss>_E$5rBQ{y>#xR_FDezL zgr`QI4v*(qxU|+se=lM{qP>mN1r{PnOIXybdxT;2BxYHdm}xEUn?w9G-jWp09{9V1 zGV0M>X9-!e+vheC1=C9dVs|^sZeOPWN#8@S`nn_s5Ve1KB!^$Bq71iLIY|_x zJ{bpjbS8Ka7IH{%B(dwdCb}5_g1J?!mSG`gY6NY zQr804Ju9Z1uIVvV!Onq}CXuN|#E%n8viICwDesCX^@6beq~o9^sTrmoO+MWH6VN$o zR6S!+Dn>t;1oHb}`1Q`?8%MN4&TMAT#u?&n>W2#7c4rwkX||m+m!1{+Fc79{{Zs$6 zUR<}JM!CRZ!m>tCY1>5du0vPT71aeHx8|_`Yb;J)%qV5qO8v!j3W{KB4apO*Q;Ugf zyZK!cFC!W;H)e7=HjF5SE0h=t?27WyQrr+$xNU&Jq->W}oVWNoCC9%3=>GP}!_XkL z&vQ;{hHCxB_ky*2g+OPxFs(s=P<jn(XAHHt6(duwT{u(>qa*rLnj|WqmPr z0XyihsP!0lUzqsP~5e$kf2f%c3`UmD{&xoJOn~fa+=L5N|L_uS^ z7=t~YAQpsgdJ(Dj4@{7OofCK4(<<9#npk|X3U)ZYN%zd5)JIqLe29t1-6{e8yTSQ| zyZq`t2j`M!b6oSJ%&S;@YJkY^<8HCimliy9l7stbgi?3Bt@)Q7&lqlc6CJ8ne;|hg zyE#`@zlri-x1Y!jbj7QtY6R`Bz1R~OJ*Yn2Vr={hbLtF`r|5J%iyNn&Wal{yuPFA2 zo-4RdtrEA~MW|U^TUU`2Sh%z**Za*_x?hiUe(rPc|3|;iKsxr}pQzbscs@;Wp|wt` zAdD398sonG{|M8l zw;}r8`eQn0#>%>cYr!N2FjwW|>iy*HgZI1sE`gr}#503cCRyjsS%lA+t6vpAHCGe@ z`MPXxJ~NL4e9!WYP0b^|@EZ5s1xEAy)`z~a)#OvUwViVbEx|}s$^(MtVsl?WQQ!Bc z$6ZwV)OGHD2Va}aqnS+N0Nmom5oVtmbQig;s{}DS);qZ4FVg>+Zam z#DXf zGfm39|1ixS__SmD;b#IH%2E}SwDlIiRnv5th3l#=tttuO7Btw5)AO2K#Cg5XO5T!3 z9HE}&&JjEhrFfD5lL?tavEqVLfJ_9o4{nV+A|WHF>xDh${ymL9o7y6~XeZmQY;!JM zTHG(<19NERLwpW?SI7)7Usn<(m~Jt1#YH<8o40%%9y$~=;sVlwqadhDhVZJiX4oB6 zEv?z)9nG4FW54YeYR}^5MVS%h7*{(9k%W z9GjM~i`K8))!-f~WCU}+L@cVNV z?M6vRO;o^^+CujgctLCJv-^8tSyeK=%d5c*be;MPh59IFm+_G!(%^FH(vl3v0}~4` zied6P8Z3UGober0C6ZuNH7d2Ex~i3mU9WwFgyw=SyOa1AT6)Q-RZvSdGZ`qfX_PeD|vbNp}m-#n~?vS%VclYl9NC2I&KwT%#KdGfh zLo4i06&O2tZ76M*c(mkv47he(>!P8!_U45%aAXLtXkJ+K}uNaRWD zaU>`SxwXC{;T7)7hUE=eOsVZ5?wNwNYvZ3c+XlWI9}YG(^O9b5sABbzzW1aab>C>* zrDBCL6f5P@^TiMT=}!B5#xC6THZCQvN!{)l^(1b~u$?B)5fQi!Aev3lHUX;3Ydep+ zt9RdQIb&Q60)9B0AK_G=By-1awvz%>@Ou##^?&P8`ozm$7*8&iWow4GAMFGThyy*V*sA!yNQHEB5J4?mBzMerDT6 zKbq}!8IE5`=QmrueBQpfELy~~t$)t)0V?3aNa!aCew&Iz#{cyGVW9<(B*S=|VetHO zP>}oVVLDDbDoKXp5T*dvvq{!@WC*~X;UaxUo)`GclKx-GxBvOHA^+qNY22I7aQG@` zjc;nGJ$f3TVTJzp8oB556$mg&W=zQLpIcIxUPv4Y8sdwE#OhorPkJUsyzdvW+I~wurXK z309zN%Dp;C>->9xzu!iJfGl?7qf)g+b&$`>>+HX3NWHg*GMI6r<>TMm41)x#l5YEZ z=~Fr```x+m=hOOKuX!)V8j(<0`I)f)D17J5s*oW;7G-O`mn_cx6(DY7%*L{A|1+%J zcmJb$(0!zS9O(*`t^ZEos-?)sd=*pF%m1rb0B=_c{vRKqf%0MmByh*k3yhZx^IzF} zzP%|3pjT5>r9Wl})Uu?@uJh{g+A;H(g3tNH0`bgBEEdQX8Sf+t0yi?^5J6vnlXQQF zeH;Ggtjm>V=e!ii%;-TAbM1IbN<|N%rY=BP*$=aRiL34aa}aFqo?BOYJz({ln5gyd z>gPkf5VRBqa|D#BB2)gIj3X~n&klqu0S698c)tu5x_+o@W9GGa;%}C5?*Tdu^7fw` zZlt2msK$He>|C2w$wB^H6p~IY+0aX(f+wkh!%JKcEbZWxSW)ItR(20QGdO$bLJqIj zIDP`4q_*I3g>j`B3vANcYe9<8l3jIRd@?aW9ieWlGKTkfeC?}0_fxT0xS@bjM4+Ui z0&_{Mr8nJr!XM)X(0CO>)bO*^%_ofH-GhK z_9{D{Ni^6_mP43&Sekm|t5<)=m$)$fqQdi-{OKq6uSU7U>R5Dg&>=#$yT_W6q@7@6 z1nS-HH`a-|IY)B?N(lcf(flOp#{QadzUb$0p{^Mj`a?F zjji1S$!Nn`Y*EH@u`&D-_4*}Nj^qrFx#G{nwpD?eCnGz^Ziph3iTl&v{I&CGD-5W8AaPR_F^73GAaIsPFrQ)yL%z{a)qg!=*}NLuTDR|KEzW63Q9k zx-AGU#w)b}I=P6WjHJ!_xzz($7t0ieUcD zV{GY+&Z%>?hoNHy=p@4VlpfI_Pxu3>B3t)L?8`0T!z;K$7icfqOQdy%GB62ICBk(`1b2pOVQ;HUVj`!T3_G+!^K@`30x|8fcChdIG!y6wE5t>ENZ%Is^{Ip*|dhGjTv)Y`hD>9O~} z41&yuDzfUlG#c}Gle)L0PeJe5Wx*#i%DUXUZZCFt*}Zc2dW^{4JnL1I4gP|R2^X@r zhfV0(=MJ&URmyE>Qp0l^SW)t4R2e>FXEZz{_i1cWgRgLIPltTZ#0$CKU%#d||7QH_ zDFW}8RTy4|BQlx|u!lm~$>l?P06s90)@%t^wMv*c%#4E>wvwAXE{{|?TIA^>i+?mb zV%4j&UIKoJ^F%yyn99khrhGp#{v{ZYCIjpnCz3bPp%3qtDu?#LWQTqyCZdzoG7i_? z;RP;1)31AQR`w<2=Zo2&iK-RfR(ZfG+~(%Dx*Cqhgxp~MEz-9#g23kb`H#yEr=+`- z{)xFy{f{D|O1Z@nH*mfiI~B36$17i%Gx?&d#IqcqyO-Mwq3b#QIdB-wW(_Vp zoi*6}TH`m*1d)r(`SuW^TV$WI=72f4rCioQYUP zGq%EZPI@ak4Iq+CZBc=b7PnmRmj<)bA9@Zn5Z3P5+MPSejz zeema(tB-eQf86%$)+?v~&63(u^HU*ee^?A&1F?*2Go2P2ObH#oTX-B(&Dqo z5Q`~{dkF|dm7kyKD?8e5dVf*jEUvkcE|$cVGe0ov?Nj`;cgB5h!}eC4lK%}U=EcP~ z;!uM>z@jqqPiTD45XK5rcV~RA1@d>PMmXmM1Kv!@lK#%5Md56iH&KF|(-7^8l9yPG zkSK)vqv$FO)%^o4Vk%b~EC4qYNNQ1*$QMYOQBNof5B*{;?~%(l{~ZPLubOT(r3jV% zPMToft&~}j+s&KJcrj&ue(HExZ^w5BT*gVv5Szx`hbftE`s{*vZV!EPqON%Z#Yxom z&XxWK$@1Z=$Y7zz9N0Ct6L3PmyaDPu_W_?Mv_a^fA}&B6J#vZG}m3b?#>n7(URRo`S4!OWu_FFoAMC35LE|L?og0u?SnCO=b< z$TJfrT6F@_|E!7XVr#H3wV4I9uh67y3X! zTzl|gBF96y-Cfh-RS^#=MOFFJHlkttrm_B6^XMrVJH3}Br%4w|CG2WM#BOD)|905f z-!TUs$wC5ZSb*GaA6fGqE(CFUnMXkCth-Z(sN45*nQt7jm?d&0jo{fW5^J>I#5P_$ z)EPXrvDlhgdJ7^q#)5D96XRGe{jE(dG&{o1Z|(m{*`#UzJJhjcjrECun_KNdJi6TS!Y)0 zx1NuBiq7DeXrU0SiH1?}L8#T$o1$eC7T1Iov=v%|KC^X*cE;Q2w?9OizgoVV(4Zsw zF8M>_F3*aTcFakh-(5;lv~{741>!Fk9&uS}TeilZ;o#4fll7$SQd5d%8sxlTS(B^@ zS9-^#=GSu$wZIC%>$$GAS){qgD! zBw#FN@vi69I1QTcHu*bQt0E1^sAdZ zi4Q(D-2YaItT1#u$ENwKFzu0A=+h8&`%tSZHuS~Y=6nYg^){zgz{|En`BwW+=Wf~E z5VJd>SQw>}P@8<)=1T{I2>U#3_vIIgRe=Iek&Yf?)iErQm448{bSb-N0Lg_ z4MY0W5q<&NR|}B?V~`>KK|R(1)rD(eR{7GWnB873loTcVUgv;b&MD8f76WZJ>0e7eT24k^n)P6s1asP$l$|2%&>C0Si?iv;ZMAMQZ3uM~c!32}lWG z5J9>kNEK=7UFdJ`cb|LTGsZnZdXq?RVz-|V#hqC69mMcd z1Xk*hzD^wVU_HL^e7~*V>Q~?9F%?}lM3`bEe?)Y73L2K4q7K@*4b^5yNq|+0m1mB# zSLy)}l|U^tw`!O~uFcNS#H;No-L56jrh;JaTN(}u}NpJmfycG@$JpYnYEai+Yg zBe1H%wRAf>$7krWR5^#U>Nm9WL+QI9rb;43u?8dPDh*6EA#>Im9cn=y)8XxcBQr1_rf`(YJP9fQj(1H z)2OI-+8dfYS0Khi2BaDtAu8$##0xM;O414|W8S3}dj61FzLZ(0wpq1OL*H=->qBRG zVL*hfxGI?dnX%?!b8fk5uCcy+cNYF0o)KwLRFyz*=q-~(P$tmQzcD~&v_X1hgEbYW zA?EAoj`q}nnl)*P$_YrM>lRu@LKyWvql_+X{L!xuva(?w-3;M` z74z9l`J!gAd~T`{bat>R^{rv+)*K6)k_pCc*`$en3h8vtw?xd zQ)&Dp)mw$m>5#d+jB5gr2E2BxUN^mUXNzTNt056}FgPB)67o|0*33l`Z;iWQRn(S( zbXEar5m`OO!>mS(Y+od;a*}*mA&Kb(bN+hrc!@-rgTn-Z;S(AD3`GTJw*ZmYEoEqU zSLhst1jt3yY6N%726Fm$Nu5>6Lrnc~O_@O@JuyRd(G-6idUba+QJ6SVY6G!l)x($u zAcyk&AyrvScvkA+8sOt12<`Z(>Vavmu!-Tpj9IDr{)x?OVb2|~Pa7(xU$%govq*AsYE zwz@})=Cu6xHl09XF=~s2$n<{b-dua#6NG{GP&tHa96Ifm1iZ<1CW;r()w_;DjSE2@ zr(ujz(MIx40xYeFOJW4;3wTsUsX$^%DpHNenyRF^PMu}LA{1@4Z|9XqyiC zq%5yEbug8xIg9r-4HOYFp;tudm+9zSAm(-sQ2ycl zc7nOz_LK6B{4Rd0(4C7QTfy@K*gOG_s2m#_lk!zgoV(C29sN6NZC33Yys7=^e`7_%1llkk~c8n(Hq4mnZXvdg@p`qEcMcYHX4FP;%wO@x`Zt5nhUT&pqqK z2PF}&=kt(3zE>@lyrt9E;CrHTPjXb2CA&g>Bp4Q1(*>y*oG}v3Ja#o1YtOvd%JK<(=( z&XPITmRMlX1fYF&&NT6n7m&6cEZrXDxB=a#a7l4MFvP{i-NI>Iu_&~+LsDAO*V0m7 z6inhI!a=v4mM67C&`AmlCST4Ck4?e&%ZTTsyT4Vau{+{ zJgDH0$>VS}YnAbc;{1kAL0WPZY5K;;^)b%QY}U;|JWP4dXN?_HJ?D&gedFNpvR><{ z^(GQ>LJD#DvjRIPD@Qf$TSe3@iBRToVbY=}Ur(M%w*;>|3dcFW#-vdQZLjEJxE^iz0_ zL{eQWs__1`slDj4Bv&0>yXEL?Cb(jjnb2NN9sIc61Xp)zHc0uLJa-@Vto&`ObT3uA zIevZL(W(sk;gBc`gLS##HI@o71|S;nD71HLH}wQytqg>9SE=-ng6sm>7|0>TZcczG zgd}ZRTMur(XIDGx$FaD=PXmoQ4i%QaGw`Jq@%#+c8%Ca@cBb!7iKeUSQx}C|c3Lu3 z8usb00Tu8&JOB?xlT}^vWX!F~fX}2?kG)Q{{$slY$hgwi(yeYYp^&xGCikNNfAhtM zduLu%%P>l(XPP%S2e$gA9mc|~6*YWYZ|cCm3<$SCBQroNOJ(Af1m%LFNl27N|5;L^ zDr;!W`O5CgaJ-rglK&1eL8UX&hqi>y5YfP}o7;A@D_?8lF_%L^f6b*&Qw86+@IzDS zVLm_t&AExbEVWM$^*bCj_oU2rm5=@aSG-1*mH46FUKHB_6BuzM@)Bj! zVHY@Y#`iMfO$ms2&SG?%HJrrGd?h-|1YutCsRm;=#O@yeQXahxrM{?~uBmjF&jQEI zmH{u2(U}hb^@^Q)amo+La?fa|JY@=pBG+6s*;*6w2YVp>FEsi+=HxH!fFyYpR&S;p zEGlcix>+CAxN-1iA;;t43mhPX+Yz>}9vesBmoXnVeSJjF;vY-u2>TKuEL_nx_vE#H zl7fMi?gIVq4_7{)I^c&SrQHG_yr6)Ftas$-n~uua(%(3{ws@aovUHRWlxke)C4TQy zAoYcTJOgImC=9O(M^nm7EjIidXeMzb?uI$|-Q}W&a>CdE zGtf8^n2Rj%dJG3w3OYSpZjn*obR1Ha*)nc^3)1^}xyg+=NjSdrpebAvAMjlwmh~M+ z9lOF&tEeuFr%Grfe7uZRsC5XL3Fhn3*CF&AT0Xnx_A#jsd&Nq!BP zPv@cQ5=tfLDG^U0og|aH_yNo2JLpSI?gVtAR(iu(U7w!7DCJW`UG^kgvKG9j&47};B^oFl!$qY#EtL4*K^7ZUeS7|f5b0iDa5I06h`Dw8^ zP%DppT69B@fy?iUBuhTPy=;d?hygQT{q(*ZtHbtwFE*jzmrp6p%Zkifx4-Y~-t-WY zY-hp;k;@UA9we;IvidSmD9jZNEB8yz&fQ<87OP{q+v|&%?MkjQ#Sq(riDWo-st10g zLkbEJC?ncikSnCo94K!~k6Vnbr_^=kD=73XiKI^maSq--= zFDE1KZ)>hQ%C1JLo`tqmjO6^D@)V?^WXwH~OVdq-v4OqdQduWdcM2xRe|6fGNdqQI zbtO1zt3;hZb2DEnhC>@mM4rkB20{x;;jp4piL_F>np5gR1f3halLgVGcRDC$kCE(S zW%67%cZ+LX-J)7@Up};~92)jo3c)f#4A^^SYx zygha-&Hd-*ltDd7I!JY=l6;ZOKKHcM+0M@BIa8M|umt zWvrsWGicaK0N9AeqH7FO8CDWeIMlPf0}Lk}uy=|^rXo7AN@fCSchV|CyE?_L_GxUV zl-2sh4vGQQ&%-7-bpw4a_A4SXyo_HMvR=*jo>ytIw7y%4#J~PUx?iD7o zMp8IBGSec}=QVEeb~9F@v@U(;qHVM_szJ1}482w3en%4HzI-NpJ_2&;x7dEJ`eEK8 zPQv-+hA?um6#ireZrR1*jGZiAcy$>sMwQuSA=pJa7L_*KuM57jGeEArtGUb@@-YVT zVD>V3W>@T%ctm3Ep5&afom&l0W`!bPQ^8*!;eLtN1q{j^cHJ$)`$zM-oo2SNgX zl!~7qT5ID5l`4nR@8o9S6@8<2XFlA>nG%DLLT_pFftawT4fS3Ek+(G{-3zs0-F^@j5f)?R zqAgd6LlxGSo6Ty=*B*jzp1FI*nNr#eo1@O{Xxt)}GR^MWy9ogX!+Dt2>P2cJHodQG zMZ1#7JB4QT5oR$=l>;4+2rn-!B&A;-8GNlM&=OH2_90mAMHwfDZ7+1y+M)OYM{k|I z=*}ey_@`5~vWtb^)HnzkJ%Pws4*C0^Eq`<*JRFko(%n$FaL?*TA?HMQ%Z%yNj|SP| zAM`G9z1;ckc4iZIF7e!3NJ=Yj*5f@t5E)zuCbk>+bExQ!_QGmPo!Re6#dtr?i6`u~ zdw#s>nc`e_otTqmwe~foZTH#7f#5WmWKIo{>L4)TX4r@N9+$4cGGUF9qI_TMB7&b` zq?fTaYSX*cCOf0dmrqJg+!-csGps(Pv(^zjmp!XoJ=H@q!8a~?UQ0!u<2!8G>>%35 z2@6b_a!l!Adi@&F0wz!xIC*X3z63+W44l8M{IvB%v~wYRA$&5GZYWut%$<_<{k9#% z3S1s{L-fs83n&6g-77hj;wvvsld4@8=>S<#R-l5NN?&Txq~o8<=r~(HCng*_^-aNO zzNqZ9sSH;wzm&6{ARE3mdkevT$M?yM{O!R7$|6@Y9&AdMloPN*faXvSn?~PBAzX^O zBFJCgyjJVi!jWed=I8swst#$SFvnVdo8$`?PP)mq<3XD=*~>wyiRK(Ekl=5zH3kbC zZOSSys(uvjFSvY5DU~QhqZqYRI~Z;)bI*KiTb&pG#5efBrX*K}jg8bL$=21jyZu_( zH?8`<(fLH5WuKxX7xjWDl&p_MzoH6>cC~Y{Ret%M@F?#-<&H7Dh2tWEntph@AK5!+ zysxDL)}gK)k$v$RSV>>?_Pcr>7@p^V?MP;pI9>GC^37T%#ObI{A#0&VDVV|@x971N zvg$gkZ>feRXWtPb*kglfr}G=!Xv|6_r-Wl;&VSeOWd&W!FoU&J_)_}Iv0acZDugx0m_4NW|T5AHamNya2uyxe{?dzFsvV5o3zJIY1;jx5!@#EIm6Ypcv<} zuD8Bav$2`?s(l^J3e4*$9D7~lrG`{HyDxg2UKJ+8^VvP}oQJrS(XQ+54hWQRg1Tf) z{6ce?;Eh_>)11<`mu2xBUCuPmffAYLVnW!nhL6G$Rf`gq+z|$|mLyI2Tn^1prqK|r zz?AA0Z)U=?QrXE>}ggVQZp6g2XU0@i$Wihi$JkJjJ~R3j$hQx-mPo_b`q3|otjsm z*y8S?n00Rt4tnbK5HH(HT>j8Wfs_r2z^35G?(rNC<<^X#k*faw^}>Hvs;!+SDy8RS6|l32x66_7n2Myj5_^OXZKWixa&tC>;t#Ix_}yj=CH^_=bT`+Ep?fjv?DgR8Xyi)DokF(Oh(`9}xa zfN>*26I5zWxY8Y%kBZ;P1Z5HfP9m|Bx>RBD(Ho-rx^*F(gd zc+fWSqBsk;cMtND6JYT$x>=3T5GfhPkaTCIWJ^XQX-@)PT(@iU`u=V~(oJz2^l$n8 z->glW3@h)hya`INwY>&Bck%Rz2*dPJ08>rN*c|@L*d(SmiJtD)UX9$VW`|CJ2P;UU zOsHJ?JKk01oN?$D3U?G*)-&2AD zOF0^q(Hng2Z5&+V0keNghWY!AlaxXU)7q)5)`2!uKO2sIO*;I37kTcdg%iC1M?`a; znWYigXK(D$vkWkvj{Z9lgd>K&+j=_TSk_bpM; zEUh=MJDxXhB;AJhif1b}BS#DK?8=PZgw(im=+=o!aV{x;yp?my(9Avcv^D?VJbv=* ze3O0i`)^^8|8GjxUAFo>2p1Xc6Y+Q;B18PQi~T3iaV33Kz0UDgXUai;i(fx}^jN@2f~`)JMl@BzVd|n|gGA*=Tfz2V)#zX=-W9Oj zx0d^{M`9&?NZmpR%Mf6~DqBio|9yTlI8|umYZ74UdCj13R#x=g4|?967>-RcJx!d& z2axC zg%&oU9N9g$D?iHWdC-cMkE1A-xo&U3g4gVNqE84NvnPQ}0|QOd!3XnitndHM(x`ea z5o-|gFa-beQDPpX0Hd<9Z75DJV|R#aWV67WQ8$@i7dcjerfjrF6p6usIKmPkW4z4k z7^R&W$9*qz?{2CDd^vD?d30*sY(D#%GnUyEqXjS8+P`yU-SBsh&5>K<;SVpyU5g!@ z8CtU4y)#mmNvI+h0_UqVQ96frC&5DRl!h3F;n`j$$@M_g%WwwKgJSs?RtW7_VlMR zZ=el&BF*JVwvXb%!>p(Cnr$0qxt{^sU9+FV}?(l_h-@%ziEy92F!T{0e4I zQ(;LXH|j+-GhG{W=QG9N`ADiqrlzJc zuIPYwx&LcbdS_nRa(L93{99B;M6ckIlX3!fw6$fnY)d2^1f1ksUyuEAB z4p*$qAMqR}@u_5n5lpX|nm_p6l_|v`%S`<$`!@^u(`DQK@FtgT zG-rTLRIyduf=oh+GGPx63bnVz=SiQB0)6UjuHUIdqqdHNIFTIu8B~BzdTh1h^&dP0 z$mI52)_mzKNnTCYr1R!mZ+h@t;FsCn{;5glMxO~*r2JO>YBe57ML%#+NG{`*n3HOV zZs82BRLkfwJg;c=Ll4l3z70*4@XMPLCS(Bx<@@A!?(<)tvpe496yGX%x@1^;@lnk| z_kQAkWu>nZuv9uq`cA_X=UHu~w6I@g@ea!I*TZU3=rBHr>Jc2ZEpQd_Ed=p!Aa>$2 zml|p>HC2dP{?Sb9oT}2jPpb!njOSlBES&7u^86aa4YGUfc(K9nGCg9IwR!G^Jsr_kz^ zz^N-?#N!>K_$_XYaL5s+R3dOx0QLcBJjAW{KPM0}Y&qDyYwy||0KQ9;N{Zs?GmgMs z06=$nDstuMhNI>qt|4zHiY*UWpm#5t3j8uUlBDeW?tJ*~9^>+85#5t7q&iQlQfaZ( zxW7)%gLH-%B!z{>n=gfDz69Es`B^S|TlyxONgwWDKjqOng!^$2AVPJG>Z=J^ zapx%RQo_pGZQ4)6I%GBB^t&Lp4RpnWD5(ta&mS*d^c@|xw!f-+Y3SfQ;l`u|$fh#} z?JREX0@PPW&FbIvn+T5DL+DIf+1?oO4zBSz(V?ii;`V4r*IV5 zEyPRrkuoAo2{5<2bt`*J;YSz$lT$S^0M9aNM=K(J_n(46<>L$;tRH;zXJBF5F=JSM zV_eq4&~Ag_J!y}3SeQ%eV{$C0GclzJu*V!;l!Qm%i86$uMeyY9qap57{XOg-^^<}7 zt^Q>RA48)y?gLzK)U5tRJ3Ai@z2`RLk80pSfQ{PUqqpFCW46)#qt@-jg{el3KXv0o z>FNg{u9OeQYrc;A{o7w>VIsZtuXP%5Z58GJgjW3HlK!+}{k z$trf&d+og>^z^BwmD(j#Qdhq+7F{}|{CJ)D zpM=_99_aD}42Dkj`gmag{r=7K?tE)aOEZYvy8g1(vU$v*cC59ssJyahi=~7o@XxL? zz@;d|<_)0}6=Gn04vX|8K;Z(+D5~e)K+WWIruze#%rY@w*-K4p(*Ho?Z}-tVo}FcJ zu#z_aYMcn5*ZuI#FGKBK%@;xcum7&mnbv_!qN^u%8%_Uuk)NhgK6rLM6_5Tmi>qqT zLiHy!E!A%KFHeP27Uk9fOw;1g?jK`guKtrXYb#%}zTAga(9f`cQS{z}{lI1m|NP&( z^1rXEh(B{N&HH2e@rgW2qM`>A|7BKz`1sntC19Nquq1S|-QLaYuHeXb{4XTwq`t@j za`5Xq9d%dwGX+7t><{-wZ0@zAq6+dT zaN;A>f0OotXcVw)-nW0OWr{1M{t{fX)I6 z09z#h!c{PcRlagE#_K%htA5{B+r0GHiv0w!ZgX|&baiuGY>NP%jVL)FKbZm<>`WBR>buSxwkD(Os7(CRl6$!&q|ME7j z6o1-wmipObO^bhke^1DI>37fO;A*!1=M8Rha{7jh#-xRGxTtr$(CW1=D*0@pyFs6G z`hq^v+XXO^nly8{#r7+AvF2UU35i_w$72$w`9lQte>1|U^}pT`YxYrkXE7-|FswRw zawv7_>(??wJiVdz&))eenI*;Y{}JEamA@O>g$_RdV&__GFU%5&N96wnd+=>7kcVDklQLvz8H1RaswbXk$?b5 zz&}*)9yQ>w^uAWTCHvwQ{DaO_Aj`##T=csE3O!q7Te1nD z_|2~@kp7H_ZC447!%X?)x%MSnD2B8S#%3@)&u%X1FbHvr$1y5jGkr%K&)`&Zj_(E` zLbO)bYVt5})PTbJ<%hB6u3jgU=!>cdk$Z@g{X1U9nK-+Jx^Ig7Wzi&&U(@~MWsmh% zyW|Je3L3ZKb*fb%g0D6$D^+?o=gJqab&ccp`O~$XdFpLO%Ob6ad&4@bUR>@vkIK44 zznmvMXUqtqEqc)Ow|Yx>0`>68#(kInQi=FR44a!xitET^{}B66oq(4+Yu~@R2m-`1V%auhZcV=8WA@v?n}F1@q5YF>q0t+i zy7QZcjOYg62bP=>^tarOQ+#2T!&8>Lh(KAFP%nqiYf3X27vHpf+X!CW5Aikp3mn>C z7XFu)$Tt((G+hRW$nR;orIp0`kazmt@9e#F?|aDpf;LKhnQ{2`Ys~XCaUC7#Iq}+L zO~tf=A%t@+1mfDzFY#c-?~^s|V6a(W6=IifxbW>6uzIWaNDNTv=I$YU#(Q5@WlWzJ z>?Xv+g9QSQuFg#GDmOkB;H3b4a9;^DYghK*aeHUfME*(3{U9K4tYbU6Z_?9u11z#% zEAh8RY?pfn-lX+cKTwUy|L}FS%%Gt)$oFmegTOD1?Dv{obG3hq-v{V>cfI=_hR?Gr z%c`Dptlqf$Ox9NNhSRXFdQcqzCC^8q56_q7Dy{lmj0>wK*xQI7JnuGlx3v6PS8{8P zR-5ky1>4%OVl6cD#%;jJVk&x@9%elDZ2quM%9iKvkVB$@`5PA>zwqle&+pVFKl`>t zqu*DAcrn`zONfm%QUx*KOZ>jCWmk|a_zZI`_A78BmRQVuK7=4Lk) zLOdMrx7~<8OWLSq{}oOdbr8kIAAAL7tbCi-i4k_T&5Bh7Kb}RAE~pp(gWGdnLK-_@ zZQm{rq9`_7KQZsKo>dAJNjNIKxve%40=%D3)SV}t6|VD9NmpS_4Frl3PQi{$PF@q0 zmuO(@?_qkgDhCj{$E#wZHgfk1w~n}#FsUG?>rV=2*f^#wR$p^1-+CfnziV!@$a~AF8$Q$W1X(IH#eO8^+U=|{iJsd zZUi=ya_UQrr9Smmy88FAeJCsiFgiF?;D%(`w&lO~i7S6&^yZtx2A~2lqPbG)*mgAj zb4&XAmviqzK;){yFZwe z3ZrM_?{W#2BRjrc3cZsMCpKY!#c@wF;YU$4MS5)J;Ir8o8X)IRS5CHdF^YOK=0K{} zXNTXH(GrK^EwO&O&rjE~hyb1a+PF1&m4llp~#M@w5+OFSwx&8Andn zx+R>6m!QsVu~t#Fyr%%iG1O^y)p>Vxmd>Kb3D2fV8EHK#1nUssaZY4 zbO#2DdNhd>jMts&ZD*V7SpC3uit35!1*AD^3?7sj!J5}#wU40Z)a~FMTaLGW7B(Z< zm~H>C0!DKsNl|ns_505XIHNRI#`=}yo0r%GX6HyafFH|Wyz_OutUZ29AE#fIAGEp@ zII?)ng$#HauwBKogVeCE9L_Dhi`tXN=@vnxVM61u8achAi=+9U`AbNcQ@GVc38O_pWC$iVJ51$BUv{6ejttJD(gnx^PH zd-g^PQG(1jc@ZHALs>`1PL12@7B*lZbJD!2AhCc*w)|(y1?d~{@$e2gaBa}p)8Zv zC&7V#Ms{!nIn-P&-_FJQ`LK_5lE942r7Qv-e2xw0=Co#m{P-A^(NH$JIp7UIt(@hB zo2R~UsR^TKR5~D!UF6{zUX1B7MjGoi7QOwEDVyFrgpC@F<%}g9B++;!y$%W!U(mG8 zuJGlJFB*VaCzGFwm9JZW;$6MJdOOh~M6lk5J0Fwj{$d|hYD((2Il-UkC9R(3eL4Jsj{}VZN8$-q)QG?lS@*a89~`H(?r9y zR7%ioE*54@=R(-0Aj`Z!OANr2awbbYJEQI@P@fC&2Fe=vj(|va2*?3xP)y0RYG&nZ z>2@tAW_GYn&&{-a>LRGQqHG%Ru>U3J}cqBszo#_-IyL~(r}~AkH(wsRuwI=iekq~ovW2l{SsB0 zXrDM#t(3GTw2RdV04;VB~?>9vHg4zicrZc2*C@mJW}X2Po)j;i$Z&xmT;! zXh9F7)~WpO%g|x5gDfad(;=0&Z!l`L19|=%fhZE=;shcGRR~6`K}ucW!Fsb_>{mi? zp{A=ZSf3INDViDmjBA&uEA;1M7g19r(*`k39@FIH^Nzid9Joq-E7U}~B-a=pd|Xe1 z!V}uEs9-`+uPm#Le9>c4mPd;Lr#7f67?jhez>iSK>YIv-H^pFPkjXo9?9(?ETX)Pu?>z0-v#Odi0SHgD8`w8JGTadBPyn$e>b#W+D9Wn+9Eh zCb%D58|7oB&qwgRz_y?J+W86B((U;V*cKEyNPF&}%1CG~oKuaWYP3bHKQNKkl%*&I zu1zP@E*X5UN{Xh{)S#0rSLqJmqOogj99yXNCPMouayi&+IgO%TmeJ!WMjfCVhx(f| zbkQk#8XGlNcbs#LO!Hr&@^iM8klT4dL%q(H*ZW@~B}~SQtKqD(;QEhxV2UET*qEas zK`WfSOqp{vrcYK*@!90F!qARgeLJpaxij@ana-Ctgm72Xu}SH-E)-(~$)B@ROBT*F zUIb*V_7EwPa*l|INZM3kTb}T4P%CAB*92Tp!*zY@u9SA7t80^R zkt>KSm{AT8m3~XhFJjS*#Hj!88RlT;WeY131#T%>?k*SHu(OThTK*}h@j1E_a!?v; zanbf*j`XwmnI%pEa*vs|hh)gQv!Z^V)bdwv;`eM4xjAos2Bm#tmDk%cSHq3>GI3+t zvo}pTv^&AttR;NEx1ZK>j1}Xr`u(o6s&w;)nDr-smXwNRy$Y?)G@}2}qegn74sz>) zr_(56tS+pKMDL?bBB_LOFcE{i?b<ea4)g;Wg0TZW$-G;qngJhXw7nI&S}iL?@_EK5a8Eci;a!gDsUMD?U z=trsbZh4-WOTx~;pKwMbTFL;Z$MTt!u7i(yj)|j=B-)w*(klc{I!5ZLpq@SfE?+7i zXC?PGP^q1yC0&xEMIA?k1!!+W>J>4YF;}8xx}T}%-V6kQZ)vv^-CFu}B38!fF+hn| zS`S_S@WloLuhwx(Ba`aTQ^I4&CYxe9YW^vbp2wo^uy-d@=~&dYzPQ)v7`w_Wj&R?s z_(j&*TpylQGbZEAg=YI9c*A~lDT$(g(b~+1=ey1QLOdAyPCz(Ghi*8$eokfQaCtI3 ztnYAH_Pp<7nfO0QaTtTTu?1HhyFVCA(2{D->_+ioa)juOOnfXoQsl6>4(s7?c#GJ@ zdNF9hO>?f#EtH2(rtQ}G9lMF`VP0bg)JfPQ}5+u_^=nvmx=Auuh>4b&}8Hw+E~+f zp)9OILz>^N*XT46*LSND$I)6aM(OOrL^D5hULDY(h-h*ZnbE{tn}_#{W>^-&BjwL| z()vC2HG`n<;Ay9YtvZtnOc73nIePk?Uzu4LEc)g>!vi*vztpUvA524;tz7q zggQNKrj&-bn9gm^^}`8E_?p-D9>GYnK|rmQsV`_n+!xyylH?kMFGfAspGJ#M@#4%p zsy0pBCK0)~PBmM_RsAz+~U_R9b}@&1|-y+eu(xOndGl-bRv;_ZN^yY;xx>?-o@~)6&CYIZFrg z>E{CIB~qEB?=Ej8?81}M@XZ&MD_@JI6R&0rz`-v!YXO}}0CR7L?^76tR7Sf{rUUeE zye@HhP#`*a+a}-Hs3m+f4t-^o*J1ef5Rt;KqsAtz1Pu1;i04K$U_+hc90C@%aYTxP zq0`MqJNwIv!Ruo_;&-A2n6e6*Y;uQ`TPEPK&U^0d!pbhpvSn>GQL|xp@Bt5Got)D{ zn#E{PPE8|X<#kWcWY0vwnw0slRJVk7S9whu8UEUfBC*Y|vaEz@KB;mOZ_D_1Y#~!? zLedNgGzgg;3GH5O5ws)GvS}&qo6u&yRMlO&WSa5*1&hoCm?)H*z3RoQsWr?ove0XL zGerRRv7MdiT~CUySR=0VMvbn)3(60D(HS;89v7}rJ=dYkR#O#vMf{v?lBNhVTTo~T zd&+$cmDTa^0*W)tf=fV8k)mHhx3z(%QpcIHDyxo&(emJcNz=wPCe4$_Pw{k8csf`w zffWGQt&;rh1MXE{BtDPoRwQ4&>V9)L0ac z_^SAR+pHd*%oOVqOx%Zq+z<7qz}X-n`6vJ|O2BIjJ8r8AO)4|>Caku6W*5PIWP79x z;Z35`siO3Y7ieiJGmZc`P&k666&%dJ9pU%U4oH}EFe_o1*Ef%-4O&(Bkrj?;q?M!) zl-zotuECojx=LLcPgoUGIV%kjb85}XaRn`VgKk$MI}}?0o=~v{8IZYFTBx`tWEAj# zq4{ckG7ac#^^jFsmr}7yx12ya%r9J95&(WLDHh(0F=VM8SvIA+1v5*dHUy{JPC>9<1>%XQx*$+9+Du1#)W*SDG#LI9(D88ySpiZnQ6`F`p(=QB+2ooUm#5I;s}t)!DKjkxoZL%qEzZA@Uxca32|+OeLbJ z3Gju@AHN1hX$v~ZMX*+z*8`xWN>Cm~Ww5kr;Op+aFN5%46r?|pQ6&2^T!m_hulZ`Z zP^FSEifp36xO^Mf%LYra*rcUw>>uEHiN&y2B5lxmUf zr?)T?@kGMB{4K))XG_)~KEIoUsTzJZrW^b;Sr)*c8I=OETrk}W)_@o0?Oo-_DC1#H z2bnO@f67^Hff>b=!#OURVV^KNSvF8GkY+TVUzxQGdMcA#8ynZLR^NATQ6UEwE>vS^ z(Qf~`$U+)=>_x9S)E(bYtspA(B1eNXCb@bY2hA@d;;AAg^wy6@2Snv5-h^89a>CLd zTs0kn=Z0b-ycy$>re-BHYWiArk;I&*cR4jQRMw9nqQkMZ&5;qOI*Klaxvz#>99E?PtxFn6vlf-w^FUmSRADC3F40m5Y=3Bu^lYKtBf7S8y zmy2}|^!r~*>>GtK`4-ShI6=U7_XY$oUm&BJ6oXauJ1AC;v!QsAaEwZ53$6#!ZNM#< z>aFTYa?TMRr5+Ekyg)tCe~KCiYG=;KyStB0h)iBV%R~}XJMWa3^#o^q*?{alR=K1cjpF*ci{#HA zLg4+SwVH0l0>?vUo{cmdtggX1scc;!d35P#rBNNdRrK1GH1~H4Pn@qM)y62Y#-%*3 zMOkpI*NKRw`Wi?9S`>`5qUa)8%x$>84yg#t6LTb;Rb$U@x5&g3<@dI-mIl;n7+&3n zOS0kFt0~VdWh5}arLbGxq#7R|&&Q^V(ZBC(e}E6{-Mmi4gug!0S*J-rc6H;3u|$@# zg!a?u34+-JfMyr0g!9$w3Ry&SITPM@X2RpmrGfT}r&ki_h_TxA&^}0Ql;xBLUMF#o zeWQiPFJSgNE&%|tQ4~wN`i{m! zcy|iyvAlY8Y37%YjW!rFm38$19|OB(byN&C6I3eTpO%@45AfsrW_&(NJBWE?Dszee zpPf^23i}`kx}6(O(~TPOMdU<9#`3n)4EM8(5FZ4kO?fUup@l@JL^yD}#Pp^f_j@W^ zHAIS3FBy~m;9x%g85BI|T!a~Hmm_HW5lq@9P_AbAV`hOO7+1~`os+gYaf#fU8 zTcD^2Fi(GvDv|$y0czfi%@t>}aw|PBHLV%{cdWQd?*Fk&{2v$nhjj(B=bxbLu`g7H z_^kGD?$e2P#>v6n1u$5^exub@$i3m)&&B+XUT#~hC~V}evHr2*J~_n@I7NcA<(Tbf z5oR-<^E$>0CEIvEhmqTL?4Cug`|t7Oe>_tqmJ} zI{qO~PNCTTWs2XsPW!6tQ2yiKwe#vMe=k1O`y7a0Iuw$N{ED9|`rjt~^Jja-*ZD0} z`;J_c08Tc~E()OfCJscZgoC3{TOv}fnrYFI#9 z+`sVv_8(PifA?|#&ayu~u@3xu{HOmK;ty=0dBbB0*j)2jM+c#~RUOz`5wKAjdHLVP wQs$=qfe-%Qc*px6?t(SH4n+ijQk0SD)Z zRY6u-!`*NfLt5sn>pDfWIIu0pBAY)e{-M5}%|%;@u)SrP^J8B$InyZT4`u#0x|~$) zIK{>(0=(jMc(2^+aY*S?@fw1ECTSQcwdZ{frTa+tBfy?2=JWeimhl9eufDG*8yd`L zR)ubBCgfy)aX{Ziq$HuJ~nbEP5Y6E*#AN#(M4jMv8v*K=wJQWHel@LV#Fa z@Jl3h;*(Q(UF~!NP~Ay5*DnIOIOX$Pn}8lJt7o1qZ!*=nG( ziGna?m4x%7nGi}Q!fHVHIdjEo@_r#2r+9fqPi>I%Hk|(RU&FIn5)+-ZPq$MZZT9NY z_RbEpI+UF|K8siugWl__-mS`=5muzaXW$e}S#NG>$W2+DlpklxWbDf-eB08_A<$qP zo1#P%F_cR@VeQA&B$3LaH)FqDhost>VmaMX)t_OEz#S)^3mpAfy--1S{!?=|t?S;H z(nF)%!jd_k0*c~_S3|3ZSy~b`aw%!YKZi)#nzyxczM9@KwsHU4&uVgcBypd!=$3m~ zpE_<#Z=~FOvZKcCV-v!lr_|$hj{}*6_?>Q;ebt*$A@};G&V#$sQW+iu<1`~4w!)va zy_+8Hv2OE7uOVf?hG%w5UUsv1r1!DSXv>WmLiV;nrn*5HrE30?=1uXsVQC#aFW#p$ zYS!Xk5PnHhis9kmcbZ7XNaHeRaJW}fvS_|OB}gE>CG&oiIq zyk5`NPy69BnhAtXE_5{p1t&-6Ea|TTo6Xp9_--`p3IRPPP{BrKqGEAu<2wN z&=@V=;DfqD?R9yk;k%nqY;-2Dfy9Quwu;Rex%s;DS<{dIFI%BaM za1`t$707|DBFSttKn zJMESV`inel%I+e0$??buG2V2JYkc>zan;-)0{iX=g)#5TUFQ>qFSq7qplKn=5&wB| zRsUkO8+K$~DrvfjCikLLZ59Ual)*^<#}%JQ7Edk!**V@^Jo4be1poWMbHV0|V)#WR zpJd<{UrjDw)HAz$l+w7T%aNb<73u)5PXQQYO%-uwR{7^rmZ2Ev`81#R$%endK)VyV z2zA7?JZ5_VEjim1!}YEd!Rfzf;k)AT#;iiu?QUa(hc9`2gB@uvzCcg-V8_&%_W$`M zEHv}o{+upw3@bS4zwbNn#2kYOU~brlX<#Z>-OTZ5;Ck%A3~v6Ab0H{d4mM}!V4h0p zjhR}B6kcRnR>s@og&n*E2DO0|$oh~tS-UVCkp5VUzOsUy0nyU!_bIvlMOH~5upEnB zfnL>R-e=eKmX?htS|En+Phkt-CvMnkF_JLoF&sUy&xqIW-H?&#TGt+{y*++_k9Nap zuq=cb!MIy$I99kbu*FBO%ihRur70b9&a_KOIk!$700m1Y;VRzZ+{9%iv@n#N&#;}> zRlnu18hOoUD7K#&V3s_8nbL@&rL~7`z_6#8Xm!{(Ub0%ME!S{2;v+2EvL2~7;y{#Nsm9<~iY02f|`+swQjb{89v1FUpe<8ZLY zW6Vl2lz4g$w}E`*PHoC_M6Ba^CT2IcJjaWT(*`zmfNkpODh0MUeA^gYk5Ik*L5D0|K+zEFyArG}@}(?wV*Be?a9U)}DUn54>}8S&4(ga= z)Mh)_F{$fF8=d_VTWtr#@BtA^E7;CX6nq8WmRy=vb^}V=F-6pj-NBA9UuF+nPC?OD z@S`R482oA#)_Hs-g4y5;?1?|RSk=iZP;1T}l7mj3is~h-rEqwykkW|03ywq+Uo^*J zj5zs#brl(Z|GlM)p#wQ}h0#MdIMNH4p7MTTGXUnJ7c5q|rRZ>RWADJ7$huLeEtPuv zUujrn?41Dew|%K{Py2O!Pa048c0ImQaA6^T(iXbshPyFm1$)BK1ySC_Eo97{(r919}+HA{ddoM=K+uqDs;>tSir4iq^;U&c4R z!Hqf!cJSz9R`yo+cY8dIaA)WE63;TZ3K-{QwX$n30o$|8R#o?$8imrwoECH;X`wmihLI0KJ z{jyKrP{$7(-l@)2^2={Q$(ku!+!}~J`%JpQR59J!8ug^TQ#GGeyjRzrslH*IxZa>& z4e{sim@}3sX>oyZ6?DhJ)dD>E$ldCwSH%~d3>UqK8GSq7dj$K$fOaBfBh9zk?4=9%l zfkS4Qttd8!Q06esdC?|zqo<9We{->|kSx5z=3r)xFet@tW8LO;`M@H8V?Li@A_+Y| ziQpdV6sAY#a~W7iYy{43BW~QkBgaCwbP9qQhwQywWybzd`QDq(@ExOna5Mqa91ZQS z#2)q&KwR74#A4x=8K$%;uc<5xmMn{7NBlaYfYtU zOkO^~eemN=?9yw{evWe_H3Yl%oY-0I$cd;tcf!E$aB=H;N2aeBfI+_EMXrCvEi4_K zi5&)pfGg-Fv@EL+3g6IfrdDQh##jrdLeK}8hPr)@A}oM`ToBDKQNz9AqPcL-O%Y5- z7dFhUuFkw}gb13ff*poj0GF&lQs}egEDaZ6;fCh(;TUZZ5_Zl(D7H5<$_tzIM!qgH za<|m|s>T=T=94QXaj1oxh(W=zsj89cE9oBYLbn!MyjQ82H%H06?>xTttz zH?tF8)&$9uuDNWA_0;% z7!MKCyUO10KIc({{dY3$vm9X8mX6Aal(*o9m-l^lr|>$<_Wu50zJn=1{Rbgx+soR_ zJs>v1uEhYM3w+_vxDX}He*h|tIj2hg6*R&V9tfXdNWhl4+YNt~H~$~@pmL)x-M}y` z;U?IK?!b@dE==*s^2<#l$Fj~9nf$tvd+r<;5@ic$i7xi}hV(*G(*bJ-+c zm$M5c7y4KLdg9&;N7po9?kM~Zc7;qE__(LT@^|;+O@ zmmr*fIP)9pTLDkQiUb}|{=n?|ban5@gNlme%EeE3ypTU95^f^Qk-B zY_r>`{I{bU$I^8p@B~b<>vv$|J_HrGbk+^Hv1<{tbdd2i9=46EK$KDC-AvinHqZ0w zWHcYK+IjCrb7&Q6UhWtm$XjNy-wr;W4N-a@o1Ea-;rDs@51M(z`;7sczQj2|VQF(j zOQ?&)+9C-{M{DE7Y9t8U=&~oYcw`~3R0y_xt>H)Ql#;HOlgAv5S{DH=A~>-{8R!;{ zK0AEjWJEGfa&qbfdj!CdJH|}e-p>cu9}{;*Z$U7*nO^&%Zb4Kgu-P%FW(-xoN59_U zaUXYSkTQM{afM-Adk_`w%jYk6!*FYnR0D^y4UHi_5$@DqbMGiA#m|li4$mPJPa!pEph3;qtf|sn< zPsG|ao~@cRz0W@7v%|Hnj2%QVyLfg%gd(}pMDu@g}GI+UIf|R zO)qV!OVMIBXQZ@YAgffc-fSai4S?Yp6?@82QLRvju?8H0Frzzu;lm~s6B-q zznka&#V|~J_(gpBVH9EhJg?37M*E^9*IIT({tO%NR;s<&f@-x6f2eQqb*JRr%^FKIqqN^yZ@#}gzT=ieYv_)va$A!9)F|3xn;K&qut(f+D2Mkd>az1>)21h6h{@lCZbtW5g`(6UA%wlD&5t ze;y8c-Igv9E3+Gv1I#N0?%b>1S6S~Yu^|YYP))mksSuEv!zq~`8A0iL7^uW0!KiW_ zl3wE!pQSoz)p44= znr-)Xob#9_CsQ>kn5i9gEr~;S_wYKSMBdbLF&XyB)4d90PB-i5c552j-1P46_Kg%W zK-sC0M#37;f5;FlJpBEqjC`?L`Pt|LYrK8CHJkC+C_iOUBfjZ!w1oiYK7m)KFhiCs z-9GX#EWDyd&g?p`DT#DYwN=J*C4pk)!D`&uR5XYVNh@EmRwy=c4s)kme+}wv^_*U- z+fX`KIfzfgI$Ow;g#gKsSC;=U_r-3m6n)Fp?dip`Xc2~)oI$d?)8@QSjIBQSDRJq6 zrRcfau}L>Uf^EOMF^!CK88w>opx*_1&TB+oqfe+2)MVw`tY{nsE&Lhnuf*=$aYN(% z$ekk^P3m3g3|=!Me4lWXGLxO{;YRphrNA0zMecVNM)(#dz$?DD^h_ z@Wj;_h#er0&6?6@V*5QTiuxIFy=!8T-{^27mkXJWJ7M%pI5l#;S-v3#Tnzc z?!V4jPf4F%Cg^Vx;wIz?@+miy|47X9a~XSsMp$!Q;|=e1%82RDmX&DsGZOn)6SLIo zObm}-`S!srQk5@L?BdX4Fj;GHYkKz;mq@j+uO%jYb7SR>-F_%b*2i;VtAu*qiAIYj1WGeNO+7#V^HCy{eKiKiGmaw3wP5W!n*N>H_Twsrji)#Eiutp(-6%xOQ{jb1Vzgb8 zxS~8?*3~MMXC-dS=ySV|Zf#`9MD-$V?o1IKY`P=2Ba^ zVPLGGq~Y6x(tZvv5AICI3ZT~x?d~CF-zx?lh42pG-4zgCkwK3Asjcbur8@lP->$&w zAcErOL+YJwPFhu=rOE*|oTIbK8LwP#+)`MOE^Wi z^L2&dsNG5x@uMI`AW&Cli-l~C()%JhR?>Z5(HE^Z=i|HE-lUxa`BAjbXO4lKy#$XG zb0r`&@cd8{;i9CmVuM(SNNihQ_;TObDL}YapRnwZ1dKEq_tE@QS`#wEM;wnax`XpR zwmUu)R(}6#vRIekuy|nI_kzaaF_^wIV$${lH$_{S3+zX-T*%fmw}8OFC4dTi;U*)1DH1A|q-q|9%Ld<&Lj)5E8tnp?3#L+K5D^SXNs ze%+fJO0YW-wu9|(X|IMH2;CjEI!j(2=X(ofT)%F|hQ=P_<^Ufxv7c#o$+2_4v8j>$ zj)^cX49tD=H+FNVt=&yd+}n$-<317J3$WNkwf3)r_2z5Fgk(r?@S4s2O!i=tfxQqV z7~_kYj~4yTWhZ{xmYY{&i(hT{+}S8OG38GJR8hmTs`A{h|Enf&n&!T2I}Xwvxo zCmql1?^{Fn6@pkvg6H?XmQ)12J7!qbm zW4bVwu662q=>&PFDuQvF;#sAe-%}U@4%!GHYD>v&Lw;kwV{>0f)*a^Hx-w;=+3K1} zee3PpJgRM)78mk`$v(unitHMJxAS5L2%`ZIr!f5;nB`pCw&O`mChUUmf~BBm{yH&xeVofP?`j%cebe+YrUOE9s zNBJ=mB)#3a-<$?qH$leqB|aG|7W=_hinUha4;h1bzreE!D;D`y);jqu*rmJ2p;9Nj z8ool41AKCF*qVTOeAJ)q_GUh>#DY%cM_(5HZ~5^j-(T0fUX6^&vC%_7p3-KBm z%UAd)8-+y`h6ddHTnl@sT0t$zNwavqi1a+Q32c9kyixeg=)h&5pEY3{Yu{dbA3eHJ zQ_*SFey{^`u%t!n&jO3Ou#A!0GGV9zQohEPakTi^5AaTR*)m54$+o}SI&{%4fWg>| zo5Y+s&cwZ2p?5MrIVj;aIj{CBRN2j1yGvg@Z+>kh+q*><7@W1;*WKS49%CN%bJSA_ znpryCTbN>w4N7{((jh?vQPI32EvKz3=pWF0<@5sT95|Ll_}ti_A&q)*o?5=8n4UsR z(g5Y2l&~dG!@!H-c9ldFutEt0ixk^yh+^S2ZIDiDK$7z=e_t^wuvi@*x6=h z`xo#&&Pq8x(xOVobAD^m^!4%M;6=0Eq_wl|Gr3dgHSWC$V`Y@{^YL#hRth1Qq`dh` zb*83IV?Fy^#qFZ5wzjGgOPk7(n(B321W~aHpIiNEp3$l&A#t<2g<5cbo@0M6Ci8AH zq4D9L$RY4H;=N@=;tTUc#oGTlXfg6R9)I3vD$3`Q4;F8wA1?cOd)HGFiv8Q`Ze1Wn z2RWh{S|!n@n|~fxmZ-d@A>YPYcUlC3>faj zh6cqF={uYpz7tKtdfuU6h1&id!z?fEUs#4uJ+Q{2H9=tX)=_gR7%@8ZFr2TxZp?K^ zGJ`XSPzX9e-kSRavzFrA`NqrJHsrY^TgBb*WU5tu({J{=ox(l4(-MW~>(Mjav{D3#8q@a4fi$e9&)*63QAB?C~xj z>9FFrURaS2OJDAM+FZ9Ov$~mra=VR=lE6|xLR*=o&85A(kK=EMIUYme&iQZkkKlkX z)gv_XxZH4YkqFS{L^GG8u9EAQfE4Y=7!k4k9k|^VmDOI`E4QVK_;!bK7szP(@D~pz zI3GH{=I1H%K<4^nisotG&1lhwPkR;w_w1i|;Cbu}lCMqjmOHNF)0vLi^cD-4oPJAf z&w8vgcAt=DEV|T0ie_@*$h3#mr09sv6v~C7o4r-|xXvu?6W-B1GClBI6>E(|XygD5 zOBh?Xef}EFt4yIwh2v&qQ|ynFwU#m1>~ZPkTXW3i)?z>P(iCKJw(gZk>C6+4!C$!S zZd-&S7Bo2Jj+P(ds^Xlp`x(XBXUkpN-kBQYDcf8X%|<_S=~x)8t<$&=&bs z(Q0VwvLay3z3iIBMUyz;9aJv52a(KEDct->J` z$;z5oMN9l7>eAM->q17|sPp#S)d{=n-M^bH&1u^T4~b(qsyQ)`^R6|9KUaujti~05 zjX|<`R$OWnishHPtZbfgoLnllF~K#g5DtBAzHaDrliXUbsX`%VolWz@uelfd6+xV0 zNsya#e~M)ngB#7bw}z^@zxW8QYt2rNk#oh_o_?aQxy{sGce6Gf-{|e5VZG`vs`d1* z_n-Dir4r_~ZCFriMY*AIOghB%#uk1Hlkvt8XP*+S7JTbZMDtb zZQ1D5n1+EE_j&tth800#!wqK#?sB`^x6QiaV)0fwjx)v{IC(ze*xg{}=q=V{TNrU_ zi94j*FY=qab<)vBUeP>Gm`J*D$9h49zhX|dK*MMy=HQi>xoUXYhn%XW`Y6_!Z#67W z{iIrjBW(s8SB2=RK{DnVKpUwD6Zqx%rEKW?6E4Y%R?05LXGEaS_Xr?32RD8}wg?`Z z(qb8hk2UYcb@*gE>P-i~?2!8YnQ?sVyzQ=V=bO}@>o$kgB+e{}KE?L;(kLw#B2skd zaA{O$=s887>@u24+%#4%4KsX0&>*H6_GHnOYIjKdrwg|=hwJVTj&rZ2v9`jGi7{HP z)N4j!0HG^nOb-%aE4bwU#W2%`-apN&Xtiiy6vPGjRZUO!k5K0H&grEc6J5JG<;!?O zh9u0WqfCK|8_vVz8>WMgoM*W8aT@x@yQ(yr+L+vUJg7CMZ;S|xYnG6_!M`+Br02Se zFy^;@5!@&FWI!~T-czic*J4oBc-%P4E6VWcqdc92(AJhDjq~2RUsW6|8y~y#rQC4p z`N`&j8-&AnUj7P=dgv!Hh43S}E>q^wnwR46SU23fQ_Oo9kiv&e?&?piorIK5ma~ob z%yB)K!_Ur1^(XVht&TBmQTP%S9!Y*3i=)LiHb>ImiM1CE%;0vWD^JUWr!Yd#2AlL} zKaTtX3ssL5CO^>i)Ru5;s4|sW!_(EtzFN@0r*Vyl>cn9w@8j!-Up%ceq`HMgqFDoN z$&8S%$L{rqPZ>?uFUyA|iTF&pNgTTY`&XIh`2Jy(cr9?4>$^<~KO}{mT9LljZENA?jl+cf-fdVlr|9P*0dANhkBa4&+Nhe z4PRi|(BLre$5P3qzb-EZcFZ6d^9?3sumfGBNV}qdw9da5(@9KbSRvHaH8JlJP@VtA z(k+j47)tL5Y|`FZ8WLCewezw3^lPZ`*T1Q~B;2gl)>~f~le~1-c;cKWnA)Ycpk_TU zwFOB;I!3x(KfWazmCbgvOsHkD89It#mJ%u~k$FDMRrGsvn!ZwyMb^4OKrCK+ow>FO ztT}2&zYfqt!=3;tGWZ?7&?{^1ifKZPz9B!O5eMThR1L*h_-^K zHjuq<&{L(K4&djiXcqkSw2a`{agxSOvbAy8Y3$g#!cqFP_t>MgWdMhnJ zOHOrXIJ}R}Z-%DW;o9CS8F^O56snY0M#8ICd7Iat!9Xe|{7JbhM*`!pxHCz@8*P?4 zR_A(AKj7#xsTvx=0rhCS+1GyjGRXq$mN!G9{ZxyNB1#Eny3LN{+rY+@zWovd#Q78dN5 zk$2k71s<9@fhUUdC4JpRqo8)OY#7pVBW(6uZ(!>ihg=VgbqeB(DuE|6ffZ#J){wL87bGjkWs_KUZST zXYVDrZMxgT#2G~#t1nfa`=jxb|5x(+4MmXR8?WA%PxV9I$EHc48(jdyfZrcW;h*#+ z6wZr<4`}|&+8?LD-@tA#e0eWcpl5A*wL(1Ddq#K%6!R}|-H)P-$pWRT6$WAiQYhG>dh?Sr|jpnLn7VO+*cKR)5r{Z^`R z87cf!u)7;j;4)MzIm?noh2-GMA%7m#qaN}`v{D)T9qj4c%In`e3?sCw#;JK%h8j%0 zvD!?v*{h`h5k)j(tI8KVDgU+j9SSwhL~fpDxd{HHdx(!0@$=nuWG&mi1i~O|1$)VF zu)&=0Woh{8M6mgs$;e5J`S^OM(9zUET9{weC#M-8uilyVcI2DGZ(L=%7~HCS=9hIt zv-Z$=fj;Vo5=(7E2_gaJD6KM|jl?nLGGkAtEc3i;RBan(YZ?5oh~~R) zo$oHMwDbQ)7|``Pl(Spkrj(dyzd!6>w@De;E#T(AReE7tzG3b;N_9YH^z7jFKki^l zt@U17ySL0QTg@ggEc`Xyt(lEG$Q$BU-uKdk8Y5Low)-Druj4#P$(xt=lF4Wjdg8MZ zOslBvz;GD*{IA+`LTpZ=mpje@$oG;iUUH$cxvt_3Wp;mFSt%Ph#z~mh@L1=J+S1D< zagwf35@8kidBAc2qn&O&9KcRb(WBGJ6Ny2NBc-Db9t8FDABpA8EdhU>80> z*D+s}0A=b|@B^O%Zh_VFmcU|p=`cN65CeOuX}UadqM@Pxqq+8l`@LnAUPxR~OIP(x z9Gg;J^h(wkpsxs^?Q4V=$`lx+);=y%TN`fy<^5pL!~E-+p*bYOFB7nk_Zi_i$8eri z1maiP8L&cmK6KT7Jq#oD&8V2%q=a6#w0{p0k-XHFP8(fY77@L1gezf=gk%~(W|BzC^TZDIMJrbUGG=Hpc? zZ&%#t``|>}Z!sG6%JT1qitg=4hT=6Vt)K5dZQ7|S7R@`_13zhilbJN`RH=h#_%{-z zdf4g~-hydRc)XG8>Fc695S_lW+3oF-u5wvx2lkyveX;F)@*kR)yXzz7)%@0*nT0g+a#lsq23BrIMFV-MiS{7Q;y=NhoS8leTx8;ee1AIE5~#Nsjp!sSQ3;a z`-LDE&7R$vs8Pp2pg#{Kp99gi?kqlRrS$zwDGa?`65+Ef(4n%9a>Y4Y7o~arrG63` z)|6LJAIgNaSKTTd1HOSCch~}|Cq5Yrq3sf}P{1_rtm%}fEHnqs6h8Nm$-0S+;*sye zr5gM^j^X^4I1P}W8!mVL7z3L9gF%N1fd(Cq0VX!gtLc)vkz>qBpz;Y-Q3&k)=Z@)2 z^Gu(+i90@BltHyNIwQ$~*qkK6 ze-8Ig{HDh8>uqp6Xd;*^WKq35idh8c0{O*oEdy*!)hx7$2N+c@F0~qrp1l z@pR%s>#TCRy8#E@J{-6gdx@Q=+zH5RkV8kvgTre&rk4hX*&M^IpgjT1Ea!N9NhqgQ zO4rF^)L?V0`x#qn>^L~G@vpYfb#EOO@wqqyJHT_FBoYD7ZygZ6 ze^_~_!YH^~jb(ZoKB~8dbN76~jX3Gvly+14r&(fqE0i7Q$EJsE1?!}_Rg6sS4BVLR z6UgNvd2I}biWtz!g!rYt=bmVucCJDFf1BZ0st7}Wu-|Mx-mM(ockyCYl~7njHX}!= zoOm8%O7{=dv2#Ka2ntC4DW40RzOa8#Ow#3|+uKyvptgCR0j6w!+IU8YAE8ISAj&tB z%q~EWl@irFyX&>>`_eYrL#|Z(giFEpW&y9kYzlkRc|iB!H$~V`^^1F7U7>HA1D(>& zdtVkv6rVTEmNw?*&hC7wb(OTG&;5oI^AjXF|JFV7fZDS*t zvg9If4p*AI`GZ!!VE0TWrqSJeJwklj z+Y}LNQd|vqCK+tjA-Wed2JA1|^0MCQf0I3Rfr;(%w&y!`OPj?{v)+3Uxrt}qk6FE| zxHy>Pcqgh)GK!9utbbE3+`n^kf3Ysd(B{1q(t4yL2$XVP)cw@bpcR<{Qz zV~(WyPv*r_81k(H>P9=0)X8Nwld6QP{gH3nU*dl&Xf_Yp^Z8z}Wumut-QY z{ik-H@|5n5&%w;0QU(V(O%f!RZ+Kv1JFCZzfxpIlNf?$g(0^hX?TcZ)(f)npChUa7 zVP%s&vZV$2H$Up+I9EoS65=|6%?+&|eT*7DZf)GecG&m8r!RX|-3s&HW|pX&thilK zOj7#69tArKf@y5k`yx?Dga&FFQKiE4ZtpQtqPpasZnz<-TlJvUEt1||4po2Fd@IZW zp7^Zat3)3yoBooKHOI*1&WiP?``f?METP3ttxlyFTW^ut1<#YGCW-#h93R9PDlsF0 znj05Zn7a3MtksvxM35e#1q|W!WHeuY2e{byF+bf6PC_z5xW#GriXgu4e{p=cT(Ptx zJvY1Lz7eMsa8$th|4DIG6HZ4|p;y}|K9@CKhUbsMdAbxjxhRE?|9Ed1$z85g9k`5{ zwtG#G2pz9Y?%@9Y&`Ly1GDbzUJdZou5rN$pa4O5K*FN$kpA6Ux(8wG9dU z)C{VvOb|q)hYB(w6xxXQz~1;ni=KV#Gqst){U~&sKEgwMXJ>lP5<_O7NM? z8V^WhjnIGgAB(Q}pxwIAOy7l%^x74|b+{`V4xK5wkj{y0ATtd27NCf_=`{*MOhNt! zc7h(n)5KZty51^_$=_PtH%dNEE@(zmRWS#l9sY_S)B1c!SLXt(9vLd}uL|8&HKx|D z{>ZM6CsOanNUdkG7o#)@j>{bzhh?={CTg9_2L(i44&0CndFbCC9xQFLk#+jj!T>LI zp`85hd(=yr-HJU7%^l{a-b>ZY&a;!v1k8UKUz%=G;}|QMgrOuTGW=>QWqqJCtBkGO zaeQ6=YOUH1T@3dKm1&|n?D?Pb8pTtY6DfM3bw2oKg6h~h4j$mErSi0Uk5HTT9jJkG zA#Lt&lv0eaC5>vhvp=fc&>#u;sYBryK$rZoWpFh*jwm?p`|H0k<`(H`lk8RHuL>Rz z;b@nx^emC3c|AI1r2*6`O}GCb9tNW7IlbwiqYAyASS5ZopYt| z`5O6LN9-+LUJnM@H?nPEJ#_;z^B$|o-$7Qub%5E(P(z8$Ey^6;>>YS~#MLKUTdb|^ zrXTj*ZBzH$9A!@Qb=*H^cRfhpuZwcWUz!EWb<1&_J2tD@&WSufw3o;3tZkon(5Z&I z#n&lxQQ+;r1*<>7KvF|mE;%B|tNdWiFlJfz{!0h0A0wMvz|F2OF$!qo5!aBMrLB=v z7ejS8GwZWs;lK6M56vgoI&@bcSTqHedS@&2p&5$v@cS~&(+~kN!kI_Kj_uAI{2aHD z9Qyb7Uo(twiF6q~y5?L#eSTa~ybisxwhCtENS?e$X>R`KI3ei-0&|}>Kz=+%$SCLb zU==HyQ-!ZHxRw+eQ6oDqTLKs~TnS!PfBa!dk#syw(Z&-G1k8dWM#kmgR}u`v z{@c20bw=TM71QLkYN}^z9<>Gwr5=JRe>Y~`Bwm42fO#7YH3{#s<&wkdAd!J(X}Q{B z!^eJ#H414$d2o>S?W}hZZm+lbf$2wwU4WPbEs}L)!W2*`V{~d%MTq=zNZG&SEC1wecy=0opo65)G zDjy`|yfx>6bH;DWgksStIalETBK^l8ycc!#ck}AGUjG|JgoRQjZPZDb?@?GdMdHjl zJ@8YoNWgBT`vuQ)<|K8)8Y<2IU>`_sM0VX)pA}|6Y50MV&O!cbLqX^ZduUiHVg|&Y zm%eL6tJcOVOts&_-enLPs}nT1#m^J_*297`BlqXd??aKS2u#by7>IXyMJ~?QbA8tX zp(hB7u9p{ovt!%bcgwpgxNS3Nq25P1$%dZ$b(@DefBm16F|~s;d2I82DG86a1TpK^ z5;6SHQ*eI#gY@F%@q{)shr5J^X%F$&q3+e8iN}H0l9viofKTREN&zp4)xG$2jlv0i zHKsCNdAg|Sif~yR1FE=vyY`+m8%7vT`LBj0KOAfLR(mOIx0M>f2Fpk9=>s5Ak7-=n z@vYUrr&|EC*Ii_`W)iPv&k>cc%|;fME3d>75!`4Li>V6d^f)gt(vQaoWv9 ztQ+qCjM)e0Y!qu(iogTfB~2D4TfJYD5A#1OlF`a7R-Cz?KgKZgAtZH*MGA!$aT6fI zM==m2D{V3-rXSFJj4`%e1lK!m{dEch)k%ux4u#8czSq*M7%Eg2$FRb(iXOi`f$Z$Zg1zUBEt8_wmW~M5-{w&+d8-V2GS^RP3jdm2862ZwO6WR5%WOb z&{a(i+^`1ZcND%E{|LaSmWzx=mCBd#B<#ZWe0n%|{@>02K;Z9c--1|Ajn>7eAY z4;ewhz+QWuJ5O^%}BpxUK_xE|OPSQg%YQO>d(4xG$q(mWAjrc@YCj*{ zNMcT7rCfV^-nS$t(+lmn3uO|xC9uyIV!8Rku?S(AOmvWVEr=xXuaa^so_wCW*B{j4)6UMC&=+=pMfjALeN=WQA~bnRqj};g59r_XUc_$t zUi_F}$(>)`TwTTegq_%E74yZ)H>0eY@vuW;=rY-CY4$9`TSrRM^o{nX7SYRnJyCjr zJu~btV%l49F4=Kfr@^Me~NWWm8on5)5T z-jn+}+!j|hSpxZz*xfEJvHjg5=ORtKeG-^UZ6A+JnBVG>4k0#%!iGG)f z;N$A{s|pnFmp9MQV*VW8O`G~OF6k?Gau9=ZqKVqus%j`xIfv$LZ_S78uX8r{^7CT2 zUQwB@kiMuv{}?Q5GOFfZ!F zct`U-TtB_XbNZ;0u59YB4N{be00jS*NY7eu;a=rqKpZ^C>BU|1E_eQHddkhl(Zs z>>d0}^%r=4%B#lan%ka@34PtZd$c%O`<2B;!9bfj5bF1y3s(1yxJih@$b&HH%RY}E zyOAb=YoyH2!56!A{wZZw$JH-&D-NQMx$EH(IB3IhO)RXld2^NXctQAbO-rk_Bk8pop?sVmv z$$a-5!Tx)3S`1faPLincw3ASWZqM}e?_;;ur^P7;`|j$fvN6UJBxn&>$AeR8hJC7>mjJv?{H~}fNcAs>{lPx zsdttnZ=cZO4f^xi?gdf~g0Bd5A`(`L1# zSM+yW7PFS;bV;if>Mf1OdlVT6AKsQK{j&c0%UYl<-K%>Z{eDU80$Brp+?D3Mi5x-v3fy;wv@} z)y;h3Qphs(o0wE&capf^mo(egagz57PiK1^u(sSb)?0*kkcu*>YKu&^i}0&9QodT& zdv{?2NE_EW;8W%MWZKD(KIP3iO_&{DI=-U9G3L2JL_8-3Sod|i=snMJoYmDpuxYgD z&lau6D7AsvWW3X2K`&A#^sX|@ zT;`lJ4>Uha1k1&M+10WrUM__aQdVKEOUc*YUVzl+X-JTGV=1g6vbk= z3*FzpTpp9$_PPX*`%}L$=G~$QLK?boKmS`AH}$Ox={~n_>?W}nPq+P2v!PF-uhHTm z!&iEEE6^q?1JpPzXc!34RsHCFl6|jy?=`#UE42PkF}cDI8^_Kw^dUIb$v zVuDp&I5)`TmS!;gCbHIBL(ztv&g~R|mJRj~CB^Q#0E!*FM4OLN!OHlWq0esv}L&k5(rUgxuk3);dOI1oAj3Xl+_tB80AkgbIM zNn4ngSMMls=j^V{J*NSeqP%Y=Bm8f8tKx1=-i~v^m5$k+{rRc0`sM>C{^( z3hxP=UzHt*vr>u;ktfvLDUV(rX;_~uF#T8({(_E-WnYx@zyQ?3rp=NhoO2~$n zhuZ#yX!;o+^9hKlf~bV9V>UTB2VOf2DvI)C7HFxN(aS{TS3JC!J=5l#Whk_03Q@p} zMztXU`#R!0{lk-%ZS31EK=i;vr56-_Q4&B^Y{^}YbA2kg6I&p%ujrh);xG+>im~%GtNP{5 zy#s*d4hnHzmvaHHiiCaSyAb`@bVnv^4gnm}V)3E_VF{h9Kfx#u&O42W-*93qtfL-`q;Kf0j3wj&#mXdr&L$J8y}KP6oZ>t=8dStgd`QdqlwL9)-;!o3?%Xy(FK!W_czO03f6X5?SJtn;!>HuR z5@IY}NR_%^%>{N>kefaGV#Zhjrh1-~b@$nynuLdbe6f&_rbohl9$oH#g#&+)WrjMr zt3J#fJikr1v^ogNA3MIxa(45SR#_aRLeqlUOU}cI@VXcSafAsyq`0BypX~W$7dF$%UVJOIN0%ciXh5Kx)`>w)pZ1U4$4(q)VF_b)LQy zyJ^m=?>o0$$pnZ#h{ZQd_h`SAS9ks(^|5H_rX)VTZ3ci_#-}b|9!YR_{@{L+;&%r7 zFQ9eQlQas?j2YTT!zS;h&fYb}1Zk+VGjjip2vU~*9cv$sdPz6AAs%H~(HYeLCtmp_ zu>)^oEsmj<2+r?Yikxn?Hz#eRbNJ;L+rPBa$%|FjsqzZB1lA}Q8&lQ3c?C}Mt6WKD z@6xW`zw6w4qT5k*J4p%SA*~`HY$e!F?i&Fu>L1Jzq9}hg`Tcgk>tlgOc~!D}pW~~_ z5(gfmD(se~;~LeC`Solc{@Faty3vpwo-g$`$oAKSo*5Yj{=7&Eo8Tl#ywnF7su$l$ z=k4&Maz>hL3+}V%@-%#^wY#`ue)xbDnWM}Vy#IC!?Y)V8u&!>d^#?Z2wU4U z!3Y8PRKerX5C?R|O%~hW|K6vQy4Yg_syiFndR{R+ATUKov-23K259Sn#h)Sr@keo`>v@3ad0vHHq9SX3pu=c zG2{P7-CO@f^}PSX-R8pI4 zbe(ju<{w5XU04V_wZt70QT9vNjn+dcnHa0dt+nXDjRpB~XPziEE9Uf$*Qu1Q1NEW|rwpX}yE`o#Ofgn|B5>oEYs?B_qf z-o5{qA5?SYNuRHY`)%qsdtXcB?y_ z7hy)Njrv8zW-Ol4kJ^5{fm>|}pXtn+vIcA!n>sCI-4;Ql?&duU}gai9Y zqDA46)!mEK%)}nZ8j6W{y=TmfN_I}ac;!m?m8cd6p~q?E4p8?*7+MMH^HXbPDerxD zm^x*GvX8v{qG}Oy79V+XU%St*wXQz_tA7F(g3*7_0CKN^?jLnC)zJ?jzpfZN)Qwf`kLwNot&YZHc&+NMbR(^nP0Y4}2KEt5R~0XkK+D4`yGbXk9Fr z_`1E6+A&R2MW&qv?Y|vj6Q=Q)b8lm@Q@0qb4}cue>u&runae8sE%CwWr&=n4BaXv( zNVt&9HM#TFoKN6vVh_DuZp)*e}O&j9P3W`YfRAz-QPk{w8lIeB|cx_i~d@UJWXc0Rv| z5EBY#>ec9`6d1aMR18!XbQeQQKQcRMzvPcg`s^;~6f?4+H$tZ+#uqBb6Nj6SmM%m+a@hR`J0afP65=1IjoJ2t7O!8yqPgK#Ht*MM_=B{t|x z>uw0J%&K?;$pp)!a!ZW<6a$XFs|-)Y)k?Y05c-{6MRhfERuT^8Zmb@W{Pc8K6G-`! z8cxjGn_xNCRC7`*qQOhDOZ@7+lkX&Lu16brXZqDA{P22c$u%sUGL7=S<~m>mcIZg* zWvfn`Shw#$(;FP3@&kUl6DIO|59DgK8Q+We4#@E1DwCB!*<%K}Pe?r=N%_v~XVa3& zCo&%LG7hImER-SMz}6KTUBFte(Kyf^MU|PTG;xYewX=ij@xOil0;k@@llhWWmwdck zFsvl~_oX)(3GpC%*z>$Ay!vyY*S0HC+C4 zu?(S!ZxMOPQ6`u`{IM!((zt@@fDJS7Q$0_XFZoD3A6tFc)0c3aLf_13IRE$Aj~|{h z_ZGi|hSFcRX?xFNU8jP@UCWrVK>U&K$_#wu6P$xJ{3k0RDrRC)dt=uPHC{tcNI!&T zqT|=Uo4^Z&X>)j{gHaN780I^_qU6gi*`h{#acNv*YggDzT4AB`3U1EbXc|<8elMrC|67a5-IXuihH#y?gs)T3GY_xf!Rpx^VB zguJUhltE5EeDo=%d);M8{$X=FdHY&mplBz!4Q^Yu?+34K+6o64(a1Bh7tz6>Zw;_2 zceJE1(4ZJ@_TLVL)viyE0ZIZak}>5FZLfCIFfSS@F_TuufoJHahpzlQoxFx~V4B{u z_BU`k$P3}WKdlTAwZ+4|n|gXXwYq@j_C-Q2>O<#`yRm%8fVL`9um7b4?~jyAdI4|N z-2(>_b1so!j0vo4{$OSpq?b?m**jG{8q>K)Fu-wx>{XmS-b;#930piCu+ zd=Rw@PoHvB)|)v1%L!u|KmH4w$W^Vr*P+l*s<;BRzO7}h8ON;8HU<|}%#kt+N1;() zqO%P_kH89_yk_5;u=MiaiCOe z!+*BF0wjj(4>-6lJ#p4Rd0EJfWcjRYjcvJOU1g#wXTXj}OwR-p+YLQV^@Pz=wPh`a zRUpX4()iQzk7=I%6M3FRSpyS4qJENea5}r$@wN+$+imDI#ng=aXY@LH8~#NPzKG^$ zz4FBPW5Rm}4W|87j2N#+x-7L@g7IC0Xj~Snpsw9?>Fo!fq^sSPRorc1ZcsdfgdQMfEFPNP%^Y@9RYp^N%^m8OgOZW z`Z?1BXV0k+vkWO(H{IK|GS%;gc2{28ml`VQLOhPZuN_(&R9}b`aF2BXe~WVvuYOs; zxt;eicc$Ysvi8T5%{6C7LsqASXeE(2(?8+!X=`-U{Z$@3M}0N;F4-`ZIFgO{^8*11 zlO+yMpa*fK{ifu1Ox|w$ULpKd%)e2+zcf5|YCW=MtHvVGV~Q1FVvc%N0ZZ3bO5uXt zLXEWrP0BgdHeX8m_S~SS&rh14et6m?zQphEzUZ?E7G+=jtiNN)>NaHLK4*I5Fg3tJ z6f$j!u^BMfYa|^kVb&Q|MYQ0fiPkI~23sBh2xQwI*h|}^AxaN=e%5^ zI;&F+H5YIiRj~Pu4JLYmL_Zk`zS<)LiGv>D)NCdXI`$#9-@HO0uy-YXyzOzNMht#& zGf>xLIl@1f@#o66DH3AFTrT+S(7VkDU(*R03Vk=%9Ttk#>84Uaa?o28{SM-aF#)d& zpTOk$tdl|BEG_Q|^G-Bh_;0=p+80iS`lSY9g-)lW#t#WL4+vK8PMX`x|@HpvL8ow!5w&YieCO!6p72mAc$3h?d@80=M%A zWMDt-&L!|XdzqBbFZIs0C;1W3XGSugILU)Bx5 zga(6i&fg^Ojw|nXy6mj&f&8zz%d??A`&-#YyYa3o-0G!~rN5FVrlTAKBkw8xn#mLs z7R#1*cx3K+Cf1L>e2?LtCv2b2*U)Yx9U|mWZ(_Z?R7v0UxagkP zS^G4-`+j3Xmj4np8>DU#K*gZCjXVOE4xaLhG>1y)Py6(~t^(^^9Q0#};!z}~indzi z*u=B(E7koZ5#MA92H`a=)*d8VgYXHHZ^pcs;7U#G3nz@Rp=gQLgN!qplwrvp$s~(c z{G#+*tjjN#1el*IA*)RlXV^@*o8$nz2tc#){AX9c1ysf-Sib8`_O0Fcg68v1dRFzu z`8Va*W1iaHfS#hv8Ie#gvCV^qz)0A8)2exR^duG1hMmznlZ7mT|D-P%--UcQ%9^Gh zJ(4s4GaW&iv2!35S>7uYtr;pU@_rVg{ zlvrpWzN;-B^%cTT;u-g%A-VWw0#+i6w{T*jR`PV}atTt=J%QH;IuT7!NCh=Cs#w{A zvq3QJq8tx-;rj8y5@EL{bMo0?g09|>uM9QuoG}65zE4T&>)4VUw<5;+*mEy-XKB(x zwh_)$#erOjX_-9`@_MUZJ_4e!-d!kcx~9_9ypF~wUJ79O@Z-2lff~9=tYD7lG?7$k zE$n94sq>bJ)L8PdaZV3vETWd8*(FR3ldhtpkgwpkh`a8KC{e~Z-L9}46-&%Ky8>mQ z6=Q%1-MH)edeA6$?V@IF{NzVpc8*p0Dq)5w5X@19dIB_K@YrFPJ7PDD1(~vUd>!m+ zjgb`Q{6bvoNtma_+7&O~=@5A6@`O1JF(kCiXG*A|44h`kYI|tv83gCGnk8$Yy>* z8ck9m;o-a$Mk*{AMym0k{Jh2HX8NI0ab9)zs_GPerWOVF?z~8CwrNl;ep9uiKBLg2 zMw4icOg2C_uVssz%nRi&a5r_AaU4&wem%|~MfEH<=9I+AJj7esCv-h|l1tY4qef{% zLzQ0eO?0@}a;}f3mF74fsCo4he(6$-8#hcnyon7Z_G0ZWtm1sDhE_|`wQ&;oqDJ{e z{J7h8%E-U^ngN6pIB+W7v2~*5>0zGy9O?-8^Zu)^rg+b0eIr%r$hz#n%cAn7G_C@m zKLtvdr;xYtq2hM^D*aWNTy^fdMv%um39smVS=B%$WDmIvOMco@pHKraLoe#h4z*Z> zTi0WTKfEys_!62sfYg&DToLZojBs8j#M5d*`&lzuu&?ajKb^D8Uy7w?MV+G)@%F`D z+>kc0+3`B*xt@okafW?-?zJG;k=Rl#p6A@Lrj)l01|rVdi?P%MPF1E}BB#j?R54Ef zn+J!Hl=)jc8t&Gr6Tiwvv+P!%Ug5%V>>RqKr1C(no7KgxT6(ZTaIMwzh2WFZEvJT1 z)z50r+f|Rc1JLJ-0;(E3#(HTXigJad4H|IuPP&meuVVakjRJSsio{x?rThd|C+vpv zF=P#1&C}rA?AMqmitqE>QLLV(PC3RB4+4_ruX6+bwP_#MzADtZ*xz!xa^ug0T$DU71)K;UW=N412huRmK-JI3i`yiGYc7+G zNoZN~AW6~U%-_A(PE^}{(`cOiO87M=1KQdd%5i3d+YusLf#rJ(O7)Xa_HiBS`CF&v zozAH^CTpW@#}}&f%;&s1(|QS={#ln(D*cI>KZMO1pWRc1f*~SO_&T~tC=)$3G@5nE zN`OCqs!gL|syZ&$=;w0RFu8>Y!YN*|J6If;D$BqPoo*U1*9cnrJcllEf(u`Ibi;=A4KQK zBqpcN87MxQ=o793kX-dBTZWyUkEsaT2BRw{?jio;0^>r$J^JX~h5kikVZ4e!v6_N` z@So}sbgIi3cIrohv#rl2_qvrI&I*g33lh`n;74SjZ_tCi<^C4!+|>10mF-A+_48C`;7yCYN*-%C@Dke3jm zmq5b9?kj{t)WCzu<4w5VHhBjE%#w#m1fOcR^)!Fe`2j#q0zR&-G z%}1oCh-J=k5C5_c8II1llmX8ZeNRgandp1itGKdfWT+M+Z~WVHGfAz+U-?|b(OD6q z75K$Pk7OfmRL~18O}9Tw+WBsEr5J0DaEhoOxrkbTmZ74Ii&Q7dL_KLAkGGGU>&mhP zdss7T1D8`i)i{n(_&V2kfEI$GuF{-H4@0VQg9p6|57uxQ1w)M!8&Dk9e%`^yILS4! z_8?6>7L6|>>kp`ybVwK|w|c$B%4-WEH!jqu(-9(!a)UM0IH-paZitEql<3V}#j?vl zw9FQ8F0-;n$UryU>>E=GBeU!lPR@(U2o5Nf@eqP9-IYW5Q^-xpC-HH7266sb;Jm}F zC8_Mv-CsL=Eq3Vg6FnyK-j9-4sKlha0tK_Da?|MTm{>zdWIBVF0}@6oo6GSOMZh&> zec67!5*2(1tdpO3Q)H+lt`t5l$o$5rq*IRjtf&(t6iTW)PvL|Qva%HPS`!Gqq)lQ) z@$5HJ+6oh{AfE6aGuqJ$7ZCV=#{}LOYkOYcnn*819cp1)xhPCc~c2op~#JXAZ z;iX2}mBlY-F0MjJUro*oC{-?En*o-{%pR%0=QfNduLNnIM9?Id7N;`zR9ouuk(i!+ z0%bd^6)APMjKnd-`B_^M%{;4YB$BqhB%vww=$DUtT1u-||nxZ5@A7 z4_7v-|HQ88`?2vt&|pt}kAq1kmv7g?atT2MTYAhPJ(gM5lO_r#QertG@6I`PrJ`v` zP@9AUoYvJ~BM&vkbz?xsU}WnMo6eQlYg!pMVp& zZQU^`$09{o1F3A}UAg3QKclPUqOYl6a%ja8zX6eouH@1x*7=YzOD{u0oGnBDoJL`J zW$(;x0Wbu2UEVSHVnmJ(q0Sg}J%JsEenR6ZpAgniTa*_KgmlULrmp7$^O5O62l2s+ zEpNY+DU6Vnvp#$a+CTH;WLFWqjcGwFFLx92WY>OtYO{KE{&88HtG5V_5GGBx`&Dq; zv$T5BtWXve%on0swv^U_b^z#yil}O1aj2lY1@B9AYU}ZuU78zm^8xI@Rhqv96ZpkA z)j~D11@^4hoeR{4(3*XCr^S(% z-3eNTv}@x4U@(QT_VoL_{y1aGHjPAn>uM-7VVi~@$3!OSj?P;HXx~Atpd}FkY-X-F zQ{;{bbe(W_U1X~sda5bEvm~A$;UuU@H9Z{m@SKu8ciLY7kFBkM=G~W$HR;=Tv7@$S z*H2fUU>pH%3+Z#~)pLdbwzhPj-JDcnxXt;~R`Sf;tZiSO;p5AyMu{%PTE9B@(1MxQ z5yIGq-G%SN$WrBw7}CL;NDupnLYh)NfJ1*kc+p2-dDgo4nX-_5LiC_)diXqKR^Uf1 zwO9}IxOq8K&$rwl@uCGXg@h)QUI)e*eGTTI*KRGn@OimFHD(x&m|@1d%9K zo!MCx-AFR;?{dnu-X*c&(~iQ#T(oSNt7EOCZXfOjdkTi;bTM9^U6U*BSimEk$KGWO zi3(2g?>h7hTJDKvH>j$KL@>{1^2N4T7i$OKT}>m||vo-7s}uSDBnW92@KYEvVl2*NgnS({|N+HZ?Eyr{^9#(V5ov ztHNtFoTC>XrHT(yfdycGW)uo#GEn5B)Jpg4OLH?4caC?tF*wEi_#+u_q%kBHz01cL z9?`Q=Ha^Pro6C}RRe&BFoMpn?e5}vuX$mrzslW_N{4?z~DvrhY?r-Lqs2`L;}uzo)=9wVWPsvvcM2 zG_3X2I{e%xXMIW`PagS`*NB5lKFXuyt-vQT)KG~?|2NOnxC-(N-cvhFXqF`($cDx! zWpfIvo-`q&OI*DfMZDqxcp5zZ$*4zm(}k*H(>Jyh2QSM4$fpR%!0eUh?YMWUdw!8L z>+`n8`@jmHHTXFX_^>-9xcONq4qF>j(#0&u(<|{h(rA1CNzW&{kV;dZ4X3s|AeLq0}Bf}3KWB>&vEArpoAgCfK9yS(^F)s+U8DI z%wekZ>?mNcvNGZGuKeb^T}-&QBGz%m(YB5&G3n2{J;vGp4M%WM9A=|#U2VNLEZ9`= z)Ga7z!^oDUAo(;ROay#tEbMbmdX!p%e@Vw@_U6~ldZFtoZo0K?ohFTff2utii$}6( z+OCuA>Yiq{w!?a$*J+fv%*CeE5+8^s;n7BX&u&esiV*lY#4buAtxkqA?v>QQ*Ji8d z)WKqI4j(Iy)I8&O|6rJMQIN{)be{-h@cm&f*ciom$C@h3m7c<6{|lGJj5^hiAmyU| zUmw&|DS+Sn)yzMn!OB+1eg$e>2Q&Q_ZUMj15BTJ2H;r9Q*Oz2+)H{wWofd07eDm>S z$YCUDPq^Fc+^L6|s*U7g(_mMEv8`KY*2gqdM8xO( z5`10|CRV6M2hjalmL^ju*^_wog|HZL-3VG42x#dm=fZxAEkb-;eMXE3{Te_5u9UjQjY%6L0s`4AkB#_h+W&V5mRkENNvX+%N?N_erOAaU<;qHgi2&%Ka z2K437Qy%haYM}Pd8uS>uBx8n&oG&x|)KgCdC^g!I631UVc!uQGx79E6RN8x#>*$3E z6K~>SHk1i_0Q=1kg^y<PqG2nVWmj;t*U0jLa9X4I$D`4C!{_AeL(&9<;$7|xn8 zI30->0JRhyB+=#Fq^e<>dJYi>X&xH5F5$Z@g5HYAr_1J%2N#haGR zH2;_?JD6bo*mN|1ZH*g0RfQI!!|1e0=uMwr&0k`(krC+zQ9?)uze(5&sTL3B54{%D ziWSjn&Vn2==Ea0rAt}4B$fdAy)X1eC(@Zs_IuxrmNb+=!7k~@_H$t8xw*qd)Z>K^sETbccd zWaP=CS%yvsnzLE6yaG}hGxr8rSitTeGD|19py zFC-kKA-5!Z<;mNa@N!;BAdvTp@7!lecm?^sNyw*ueM)!*@sUpH)rtF&k4?6kX}?(P>Dm2Q{Mc{4lKtFI__8UG)7n*S%MgK_AzT6CP6) z<0ULWP5aW~s8Y~h6VGLiT@^=eGI#p;rGCN0Yj1SbJ|molb3IeGn(CD-%sLwW)LiRo z%pIH)8t7=;@ILxnTw#FqR$=J2V064K!`o9_Tr*Vwo|qE;o<0)BSNF|M_Z%$z9XDe1 z<#q|_kZJik84W`f;;?g60iF>UpvR|+)+2yPt*xU243Q37>SI%`pMPOmA za<{>my=}Ntgn6t#nXezTyvtlX{q+ajNn>X@w{#~U|6-O3w4|lS+#^HJedw_z>Av4^ z<#jjx@eTLU0_DO~Gv~e9V0ROmW@9OXmcaxb~gdNJ+-d?E3; z$rqP^v-vAQg0LBNNG(_YTY_w>Ual$B<2?aznA)elRw18rPD^ALt%(%|k{lbwv6VGN zFZ1VWLh|a}YY(}h=D#&PGu?DdClWvYdcNP<)N#R!^iulL`M~s5Wp_<@_$XjzElBXv zLR~M!)_Y~deT83+U(&|mWp_P8yTFV(d8UluEnmA+Fm!lFKTXd!=*ns<`kRf^@e^+r z(zssn7rRmMNu!T@)%(=B$EzJvje_5YQ>JjD_IKDJlM9W4#>6y>gLo*1P~kvz)_nvO zxFM0tcRK_qu3zNIbQY&AWf96z;sHBJeJk34x=?pWd&Kia=hb7Elca%MmSjEwGM)V4 z&e=GT&)^aulZ*;PE0GDYs;2zytUJqs2X|^U4_Qjr#xrZL*kU-HNw{%sA=xR4k07!C zHnvcW(G}Te_$7B_i5As`1u)O#Obb^;sQ|lJl@04wUZloMB!s~=E#+r?76r=j3dA36 zOpUPqp^Ng=_3BIGa@xgeetMFV)q}X#OWEd2Q-By*!fVYvhQhlk$Xy7EheOhIc$)w+ zPh~#Zo6l_FakPlK#t9GOz;v}GxtoJ*n>hKScQ=G9ZQPx?5#^2UDu&>>g^f`>pzRJN z>ef{U)HV%TcU&Fr+@LBaX6WcN;U{G?lTI`L+4|)vqz)65t*y(|p?l`K79$~h{Ac_m zSJ>Nrn#U9Gf5v#@^9Xvx5-K23(vu*TVnXr_=k8su{FTpM#OxNhgYqN{{5X0 zG@k!A_ccHwr2{0=T_0H2wecjETe zro5WIU8PyhkdvS166in=3gq4?|KS)PW6)S;c)iizspaJK^|~kj`rYur z@W9(2jy&0v+|=79K^~idc}6OfJjG^iwSVJbd~Oa=krvWYE5eg{RMwS;F9q#E+ARe- zdw^lvXAev|@xB48o~pk}Eozq-j%wfzo!D+Rhs^5exNH&<=Dh}BLQDF+5j?qZ?aG3c z9SMpbNz!#)xI2%uTL_|A4C2k}97eioQ9ix!(7vZ%f-uEf!`hzvtT#@A#A)`tUivnEEbO3AB~ zZL7s$MnsnWc9kAH|2JA1cWyWdW?#XQB4k+?7V7j~xpXASUamD(qvdP1Qn!wWruG6wqBz@ zJc1lX0d}@k|9CL1pmWi94eL|`sffOyk zCrUdMz0Z(f-XDWG?`_ACk8QhLbg9oh8!$T)Ex$Tx#?gvU7@$?J{U!m~GmzT3aSgr= z_|v+2JSM5ga84n&6mZ4A>T><-aP^hcj-Oj?Ah|)`%$tB(lXU9C^ZO&Er{Agq=&w|L zuPr@luQzUg{vtng^X3PU@+oea&X8oct}Y-)Koz=iKO4u`DDbHs`SM z%ZhusGLo!c?=y|jek0Th6g7?zdbKOc?7u_FN-Qt?1+-2+B0#a&02Hsd3WA>-R ze!)6_UjJbMr^;vWPpIYi|>hvXAa)MfT&{6XmAH)Eu9 zvLemY%n1}D@9S)c;K;Nbn6uP;r|{rL&T^dunSzXC$_^Z1Cmz9d{V=#w@GkT2+n4#) zt3JtobZOG#Egz3D0Dc$1wDzd-FP?4(y?pwOBcSBwACFN3xi4V{fdU;Gi#&g*D2{Pq z?mi+vR3-RE!vxiNYY}YvK{5}`)ZzA2k8Bxx{OH5Bm_Sej2is8nmCT2j&l#rHqk7ql)Nj z7O%AKcJDJ2x?7jb(zx$x-=sMY1@; z;k;=pj5oC7xDwT+AK2T#GR9_H4ScYP2$<#LNA%jyqN+69(+v_VTKpz<;)2~I-lxgl zjXb|5YqF*7oMqbrZ(7V49b*yYos+f4P{nyI+uyzdGKwGM2))N=qYS>cIP@v?cNG`e z-|+5c7OJm}Q>71WIsTQ{lC8p*Ka1Ga^g=nFuKbV{SDBkXK6w#8BpeO>zRON5$-JNC zU)01WP`dPZhbnS=omn7dv+N8L)c{jCL{qf;6iev!ePq6!x`-PT+Kx-gkDh7`*`;dg zPXVG@kLdp=Y)wiP^^5oSfsJeM7?DkPTXY8e2fd#G;LeYZa}#?1&G!;5QWoZiz%QZ;DC;F?x z$qGgyctDh`bR1Y5sgm|2b4iSn>a8u7e){WC^P182a%jPO+JVGvRX!q+IqArLCL2Gi z(n+>2H197N%6Fk*`CZ*}d;6W={35Qi49w;agWK`FoVTylgGv6~A^v)YneM_%u=6+R ztf}>iYITOXD5#}nS0BhW26Y5X+6VdreuEwVu-4Rpzcd z8q6&FScQgG@48~7sy*x!xbZ1R4y9tUK&3b^I9p8po4SToz{=`(O!N0|!IW}??X2zP!HVal~E{_qtlOwOD( zEx&$Hwf>3<6QPwIY0-eF_S%S>glaRhM?pPt6q0L9=Ty&()Q<3ly-oqhnPelcyJ(`x zDBv{wY;}p-hj$_#yTkk|rf^cFo`!k(75+izEgYpG{$hbbUtNZ@Ie+l2qhSrFs~7r8 zVWbj}LqV?b48`Y;=W(j`dluk8dEt%*ub;jSUqT_xiZ}xht2*yIK2$^$zZUY#BI^VL4$praD8XKlAl{O z@sStQiR5;E@xsOWC>}77)XsE5S^3v+n_%_Y?bXUU&iysj>hP53HClGSx+t;*`zoW+ zH>ZUl((!a>b7xw|_7efhnKA*gQCMPq{canJs}24!`@OT@-3*xzD?FJ3uv-i+6;POy z^4%$;eEYA@8(QGRFD*0Qv>j_p3_lRLd<*7~iJ}{2eLenXD5YX>+FnfXU-LEI2=Rx7 zLKtj2F*~7gt?qI?_N7sL&Vo1PhBvcg}{s(yMzE_6TGbu(xwjuclDa?Vn2Z}>aCEyB&4*I_SP&vWw znfY!Jw`NZ4`9t-L7bD!rjbeuB5@a(M#PCSceB_L)QE8SkWO+obG&S0jiS~z3(XMuc zeKc~S%2Ig3D_U)le;(v1$j_{VWB$NYG$*JJGa6|7XBrwz3*DA2lr&injc~g`I_5OB zS>uMp;4)3!i*c1U+1h1M#gHFcQebuu)fe;E(b})E^ts>VPLFNB!Z^pmbPFD!f>N#5 z;Z0mDzedc4vOkO}oI}XWB-ncnpa>K0HT~TI=iHoXhIFjHOmoq0^+*^$BS!+AgOUVO zl0Q`XA_EK=FL}f3%Ta362D4(cvl8G_MmVfu`*hr=8d?+*Y^0;X9u_(Wh@0ta&F8c} z()-~zsGXRYDk_@FCib{NZhkn)FfU<@XvC#^#z1awjs+=y9FAvbMykm8fITHhoGj*q zXKp}QA3HLTPQi{^ZO0fUZnz0wq~!z9&Gff?jF;igNc3g&qj>n%khWPeM^E8mPHJ{p z2sb4k2cZ*7@ChyH;|A6AsOYN`8C%T{7GCI{#QpVvp7Vt|yH=duiFv3CrqS=+Cai}g zu|IFA(r7y=wbu&GcK>u=Ckd$@HFItmt!S)T)-0M>j&%-f0t5RugzD=DT*pn`0e$Xs z@)$sSP|o_y8AL?5l)sh}t)|%gtg@ZBN7(?7K6;Ve?#T|MV)4x72q{8@BuN45oy^%LzTN}!$o`U z-dC~dS1k`CjpjUDFaLgxjA5j;?cyjOC3b$WtbL}5=D=~j!wcT|xA#1yJeWcb zp5<4fjWNkf{uxE$2u+XqD0Blg2cOV?kf#o(uhsmRfu^t-~Ml-v482Tfxqv&Z~hY0GJ4;wk1{u_2iVThusL|uV3+KZXM^Yz@-OrY z;tnaYqc#ETi3KkX>Ldwbk9N@81lfMXGfamGR(Xd32d^?9)BbKPAewB|9Oj(YcJV92 zDPhR`b+Eg3*2rg_Jw!BklaC}x*on!EI`}OgiR?Cls<$RuJmYi+k1Hvx-Q>p7N`a;= zLW6f@>35M|>qzd|gATtzVTYUOdnj}f=Y&SIlMhlbO%Pf?SP`pL>0 zp6!%JN>C-@#IU1D3X%{<^yvHU?PN9_(V~v#QVP`@GNqTH4^xKq;ZrmwAolm`Dp=`r zchQJLbn129_VLk_JwjPOj^HiK4XVgV+iuOYPd@Ik^p4jAUa>Triv{fiAGt(nwBZrZ zKMQu6MffJb*ECj#n_AHgPfL0GW8cP?G4F~Yrl)Ml-{WG=7x618kfC~u`nD`!));yM zk675{Nda-|{Lpm|#j^KKCd=70nlTPccUNZpq<3e}e8FP){0LjgOip2{bSc76$IzgJm3n?et$D_IJ!M#6VRTPgWkIGJt%;-s6zeRQpTgxpc2dAbOCBQAS(g;-O0b+m^x(Jm@$BOB@1dD{5aH6LH@&$vly3Ws5`F$;E_oPyT4WmE zDZArg3V)pGY3vDHo(qYJ!exFSYGp*^-KsAj%rJFpJddvLtsg!&|9C>t;vz}{GJnQ9 zG?KCB#p;XU*A@R+AMM3MX>!+XyBvra98UTZ3%GhQ_H)3(kFlHS{GxK=y^wF%dNPe< z)7biuLR?G1xVLjFZIaA!QI$(EuWf@bpnxoypwtt_E$B*9^AuMk4*#GaONF3^=+n_| zm>PiOTE*gMG>iR5EUmYuKn|BB9zCF!$-rfm!B*+H=(0kd04HR_mFrAmf7+9~+>39b8UWnoHPt5*dvYTZJ+1g^R>e;i?p zK)^a7#6p0fx(_YhCyIwxRk&3`=)F@r)lnID<+2)M3EaM8wt(<(^ED29isqevZg1u$yB%VH zuI&?8?JoG;0Sox}v6lGBC1!dqgZs8UYT89_!vy(@(BqaUe=cb^PE|#HGK~Ku>x~D_ z8}_$fpWFiignQP~vPF3|Upj?||C&&U0uO5crz+E_(Mj(^RsOgeJ=tQgzg^G3B{F%f zHk0N$%d8@7QX8(} zcZ};z>$$AEu0pim$X zun%Aqa{;~2M|SDu7};q#e=u{mAWEu;aE}b2a3lu+7wv_UeQBs` z?RJMA-x`{`yBwvbpb}aro*4)enOqr0dg_@l0LttOjmv<~6&%_heHSOD{{NR!w4Hf37+EC6F68Z*wSj+CWXfzfD}S9b-?Gqah!D zi^N<^kOQb$3Uv(BNm6gKy0S=3A|M4#da*#I+1$OzK1XSj4r`Dvk#+B+jbnw5uE_$M z>iiwd!+TD_Of~KzX7K9=E_c`$iDz&*Y(41fRP{W?_z^_B1Dpi<-jP|0liXuXxO)$& z;7HS1EZ%Jz=alH$!?+$H+f5i6MgzhV0h2jHSeN*en_>UI{DB)rja(Xm|B~R^uS)5K zw)KPZ{Ovf({ouoA1vK2hmvnMNcb(+YeajnK$_@Y#lJX}&v55hxR$ElH<%k=Rr^Vv{ zFRi{%_ZrF>j=%V|a~=Hnr={oeTI0# z2x?mw4l`9osXBhfl=kNZ!$Mus`+W=>*W-RF98=Mr%(==OQ(B6m+vD7RH8mTKjc+$v z5}fGGEX?MV{GKwTqz&V|`q$5Kw-fZQ)$;4Vv*84(zk9oFyOKrc{|8(LA39b}6wd%R zG|a=_Pf6rgv7v%3)sjU#O>`S$Pe8z;LAW`7QAZ%0ybH z`n2ntQ3rh&nM2V%+rizFTM^gv^g9Y)czluf81URn)?b3zu3I%cgbQ_&Fu8UFM!bya z8Qv1@#mLT>OkTd}aaR|4{#%qeFNZY)2AEddSDiUVx;)WST~)#w zJIf&hmOwpp*476rc@M<4@Wq|pe3Xl z^QBoKOZ;)daRsS1l%S1W)ROUYUm$OB8FF&e-O*b_4`>82fm$UJPxc304c`$T^Z6N* zlNh~(PsS16;kXgVvnQTIaUQQk!30~ovboqHpX82qm-zH5lj#4AjC`L1E!O_Ju5n7( zOv}*4?}UYNyE3Td&+g9Idy0-!fhv#P#Eb9D0;p3|CP6U~NQ2R&{<%_W zIo(@l0ZVAci0uhGZLI#GrsU!?WrYxD8MPCPG#tb0Pn`Cp$v7=)Gwns$Ul+aY7Ysh@ z@GDCx36Ves>=&-}Lc6Pe7tHK3%cfQpEyn6Oq{mHpwJ!YwuId6lPL}bKhd~cH9I;!} z!n1=Hzm@z?M_sO>?e05>mFG9$N{Qz-;_{N@Zy{mM6IEo4NU^>GvVFvUydPP-%CIr| zpL9~cg=Jg2`ptE1?~?tEazIRDz{G?w{lgaD-w|ocu`M%BODk;4R-pWldrG!q*=z&o zM)qy3IdD9q@s4ta7=aj|Fp}7{zi|{^CVFr$-k+Ew(c7)1H&v}3+<%w;zMshjG%Crm z$%7vr^mInjaVKET_zyp6(;YmFo;=z&*t**0vkz|)N(oStkId~0E~|``U#1HMJakr! zL{S+nmIt+=&-ybLA#XL7+n`7edgzj+(p<*L$$8ZJuj z70BtsKU|0DA;^;WLbP9-;qcEej<>-HbDgz|Tb=SmlYPtMJr|j{zKtOI8a(~x4*QJvXlj?iX!|2>?7Nh@n%! z^PNlQ4Z<2`A!a8|0zCeW?z@%{*Py&`Sf*@xPgaPty5Wc?<`axR9CaDTxjbMC$YY>e zP0h`m{)urj24D4g*f>kqY!Tx1pWjFYl7C&O9B!!_R%@<^JuC5l3LT!2xyD2zn0G|C zbM2?uIcl!UI>}IOZT1vDCh#=N8rTGe-Vq*ybZHN^K_LquJ&MDnV%LWS)IxK0_C=F$oaT zOc*=N9x`*sTR1f=ZbPmP9|42pXx9+hA95yxs>drX_z*w|1bEvYkXEN@_($cv6A9el z0WQG@5p$H^U<}7u?fTon<9_L#*n1xWZ5t1Vno;in zs#suN0b)d22|+2R_p3M;saZcbU}7Qc7`0;+3u#>_X=XXwK-r{LZS(+WE@NxM?jRd3 zck*MGJj;bNAQ|MB0^y2(z3bAOWY68=lncbqkUBL*gu~CUuFhL}{vlifKfa2d!Aysy zPahy}cWFtqfw-0&eMjxag-6I88P!Wp_Qit5qHL@h7E_Ppo| z&p$P_r-<+70^`4pAw7X8+F5g?tpF^q+hWT0MEP6sFD|jx{ND!rTU_g+`+^*v2kYSS zJo*2)d+VSmzxZL45KvkX0VxUT6eT3qMnOSJKpF%@x|>BnQboF13`Dv+mhKXyB$n>( zg^hbw^m~8zzVpt!Gxxtc`wzo;o^zga&Zm=T@yhy}o;=+~k?A^>O7Sqtsfm6rrnwdJ zxT}W>@!X#_@ZYZ}`5G%-YLKcU7n>P4$8p!i!nNZGJ^6C)%-!+(cvX6mq(5};MO3_U zo7#81P;vdrrid?~7njAJ&i2%jXS^Ha5_xpKNBt!c{ z)d@nM>XZ&VjC%Kr*_K5*M4K;HB%ng>_$G(YB%d5@Q@ZuViZ_6>a~`4r2DrWR8^bo=+(GO;|ZM(=o3f-;eTaSDpfo!X$iI=^@Ss< zM1+t$P}Kb9+kOkDkWJ|hDZ0iEUl4?4Vp_xYbG3Vdg7V9dhryUpz~puLfgf5$u7WP= zt6v}R5Q{hXom%wXypv9&9Jd{Kq1C+A<9p|D56s9?LZf9O*zqK{UMx+(*hySnmw)GG zS6@}=>stKQJqzcmo9Fe|nlCoPMgIpX`UJw4*9)E!9WCuh zHl=^vaRT^6s+4Mn*G90}SHQ^?+-B3^4{GyBeJX2YbZL0JxaBe-26WR{P$h$9b zg{}n>!p#$QE5tsG_kh3vs?`XwL5k|Ih4ET4fbAd%zvao5OBbpWtn0O9e!P`8VH^7V z^{3gWdjOs4qPJ7zc#D#MtOq|in+=|HWqx_$z4O`o-Z4UJE3KiJ1J0qfqdLQgkJn*j zhZR|dPsMGRpSsB`)w|elSu6>;=h%yjm(qN_u{_!mSgT;lL06>o&V?um*jucOv+mLt zKK-aD*1Z4nYY~6iDc2C24CZEG2MlQAM0W(wcMXmHLe*P=kUc!nSiE)RQYw4|c{H*CzhPP*k zSOm|Td71tpZa9-P??q#qg^$#6W(7HlOHV&V)w*zzJY|Wv$rH(EC``E-BmF|?yeV>m znxUd3jQ$IAb`s}zmDbT)qBjej&0l>d?PaKncBcn+DRQ1Y#zk{bR@!Wo0ngZG(l8X1 zLh(oWbFpo5^F$DWQVO^qm+mA)IqoifQn2Fq&KQ?^u;RVoro!|=p`#hno{ir=42Gkm zijMDdcYo%J=%+e*jh?40l53R~_(6!Xp0g_h=)Y1&skHMZ?CsPbKhX zdq4W-P85+9w$jwAyHiHMQ|P1X(=W4jJG0VQa2WCE(Lb8rd{53e&KGaftRDTOyB<#w zvBHRdvr2S5X(y1Fv0y&Lih<0Y{(@n7Zhcb5$_5!t*`!HMR)~jL4zAbs5sg3qkGjgL zBlCiV4`j{Ycc&}jW1+@W2Pw{DMhoO2>#%EKW1uPCy$c*5&1&FJ?j+EEHm-Pe@Fqik+`a6>d<8vcD-`9 ztUqvoYly*2x?F(a546a-r~CW+_yf={;-+-5sNsdFhSxEJk$dL2M&BTVHdBwcKv&kRdt;-*3i*a(p&p`f1&-qUUELs>GvYJQ zp5^4vz2^{A`%r#e@`K^ER8m;z%s@c4*gXAj$L5l_bGTE#7hH@VGwBoq<=s;3(8Qd= z_W6jeZEc5tc(=(p5(YHYqH|j!0YpH&R4MZ2^YWn~jIg7;Rt?;GcU_8o__9z&r#04# z+PLg@=H;@OjE8M%!54Yfj+d&+)-18{whN&Y+W4hDyX)_Q%%DLs0im3f&iHt8aC?fnvB z)p2J|CWfqaNATj9DX7XfO(aYCruG@{v0FnpoPXPaquEO81 zPv1cH6VD9LHx(rBxv?ibJM8>!&)@uX{rr%~qx1Hco(~rkUAR9%a~w=~6h#111QLPO zu><^YL5jyZGgTQ4C|n7dnf_~Ib53RDwz zj-{SG@>O~%D3aovtMdNEPL3MBUYQ>bKky^o_NS~_YNtqDFBp@`y$8yfWF^Onr+ISH z{~olS110@v8ulUtD4lF}*;F$T(AM(Y z@aANG{$>e!VI<;P%c&n+Jd-t${6qLjGD#1svUs%D_glNOcyev}c-2;Zs$jkHe z^p{usCP?|>8gRRL`fQ!vCeWfI`Ch!paww<7&yVU-g4TCj4XTj%js$=+XAsif7rM%) z8C?BTMo*jCyz1nd&qwb$Wdh=s;O2C;(^fM3a-MWp98@!Bz#FYXdg27Qx#(ADU7k*C^`m8M@&-wNVKvpFv<1rL1~**%`^ps9#{FgjEL^!}2tg$SnX&~iP5Euz}pCM>?2 zIU$@nqlK@AXK&pD^DG*3co#v-w@Ng`5!Rynx@fZ-c(_zdUpBa#4!$;`KVN>M%8A?1 zVpSg$bmP8mcIkczP4pWg7h~oxpRB=xD5m$^LOq{MVn;cnQ}!5GgJPQw zHG{_qTew%D*=Qs&-mT?1><$7xDl@99|3yyEx}f$!#7T>-*Q_mi1@Xc6e5gaj`!)27qXm6onUjCs`5#o|f*z$ewEQ;E%}k*kVk_qIV56(*DqQ zT9*W6{4($aOWH4aJ*ux(oiUKnFZ;q}CLeD8;Q;6ERc{lPw%|p!!Td3Rs(J< zPVsCC;ct9LJ$psFa8#J9%hO6?ZPyde*m&&6F^;lx2;@h`$zN)viQ8oHU!h1OE~))N z9j6qUA^wMO0Zq&QDQ&IZf!Y+|s5aDRGp@1ZB3Lhv`9%O3vNzaN z^Rr^}Dx%tnT^6@i2^VjutIxd%U>Re7{|pF5EG7Kw^AnwEgjsV;ZH`LZm&dutw!-jS zk}|Tl6eXx0;#D(Clv&LVH!6#;+P5CZ$elaz&P0wx_s`ps)!YR)Gh>+B(`CI7di}wS zgL#8V=M#ds-g8Qlsj;G1sT74kk2~p}OhuA$P$dX4r_>V`wqE+n$eJGr@$b<|o>#^~ zvFwGbnj7Gj+n&cT$MCaIZemP286G`J3F*-E{5fQ#2@>{xjD#~CQ5v@uO=F(TeBBh= ztlOFW+(df1OXro_ee|rdk{guoSHgx=D872de;KMooqKdQmZQA8mo#IB!>g%@zML)pUFv*$jDz;wfuY zl!(M~Z--OHNUNs1OOfNmyLG1W&g41#hxXWlE)@Usb@&0~WJ_2)si$S3Wx;<}@of*` z@*f|?Aq*ocqW^!FXksCQyA1}(J@`{PSYqlx=qgI(a5X!BKo3{+_pq5pxnLv=q_hqw z3dX%-uE%S{@xpqySL5e=TVWPso8z<;FG<IKqbDUYyXtAi90lP_ zziAlkY~AF0nLX$Gwt|s!x$?RbTxu~}v_6$_eN}vi8hb$EtFUznQv@+J_i=e>q1ByF zSh%>@gf7^VX<2M>9~;@O=fFewPX3UY05`4ahq6A2Fo4uv&usDbDgW4`?*;D#!4Q*G zLw!}3PX&&6ZEHnwWCurGSZk~yb;>b5_L{cn-&l;XqlLs#O-VVvh`0f2ItqGP+1n!v z$PC*ZiKEK^_Ku`B7gJ%#hOY7$8q7je?eV>Z@C}Z&Y%;I@SY_-V@e~B%MynoqY8!O# zdKU{J)|K69K_E_ZNbu>&JKT~JOzBmK?c1j}I@Anqi-^tV;r@rPV8 zAH(hP@jeK)=HL>Lb(e^RjzdBXT#rCZU!kzP{`MY3zmCEb+ll$O<GPveG{LWlO!TM=37DkpIs@OU@1`mnd5wurwkF9jLQLJuZ| zHVTU|&ArI+VL75djaLByHp%%Re*mF9vV@l*rYL+X2E*OY?l-u&DHN$XCSPdq7*szm zf%HH5*Vlwj9d-OWM|@%H=t?JAR(N>9q?YFP&|iMkgvaM|`4sa+-=x@in05PJ8p`Di zkj~rd-(2u==blc7m&YK^_h0%8M#4O6U7EL7ASnk&UD!Ee>`E=J2M^fNEIDrmQUaw@ z=Q4-Us2qlms-MrsW|xzILCP7yN8-3sOY$448QEV*(witg>^iL^dU2%u5&WCbeIZ7( z!1SjwP9dvcsHqQ+I>igs+a~PD-x1bPbM63TpP24De}|u4W%}j4AImCZdtF+&C`!oX z&e$RBWpF;Tc>1Cf7P#&#vo8w=k1Ny4FG1Bd*KFyqbZk$laJ*7Prl&8|AOi(1VL~!J z4b}-gt^1v`aT%h3Q9YzHaa=hgyXWk`L&$N{1WsQ-KWlie$iLM^1X+wj;6+1s>z0pWD3ZxYGcuy?C0jx8Yg&JtKMgC>(jEM`&N7 zwuVeZ`|q%gR!X=q|Mo_ak3O=vZ12=mt@(=%`s`W)B$d}!S-fJxJUX$e^Kmy2wwo7J zYYh_rLC<5}J@;9t{|W5n&hTO2HQlr<&}?b*+=z!_e{G~NRUSK?i;N^h5=rg)$v?cW zftjvRKj=VKc(Z*cMBQ^i#*9D%L8!VRy~N~FZ^zC7re|qo;Pw( zc$%W_jdi@O`up6UKGP}_nQQ%AC6{AM9kH{ZW3jGqLLa-0m)!QJBAnct>k0sBE*jM# zWL#j{eJ`G2{$q?{CtmG5+rS-zDm;a6jpB^g!V+#IS$f(fFagtO*37{B^Do~$=f>3z zT64bUA_qqW8I2ror$W{okbSgXnm8C;42B)JXL96v((9_+aAZHYZqoBkn=8Zl?S=x| zcmki<$Mz?LxG9`sqMAxX_pX0!mJ58VZ$uSO=Fd`Mb0_Y0yNlslO~Z=N7q2*X1bQl( z(QM>l-HINdR5qEkv0@Rk)-)~C&B4(3GMC7E)VmXm>Y0Apv%NQ`v+9ylE{M@u557yD z7(a$45{WOalFLGg@;F!N+1E$9iKhgp4t^aKHud4#k^lun7Cq7VG#CKJSGP@4AY)DO zgpjp1{5BKI9@@O#Wh1*qL8}iUkq2oY7jKtvG}YeoJV;-@np+)ER6bY%Ob|fXVgJ4~ z#yI+NQ0;uw$Sw4O64fJ{qI$oL*gnX3o1NDsSh`AOfRRMg?quOy`NLrA z>;pU9H^hFIq#31^2%p;;u^gJxmtFVl?0ezLRWwl6+tB?sd+)Yg=EXwh_c|?G&5uSW z--&h|xeB8=A!I(%Ykhu*{4L?4)j#qoh8jN1x*YVD*IsV);|S+D_2;kFl;XWa&Z(B> ziq=+>XXt$lepXr?{?kLG`_t$4;S{?Ula+dHcQ+}2`Pqa1SnTC)UOgG1voWx)~S-NvnZCju! z7M|g=hX?e4D3GY4&*e{C$s?JI*C82P%hNIJce><&S!1y@5J^Z%=*#?wZ6Kj$CXDj{ zg$lIu*DYtKNr;N8hUXmd9@DFJI?ibU$Np=*BKcsp8DkyOvd^({ey>gM&8|Mk{&b#l zF452jxD$gXYc1#SIjW!ORqdGmLfVHLnm~KYQ5wRRk9n{os0v%5qjJbGKTvdRXM;c> zTgtRNq(j_rP4wE6TZQi|vOgx+s0GilWewZ&4G>S<6)~U1{Jb_a@zFKuUUOMuEA9hB zPJuzrZ&r5@kJu11B(x5Syma?!_ZUg5+hHFV8Z0_ENX`z3yUcffPPdWvP8jb!sE>@FB+6OoX&Yx`Uaus18>S0!!Zm_tk;$hJ#BDE z3m!4}IR3k+$dUw^2YBh7CLxx@9!ZYE#ss4-Y8qcCJRhcmdbF=fHcK74MR#~@#QLci zyH1szVp7(<)&-&@MCl7G*p^#1ODrbvlHc@excFTVyEN|44YiY}{IE%DCHsE!V~IRR zqg6dWq1GvF8&g8{9i~@R3^xm7T*Pf&$El2ZO4%ZwPvr}-A=|u=_=Z%Uc>x}u@8pXc zmI>9fdi!IfH_D%F@jJe(a{Z!?SieqIp<%e|Cw#{-KI+)a%b*Gc=sZaqk96BQY{{tT zxnrA2$+hkhID8tK=RoeF-g(o3ugc1y!|>@cP8+4CnourjIQ1h>$a9EmFdB1>l!*tS zfTNeCjGp7G->JBGg_Pn>O1(8VgAvYYPc>n1=a$Z)HOLdECM|Q^8Bx|9FMbJPGqkqH zTXnWSzzBeHX^$QyC_FMQ&=eMsA{Qb{Q5k!kZZFf`WcBp1Nix*D-a3NnDy`~@Q`33b z_%M=-46PB@sCMHb1lTC}$R!24nWWnVX+s6AjN=to;sfqFbYB{kjno{oVcE3k4rMR6 zuvu;?`1BI+h^^repxckTrk_yXqEA>DvGKxF#5tWk(DilfP!g_%n`^Wdw~JqamZIUO&hOPCGrsg) zmqs2*KsOyw=aiHZyc>tCC$Bf9gTUgJYNvA~OxW7jVkM;V0jWk&(!?B@G%il&e(ZLT z8HznUUquO`BmO}??q*j9KlVrDj0LDeqnminpPD{qba&W6 z8;7Q}rV1wKftnhS{RmW`O~@JSeU3}GPa)u6+IuJSP-|}$OTm+I(sh85dH@((WwDo_ zl+O@@`D+~&(pMKlm#Ao1)7tMRvB!`DPe-6)Q185rL;X%je3avE_YjM{ zL8m?iiLo%jNUmDizG1amZ?}7*0(;~?99Ei~>WTI9Utxhwc;rTF+ssjf zb?gODP<9QveD8fCIptLbd{`O?aORRCJ5MQ0GTV*(r3Xt;b{q3&LMT+}2 zNL(OpAplxa<(KiPeaE5@BO&Hv#f0JCi?k3K{QDNa)_)jHrFl zX(LR$GfH8Q9Yuis`7?O`|*NJ9%}wtX&c5DmES(f zgUI;xoeiap>Lk72oQ@a*R-LO|sTe|gou85`m*j+bJ zT$`?+IgZ^9O3Z4-FlA0RY0pb=6h3{-*-l;EqzBrK+QG+M&CcuU-H|#+Bh)iD#;uzI zVxSz2eWd~#he^fpkCLQB?oY20tm8=vO#)llfkmQquTujR;>s~>@52_j%sgfRPQ@2# zl_EMJ$-~UPzT!sX*^I=Ucr>}vc=&DWwq3jJ(*;6z*QQJt%_{5`&v&))9c8UAgvaT~ z9s*Z-R?GMmvCX2by;o9>b1Vg9(sz~CAHVvp=t*9EEq-U@W_g;kGMR(1JiD0QZq-2J^&Ozfzd4KFaq=hP!dFB`YQ4!5{^W6&*uE(CR}scn0vR%fk=$t(^Q|H(ez4k( zWQ?eLY{Py#kZ2G8mn%zm>@FUs?nc8;P_rnBYVRCd;LjdHQR7y1BRicM!O}nqf12sw zG-+0FZsiGsV(Y01H2fkk&;VB5J0Z7mT-9<^B>svHpW|0*-1ruI`Y@u(501hY2JPvy zM$>=(RykUd#7PhJ58tglaD8iWR}1uk-3&09M0GlCS4^~#KP(e^_GeEe(~mpNXrXz(i@(bg`6&TxyG*1;L~a zP6TAkxIc7N{2)z3i71HBsGOMRb4LB(E%jU@HL8~jMjVp}k}EPNHN((SUTD{m!|ics z<}6S!?dxTB3GKgtL(U3@?w?Ftce?64+%SHK@ppH~&9cdKap zH{tJO*K^%`ThfKzd=*gHdDL8?l@QU9>&1qRJc>JZtwSt;t05kq3m-J2W&m11x#IY5 zKItf@m0l@TXPuu9CJ<&ykPGq3Vdc;6NEuREvruPNxK2J?2}GMwmyu$j^Su?fzryS$Vr?7*xFzLT0rEzb_ii2Kpl zSbiE{Q(*xENv~=9hNgQ$s2S?jjRZ*aCT^4E2_5n}d-HB>_`}op!^;V69)1H9=l%@) zMa%aV-u=IC^dITvUGbamelJLpB{@`4#(Im;oBO66om4DZX$lB z1Npj*17qJ(NCb~H1LU*=vZ;oz2fu@~IsP(1bTFc9a{-lI1jc%@7E@r_h^p8yP?UnCI?@39@ zx*i&|m~7$c*)gAXm26H>Rlr>ybT#PKovy3SSj*ehdr?c#5vRB-ou_GyC4QS?9(i=V zFF$J5Qm$NmnM28YXu>P+m*e9dTm@=Rlb3i(X}N0x;7 zO|hZfL3cDoCuUc(=6jOoZ)eQHSG@F-5h4hXW-JZwR#A1S7C1sla!o-+F0IcacvQEE z6uClP1XjWf2Q4y6=#uH{nRag)dNu_}Ok7J=CEC|XAa6J)ay!HRWmd8i-KMR(TcZ5- z?P+R48JoMWT2JZq;>N2TnKlWW1^c?7FKVXSdXMiHT+={<^|}OfV}BRSjTB#JP?FoM zI5m`{w_Z~^+!$!xiuwH1{x0g8)sv$&e;UF~?i#ikijnT#w>Azp1WCwiixnwf`+s(N zSZ+qp8}TM%BC(*hhOW&>YOoSZpons4pz8GTBs4t2@&;!8Gwm^EZ%@u2l>*l!c5>j4 ztr~|9qCETPD-evfK9r;&uXiWT5>pGzFJR=ny-!-*Q6iM@#3Bb7>ubQ`YkQFc_kUnm z_a+W#w|#aN3111!5P3Gc3$w7hO^S`7hph(#am6JnEg~>k8Bp*z6s&?`IGBs zALX`S@aA-d3s$B_cYzBolSU6F{>aw5AB5ZE1bKR1cp?m8U7hMfVwmMkekTUVc)0DG zhwB~D9LP?QmK-YG_9@7BgIT)DF&_s@(!yNy1M42j}+6xdsTKe@oaaz(u(o|wlg1f1YfkYC0SRv7Ct}zw-a@9 zf@sVx<1dtpKI`~y?!=7w$%Jk6smOO%Ty8K}Ke)J2!5#9sZx8)$=*a@i_{%P>%dSq-xi~j$TrgOHB zRtp|yw37sE7(OvkT*J*{OWZkh zr>ZvN3=z!9x2F1{utZ|(br^l5&X~az=^qdWC>H;$vejIJ&vR;KP{Au2L*qsGJPYgQ z`p>N)eQfT9R!ucdEG;u2e!5WiF6aBTzktqARM_R7*NIxmf!DH)Zof&h_!{Q(7n}{& z6EQ1|7*%v!Il+P-%;9=}tI`3ThQ>dPr|9y~U))OTlwa90N7b&6d_bRB&?Rl3|BTx^ zQCS=;kw#I+q7JnUi_fN{UOK;qbO?p99$&YV?&=esyVST41B_*}9&TYXz*lkJ{!O0J zl5HpJW}_ykX8mIx&`I#2v)wyi>b%BtP*k3|>n3$+H54L*C&O*{U{a~GLEYpzP`|!er65N$1mN*(?47rLQJ9>)LhW34 zW##sqBaH)~;_ZxvV6w%~xna3eRAA8x{1=0)+l^(q+y0%1DbnaLp8;-Pus^2rohQ0u zXO1xrEenI*leud26XELVAUH*V0dc+h0a!vlN_k@~8mIj-w)CzkBNQk5!aUdgSo04H zRmQ-0MuXCR+=<+o8-(W;S{-AcVzX%x?MiTLz>eAkoRv-KgAx))v+;A1!_`g}V=h5U zg}6^@hd~rw#+tX&A6u&7zD$ePpcCrzLxRr}-lUv)m|uruPGG^_7>76TN&PGQZXrs){Wf?j>=<{FIO`}Xaf zzsHiGCI{E4d$F)rw~zz5dF5n~+p{Z)@NARK33KnfrFLu=Z!4YXG#ys|<3nS{8s1~k ze4xE9cb2!rwgEThFEZ%lB(}BIg*NTNlMf`cHs&bq?C9a@s(`OgW`1_7?0j}Xc|G$L~SD?Sb6)F zN1ylvv0^?5KmYAK{1-a*S}ZY{b><dYD*ipyJT1K~*L7H@7x2i! zlLlQp;&48cm;X@FL95Spy)~78YO1)vtWtTTWknwcn3P(QyUWzPj7<7ns4oe&h*}8g3Xi^EPm7$Wrc|@!9b?7L)lV&{$!p<)(mSI5Ro?``ow_yBW zj}N=zz^cD3HujMZhOO^eKSKS&w#F>$0V3#=zkBM^vBHU1(Vae&V+fYDo&|U5fZ~ zm<;w`SP#5KQG)fq5d@;BUUW+TzFoWK;qz22=E^RD(Y&f>@hWvk^Y`(7RgM2Dn_qk%JR90rKZxCap zGV>Q_+|?9LR7Z+S$|VTs_)`ze$KX|f*=LgdVc5KZ%GT(s2U^E}XdymgZ&`yEKbJ88`KxSJHQnZID{PXAD&I6ZogXGha# z6J`VYKp7jDpZ>*H&zc-z*FynBSBi{;CLJngmsvJn;4kiL8#&j}V!cRw8(9y~PQ$F< z-4}FtPZ|D6`O-OQ!i-v)@4S-_NDlR{P2rs(8X$}sNXNQ`u286CdON^1v?*ftSR5{O zMvFl3h|4W11s`d&LHE8WVpgYG@9^wUfup+99pzvPQyu?WAyH0m=}Csy*M;7#_WkhY zpOSJldp9>n_zK2W++`S&w|)1g!4y?AzyDv_xD-r_a?xQGUQxB?-`j+?-&TfZqlG~@Qbjs^jQqcNxffHOA8g}JFQZKA1P%*J5oF6XfA4FF(h}7Z z7`Jy?iW!vlD|(mL_>UVAEy!g1)JvbxnP>>%RW-_yeIocvahF{~oNnn%qX0u=?>~A%fpc5vm8IB;4UN-@lW2ti8FH1EEMo!Q{|54iCOv z(qMPRySPw0P7U?r2<-^>IZ*!ik90EVPma6Xu7(T2&-vb*mAnP-6@3Px0A-dpAcOZ+#m%Riz)^oOnJ=7r7K@mwL}^9p zE}_j{P?E%E$Sf1OAZd;+@Kfza(bI{kL6ujx{Fpc`v$n>(0uqqiUG+=ptMN-Xk??bfYzX{4FOe zzkNMs#nsy~->V-2>_>=X3}_1v$L~Xe0Ul z{IW`WGh)AGefljpXMK>X!(VQtPCULpK03&nl4ef(@|#7zgh{uhV(%tRhhF(IQU)6P zUbJ-rvN69I^!@cvZm!1IkGLD>-Dg>IEcJQIKDa7-n5f-Q#Dh-?>coOplh`_S3aUb`ov< z^dZH(3=5MO?^$&l>WuWm2RU>m)yhmJ-D`I^kJ~pAmiRlU3j0c+L9NV=zjY80y z*fa%w_wf93{-SlCFAa9A(7MKRl|NVRlY_)~;%KWlmf8N><;>qJa7cNk<$EbD$p)B% z&>jQ(fqWzD_~-brFwxfd@YMDtzD&MOXQ}6f1AN!>IV?Xdgh#KFKB4{d1F$iU_Wxxw zLXvBycV!?LfJub&hfn(7Lcev=n{4{tUg@)f?I$b;T^PiAwf8-zLo=GZue_i%*WJ}T zk|b(IxJI?r?1+{c3C}qF`aWgP2S8~ny$PkC*(S8U9H~034sAbZqyO_?G0jgCBRK}e zs4(5NaMg~Z>cy%0zax;_a_}hCj=i8%okgrs6k!;c156Y@c8LMXdCTnb1XK6>onI9K7f`TZJ5UM(2mkhN+`n2D<-@5VJ@+c%+nXLp={shHh^&+i7V>h25$n|{ z*43EDxKkQ(S-MursWC#%0!{_@TV<)(I$jiipwM^OAgSsb37JppQ;02rgE_#^n8m|z zr(fePABy{`-K+~qrAMz|t2S)*@)JX9KCHElEeeaTX4m9REVDiqRy|O4LkhCsjVmoY zLW?gM2J!yzDC}{U|CCh&d9%iss7cYY!javU$jVF5eG>jHYUG5`q&qj{s3kTl$M3ml z`wj4ESOIDazRc^HiHy~rKAKWJdMy?zeU|gm5F*LU>x)&o5vt#^3i6`ANB(Z4Oh4Ps zOO*9Di6`LZJxj)~=(v+O&;Zn9&wRO1bz-eMf{2&xNbt&88lmwzZYssZ)NpTq11CCh zsWye5=<+~0ZsFZGoj<;u`+4PhdCA7`Z0fIJ1Z+=u8eYc$kYp7TJ;eAmt_EbLUImbk#wSC!2 zz9PBZy{p~H9qwM7sQY+tTXwDM?9MZnMFM!}POMfS)0bO4ab9t0^a45|{L5fb6A8q3&OFtYdulDYI;@<>Wm@bgq)@Aqs$bC9PKyG20gQ1s^u9Pw_R~g_a=Zpx6(3 zk-IPL#U1kP@A0Bj(5$ER*tnRs}~Crk~SOg7qpE^Ze_Yd~40U=|b6^a2iaL?{!EwvT)d-%I$85@cx&d z0Q;WZEqWeod^)9zxY1Ijn%MaWYrV^v^W3AatNYjw{$rgIZ7W>9cS65fY>sTb9xVU(4Z*Oo= z?Uz_xuLGqcP(I6Lf~VfHvdE z6En}s5$vkIw!_7~->NKL-E;~*%M$wW2NHmM9db>bN<=QkDT%`$CHA=NK91n=xOepR zOR68E0_558yJx4-~?4pvl`Kmm!c1o#|$%n)n%=?T+d`G3i61KY{#ui%z=Q zKNGzd-Frv1C4l%9_8!h}u<}kCKbQE%-{%uVGqwnF(B`du+^9RoA<8G8U!A>^z^^;b z>WX*0w5_MUJ{&nPFva}msOU`=JAIY6Z}e#fvX05UI6YcWO6xi8>UoR%WbkRdbO7{6#o4}EyFW(G z(kvcEOuBmHL3U9mb}&>F?nOsI7TO{&p7|e?HoC3x_qkxpgx4OW_Nl|ScC}$O7x9W7 z|J#3LClI^lSUm4Ned2l%S7sHHwwhLaZ4YQ=lee8TIw;S|Hi?+sQoio8Ln zBiOGlp(4~Hq-Y~Zf{(|b6CSpf;MU3Nb|4-hvmSQAspVlj)Qq`qv0nTP{vd` zIyx#=Ir5qH^>q{qwZ9*Y5B7do<|j;^Swk&%*85kxC^p^kT=xRqbY%E|d0u50ta zhg-vHn6 zF9F^DDF4` zj8K@P#-+SvMqu+F-tJV6hw7jQd(LX0)fcNQh+T``qByOe=A{)i;Lst z=FUnt2nlC}`0UPy z(^HO|wUw$o$SMow(Kn3dOz1DD7G({E9e^MyH~o}fxP#PQip|89S4TbkhDlMy63ssh zFU5FG_Z6CJXkl}1#Q6XhC{8wr?@Pp2}5i8X-lbm*Rfv2pUytSEH9cI&KUT3v#Z9Z z_atuVWZTkv?+OkBD=GV65apEu$v+Um(6b;v%!(C3hnHeMFB{c=z=NFk?Pir;!h-$e zg~c{A>3{M1F?XYtNxXX_V$ft5qIUY(a|z;=t0O?y^<03i$)Tc(^k9hv1>3{!TeAJH zoD-;%|7V=@RP5;C{J6s`4whSMm}XNJ%xpDweD+BY6(@(YuYMlsxt1(TH6U1>*}PE_ zb!A#YK}KUUE{0M9`LlJ?j#PC^0CpTlYi?)aE~B`2@*4(yG45oat?declLaaw1O1i1 z;DfS&G%>o%-N1a#&y?drYw)n1-1>8Wt=$*BKS_|apPGyxAUpJ}2R{1`{Dl(bPe_wE zcL;pKvfhui;m5>aJ$uq+u+?Sg$Q_9ZM(r9ABWYq;r)Y0vP;;i?~nkSpN@T} z_%bW7E>yAAUz!GajNyQ{`N2jP{GbzLA}g+oe?h`ayJJa%zDjqk?_SF85r@y&^HMxj zMbjiyC)`yef23#JXNi69*p7O9BD$uG&yV4TG5~E8w?nXr#`1T?nEr>Y084)ZU8(zn zyL$WX=TBd6SK#PC5`GjWak%XTYbg z^$W7=W0e9ZEoG`E_a7l@xYBtQD+F8d7vA1D;gDG?-YT3Xf#@FHFSPl`hR(rum|=*H zQVetIHqGt){WCVRXjjkYvtBq0Q#*~=JE|hww)%_oB!ny*G$D0$V`Q-HcSYd?uR2+M z&MqQ;tg!@^AY0@kvn*zVU$AXZHfqOMWRCrd;$qBEXaEE)OEA1yd4rW08nhDfY)I<- z&2m=Z?%=`tXiH1us@nWikhl0m%>2;Kk&sd5WboXn`lXf2CT)4vMu9 zuLRu&Yz+UaI*TJR`-wNKDtV#r79{%5)M?j6gW`Dpum%$H)VcdygUHD~Z)A3u5yNjI zEup~dmK(d68Gy&w0|c^E#NhuegAW5rGWLHYga7X+Nf1KUr&?OuNj~D#6;0?BC7iyw zROk1Ll?JVV4*IM^3G<%wG{B|^Kl0AN0O4+7=n0N^$2;4^oIvMR$I;b#BUIia&L*pU zM394^+j%DmDEogx4OQn?*=kCvox8F54&mPDx9M^l|7;Wx_Jt+6vV^1Ti6vS5OFllO znsUQ1g}=A9UccmZs}#`|i}c1JxO}FMRSYsN$=am&Uro0x$o_|Q}eJUd4tnAFaTKFV`b{ngZlDctiA31 z{@1UkzG79;L^$w84%y_JZ|bq)3apznA})|Jrsg?LjE#3=KFrU{kERSgCu$*ET_LfP z_&0Y@^PLWF`%}N(l%M&#-Ui?I)8b11cQ#QO{@3sSsIjofGhRQKo==xk=BNpxDf{1V zGdLaPm@ZepeRy64&-dmu3nu@M;QU|2aaPed4}7w04<+(Y%Wuc~uN7i{cd`BCe1S&J zfwHe&)5zVZ@YdoJIOa)7|IdG5*zT_Q<=FoEEiMCWP?>%1pBia=+>FOC4jN-?{3HLY zJML-WZCdpM-evgJD7=ojy3M-PSfqeGtN%gA`RbJwc3Cv4|Nn;@Fbr41foc(0OY^1Lv}^#D%!*>t7(HD$cY{|bcI@ZsARv8x(Y*10ct{bH`Qt

sd)0I&5y6P!)X)(!JeGo>K(j&KSv>LJCAOP3~=U?#Ka z=lG_F;?I79G?Cf3=A5Ot{K?z#j+3vC)0ATh?QYDNwE9g>`}a|B=K}Y)0}qlEE$kX@ zpc(-+HMKnK^{*8^ZWS@A7cc)WFcAtETpgLUE2$RZu*y)4dPEr4x!wCDAb%7K2P@&a z1Go^edQ>$&CSQ8dILBF%T|65YRL_N<08 z^2Bd&X{_=8C?KJLA?i3kZ$a%Z_HRx1IEa8~RD{0Ylezjw;CeJ1-EKvh7at!VP0bnQ z{_54MkdTmofRPH^=z*3UeyLL-=9ZQp-oG!)3gMRzxxVH*HaKQ5cVXwduMYYP zbkN<0k)mA1IR94P6n@MnQ!TE$-OqMc&f_tp8d#nUk2y}QU_WYi25G$aXI2{MBG+3I zgKy?parqSI!rRSy=;-0Ic6GF^Z-n0Ei{0^i@GW#I+A6YEeh(M$AAjD^|5&gWVg~z; za31Arz7L-{Lk|4p3@Le9`0_Y0G4G!u8F!A0wQ1f=sqarR(0V0Y}A(Uzj?!K~2uq(>DD^2IylSO+W z-Jhu{%(La*IV@W$)g*|KjDP!P@(*$(v&r@GVm8Csa`MNKduQNQ$#GOzUvYS zN!gUtVI*gh2QWn>csIm6j;B^}@yM&?_K7@FpdAu~oM(3M@3NmRg-sANp}t zU;V=UHR2R#9#td1bkgRGMvONa{Be)@)0Qk~DU@-;=pA!6{z9mxqeQ#D=Vmlw0{X@Y zI8Qf~F+;?lDj?5y#;PTrW}m5!&jqlkpn8`N$kO5}+>@c=e-(vh7U52 ze3gT%K{FTA3Xf_VQl&(xx#J#tZtvE9h(9P}D9ehmNxV}T-Nr)ut6J$lmBUHup)?)>jAFl5)wHXVx&I5?sNt%)yqb3eHr}8;aN4zxro!2Z+VY{ zT7Ge&CppmQu-!FZZW$8vX+XgY?8e`8$ksicyXpXJx63`}e zqvE;5?i@xL{)^w19J|LKdmo>XIpS|eD`HL zC(7~7zkwYU&xuB_U{)}mM_!WM?9cYwZZ##}tc9%50p+GoC51o*Hll3Jg5bd+Cck<#MAPdHQ+{qTs$7O{kJe8#*jfkY-so z`$v|=Hgm39wvsqi3A!>Uvgky&=&I!)H9be$_~H&Cz}4Qsm2I;p1n7|VWl+X||9vIb zR{*(Rosj&D&N2Wxv2HG{;1ccfP6bWuK!@K)GVE`hg^mpp&3b8;U&E0H$2`4Tx_wV)*4XlUx6aH& zVIzy09rr30Bg_nmr--JTDiFp4dOj?RP~i#!eQ-3q(wOxX4oN>C6TFd%5HPa+i^}+_`kt?N(=3kmpP4U8Qq%xbHXth|0 z$LUxh9&cFp`CFZ*a9BI@*FQ<0i`9gyw{z+cpJC2eNNS3S`wZ-0ju%I+V<*V}#!Y+r1y8F}T~%h-*lhgbBfOy7 zm`AI1-_z+x8$9(1cYyPEURPZ^5tIFnbWpDH1E=hV4}`2|z{r_`T9jXQSZw0ax_q&NKlFkwZOTNHh}E5@;CWT;G_O$6411qa7R1Z|f;5#A zGOS}I6S_^5djXg6`F+0KLPrEKBobt_;>cdAHZ}^EXgD&pH}8BToEcO0{mF>k04t-L zF>K_uSdNIIGGVIKtGAmpX<~!q-v*6+GA=7z)sQhr&i*<)+aZK_;4IJiTxxqmk~*kB zwg#FiQQ@E_#*wNzAD$~a!cBz8%|I?UL4zmATMg^MB7q-VGZZx0lC<%C>HtLvOh?8M z9btmCcbf*nF>K9CD)DL_RE=YjYS!i3F zru(F|lVAbR*VL=s=>4v~z&pwc-sa;fiL50zl{rE8_{8giNd_(^N5a`qQP`nSBSiSa zRIJet%3I9_H6JiQW6Lp@~^cxmYn|h1R*3VsN@vL-kiQmfA$}Wy1Vz4n9 z64d>CYXLD;ky2KH-(kQfTsmIy{ys_h&!!RYuQs(#v)igdkVI3h0cf4M8FVj|J85fD z6cJuQRwitjIJC{H^%3w*F&C!pPtKp*Xt1K!n1cKwm=f--&Q|078D>)8Yzc)nOaMET zNWE{#z5TQnX_%`r+t7u-+-}Le3#J6xB||D1)}UYQVHFRxQ-(~d^s|nhAxJL8DJ9-t zloBo_*DZ8jmei=it{*C$JWV}}ruiJQM0qGZ1MA>vjU%E!ac4|Uq}|u8HXdYvcnC*C zFcZHbO?_TqWf|;U9Mc?bjLo0^mf``I0iUvayo2J^!hXD<_rDeCk-=d$g zFPI9di`_EMY^DP^a0e-igf%=j%E?i>*UOvmWCI~zUZ}?EHzCn6;jHiPkY5rI!GO#q z$gDuB%1S1cl@pfpy!-S{a)kXZE8m2QVp8v;znXWLw^_f1U*u}(QBoR2EE^*Qn`Igz z2$MgesOmtQ4pVhgYSjRjP%1TUsVDWvNXq%sTmp27FC`GxGyHwNVdRV7mrk5WAB zOuv$wq!SO*zR7-7F%$FNJBeIh!mJ<%zuTyeeHF57MAzuV^&COAu|n?51+b*Ahzc{l z=cyhVWisxOl%y$ms;ODxl-@&LnU(;fM|u>cHrBULpi&1-#N6ZJ8qL`Si@iMbd<=qC zBkR*=HUAhu6&U-QcM!V*52lr{M}5F*p`0mZ!elY)`D%&c-6a(ta};ec0PMuA80`?p z^r6gj4^k#+s`z-&aDw3w9(PsA`IuDDpxQ3nDK?6oK7d`*Z9?ua8{|Nn~*>KBb5%*gA}n8qjn{a$>9P8n%%POOu>OXh2-7o-`?iT z;$QT2!x9*tb^w*j(1Hbcy0;z2$(qve#yS4hk$!_Fh*yFl6MRe`KHEnSD3#~SWt2~9 z=*#5OvYFq~-kaoN{G0E^Ep!$QU%E9h5*Usn1+O_!8vu0i`lUoH!Cg!?IGK%L32)-g zH@H+xS0(wBt=Tt=%7`v9nvCMmwn@Buuo;D?tFgwhNtVR!w$0*8aWp`6dj1CRMMFp$ zLJg1Q)=rp1gG9`IEL_WkLrW1YbZeMff`^ZIE9&en6HkvwGD-RD&?AOhc9i@4^$;=D z^51omK=n%oMgxwAR%|hb=1KU##tMDRL6u_X?FSgxp!lOZTH={ zT!?KmRHf`FEHUn9-+f`QVVT^h&V9ya({e!W@`l*`b?BeE^*2JU!i`7PcIF;is5PLEOb=$8fbxvtS8n9@PaoDLF8$u9@KD!>p zT1Y49qa?ccM{F)11BjiF<=l|L{IdB5L>+2@wKz!!*{|QcG^#~^M(&wM8fpiTJcfwn zo9_|3!bVIKNlHti%D=+A?19@EFjv<{$=s10mL7s99gL-0)l@eGVZ^$Swz zIXsNSi21%8!iURptbH<+%@75KwDUwFmc$R7~^^-n|D`AXN6eF0_#$qK`=1 z=40i21*Vtp_E+k0+F)3d+|bvYHY}=|%%Ny}L36^6>kU3e8Ov z$H~EGt>Oz8BUutu8a|ybe4sQ$B+6}kZ1=EoeW8!tHcSM6(W)!|>5-C&vFVA4VY`|* z%*~c1T6cW?VD3F5GuV8ujPxtafGdxxZQ?S!6-F;oEUY9yi|G5Nk%7V>64e0@S z+HFepDb4O~5~*dPpXvDxOczkn6%7D9_*{r4<7w1y&pDOIeHTh9F&?AS)SK}yuMKVW z&RLGGQ<8q9Xr(K#mpVmiG3bg^FIWCz^W4aHA3t$2jQ5RqYQSy^lkS#!PK8$`GVo0BfRF{@ACzr92B=vDr zGy;A<$wHTHMa8NP*@trub2Es`4cT<$;44$eQK3Y?dZHK?f6f$#-!29W30vhLl%4oi ziS$|I$^rN;^i2;2?{%uV{;0%l5cD*>mMUvQhoAY2L4PIoK%yWJS%TlwGuih^(EpRe zoVsziG@?TF<;2L|unB#$`rK^z1oZJ$1#U}_u^krK2DvnB3yZP)K4_F3&U9&f@?1pD&S4{aTNR0=@J70&$!f(O4GCP_Fd4d{02b$2`|yi05zuyS*| zIr7GDo0y6XXO4tfQu%v~rcUy$o+<({$X@m14%()HD-u?UjQq(7HY{C9%P4`*8JUBV z%cAsKN$&-%>eUg0^9hkolV=G5F@mRN#2*Zrzh_MlflU${LH;G{mdJ(}&wX&BV)8Zs zMajhINOaav*`%T8s%Dj+Ryn{cwBF;uv^gnUP_i5DG!ib2l{_&(FiP$zeM(IhEb{W01epB^Q+-W=*)vp|_x{-VyX1{| zss2Y9Hp@RfVoZ7XO}+q}njF@)Jtze56%=4cb5q zFI2a^RQ^h5su{>q>E_RMe5}e;VBGG)Kbe#WotUVZDKXx(fowL^u(D~sqj9eK$%*=0j)>fflmKxwVrDF{qqK8}&tlWNTz?!R#;m}Q@Z7stqhb=F zUP2e4nk^9hPDlO@42;T$scH-$G0a?+yKf?(jQPM{o&zb!xSlwEryg0wMC0VYzzJ&{ z1Q2*?UPjvfCYUXQy$i48?Er{T4``OmQNc>5$f5oE&Lldo$?qU8TrWTeMDWwEV zgqe{=zA9eSl$8Q^z2Ya}LM-4bLj`B!PD)Y_dNby)cKZ8{9Jf9&C zHT%O|@WysitS@Hu>x{C<04$1KTqVKzjD8lFww=>hI7|zCHv9Z-t<`Bwwm<_R=#b`1 z+1lbS(?MM*3xhz34^6(<=T5ZyFOqQ5V&^AFPcb4~`%c5N$Av1D-|045A+4PSj{L z=?YGwvq>L{$8Kr~D8V)-r7dkAKOg(1@z?3Br@9~qIVuHnIkR<~&U(@28C?jyvmweg zZ#mHQUdDozw|wIjiR-okuA!+Px0i&U2o|0<1t^w5!WRSFTPJD10-h3vKSvT!HO74q zEWo`lyP6MVQ&tB^3eua7GZ-yT2}Lm<8V_6QLIa9ou>FwX{;a#0EZr$-*Vqh`IcpdT ziGQR^YZc{gjTrj2^)xWqW00KrwM3#6wttJ_rKW7EPzEi&pCh73zr(BeVGWO7&w@$r z_pI2v&hBgy!OVdz2K;h5J8Grf5}HLC?y4CI?!Im4*R~6e!`y zA5q(J{R-K5&0i!x=(qm%Tqq$jeS4MyFp|z_O=k-z>0_L#N;FyeUQt4<|9)?qz&}>M zY2bc?D^a6rt1hs<{FO_-x_;6ktPVju_&Khw(qZODj^Q1Zrnto~w^s{?r}GLn1TFZE z(k-)$S(!w_79wA}+Fh%)80Gin@H02gkO;7Rci;VSJu>en1GeRwGABnpdbyo>M7{iQ zD)_=KRcA=ZMk1dE(BbqGEb1M~penwBCpSqy*J zYecRKaT|q$?^PaFyLswc`>uPI^?mZUT`ueeEOQKv>c`OyQ$HMJD4|PK19-ASfyU{y z8<1uV7(+fYnl{O%r2NaPdS9K0d$PwB8qy2}rMisFsue306tjge3bMq}3@4ibR<5Fr z(yaJuF!^bTxzbMEmN3{Q95yOj*WA_kYMGH0!gvP$AYl{!kiNy-R+*z=faTCdkwmSv zp(u?>>l7@bcNDEJMBEKyEabrL;dzuuAv(!=%_-U*U|9CzZAdYZ{V^LDJW~SXGjsOiKne#L=vH<}4J!)yydP zytj!xSe&8VU*AhD!J zJuYoMLC(O*(MUOAWX|2S@NSMt(e{v#*NAcYl#{5x#@=i0TdIajPp{)-&HG5|FO@gY r+D9H-Z?{ig5?oU#ls(%;bz!l>PowBBQVXBr;XWE*U6pF3XJP*X3Qj>I literal 0 HcmV?d00001 diff --git a/User/system/lib/lcd/lcd_sharp.c b/User/system/lib/lcd/lcd_sharp.c new file mode 100644 index 0000000..16b789d --- /dev/null +++ b/User/system/lib/lcd/lcd_sharp.c @@ -0,0 +1,453 @@ +/** + * @file lcd_sharp.c + * @author xxx + * @date 2024-03-27 13:50:16 + * @brief LCD波特率设置至少2Mhz + * @copyright Copyright (c) 2024 by xxx, All Rights Reserved. + */ +#include "lcds.h" +#include "delay.h" + +#define LCD_CMD_CLEAR 0x56 // 0b01010110 +#define LCD_CMD_UPDATE 0x93 // 0b10010011 +#define LCD_CMD_NOP 0x00 +#define CLEAR_COLOR 0xff + +static uint8_t *change_line; + +static uint8_t pri[COL_DOT_MAX_400 * LIN_DOT_MAX_240 / 8] __attribute__((section(".sram2"))); // 显示缓存 +// pri_send 大小为 COL_DOT_MAX_400 * LIN_DOT_MAX_240 / 8 + LIN_DOT_MAX_240 * 2 + 3,原因是_flush全部数据时最大需要的字节数 +static uint8_t pri_send[COL_DOT_MAX_400 * LIN_DOT_MAX_240 / 8 + LIN_DOT_MAX_240 * 2 + 3] __attribute__((section(".sram2"))); // 发送缓存 +static uint8_t pri_template[COL_DOT_MAX_400 * LIN_DOT_MAX_240 / 8]; // 模版 + +/** + * @brief 夏普LCD片选 + * @param {sharp_t} *lcd + * @param {uint8_t} sta + * @return {*} + * @note + */ +static int32_t sharp_chip_select(lcd_t *lcd, uint8_t sta) +{ + DBG_ASSERT(lcd != NULL __DBG_LINE); + DBG_ASSERT(lcd->info.spi != NULL __DBG_LINE); + if (sta == 1) + { + lcd->info.spi->gpios.cs->set(*lcd->info.spi->gpios.cs); + } + else + { + lcd->info.spi->gpios.cs->reset(*lcd->info.spi->gpios.cs); + } + return 0; +} + +/** + * @brief 夏普LCD单字节传输 + * @param {sharp_t} *lcd + * @param {uint8_t} data + * @return {*} + * @note + */ +static BOOL sharp_transmit_byte(lcd_t *lcd, uint8_t data) +{ + uint16_t j = 0; + BOOL ret = TRUE; + DBG_ASSERT(lcd != NULL __DBG_LINE); + DBG_ASSERT(lcd->info.spi != NULL __DBG_LINE); + LL_SPI_TransmitData8(lcd->info.spi->spi, data); + while (LL_SPI_IsActiveFlag_TXE(lcd->info.spi->spi) == 0) + { + j++; + if (j > 1000) + { + ret = FALSE; + return ret; + } + } + return ret; +} + +/** + * @brief lcd清屏 + * @param {sharp_t} *lcd + * @return {*} + * @note + */ +static int32_t _clear(lcd_t *lcd) +{ + DBG_ASSERT(lcd != NULL __DBG_LINE); + DBG_ASSERT(lcd->info.spi != NULL __DBG_LINE); + sharp_chip_select(lcd, TRUE); + sharp_transmit_byte(lcd, LCD_CMD_CLEAR); + sharp_transmit_byte(lcd, LCD_CMD_NOP); + sharp_transmit_byte(lcd, LCD_CMD_NOP); + sharp_chip_select(lcd, FALSE); + + lcd->info.clear_flag = FALSE; + osel_memset((uint8_t *)change_line, 1, lcd->info.height); + return 0; +} + +/** + * @brief 初始化,包括硬件初始化和软件初始化 + * @param {lcd_t} *lcd + * @return {*} + */ +static int32_t _init(lcd_t *lcd) +{ + lcd->info.on = 0xff; + uint16_t size = (lcd->info.width / 8) * (lcd->info.height); + lcd->info.pri = (void *)pri; + lcd->info.pri_send = (void *)pri_send; + lcd->info.pri_template = (void *)pri_template; + + osel_memset((uint8_t *)lcd->info.pri, CLEAR_COLOR, size); + osel_memset((uint8_t *)lcd->info.pri_send, CLEAR_COLOR, size); + osel_memset((uint8_t *)lcd->info.pri_template, CLEAR_COLOR, size); + + change_line = (uint8_t *)osel_mem_alloc(lcd->info.height); + osel_memset((uint8_t *)change_line, 0, lcd->info.height); + + lcd->driver.onoff(lcd, TRUE); + lcd->driver.clear(lcd); + return 0; +} + +/** + * @brief 拷贝模板 + * @param {lcd_t} *lcd + * @param {template_copy_type_e} dir dir 0,拷贝pri_template到pri;1,拷贝pri到pri_template; 其余清空 + * @return {*} + * @note + */ +static void _copy_template(lcd_t *lcd, template_copy_type_e dir) +{ + uint16_t size = (lcd->info.width / 8) * (lcd->info.height); + if (dir == TEMPLATE_COPY_FROM_PRI) + { + osel_memcpy((uint8_t *)lcd->info.pri_template, (uint8_t *)lcd->info.pri, size); + } + else if (dir == TEMPLATE_COPY_TO_PRI) + { + // 判断pri_template和pri不一致的地方将change_line置1 + for (uint16_t i = 0; i < size; i++) + { + if (((uint8_t *)lcd->info.pri_template)[i] != ((uint8_t *)lcd->info.pri)[i]) + { + change_line[i / (lcd->info.width / 8)] = 1; + } + } + osel_memcpy((uint8_t *)lcd->info.pri, (uint8_t *)lcd->info.pri_template, size); + } + else + { + osel_memset((uint8_t *)lcd->info.pri, CLEAR_COLOR, size); + osel_memset((uint8_t *)lcd->info.pri_template, CLEAR_COLOR, size); + osel_memset((uint8_t *)change_line, 1, lcd->info.height); + } +} + +/** + * @brief 清除显存 + * @param {lcd_t} *lcd + * @param {uint16_t} min_row 最小行 + * @param {uint16_t} max_row 最大行 + * @return {*} + * @note + */ +static void _clear_ram(lcd_t *lcd, uint16_t min_row, uint16_t max_row) +{ + uint8_t(*lcd_gram)[lcd->info.width / 8] = (uint8_t(*)[lcd->info.width / 8]) lcd->info.pri; + for (uint16_t i = min_row; i < max_row; i++) + { + osel_memset((uint8_t *)lcd_gram[i], CLEAR_COLOR, (lcd->info.width / 8)); + change_line[i] = 1; + } +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint16_t} *color + * @param {uint32_t} len + * @return {*} + */ +static void _flush(lcd_t *lcd) +{ + lcd->info.flush_use_time = sys_millis(); + uint16_t tmp = 0; + uint32_t length = 0; + uint8_t ret = FALSE; + int8_t retransmission_count = lcd->info.retransmission_count; + DBG_ASSERT(lcd != NULL __DBG_LINE); + DBG_ASSERT(lcd->info.spi != NULL __DBG_LINE); + uint16_t l = lcd->info.height; + uint16_t r = lcd->info.width / 8; + uint8_t(*lcd_gram)[lcd->info.width / 8] = (uint8_t(*)[lcd->info.width / 8]) lcd->info.pri; + uint8_t *lcd_gram_send = (uint8_t *)lcd->info.pri_send; + *lcd_gram_send++ = LCD_CMD_UPDATE; + for (uint16_t line = 0; line < l; line++) + { + tmp = line + 1; // 行移动 + + if (change_line != NULL && change_line[line] == 1) + { + *lcd_gram_send++ = (uint8_t)tmp; + osel_memcpy(lcd_gram_send, lcd_gram[line], r); + lcd_gram_send += r; + *lcd_gram_send++ = LCD_CMD_NOP; + change_line[line] = 0; + } + } + *lcd_gram_send++ = LCD_CMD_NOP; + *lcd_gram_send++ = LCD_CMD_NOP; + length = (uint32_t)lcd_gram_send - (uint32_t)lcd->info.pri_send; + + lcd->driver.idel = FALSE; + if (length > 4) + { + while (--retransmission_count > 0) + { + sharp_chip_select(lcd, TRUE); + ret = lcd->info.spi->interface.spi_dma_send(lcd->info.spi, (uint8_t *)lcd->info.pri_send, (uint32_t)lcd_gram_send - (uint32_t)lcd->info.pri_send); + sharp_chip_select(lcd, FALSE); + LL_mDelay(10); + if (ret == TRUE) + { + break; + } + } + } + if (retransmission_count <= 0) + { + __NOP(); + } + lcd->info.flush_use_time = sys_millis() - lcd->info.flush_use_time; + lcd->driver.idel = TRUE; +} + +static void _flush_clear(lcd_t *lcd) +{ + lcd->driver.flush(lcd); + uint16_t size = (lcd->info.width / 8) * (lcd->info.height); + osel_memset((uint8_t *)lcd->info.pri, CLEAR_COLOR, size); + osel_memset((uint8_t *)change_line, 1, lcd->info.height); +} + +static int32_t _get_point(lcd_t *lcd, uint16_t x, uint16_t y) +{ + // 优化后的读点函数 + // 直接计算点的索引和位位置 + uint16_t index = y; + uint8_t bit_pos = x % 8; + uint8_t mask = 0x01 << bit_pos; + uint8_t(*lcd_gram)[lcd->info.width / 8] = (uint8_t(*)[lcd->info.width / 8]) lcd->info.pri; + + // 直接操作位而不使用中间变量 + if (lcd_gram[index][x / 8] & mask) + { + return (uint8_t)WHITE; // 该点为白色 + } + else + { + return (uint8_t)BLACK; // 该点为黑色 + } +} + +static int32_t _set_point(lcd_t *lcd, uint16_t x, uint16_t y, uint16_t color) +{ + // 优化后的画点函数 + // 直接计算点的索引和位位置 + uint16_t index = y; + uint8_t bit_pos = x % 8; + uint8_t mask = 0x01 << bit_pos; + uint8_t(*lcd_gram)[lcd->info.width / 8] = (uint8_t(*)[lcd->info.width / 8]) lcd->info.pri; + + // 直接操作位而不使用中间变量 + if (color == (uint8_t)WHITE) + { + lcd_gram[index][x / 8] |= mask; + } + else + { + lcd_gram[index][x / 8] &= ~mask; + } + + // 如果change_line数组可用,则将行标记为已更改 + if (change_line != NULL) + { + change_line[index] = 1; + } + + return 0; +} + +/** + * @brief 将一块区域设定为某种颜色 + * @param {lcd_t} *lcd + * @param {uint16_t} sx + * @param {uint16_t} ex + * @param {uint16_t} sy + * @param {uint16_t} ey + * @param {uint16_t} color + * @return {*} + */ +static int32_t _color_fill(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey, uint16_t color) +{ + return 0; +} + +/** + * @brief 显示或关闭 + * @param {lcd_t} *lcd + * @param {uint8_t} sta + * @return {*} + */ +static int32_t _onoff(lcd_t *lcd, uint8_t sta) +{ + if (lcd->info.on != sta) + { + lcd->info.on = sta; + if (sta == 1) + { + lcd->info.disp->set(*lcd->info.disp); + } + else + { + lcd->info.disp->reset(*lcd->info.disp); + } + } + return 0; +} + +/** + * @brief 设置显存扫描方向 + * @param {lcd_t} *lcd + * @param {uint8_t} scan_dir 0 = 0度扫描,1 = 180度扫描 + * @return {*} + */ +static void _set_dir(lcd_t *lcd, uint8_t scan_dir) +{ + if (lcd->info.scandir != scan_dir) + { + lcd->info.scandir = scan_dir; + lcd->info.need_build = TRUE; + if (scan_dir == 0) + { + } + else + { + } + uint16_t size = (lcd->info.width / 8) * (lcd->info.height); + osel_memset((uint8_t *)lcd->info.pri, CLEAR_COLOR, size); + lcd->driver.clear(lcd); + } +} + +static uint8_t _get_dir(lcd_t *lcd) +{ + return lcd->info.scandir; +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint16_t} color + * @return {*} + * @note + */ +static void _full_fill(lcd_t *lcd, uint16_t color) +{ + uint16_t size = (lcd->info.width / 8) * (lcd->info.height); + osel_memset((uint8_t *)lcd->info.pri, (uint8_t)color, size); + osel_memset((uint8_t *)change_line, 1, lcd->info.height); +} + +/** + * @brief 填充矩形区域,这个函数是用来填充数据的 + * @param {lcd_t} *lcd + * @param {uint16_t} sx + * @param {uint16_t} ex + * @param {uint16_t} sy + * @param {uint16_t} ey + * @param {uint16_t} *color + * @return {*} + */ +static int32_t _fill(lcd_t *lcd, uint16_t x, uint16_t y, uint8_t font_width, uint8_t font_hight, uint8_t *buf) +{ + + return 0; +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint16_t} sx + * @param {uint16_t} ex + * @param {uint16_t} sy + * @param {uint16_t} ey + * @return {*} + */ +static int32_t _prepare_display(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey) +{ + return 0; +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint8_t} sta + * @return {*} + */ +static void _backlight(lcd_t *lcd, uint8_t sta) {} + +/** + * @brief 设置清屏标志 + * @param {lcd_t} *lcd + * @return {*} + * @note + */ +static void _set_clear_flag(lcd_t *lcd) +{ + lcd->info.clear_flag = TRUE; + uint16_t size = (lcd->info.width / 8) * (lcd->info.height); + osel_memset((uint8_t *)lcd->info.pri, CLEAR_COLOR, size); + osel_memset((uint8_t *)change_line, 0, lcd->info.height); +} + +/** + * @brief 获取清屏标志 + * @param {lcd_t} *lcd + * @return {*} + * @note + */ +static BOOL _get_clear_flag(lcd_t *lcd) +{ + return lcd->info.clear_flag; +} + +void lcd_sharp_init(lcd_driver_t *driver) +{ + DBG_ASSERT(driver != NULL __DBG_LINE); + driver->init = _init; // 已实现 + driver->set_point = _set_point; // 已实现 + driver->get_point = _get_point; // 已实现 + driver->color_fill = _color_fill; // 已实现 + driver->onoff = _onoff; // 已实现 + driver->set_dir = _set_dir; // 已实现 + driver->get_dir = _get_dir; // 已实现 + driver->flush = _flush; // 已实现 + driver->flush_clear = _flush_clear; // 已实现 + driver->clear = _clear; // 已实现 + driver->set_clear_flag = _set_clear_flag; // 已实现 + driver->get_clear_flag = _get_clear_flag; // 已实现 + driver->full_fill = _full_fill; // 已实现 + driver->copy_template = _copy_template; // 已实现 + driver->clear_ram = _clear_ram; // 已实现 + + // 以下不实现 + driver->fill = _fill; + driver->prepare_display = _prepare_display; + driver->backlight = _backlight; +} diff --git a/User/system/lib/lcd/lcd_sharp.h b/User/system/lib/lcd/lcd_sharp.h new file mode 100644 index 0000000..9d7ed3e --- /dev/null +++ b/User/system/lib/lcd/lcd_sharp.h @@ -0,0 +1,8 @@ +#ifndef _LCDS_SHARP_H +#define _LCDS_SHARP_H + +#include "lcds.h" + +extern void lcd_sharp_init(lcd_driver_t *driver); + +#endif // !_LCD_LS027B7DH01_H diff --git a/User/system/lib/lcd/lcd_st7525.c b/User/system/lib/lcd/lcd_st7525.c new file mode 100644 index 0000000..4e84322 --- /dev/null +++ b/User/system/lib/lcd/lcd_st7525.c @@ -0,0 +1,444 @@ +#include "lcds.h" +#include "delay.h" + +#define ST_DISP_ON 0xAF // 显示开 +#define ST_DISP_OFF 0xAE // 显示关 +#define ST_START_LINE 0x40 // 设置Start Line +#define ST_PAGE_ADDR 0xB0 // 设置Page Address +#define ST_COL_ADDRM 0x10 // 设置Column Address MSB +#define ST_COL_ADDRL 0x00 // 设置Column Address LSB +#define ST_DISP_NORMAL 0xA6 // 正常显示,1-显示 +#define ST_DISP_REVERSE 0xA7 // 反向显示,0-显示 +#define ST_DISP_ALL_OFF 0xA4 // 正常显示 +#define ST_DISP_ALL_ON 0xA5 // 不管RAM内容,全部显示 +#define ST_RESET 0xE2 // 软件复位 +#define ST_BOOST 0x2F // 内部升压 +#define ST_DISP_0 0xC4 // 0度正常显示 +#define ST_DISP_180 0xC2 // 旋转180度显示 +#define ST_SET_EV 0x81 // 对比度控制 + +/* + 驱动使用的数据结构,不对外 +*/ +struct _cog_drv_data +{ + uint8_t gram[8][COL_DOT_MAX_192]; + + /*刷新区域*/ + uint16_t sx; + uint16_t ex; + uint16_t sy; + uint16_t ey; + uint16_t disx; + uint16_t disy; +}; + +/** + * @brief 写命令 + * @param {uint8_t} cmd + * @return {*} + */ +static void write_cmd(spi_t *handle, uint8_t cmd) +{ + handle->interface.u.lcd.write_cmd(handle, cmd); +} + +static void write_data(spi_t *handle, uint8_t *data, uint16_t len) +{ + handle->interface.u.lcd.write_data(handle, data, len); +} +/** + * @brief 设置起始页 + * @param {uint8_t} page + * @return {*} + */ +static void start_page(spi_t *handle, uint8_t page) +{ + page &= 0x07; // 定义低3 位 + page |= ST_PAGE_ADDR; // 第一页 + write_cmd(handle, page); +} + +/** + * @brief 设置起始列 + * @param {uint8_t} Column + * @return {*} + */ +static void start_column(spi_t *handle, uint8_t column) +{ + uint8_t temp, cmd; + + temp = column; + cmd = (temp & 0x0F); // 定义A3-A0; + cmd += ST_COL_ADDRL; + write_cmd(handle, cmd); + + temp >>= 4; + cmd = (temp & 0x0F); // 定义A7-A4; + cmd += ST_COL_ADDRM; + write_cmd(handle, cmd); +} + +/** + * @brief 设置起始行 + * @param {uint8_t} line + * @return {*} + */ +static void start_line(spi_t *handle, uint8_t line) +{ + line &= 0x3F; // 定义低6 位 + line |= ST_START_LINE; // 第一行或 + write_cmd(handle, line); +} + +/** + * @brief 初始化,包括硬件初始化和软件初始化 + * @param {lcd_t} *lcd + * @return {*} + */ +static int32_t _init(lcd_t *lcd) +{ + lcd->info.spi->gpios.rst->set(*lcd->info.spi->gpios.rst); + delay_tick(50); + lcd->info.spi->gpios.rst->reset(*lcd->info.spi->gpios.rst); + delay_tick(50); + lcd->info.spi->gpios.rst->set(*lcd->info.spi->gpios.rst); + delay_tick(50); + lcd->info.on = 0; + lcd->info.pri = (void *)osel_mem_alloc(sizeof(struct _cog_drv_data)); + uint8_t *p = (uint8_t *)lcd->info.pri; + osel_memset(p, 0x00, (lcd->info.height / 8) * lcd->info.width); + + write_cmd(lcd->info.spi, ST_RESET); // 软件复位 + delay_ms(20); + write_cmd(lcd->info.spi, ST_BOOST); // 内部升压 + delay_ms(20); + write_cmd(lcd->info.spi, ST_DISP_OFF); // display Off + lcd->info.on = 0; + write_cmd(lcd->info.spi, 0xa0); + delay_ms(20); + write_cmd(lcd->info.spi, ST_SET_EV); + write_cmd(lcd->info.spi, 0x79); + + write_cmd(lcd->info.spi, 0xeb); + start_line(lcd->info.spi, 0); // display start line=0 + + write_cmd(lcd->info.spi, ST_DISP_NORMAL); // 正常显示,1-显示 + write_cmd(lcd->info.spi, ST_DISP_ALL_OFF); // 正常显示 + + write_cmd(lcd->info.spi, ST_DISP_0); // 0度正常显示 + lcd->info.scandir = 0; + + // 应用层去清空并显示 + // lcd->driver.color_fill(lcd, 0, lcd->info.width, 0, lcd->info.height, WHITE); + // lcd->driver.onoff(lcd, 1); + + return 0; +} + +/** + *@brief refresh_gram + *@details: 刷新指定区域到屏幕上 + 坐标是横屏模式坐标 + *@param[in] uint16_t sc + uint16_t ec + uint16_t sp + uint16_t ep + *@param[out] 无 + *@retval: static + */ +static uint32_t refresh_gram(lcd_t *lcd, uint16_t sc, uint16_t ec, uint16_t sp, uint16_t ep) +{ + struct _cog_drv_data *drvdata; + uint8_t i; + + drvdata = (struct _cog_drv_data *)lcd->info.pri; + + for (i = sp / 8; i <= ep / 8; i++) + { + // 设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页 + start_page(lcd->info.spi, i); + // 设置列地址的高4位 和列地址的低4位 + start_column(lcd->info.spi, sc); + + write_data(lcd->info.spi, &(drvdata->gram[i][sc]), (ec - sc + 1)); + } + return 0; +} + +/** + * @brief 画点 + * @param {lcd_t} *lcd + * @param {uint16_t} x + * @param {uint16_t} y + * @param {uint16_t} color + * @return {*} + */ +static int32_t _draw_point(lcd_t *lcd, uint16_t x, uint16_t y, uint16_t color) +{ + uint16_t xtmp, ytmp; + uint16_t page, colum; + + struct _cog_drv_data *drvdata; + + drvdata = (struct _cog_drv_data *)lcd->info.pri; + + if (x > lcd->info.width) + return -1; + if (y > lcd->info.height) + return -1; + + if (lcd->info.dir == W_LCD) + { + xtmp = x; + ytmp = y; + } + else // 如果是竖屏,XY轴跟显存的映射要对调 + { + xtmp = y; + ytmp = lcd->info.width - 1 - x; + } + + page = ytmp / 8; // 页地址 + colum = xtmp; // 列地址 + + if (color == BLACK) + { + drvdata->gram[page][colum] |= (0x01 << (ytmp % 8)); + } + else + { + drvdata->gram[page][colum] &= ~(0x01 << (ytmp % 8)); + } + + // 设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页 + start_page(lcd->info.spi, page); + // 设置列地址的高4位 和列地址的低4位 + start_column(lcd->info.spi, colum); + + write_data(lcd->info.spi, &drvdata->gram[page][colum], 1); + + return 0; +} + +/** + * @brief 将一块区域设定为某种颜色 + * @param {lcd_t} *lcd + * @param {uint16_t} sx + * @param {uint16_t} ex + * @param {uint16_t} sy + * @param {uint16_t} ey + * @param {uint16_t} color + * @return {*} + */ +static int32_t _color_fill(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey, uint16_t color) +{ + uint16_t i, j; + uint16_t xtmp, ytmp; + uint16_t page, colum; + + struct _cog_drv_data *drvdata; + + drvdata = (struct _cog_drv_data *)lcd->info.pri; + + /*防止坐标溢出*/ + if (sy >= lcd->info.height) + { + sy = lcd->info.height - 1; + } + if (sx >= lcd->info.width) + { + sx = lcd->info.width - 1; + } + + if (ey >= lcd->info.height) + { + ey = lcd->info.height - 1; + } + if (ex >= lcd->info.width) + { + ex = lcd->info.width - 1; + } + + for (j = sy; j <= ey; j++) + { + for (i = sx; i <= ex; i++) + { + + if (lcd->info.dir == W_LCD) + { + xtmp = i; + ytmp = j; + } + else // 如果是竖屏,XY轴跟显存的映射要对调 + { + xtmp = j; + ytmp = lcd->info.width - 1 - i; + } + + page = ytmp / 8; // 页地址 + colum = xtmp; // 列地址 + + if (color == BLACK) + { + drvdata->gram[page][colum] |= (0x01 << (ytmp % 8)); + } + else + { + drvdata->gram[page][colum] &= ~(0x01 << (ytmp % 8)); + } + } + } + + /* + 只刷新需要刷新的区域 + 坐标范围是横屏模式 + */ + if (lcd->info.dir == W_LCD) + { + refresh_gram(lcd, sx, ex, sy, ey); + } + else + { + refresh_gram(lcd, sy, ey, lcd->info.width - ex - 1, lcd->info.width - sx - 1); + } + return 0; +} + +/** + * @brief 填充矩形区域,这个函数是用来填充数据的 + * @param {lcd_t} *lcd + * @param {uint16_t} sx + * @param {uint16_t} ex + * @param {uint16_t} sy + * @param {uint16_t} ey + * @param {uint16_t} *color + * @return {*} + */ +static int32_t _fill(lcd_t *lcd, uint16_t x, uint16_t y, uint8_t font_width, uint8_t font_hight, uint8_t *buf) +{ + uint8_t i, j, n; + n = y; + for (i = 0; i < font_hight / 8; i++) + { + start_page(lcd->info.spi, x); + for (j = 0; j < font_width; j++) + { + start_column(lcd->info.spi, y); + write_data(lcd->info.spi, &buf[j + i * font_width], 1); + y++; + } + x++; + y = n; + } + return 0; +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint16_t} sx + * @param {uint16_t} ex + * @param {uint16_t} sy + * @param {uint16_t} ey + * @return {*} + */ +static int32_t _prepare_display(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey) +{ + return 0; +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint16_t} *color + * @param {uint32_t} len + * @return {*} + */ +static void _flush(lcd_t *lcd) +{ +} + +/** + * @brief 显示或关闭 + * @param {lcd_t} *lcd + * @param {uint8_t} sta + * @return {*} + */ +static int32_t _onoff(lcd_t *lcd, uint8_t sta) +{ + if (lcd->info.on != sta) + { + lcd->info.on = sta; + if (sta == 1) + { + write_cmd(lcd->info.spi, ST_DISP_ON); // display On + } + else + { + write_cmd(lcd->info.spi, ST_DISP_OFF); // display Off + } + } + + return 0; +} + +/** + * @brief 设置显存扫描方向 + * @param {lcd_t} *lcd + * @param {uint8_t} scan_dir 0 = 0度扫描,1 = 180度扫描 + * @return {*} + */ +void _set_dir(lcd_t *lcd, uint8_t scan_dir) +{ + if (lcd->info.scandir != scan_dir) + { + lcd->info.scandir = scan_dir; + if (scan_dir == 0) + { + write_cmd(lcd->info.spi, ST_DISP_0); // 0度扫描 + } + else + { + write_cmd(lcd->info.spi, ST_DISP_180); // 180度扫描 + } + } +} + +void _full_fill(lcd_t *lcd, uint16_t color) +{ + uint16_t i; + uint8_t val; + val = color > 0 ? 0x00 : 0xff; + for (i = 0; i < lcd->info.height / 8; i++) + { + // 设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页 + start_page(lcd->info.spi, i); + // 设置列地址的高4位 和列地址的低4位 + start_column(lcd->info.spi, 0); + + write_data(lcd->info.spi, &val, lcd->info.width); + } +} + +/** + * @brief + * @param {lcd_t} *lcd + * @param {uint8_t} sta + * @return {*} + */ +void _backlight(lcd_t *lcd, uint8_t sta) {} + +void lcd_st7525_init(lcd_driver_t *driver) +{ + driver->init = _init; // 已实现 + driver->set_point = _draw_point; // 已实现 + driver->color_fill = _color_fill; // 已实现 + driver->fill = _fill; // 已实现 + driver->prepare_display = _prepare_display; + driver->flush = _flush; + driver->onoff = _onoff; // 已实现 + driver->set_dir = _set_dir; + driver->backlight = _backlight; + driver->full_fill = _full_fill; +} diff --git a/User/system/lib/lcd/lcd_st7525.h b/User/system/lib/lcd/lcd_st7525.h new file mode 100644 index 0000000..e3fa02d --- /dev/null +++ b/User/system/lib/lcd/lcd_st7525.h @@ -0,0 +1,3 @@ +#include "lcds.h" + +extern void lcd_st7525_init(lcd_driver_t *driver); diff --git a/User/system/lib/lcd/lcds.c b/User/system/lib/lcd/lcds.c new file mode 100644 index 0000000..17fc908 --- /dev/null +++ b/User/system/lib/lcd/lcds.c @@ -0,0 +1,43 @@ +/** + * @file + * @author xxx + * @date 2023-08-29 14:28:04 + * @brief LCD驱动 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "lcds.h" +#include "lcd_st7525.h" +#include "lcd_sharp.h" +#include + +#define BACK_COLOR WHITE +// static uint8_t dotbuf[64]; // 字符点阵缓冲 + +void lcd_free(lcd_t *handle) +{ + DBG_ASSERT(handle != NULL __DBG_LINE); + osel_mem_free(handle); +} + +// LCD初始化 +lcd_t *lcd_create(lcd_info_t info) +{ + lcd_t *handle = (lcd_t *)osel_mem_alloc(sizeof(lcd_t)); + DBG_ASSERT(handle != NULL __DBG_LINE); + osel_memcpy((uint8_t *)&handle->info, (uint8_t *)&info, sizeof(lcd_info_t)); + handle->driver.idel = TRUE; + switch (info.type) + { + case LCD_ST7525: + // lcd_st7525_init(&handle->driver); + break; + case LCD_SHARP: + lcd_sharp_init(&handle->driver); + break; + default: + lcd_free(handle); + return NULL; + } + return handle; +} diff --git a/User/system/lib/lcd/lcds.h b/User/system/lib/lcd/lcds.h new file mode 100644 index 0000000..3d10334 --- /dev/null +++ b/User/system/lib/lcd/lcds.h @@ -0,0 +1,195 @@ +/** + * @file lcds.h + * @author xxx + * @date 2023-11-16 16:29:36 + * @brief + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ +/** + * 16*16字体,宽高16*16,宋体、粗体、11 +欢迎使用智能定位器版本江苏巨石数字技术有限公司选择操作短按长返回进入下一个上取消确认图表页面电流温度℃↑↓←→√○×序列号硬件软固设备型安装方向行程类气动正反直角开关单双地址工模式自手测试非待机写保护启闭压力传感状态蓝牙输出块通讯显示语言中文英算法置恒控制变频速域整已未编辑首基准驱存储磁条小路源偏差摩擦弹簧率内累计次时间故障量校大知的项配实执仪服务外拟投相信过高低积分饱和切割点诊断换在报警记录不为空满离线耗尽主要据可指复零功阀门全更新厂商名称造息范围环境~℉°成平构放带缸薄膜常运停当前移跨减少增加恢参所重比例系微死区益湿 + */ + +/** + * 24*24字体,宽高24*24,宋体、粗体、18 +,。主菜单设备重启自检保存成功失败加载中置已取消欢迎使用智能定位器版本江苏巨石数字技术有限公司电流温度故障超出规格需要维护正常一键整信息厂阀门诊断行程特性测试输入密码错误编辑当前不满足动条件未知秒后返回首页选择项目查请求参恢复斜坡阶跃计面至默认配包括对校准或的修改但驱控制号发生实时据变量所℃℉°进 + */ + +/** + * 32*32字体,宽高32*32,宋体、粗体、26 +进度 + */ + +/** + * 18x18图片 保持比例 不反色 + * Public\img\icon\标题栏-HZ18x18 + * 字符映射:在文件名称中 + */ + +/** + * 200*200图片 保持比例 反色 + * GSDT: 字符映射 0 ; 阈值设置200 + * 电量不足:字符映射 1 ; + */ + +#ifndef __LCDS_H__ +#define __LCDS_H__ + +#include "lib.h" +#include "spis.h" + +#define USE_UCGUI (1) // 0:不使用;1:使用uc-gui + +// 列点阵数 +#define COL_DOT_MAX_128 128 +#define COL_DOT_MAX_192 192 +#define COL_DOT_MAX_400 400 +// 行点阵数 +#define LIN_DOT_MAX_64 64 +#define LIN_DOT_MAX_240 240 + +#define H_LCD 0 // 竖屏 +#define W_LCD 1 // 横屏 + +// 扫描方向定义 +// BIT 0 标识LR,1 R-L,0 L-R +// BIT 1 标识UD,1 D-U,0 U-D +// BIT 2 标识LR/UD,1 DU-LR,0 LR-DU +// #define LR_BIT_MASK 0X01 +// #define UD_BIT_MASK 0X02 +// #define LRUD_BIT_MASK 0X04 + +// #define L2R_U2D (0) // 从左到右,从上到下 +// #define L2R_D2U (0 + UD_BIT_MASK) // 从左到右,从下到上 +// #define R2L_U2D (0 + LR_BIT_MASK) // 从右到左,从上到下 +// #define R2L_D2U (0 + UD_BIT_MASK + LR_BIT_MASK) // 从右到左,从下到上 + +// #define U2D_L2R (LRUD_BIT_MASK) // 从上到下,从左到右 +// #define U2D_R2L (LRUD_BIT_MASK + LR_BIT_MASK) // 从上到下,从右到左 +// #define D2U_L2R (LRUD_BIT_MASK + UD_BIT_MASK) // 从下到上,从左到右 +// #define D2U_R2L (LRUD_BIT_MASK + UD_BIT_MASK + LR_BIT_MASK) // 从下到上,从右到左 + +// 画笔颜色 +/* + 对于黑白屏 + WHITE就是不显示,清空 + BLACK就是显示 +*/ +#define WHITE 0xFFFF +#define BLACK 0x0000 + +#define BLUE 0x001F +#define GREEN 0x07E0 +#define RED 0xF800 + +#define BRED 0XF81F +#define GRED 0XFFE0 +#define GBLUE 0X07FF +#define MAGENTA 0xF81F +#define CYAN 0x7FFF +#define YELLOW 0xFFE0 +#define BROWN 0XBC40 // 棕色 +#define BRRED 0XFC07 // 棕红色 +#define GRAY 0X8430 // 灰色 +#define DARKBLUE 0X01CF // 深蓝色 +#define LIGHTBLUE 0X7D7C // 浅蓝色 +#define GRAYBLUE 0X5458 // 灰蓝色 +#define LIGHTGREEN 0X841F // 浅绿色 +#define LIGHTGRAY 0XEF5B // 浅灰色(PANNEL) +#define LGRAY 0XC618 // 浅灰色(PANNEL),窗体背景色 +#define LGRAYBLUE 0XA651 // 浅灰蓝色(中间层颜色) +#define LBBLUE 0X2B12 // 浅棕蓝色(选择条目的反色) + +#if !USE_UCGUI +// 对齐方式 +#define GUI_TA_LEFT BIT1 // 左对齐 +#define GUI_TA_HCENTER BIT2 // 居中对齐 +#define GUI_TA_RIGHT BIT3 // 右对齐 +#define GUI_TA_NORMOL BIT4 // 不对齐 +// 显示模式 +#define GUI_TEXTMODE_NORMAL BIT0 // 正常 +#define GUI_TEXTMODE_REVERSE BIT1 // 反显 +#define GUI_TEXTMODE_UNDERLINE BIT2 // 下线 +#define GUI_TEXTMODE_XOR BIT3 // +#else +#include "GUI.h" +#define GUI_TA_NORMOL BIT4 // 不对齐 +#endif + +typedef enum +{ + LCD_ST7525, + LCD_SHARP, +} lcd_type_e; + +typedef enum +{ + TEMPLATE_COPY_FROM_PRI, // 拷贝pri到pri_template + TEMPLATE_COPY_TO_PRI, // 拷贝pri_template到pri + TEMPLATE_COPY_CLEAR, // 清空pri_template +} template_copy_type_e; // 0,拷贝pri_template到pri;1,拷贝pri到pri_template; 其余清空 + +typedef struct LCDS lcd_t; +typedef struct +{ + lcd_type_e type; + spi_t *spi; + gpio_t *disp; + + /*驱动需要的变量*/ + uint8_t dir; // 横屏还是竖屏控制:0,竖屏;1,横屏。 + uint16_t width; // LCDS 宽度 + uint16_t height; // LCDS 高度 + + // private: + uint8_t on; // 开关 0关,1开 + uint8_t scandir; // 扫描方向:0, 0度扫描,1, 180度扫描 + uint8_t retransmission_count; // 重传次数 + volatile BOOL need_build; + BOOL clear_flag; // 清屏标志 + void *pri; // 私有数据,黑白屏跟OLED屏在初始化的时候会开辟显存 + void *pri_send; // DMA发送时的私有数据 + void *pri_template; // 模板私有数据 + uint32_t flush_use_time; +} lcd_info_t; + +typedef struct +{ + int32_t (*init)(lcd_t *lcd); + + int32_t (*set_point)(lcd_t *lcd, uint16_t x, uint16_t y, uint16_t color); // 画点 + int32_t (*get_point)(lcd_t *lcd, uint16_t x, uint16_t y); // 读点 + int32_t (*color_fill)(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey, uint16_t color); // 颜色填充 + int32_t (*fill)(lcd_t *lcd, uint16_t x, uint16_t y, uint8_t font_width, uint8_t font_hight, uint8_t *buf); // 填充 + + int32_t (*prepare_display)(lcd_t *lcd, uint16_t sx, uint16_t ex, uint16_t sy, uint16_t ey); // 准备显示 + void (*flush)(lcd_t *lcd); // 刷新显示 + void (*flush_clear)(lcd_t *lcd); // 刷新显示并清空缓存 + + int32_t (*onoff)(lcd_t *lcd, uint8_t sta); // 开关 + void (*set_dir)(lcd_t *lcd, uint8_t scan_dir); // 设置扫描方向 + void (*backlight)(lcd_t *lcd, uint8_t sta); // 背光控制 + void (*full_fill)(lcd_t *lcd, uint16_t color); + int32_t (*clear)(lcd_t *lcd); // 清屏 + void (*set_clear_flag)(lcd_t *lcd); // 设置清屏标志 + void (*copy_template)(lcd_t *lcd, template_copy_type_e dir); // 拷贝模板 0,拷贝pri_template到pri;1,拷贝pri到pri_template; 其余清空 + void (*clear_ram)(lcd_t *lcd, uint16_t min_row, uint16_t max_row); // 清除显存 + + // 获取接口 + uint8_t (*get_dir)(lcd_t *lcd); // 获取扫描方向 + BOOL(*get_clear_flag) + (lcd_t *lcd); // 获取清屏标志 + + __IO BOOL idel; // 是否空闲 +} lcd_driver_t; + +struct LCDS +{ + lcd_info_t info; + lcd_driver_t driver; +}; + +extern lcd_t *lcd_create(lcd_info_t info); +extern void lcd_free(lcd_t *handle); + +#endif // __LCDS_H__ diff --git a/User/system/lib/lcd/readme.md b/User/system/lib/lcd/readme.md new file mode 100644 index 0000000..a2b38ff --- /dev/null +++ b/User/system/lib/lcd/readme.md @@ -0,0 +1,12 @@ +# 中文生成工具 + +存放在 /public/辅助软件/ucGUI-gb2312汉字生成器v9.0.zip + + +# 生成教程 + +以16*16大小字符为例 打开User\lib\lcd\lcds.h 将需要转换的文字复制到ucGUI中后点击开始转换,然后复制生成的内容到User\lib\lcd\gui\Font\HZ16x16.c文件中 + +![1719196693709](image/readme/1719196693709.png) + +![1719196745232](image/readme/1719196745232.png) diff --git a/User/system/lib/menu/menu.c b/User/system/lib/menu/menu.c new file mode 100644 index 0000000..ec59239 --- /dev/null +++ b/User/system/lib/menu/menu.c @@ -0,0 +1,905 @@ +#include "menu.h" +#include "menus_main.h" +#include "entity.h" +#include +#include +#include "convert.h" +#ifdef _COT_MENU_USE_MALLOC_ +#include +#endif + +#ifdef _COT_MENU_USE_SHORTCUT_ +#include +#endif + +/* private typedef ---------------------------------------------------------------------------------------------------*/ +typedef struct menu_ctrl +{ + uint16_t parent_window_no; /*!< 父菜单的窗口号 */ + struct menu_ctrl *p_parent_menu_ctrl; /*!< 父菜单控制处理 */ + char *(psz_desc[MENU_SUPPORT_LANGUAGE]); /*!< 当前选项的字符串描述(多语种) */ + showmenu_call_fun_f pfn_show_menu_fun; /*!< 当前菜单显示效果函数 */ + menu_list_t *p_menu_list; /*!< 当前菜单列表 */ + menu_call_fun_f pfn_load_call_fun; /*!< 当前菜单加载函数 */ + menu_call_fun_f pfn_run_call_fun; /*!< 当前选项的非菜单功能函数 */ + menusize_t items_num; /*!< 当前菜单选项总数目 */ + menusize_t show_base_item; /*!< 当前菜单首个显示的选项 */ + menusize_t select_item; /*!< 当前菜单选中的选项 */ + BOOL is_selected; /*!< 菜单选项是否已经被选择 */ +} menu_ctrl_t; + +typedef struct +{ + menu_ctrl_t *p_menu_ctrl; /*!< 当前菜单控制处理 */ + menu_call_fun_f pfn_main_enter_call_fun; /*!< 主菜单进入时(进入菜单)需要执行一次的函数 */ + menu_call_fun_f pfn_main_exit_call_fun; /*!< 主菜单进入后退出时(退出菜单)需要执行一次的函数 */ + menu_call_fun_f pfn_load_call_fun; /*!< 重加载函数 */ + uint8_t language; /*!< 语种选择 */ + BOOL is_enter_main_menu : TRUE; /*!< 是否进入了主菜单 */ +} menu_manage_t; + +/* private define ----------------------------------------------------------------------------------------------------*/ +/* private macro -----------------------------------------------------------------------------------------------------*/ +/* private variables -------------------------------------------------------------------------------------------------*/ +static menu_manage_t sg_t_menu_manage; + +#ifndef _menu_use_malloc_ +static menu_ctrl_t sg_arr_menu_ctrl[MENU_MAX_DEPTH]; +#endif + +static uint8_t sg_curr_menu_depth = 0; + +/* private function prototypes ---------------------------------------------------------------------------------------*/ +static menu_ctrl_t *new_menu(void); +static void delete_menu(menu_ctrl_t *p_menu); + +/* private function --------------------------------------------------------------------------------------------------*/ +/** + * @brief 新建菜单层级 + * + * @return menu_ctrl_t* + */ +static menu_ctrl_t *new_menu(void) +{ + menu_ctrl_t *p_menu_ctrl = NULL; + + if (sg_curr_menu_depth < MENU_MAX_DEPTH) + { +#ifdef _menu_use_malloc_ + p_menu_ctrl = (menu_ctrl_t *)malloc(sizeof(menu_ctrl_t)); +#else + p_menu_ctrl = &sg_arr_menu_ctrl[sg_curr_menu_depth]; +#endif + sg_curr_menu_depth++; + } + + return p_menu_ctrl; +} + +/** + * @brief 销毁菜单层级 + * + * @param p_menu + */ +static void delete_menu(menu_ctrl_t *p_menu) +{ +#ifdef _menu_use_malloc_ + free(p_menu); +#endif + if (sg_curr_menu_depth > 0) + { + sg_curr_menu_depth--; + } +} + +/** + * @brief 解绑当前菜单 + * @return {*} + * @note + */ +BOOL menu_unbind(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL) + { + return FALSE; + } + + delete_menu(sg_t_menu_manage.p_menu_ctrl); + return TRUE; +} + +/** + * @brief 菜单初始化 + * + * @param[in] p_main_menu 主菜单注册信息 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_init(const main_menu_cfg_t *p_main_menu) +{ + int i; + menu_ctrl_t *p_new_menu_ctrl = NULL; + + if (sg_t_menu_manage.p_menu_ctrl != NULL) + { + return FALSE; + } + +#if MENU_MAX_DEPTH != 0 + sg_curr_menu_depth = 0; +#endif + + if ((p_new_menu_ctrl = new_menu()) == NULL) + { + return FALSE; + } + + sg_t_menu_manage.language = 0; + + for (i = 0; i < MENU_SUPPORT_LANGUAGE; i++) + { + p_new_menu_ctrl->psz_desc[i] = (char *)p_main_menu->psz_desc[i]; + } + + p_new_menu_ctrl->p_parent_menu_ctrl = NULL; + p_new_menu_ctrl->pfn_load_call_fun = p_main_menu->pfn_load_call_fun; + p_new_menu_ctrl->pfn_show_menu_fun = NULL; + p_new_menu_ctrl->pfn_run_call_fun = p_main_menu->pfn_run_call_fun; + + p_new_menu_ctrl->p_menu_list = NULL; + p_new_menu_ctrl->items_num = 0; + p_new_menu_ctrl->select_item = 0; + p_new_menu_ctrl->show_base_item = 0; + + sg_t_menu_manage.p_menu_ctrl = p_new_menu_ctrl; + sg_t_menu_manage.is_enter_main_menu = 0; + sg_t_menu_manage.pfn_main_enter_call_fun = p_main_menu->pfn_enter_call_fun; + sg_t_menu_manage.pfn_main_exit_call_fun = p_main_menu->pfn_exit_call_fun; + sg_t_menu_manage.pfn_load_call_fun = p_new_menu_ctrl->pfn_load_call_fun; + + return TRUE; +} + +/** + * @brief 菜单反初始化 + * + * @attention 不管处于任何界面都会逐级退出到主菜单后(会调用退出函数),再退出主菜单,最后反初始化 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_de_init(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL) + { + return FALSE; + } + + menu_main_exit(); + + delete_menu(sg_t_menu_manage.p_menu_ctrl); + sg_t_menu_manage.p_menu_ctrl = NULL; + sg_t_menu_manage.language = 0; + sg_t_menu_manage.is_enter_main_menu = 0; + sg_t_menu_manage.pfn_main_enter_call_fun = NULL; + sg_t_menu_manage.pfn_main_exit_call_fun = NULL; + sg_t_menu_manage.pfn_load_call_fun = NULL; + + return TRUE; +} + +/** + * @brief 子菜单绑定当前菜单选项 + * + * @param parent_window_no 父菜单选项的窗口号 + * @param p_menu_list 新的菜单列表 + * @param menu_num 新的菜单列表数目 + * @param pfn_show_menu_fun 新的菜单列表显示效果回调函数, 为NULL则延续上级菜单显示效果 + * @return BOOL + */ +BOOL menu_bind(uint16_t parent_window_no, const menu_list_t *p_menu_list, menusize_t menu_num, showmenu_call_fun_f pfn_show_menu_fun) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL) + { + return FALSE; + } + + if (sg_t_menu_manage.p_menu_ctrl->p_menu_list != NULL) + { + return TRUE; + } + + sg_t_menu_manage.p_menu_ctrl->p_menu_list = (menu_list_t *)p_menu_list; + sg_t_menu_manage.p_menu_ctrl->items_num = menu_num; + sg_t_menu_manage.p_menu_ctrl->parent_window_no = parent_window_no; + sg_t_menu_manage.p_menu_ctrl->select_item = 0; + + if (pfn_show_menu_fun != NULL) + { + sg_t_menu_manage.p_menu_ctrl->pfn_show_menu_fun = pfn_show_menu_fun; + } + + return TRUE; +} + +/** + * @brief 选择语种 + * + * @param[in] language_idx 语种索引 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_select_language(uint8_t language_idx) +{ + if (MENU_SUPPORT_LANGUAGE <= language_idx) + { + return FALSE; + } + + sg_t_menu_manage.language = language_idx; + return TRUE; +} + +/** + * @brief 复位菜单, 回到主菜单界面 + * + * @note 该复位回到主菜单不会执行退出所需要执行的回调函数 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_reset(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + while (sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl != NULL) + { + menu_ctrl_t *p_menu_ctrl = sg_t_menu_manage.p_menu_ctrl; + + sg_t_menu_manage.p_menu_ctrl = sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl; + delete_menu(p_menu_ctrl); + } + + sg_t_menu_manage.p_menu_ctrl->select_item = 0; + + return TRUE; +} + +/** + * @brief 主菜单进入 + * + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_main_enter(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 1) + { + return FALSE; + } + + if (sg_t_menu_manage.pfn_main_enter_call_fun != NULL) + { + sg_t_menu_manage.pfn_main_enter_call_fun(); + } + + sg_t_menu_manage.is_enter_main_menu = 1; + sg_t_menu_manage.pfn_load_call_fun = sg_t_menu_manage.p_menu_ctrl->pfn_load_call_fun; + + return TRUE; +} + +/** + * @brief 主菜单退出 + * + * @attention 不管处于任何界面都会逐级退出到主菜单后(会调用退出函数),再退出主菜单 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_main_exit(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + while (menu_exit(1) == 0) + { + } + + if (sg_t_menu_manage.pfn_main_exit_call_fun != NULL) + { + sg_t_menu_manage.pfn_main_exit_call_fun(); + } + + sg_t_menu_manage.is_enter_main_menu = 0; + + return TRUE; +} + +/** + * @brief 进入当前菜单选项 + * + * @param[in] p 传递给进入函数的参数 != NULL 执行进入函数 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_enter(void *p) +{ + int i; + menu_ctrl_t *p_new_menu_ctrl = NULL; + menu_ctrl_t *p_curr_menu_ctrl = sg_t_menu_manage.p_menu_ctrl; + + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + if ((p_new_menu_ctrl = new_menu()) == NULL) + { + return FALSE; + } + + for (i = 0; i < MENU_SUPPORT_LANGUAGE; i++) + { + p_new_menu_ctrl->psz_desc[i] = (char *)p_curr_menu_ctrl->p_menu_list[p_curr_menu_ctrl->select_item].psz_desc[i]; + } + + p_new_menu_ctrl->p_menu_list = NULL; + p_new_menu_ctrl->items_num = 0; + p_new_menu_ctrl->pfn_show_menu_fun = p_curr_menu_ctrl->pfn_show_menu_fun; + p_new_menu_ctrl->pfn_load_call_fun = p_curr_menu_ctrl->p_menu_list[p_curr_menu_ctrl->select_item].pfn_load_call_fun; + p_new_menu_ctrl->pfn_run_call_fun = p_curr_menu_ctrl->p_menu_list[p_curr_menu_ctrl->select_item].pfn_run_call_fun; + p_new_menu_ctrl->select_item = 0; + p_new_menu_ctrl->is_selected = TRUE; + p_new_menu_ctrl->p_parent_menu_ctrl = p_curr_menu_ctrl; + + sg_t_menu_manage.p_menu_ctrl = p_new_menu_ctrl; + sg_t_menu_manage.pfn_load_call_fun = p_new_menu_ctrl->pfn_load_call_fun; + + if (p_curr_menu_ctrl->p_menu_list[p_curr_menu_ctrl->select_item].pfn_enter_call_fun != NULL) + { + p_curr_menu_ctrl->p_menu_list[p_curr_menu_ctrl->select_item].pfn_enter_call_fun(); + } + + return TRUE; +} + +/** + * @brief 退出当前选项并返回上一层菜单 + * + * @param[in] is_reset 菜单选项是否从头选择 + * @return TRUE:成功;FALSE:失败, 即目前处于主菜单, 无法返回 + */ +BOOL menu_exit(BOOL is_reset) +{ + menu_ctrl_t *p_menu_ctrl = sg_t_menu_manage.p_menu_ctrl; + + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + if (sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl == NULL) + { + return FALSE; + } + + sg_t_menu_manage.p_menu_ctrl = sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl; + sg_t_menu_manage.pfn_load_call_fun = sg_t_menu_manage.p_menu_ctrl->pfn_load_call_fun; + delete_menu(p_menu_ctrl); + p_menu_ctrl = NULL; + + if (sg_t_menu_manage.p_menu_ctrl->p_menu_list[sg_t_menu_manage.p_menu_ctrl->select_item].pfn_exit_call_fun != NULL) + { + sg_t_menu_manage.p_menu_ctrl->is_selected = FALSE; + sg_t_menu_manage.p_menu_ctrl->p_menu_list[sg_t_menu_manage.p_menu_ctrl->select_item].pfn_exit_call_fun(); + } + + if (is_reset) + { + sg_t_menu_manage.p_menu_ctrl->select_item = 0; + } + + return TRUE; +} + +/** + * @brief 选择上一个菜单选项 + * + * @param[in] is_allow_roll 第一个选项时是否从跳转到最后一个选项 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_select_previous(BOOL is_allow_roll) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + if (sg_t_menu_manage.p_menu_ctrl->select_item > 0) + { + sg_t_menu_manage.p_menu_ctrl->select_item--; + } + else + { + if (is_allow_roll) + { + sg_t_menu_manage.p_menu_ctrl->select_item = sg_t_menu_manage.p_menu_ctrl->items_num - 1; + } + else + { + sg_t_menu_manage.p_menu_ctrl->select_item = 0; + return FALSE; + } + } + + return TRUE; +} + +/** + * @brief 选择菜单的上一页 + * @param[in] show_num 每页菜单项数目 + * @return {*} + * @note + */ +BOOL menu_select_previous_page(uint8_t show_num) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + uint8_t page_no = sg_t_menu_manage.p_menu_ctrl->select_item / show_num; + if (page_no > 0) + { + sg_t_menu_manage.p_menu_ctrl->select_item = (page_no - 1) * show_num; + sg_t_menu_manage.p_menu_ctrl->show_base_item = 0; + } + else + { + sg_t_menu_manage.p_menu_ctrl->select_item = ((sg_t_menu_manage.p_menu_ctrl->items_num - 1) / show_num) * show_num; + sg_t_menu_manage.p_menu_ctrl->show_base_item = 0; + } + return TRUE; +} + +/** + * @brief 选择下一个菜单选项 + * + * @param[in] is_allow_roll 最后一个选项时是否跳转到第一个选项 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_select_next(BOOL is_allow_roll) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + if (sg_t_menu_manage.p_menu_ctrl->select_item < (sg_t_menu_manage.p_menu_ctrl->items_num - 1)) + { + sg_t_menu_manage.p_menu_ctrl->select_item++; + } + else + { + if (is_allow_roll) + { + sg_t_menu_manage.p_menu_ctrl->select_item = 0; + } + else + { + sg_t_menu_manage.p_menu_ctrl->select_item = sg_t_menu_manage.p_menu_ctrl->items_num - 1; + return FALSE; + } + } + + return TRUE; +} + +/** + * @brief 选择菜单的下一页 + * @param[in] show_num 每页菜单项数目 + * @return {*} + * @note + */ +BOOL menu_select_next_page(uint8_t show_num) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + uint8_t page_no = sg_t_menu_manage.p_menu_ctrl->select_item / show_num; + if (page_no < ((sg_t_menu_manage.p_menu_ctrl->items_num - 1) / show_num)) + { + sg_t_menu_manage.p_menu_ctrl->select_item = (page_no + 1) * show_num; + sg_t_menu_manage.p_menu_ctrl->show_base_item = 0; + } + else + { + sg_t_menu_manage.p_menu_ctrl->select_item = 0; + sg_t_menu_manage.p_menu_ctrl->show_base_item = 0; + } + return TRUE; +} + +/** + * @brief 跳转菜单项 + * + * @param[in] index 菜单项 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_jump_item(uint8_t index) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + sg_t_menu_manage.p_menu_ctrl->select_item = index; + sg_t_menu_manage.p_menu_ctrl->show_base_item = 0; + return TRUE; +} + +#ifdef _menu_use_shortcut_ + +/** + * @brief 相对主菜单或当前菜单通过下级各菜单索引快速进入指定选项 + * + * @param[in] is_absolute 是否采用绝对菜单索引(从主菜单开始) + * @param[in] deep 菜单深度,大于 0 + * @param[in] ... 各级菜单索引值(从0开始), 入参个数由 deep 的值决定 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_shortcut_enter(BOOL is_absolute, uint8_t deep, ...) +{ + uint8_t select_deep = 0; + va_list p_item_list; + menusize_t select_item; + + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + if (is_absolute) + { + menu_reset(); + } + + va_start(p_item_list, deep); + + while (select_deep < deep) + { + select_item = va_arg(p_item_list, int); + + if (select_item >= sg_t_menu_manage.p_menu_ctrl->items_num) + { + va_end(p_item_list); + return FALSE; + } + + sg_t_menu_manage.p_menu_ctrl->select_item = select_item; + menu_enter(NULL); + select_deep++; + } + + va_end(p_item_list); + + return TRUE; +} + +#endif + +/** + * @brief 限制当前菜单界面最多显示的菜单数目 + * + * @note 在菜单显示效果回调函数中使用, 使用成员变量 show_base_item 得到显示界面的第一个选项索引 + * @param[in,out] t_menu_show 当前菜单显示信息 + * @param[in,out] show_num 当前菜单中需要显示的选项数目, 根据当前菜单选项的总数得到最终的显示的选项数目 + * @return TRUE:成功;FALSE:失败 + */ +BOOL menu_limit_show_list_num(menu_show_t *pt_menu_show, menusize_t *p_show_num) +{ + if (pt_menu_show == NULL || p_show_num == NULL) + { + return FALSE; + } + + if (*p_show_num > pt_menu_show->items_num) + { + *p_show_num = pt_menu_show->items_num; + } + + if (pt_menu_show->select_item < pt_menu_show->show_base_item) + { + pt_menu_show->show_base_item = pt_menu_show->select_item; + } + else if ((pt_menu_show->select_item - pt_menu_show->show_base_item) >= *p_show_num) + { + pt_menu_show->show_base_item = pt_menu_show->select_item - *p_show_num + 1; + } + else + { + // 保持 + } + pt_menu_show->page_no = pt_menu_show->select_item / *p_show_num; + return TRUE; +} + +/** + * @brief 获取当前父菜单显示信息 + * 如获取当前菜单的二级父菜单信息,level 为2 + * + * @param[out] pt_menu_show 父 n 级菜单显示信息 + * @param[in] level n 级, 大于 0 + * @return int + */ +BOOL menu_query_parent_menu(menu_show_t *pt_menu_show, uint8_t level) +{ + int i; + menu_list_t *p_menu; + menu_ctrl_t *p_menu_ctrl = NULL; + + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + p_menu_ctrl = sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl; + + while (level && p_menu_ctrl != NULL) + { + p_menu = p_menu_ctrl->p_menu_list; + pt_menu_show->items_num = p_menu_ctrl->items_num; + pt_menu_show->select_item = p_menu_ctrl->select_item; + pt_menu_show->show_base_item = p_menu_ctrl->show_base_item; + + pt_menu_show->psz_desc = sg_t_menu_manage.p_menu_ctrl->psz_desc[sg_t_menu_manage.language]; + + for (i = 0; i < pt_menu_show->items_num && i < MENU_MAX_NUM; i++) + { + pt_menu_show->psz_items_desc[i] = (char *)p_menu[i].psz_desc[sg_t_menu_manage.language]; + pt_menu_show->p_items_ex_data[i] = p_menu[i].p_extend_data; + } + + p_menu_ctrl = p_menu_ctrl->p_parent_menu_ctrl; + level--; + } + + if (level != 0 && p_menu_ctrl == NULL) + { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 获取当前菜单选项的描述字符串最大长度 + * + * @param[in] pt_show_info 当前菜单显示信息 + * @return uint8_t + */ +uint8_t menu_psz_desc_max_size(menu_show_t *pt_show_info) +{ + uint8_t i; + uint8_t max_size = 0; + + if (pt_show_info == NULL) + { + return 0; + } + + for (i = 0; i < pt_show_info->items_num; i++) + { + if (strlen(pt_show_info->psz_items_desc[i]) > max_size) + { + max_size = strlen(pt_show_info->psz_items_desc[i]); + } + } + + return max_size; +} + +/** + * @brief 获取文本信息 + * @param {char} *s 返回的文本 + * @param {menu_txt_t} *m_txt 文本内容 + * @return {*} + * @note + */ +void menu_txt_show(char *buf, const menu_txt_t *m_txt) +{ + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(m_txt != NULL __DBG_LINE); + sprintf(buf, "%s", m_txt->psz_desc[sg_t_menu_manage.language]); +} + +/** + * @brief 通过当前窗口编号进入菜单 + * + * @param[in] no 选项号 + */ +BOOL menu_enter_with_window_no(uint8_t no) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.p_menu_ctrl->items_num == 0) + { + return FALSE; + } + + for (uint8_t i = 0; i < sg_t_menu_manage.p_menu_ctrl->items_num; i++) + { + if (sg_t_menu_manage.p_menu_ctrl->p_menu_list[i].window_no == no) + { + sg_t_menu_manage.p_menu_ctrl->select_item = i; + menu_enter(NULL); + return TRUE; + } + else + { + if (sg_t_menu_manage.p_menu_ctrl->p_menu_list[i].window_no != 0 && + sg_t_menu_manage.p_menu_ctrl->p_menu_list[i].single_page != TRUE) + { + sg_t_menu_manage.p_menu_ctrl->select_item = i; + + menu_enter(NULL); + if (menu_enter_with_window_no(no) == FALSE) + { + menu_exit(FALSE); + } + else + { + return TRUE; + } + } + } + } + return FALSE; +} + +/** + * @brief 获取当前窗口号 + * + * @return uint16_t + */ +uint16_t menu_current_window_no(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL) + { + return 0; + } + + return sg_t_menu_manage.p_menu_ctrl->p_menu_list[sg_t_menu_manage.p_menu_ctrl->select_item].window_no; +} + +/** + * @brief 获取当前父窗口号 + * + * @return uint16_t + */ +uint16_t menu_current_parent_window_no(void) +{ + if (sg_t_menu_manage.p_menu_ctrl == NULL) + { + return 0; + } + return sg_t_menu_manage.p_menu_ctrl->parent_window_no; +} + +/** + * @brief 获取当前父窗口信息 + * + * @param[out] info + * @return BOOL + */ +BOOL menu_get_parent_window_info(menu_show_t *info) +{ + DBG_ASSERT(info != NULL __DBG_LINE); + int i; + menu_ctrl_t *p; + menu_list_t *p_menu_list; + if (sg_t_menu_manage.p_menu_ctrl != NULL && sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl != NULL) + { + p = sg_t_menu_manage.p_menu_ctrl->p_parent_menu_ctrl; + p_menu_list = p->p_menu_list; + info->items_num = p->items_num; + info->select_item = p->select_item; + info->show_base_item = p->show_base_item; + + info->psz_desc = p->psz_desc[sg_t_menu_manage.language]; + if (p_menu_list != NULL) + { + for (i = 0; i < info->items_num && i < MENU_MAX_NUM; i++) + { + info->psz_items_desc[i] = (char *)p_menu_list[i].psz_desc[sg_t_menu_manage.language]; + } + } + return TRUE; + } + else + { + return FALSE; + } +} + +/** + * @brief 获取当前窗口信息 + * + * @param[out] info + * @return BOOL + */ +BOOL menu_get_current_window_info(menu_show_t *info) +{ + DBG_ASSERT(info != NULL __DBG_LINE); + int i; + menu_list_t *p_menu_list; + if (sg_t_menu_manage.p_menu_ctrl != NULL) + { + p_menu_list = sg_t_menu_manage.p_menu_ctrl->p_menu_list; + info->items_num = sg_t_menu_manage.p_menu_ctrl->items_num; + info->select_item = sg_t_menu_manage.p_menu_ctrl->select_item; + info->show_base_item = sg_t_menu_manage.p_menu_ctrl->show_base_item; + + info->psz_desc = sg_t_menu_manage.p_menu_ctrl->psz_desc[sg_t_menu_manage.language]; + if (p_menu_list != NULL) + { + for (i = 0; i < info->items_num && i < MENU_MAX_NUM; i++) + { + info->psz_items_desc[i] = (char *)p_menu_list[i].psz_desc[sg_t_menu_manage.language]; + info->p_items_ex_data[i] = p_menu_list[i].p_extend_data; + } + } + + return TRUE; + } + else + { + return FALSE; + } +} + +/** + * @brief 菜单任务 + * + * @return 0,成功, 处于菜单模式下; -1,失败, 未处于菜单模式下 + */ +BOOL menu_task(void) +{ + int i; + menu_list_t *p_menu_list; + menu_show_t t_menu_show; + + if (sg_t_menu_manage.p_menu_ctrl == NULL || sg_t_menu_manage.is_enter_main_menu == 0) + { + return FALSE; + } + + if (sg_t_menu_manage.pfn_load_call_fun != NULL) + { + sg_t_menu_manage.pfn_load_call_fun(); + sg_t_menu_manage.pfn_load_call_fun = NULL; + } + + if (sg_t_menu_manage.p_menu_ctrl->p_menu_list != NULL) + { + p_menu_list = sg_t_menu_manage.p_menu_ctrl->p_menu_list; + t_menu_show.items_num = sg_t_menu_manage.p_menu_ctrl->items_num; + t_menu_show.select_item = sg_t_menu_manage.p_menu_ctrl->select_item; + t_menu_show.show_base_item = sg_t_menu_manage.p_menu_ctrl->show_base_item; + + t_menu_show.psz_desc = sg_t_menu_manage.p_menu_ctrl->psz_desc[sg_t_menu_manage.language]; + + for (i = 0; i < t_menu_show.items_num && i < MENU_MAX_NUM; i++) + { + t_menu_show.psz_items_desc[i] = (char *)p_menu_list[i].psz_desc[sg_t_menu_manage.language]; + t_menu_show.p_items_ex_data[i] = p_menu_list[i].p_extend_data; + } + + if (sg_t_menu_manage.p_menu_ctrl->pfn_show_menu_fun != NULL) + { + sg_t_menu_manage.p_menu_ctrl->pfn_show_menu_fun(&t_menu_show); + } + + sg_t_menu_manage.p_menu_ctrl->show_base_item = t_menu_show.show_base_item; + } + + if (sg_t_menu_manage.p_menu_ctrl->pfn_run_call_fun != NULL) + { + sg_t_menu_manage.p_menu_ctrl->pfn_run_call_fun(); + } + + return TRUE; +} diff --git a/User/system/lib/menu/menu.h b/User/system/lib/menu/menu.h new file mode 100644 index 0000000..e0b8e5f --- /dev/null +++ b/User/system/lib/menu/menu.h @@ -0,0 +1,274 @@ +#ifndef __MENU_H__ +#define __MENU_H__ + +#include "lib.h" + +/******************************************* 配置项 ********************************************************************/ + +/* 定义 _MENU_USE_MALLOC_ 则采用 MALLOC/FREE 的方式实现多级菜单, 否则通过数组的形式 */ +// #define _MENU_USE_MALLOC_ + +/* 定义 _MENU_USE_SHORTCUT_ 则启用快捷菜单选项进入功能 */ +#define _MENU_USE_SHORTCUT_ + +/* 多级菜单深度 */ +#define MENU_MAX_DEPTH 5 + +/* 菜单支持的最大选项数目 */ +#define MENU_MAX_NUM 40 + +/* 菜单支持的语种数目 */ +#define MENU_SUPPORT_LANGUAGE 2 + +/******************************************* 配置项 ********************************************************************/ + +/* exported types ----------------------------------------------------------------------------------------------------*/ + +typedef uint16_t menusize_t; + +typedef void (*menu_call_fun_f)(void); + +typedef struct +{ + menusize_t items_num; /*!< 当前菜单中选项的总数目 */ + + menusize_t select_item; /*!< 当前菜单中被选中的选项 */ + + menusize_t show_base_item; /*!< 当前菜单首个显示的选项 */ + + uint8_t page_no; /*!< 当前菜单的页码 */ + + char *psz_desc; /*!< 当前菜单的字符串描述 */ + + char *psz_items_desc[MENU_MAX_NUM]; /*!< 当前菜单中所有选项的字符串描述 */ + + void *p_items_ex_data[MENU_MAX_NUM]; /*!< 当前菜单中所有选项注册时的扩展数据 */ +} menu_show_t; + +typedef void (*showmenu_call_fun_f)(menu_show_t *pt_show_info); + +typedef struct +{ + const char *(psz_desc[MENU_SUPPORT_LANGUAGE]); +} menu_txt_t; + +/** + * @brief 菜单信息注册结构体 + * + */ +typedef struct +{ + uint16_t window_no; /*!< 当前菜单的窗口号 */ + + BOOL single_page; /*!< 当前菜单是否为单页,TRUE:页面 FALSE:有二级菜单 */ + + const char *(psz_desc[MENU_SUPPORT_LANGUAGE]); /*!< 当前选项的字符串描述(多语种) */ + + menu_call_fun_f pfn_enter_call_fun; /*!< 当前菜单选项进入时(从父菜单进入)需要执行一次的函数, 为null不执行 */ + + menu_call_fun_f pfn_exit_call_fun; /*!< 当前菜单选项进入后退出时(退出至父菜单)需要执行一次的函数, 为null不执行 */ + + menu_call_fun_f pfn_load_call_fun; /*!< 当前菜单选项每次加载时(从父菜单进入或子菜单退出)需要执行一次的函数, 为null不执行 */ + + menu_call_fun_f pfn_run_call_fun; /*!< 当前菜单选项的周期调度函数 */ + + void *p_extend_data; /*!< 当前选项的菜单显示效果函数扩展数据入参, 可自行设置该内容 赋值给p_items_ex_data*/ +} menu_list_t, menu_item_t; + +/** + * @brief 菜单信息注册结构体 + * + */ +typedef struct +{ + const char *(psz_desc[MENU_SUPPORT_LANGUAGE]); /*!< 当前选项的字符串描述(多语种) */ + + menu_call_fun_f pfn_enter_call_fun; /*!< 主前菜单进入时(进入菜单)需要执行一次的函数, 为null不执行 */ + + menu_call_fun_f pfn_exit_call_fun; /*!< 主前菜单进入后退出时(退出菜单)需要执行一次的函数, 为null不执行 */ + + menu_call_fun_f pfn_load_call_fun; /*!< 主菜单每次加载时需要执行一次的函数, 为null不执行 */ + + menu_call_fun_f pfn_run_call_fun; /*!< 主菜单周期调度函数 */ +} main_menu_cfg_t; + +/* exported constants ------------------------------------------------------------------------------------------------*/ +/* exported macro ----------------------------------------------------------------------------------------------------*/ + +#define COT_GET_MENU_NUM(x) (sizeof(x) / sizeof(menu_list_t)) + +/* exported functions ------------------------------------------------------------------------------------------------*/ + +/* 菜单初始化和反初始化 */ + +extern BOOL menu_init(const main_menu_cfg_t *p_main_menu); +extern BOOL menu_de_init(void); + +extern BOOL menu_unbind(void); + +extern BOOL menu_bind(uint16_t parent_window_no, const menu_list_t *p_menu_list, menusize_t menu_num, showmenu_call_fun_f pfn_show_menu_fun); + +/* 菜单功能设置 */ + +extern BOOL menu_select_language(uint8_t language_idx); + +/* 菜单选项显示时需要使用的功能扩展函数 */ + +extern BOOL menu_limit_show_list_num(menu_show_t *pt_menu_show, menusize_t *p_show_num); +extern BOOL menu_query_parent_menu(menu_show_t *pt_menu_show, uint8_t level); + +/* 菜单操作 */ + +/** + * @brief 进入主菜单 + * @return 进入成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_main_enter(void); + +/** + * @brief 退出主菜单 + * @return 退出成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_main_exit(void); + +/** + * @brief 重置菜单 + * @return 重置成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_reset(void); + +/** + * @brief 进入菜单 + * @param p 指向菜单的指针 + * @return 进入成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_enter(void *p); + +/** + * @brief 退出菜单 + * @param is_reset 是否重置菜单 + * @return 退出成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_exit(BOOL is_reset); + +/** + * @brief 选择上一个菜单项 + * @param is_allow_roll 是否允许循环选择 + * @return 选择成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_select_previous(BOOL is_allow_roll); + +/** + * @brief 选择上一个菜单页 + * @param {uint8_t} show_num 每页菜单项数目 + * @return {*} + * @note + */ +extern BOOL menu_select_previous_page(uint8_t show_num); + +/** + * @brief 选择下一个菜单项 + * @param is_allow_roll 是否允许循环选择 + * @return 选择成功返回TRUE,否则返回FALSE + */ +extern BOOL menu_select_next(BOOL is_allow_roll); + +/** + * @brief 选择下一个菜单页 + * @param {uint8_t} show_num 每页菜单项数目 + * @return {*} + * @note + */ +extern BOOL menu_select_next_page(uint8_t show_num); + +/** + * @brief 跳转到指定菜单页 + * @param {uint8_t} index 菜单项 + * @return {*} + * @note + */ +extern BOOL menu_jump_item(uint8_t index); +/** + * @brief 进入菜单快捷方式 + * + * 该函数用于进入菜单的快捷方式。 + * + * @param is_absolute 是否为绝对路径 + * @param deep 菜单路径的深度 + * @param ... 菜单路径的参数列表 + * @return BOOL 进入菜单是否成功 + */ +extern BOOL menu_shortcut_enter(BOOL is_absolute, uint8_t deep, ...); + +/** + * @brief 获取菜单描述的最大长度 + * + * 该函数用于获取菜单描述的最大长度。 + * + * @param pt_show_info 菜单显示信息的指针 + * @return uint8_t 菜单描述的最大长度 + */ +extern uint8_t menu_psz_desc_max_size(menu_show_t *pt_show_info); + +/** + * @brief 显示菜单文本 + * + * 该函数用于显示菜单的文本。 + * + * @param buf 存储菜单文本的缓冲区 + * @param m_txt 菜单文本的指针 + */ +extern void menu_txt_show(char *buf, const menu_txt_t *m_txt); + +/** + * @brief 进入指定窗口的菜单 + * + * 该函数用于进入指定窗口的菜单。 + * + * @param no 窗口编号 + * @return BOOL 进入菜单是否成功 + */ +extern BOOL menu_enter_with_window_no(uint8_t no); + +/** + * @brief 获取当前父窗口的编号 + * + * 该函数用于获取当前父窗口的编号。 + * + * @return uint16_t 当前父窗口的编号 + */ +extern uint16_t menu_current_parent_window_no(void); + +/** + * @brief 获取当前窗口的编号 + * + * 该函数用于获取当前窗口的编号。 + * + * @return uint16_t 当前窗口的编号 + */ +extern uint16_t menu_current_window_no(void); + +/** + * @brief 获取当前父窗口的信息 + * + * 该函数用于获取当前父窗口的信息。 + * + * @param info 存储当前窗口信息的指针 + * @return BOOL 获取当前窗口信息是否成功 + */ +extern BOOL menu_get_parent_window_info(menu_show_t *info); + +/** + * @brief 获取当前窗口的信息 + * + * 该函数用于获取当前窗口的信息。 + * + * @param info 存储当前窗口信息的指针 + * @return BOOL 获取当前窗口信息是否成功 + */ +extern BOOL menu_get_current_window_info(menu_show_t *info); +/* 菜单轮询处理任务 */ + +extern BOOL menu_task(void); + +#endif // __MENU_H__ diff --git a/User/system/lib/readme.md b/User/system/lib/readme.md new file mode 100644 index 0000000..94587c6 --- /dev/null +++ b/User/system/lib/readme.md @@ -0,0 +1,169 @@ +[TOC] + + +### clist 简单链表 +#### 说明 +- clist是list的简化版,下面给出常用的接口说明 +- 接口说明: +```code + +void clist_init(clist_node_t **ppFirst); ///< 初始化 ,构造一条空的链表 + +void clist_print(clist_node_t *First); ///< 打印链表 + +uint32_t clist_node_count(clist_node_t *First); ///< 获取链表节点数 + +void clist_push_back(clist_node_t **ppFirst, cnode data); ///< 尾部插入 + +void clist_push_front(clist_node_t **ppFirst, cnode data); ///< 头部插入 + +void clist_pop_back(clist_node_t **ppFirst); ///< 尾部删除 + +void clist_pop_front(clist_node_t **ppFirst); ///< 头部删除 + +void clist_insert_for_node(clist_node_t **ppFirst, clist_node_t *pPos, cnode data); ///< 给定结点插入,插入到结点前 + +int32_t clist_insert(clist_node_t **ppFirst, int32_t Pos, cnode data); ///< 按位置插入 + +void clist_erase_for_node(clist_node_t **ppFirst, clist_node_t *pPos); ///< 给定结点删除 + +void clist_remove(clist_node_t **ppFirst, cnode data); ///< 按值删除,只删遇到的第一个 + +void clist_remove_all(clist_node_t **ppFirst, cnode data); ///< 按值删除,删除所有的 + +void clist_destroy(clist_node_t **ppFirst); ///< 销毁 ,需要销毁每一个节点 + +clist_node_t *clist_find(clist_node_t *pFirst, cnode data); ///< 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL + +``` +#### DEMO +- 详细使用请见simple_clist.c +- examples目录内执行```make clist && make run``` + + +### cmd 命令解析器 +#### 说明 +- cmd是一个非常简单好用的命令解析器。 +> 简单来说,我希望我的开发板,可以通过命令执行一些处理,比如说我用串口发一个命令A,开发板就执行A的一些处理,或者,在调试某些AT模组的时候,当我收到模组返回的一些指令后,自动执行一些处理。 +- 接口说明: +```code +REGISTER_CMD(cmd, handler, desc) ///< 注册命令 + +void cmd_init(void); ///< 初始化命令 + +void cmd_parsing(char *str); ///< 命令解析 +``` + +#### DEMO +- 详细使用请见simple_cmd.c +- 该模块不提供GCC编译,只提供KEIL编译和IAR编译 + + + +### data_analysis 数据分析器 +#### 说明 +- data_analysis 是用来处理串口或者其他方式获得的数据,具有识别数据帧起始和结束的功能,只需要定义好识别符以及长度,该模块会将完整的数据帧处理好 +- 接口说明: +```code +typedef void (*data_interupt_cb_t)(uint8_t id, uint8_t ch); ///< 中断回调函数,数据从这里写入 + +extern uint8_t data_read(uint8_t id, void *buffer, uint16_t len); ///< 读取数据 + +extern void data_write(uint8_t id, uint8_t *const string, uint16_t len); ///< TODO 写入数据 + +extern void lock_data(uint8_t data_id); ///< 锁定数据,防止中断写入数据 + +extern void unlock_data(uint8_t data_id); ///< 解锁数据 + +extern data_interupt_cb_t data_fsm_init(uint8_t data_id); ///< 初始化数据状态机 + +extern bool data_reg(uint8_t id, data_reg_t reg); ///< 注册数据 + +extern void data_unreg(uint8_t id); ///< 注销数据 +``` +#### DEMO +- 详细使用请见simple_data_analysis.c +- examples目录内执行```make data_analysis && make run``` + + +### sqqueue(队列) +#### 说明 +- sqqueue 是一个成员变量固定长度的队列 +- 使用的时候先创建一个"sqqueue_ctrl_t"类型的队列对象,调用初始化函数后就可以使用对象中的功能了 + +#### DEMO +- 详细使用请见simple_sqqueue.c +- examples目录内执行```make sqqueue && make run``` + + +### aes(加密) +百度百科 + +#### 说明 + +- 对不同长度的密钥,AES采用不同的加密轮次: + +| 128位 | 192位 | 256位 | +| ------------- | -----------: | :--------: | +| 10 | 12 | 14 | + +- 密钥扩展:简单说就是将原来的密钥扩展到足够用的长度: + + - 128位密钥: 扩展到 11x4x4 + - 192位密钥: 扩展到 13x4x4 + - 256位密钥: 扩展到 15x4x4 + +- AES加密过程是在一个4×4的字节矩阵上运作,所以一次加解密传入的最小块单位为16字节 + + +#### 代码流程 + +```flow +st=>start: 加密开始 +e=>end: 加密结束 +op1=>operation: 加密的数据[简称密文]、密钥(16个字节)、输入数据块和输出数据块 +op2=>operation: 调用接口"aes_set_key",完成密钥的扩展 +op3=>operation: 调用接口"aes_encrypt",完成数据的加密 +st->op1->op2->op3->e +``` +```flow +st=>start: 解密开始 +e=>end: 解密结束 +op1=>operation: 解密的数据[简称密文]、密钥(16个字节)、输入数据块和输出数据块 +op2=>operation: 调用接口"aes_set_key",完成密钥的扩展 +op3=>operation: 调用接口"aes_encrypt",完成数据的解密 +st->op1->op2->op3->e +``` +#### DEMO +- demo中会使用aes中的接口完成简单的加密和解密数据 +- **将aes.h中的AES_ENC_PREKEYED和AES_DEC_PREKEYED置1** +- 详细使用请见simple_aes.c +- examples目录内执行```make aes && make run``` + +### cmac(类CRC) +#### 说明 + +- cmac是一种数据传输检错功能,以保证数据传输的正确性和完整性 +- cmac基本原理是:通过对需要校验的数据奇偶校验、位移、AES加密获取一段16个字节大小的数组 +- **lorawan使用cmac模块给MAC数据和加密数据做校验的优点:效率很高、安全性很高(在校验数据之前调用"AES_CMAC_Update"二次,增加了异变因子)** +- **困惑:为什么不使用CRC32** +- demo中只对需要校验的数据使用"AES_CMAC_Update"一次,无法确定lorawan增加一次"AES_CMAC_Update"的效果如何 + + +#### 代码流程 + +```flow +st=>start: 校验开始 +e=>end: 校验结束 +op1=>operation: 需要校验的数据、密钥、密钥扩展表 +op2=>operation: 调用接口"AES_CMAC_Init",完成密钥扩展表的初始化 +op3=>operation: 调用接口"AES_CMAC_SetKey",完成密钥扩展表数据 +op4=>operation: 调用接口"AES_CMAC_Update",完成数据的奇偶校验 +op5=>operation: 调用接口"AES_CMAC_Final",生成16个字节的校验表 +op6=>operation: 取表4个字节作为校验码 +st->op1->op2->op3->op4->op5->op6->e +``` + +#### DEMO +- 详细使用请见simple_cmac.c +- examples目录内执行```make cmac && make run``` diff --git a/User/system/lib/src/aes.c b/User/system/lib/src/aes.c new file mode 100644 index 0000000..bf5fbdf --- /dev/null +++ b/User/system/lib/src/aes.c @@ -0,0 +1,981 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue 09/09/2006 + + This is an AES implementation that uses only 8-bit byte operations on the + cipher state (there are options to use 32-bit types if available). + + The combination of mix columns and byte substitution used here is based on + that developed by Karl Malbrain. His contribution is acknowledged. + */ + +/* define if you have a fast memcpy function on your system */ +#if 0 +#define HAVE_MEMCPY +#include +#if defined(_MSC_VER) +#include +#pragma intrinsic(memcpy) +#endif +#endif + +#include +#include + +/* define if you have fast 32-bit types on your system */ +#if (__CORTEX_M != 0) // if Cortex is different from M0/M0+ +#define HAVE_UINT_32T +#endif + +/* define if you don't want any tables */ +#if 1 +#define USE_TABLES +#endif + +/* On Intel Core 2 duo VERSION_1 is faster */ + +/* alternative versions (test for performance on your system) */ +#if 1 +#define VERSION_1 +#endif + +#include "aes.h" + +// #if defined( HAVE_UINT_32T ) +// typedef unsigned long uint32_t; +// #endif + +/* functions for finite field multiplication in the AES Galois field */ + +#define WPOLY 0x011b +#define BPOLY 0x1b +#define DPOLY 0x008d + +#define f1(x) (x) +#define f2(x) ((x << 1) ^ (((x >> 7) & 1) * WPOLY)) +#define f4(x) ((x << 2) ^ (((x >> 6) & 1) * WPOLY) ^ (((x >> 6) & 2) * WPOLY)) +#define f8(x) ((x << 3) ^ (((x >> 5) & 1) * WPOLY) ^ (((x >> 5) & 2) * WPOLY) ^ (((x >> 5) & 4) * WPOLY)) +#define d2(x) (((x) >> 1) ^ ((x)&1 ? DPOLY : 0)) + +#define f3(x) (f2(x) ^ x) +#define f9(x) (f8(x) ^ x) +#define fb(x) (f8(x) ^ f2(x) ^ x) +#define fd(x) (f8(x) ^ f4(x) ^ x) +#define fe(x) (f8(x) ^ f4(x) ^ f2(x)) + +#if defined(USE_TABLES) + +#define sb_data(w) \ + { /* S Box data values */ \ + w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5), \ + w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76), \ + w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0), \ + w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0), \ + w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc), \ + w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15), \ + w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a), \ + w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75), \ + w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0), \ + w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84), \ + w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b), \ + w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf), \ + w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85), \ + w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8), \ + w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5), \ + w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2), \ + w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17), \ + w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73), \ + w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88), \ + w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb), \ + w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c), \ + w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79), \ + w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9), \ + w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08), \ + w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6), \ + w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a), \ + w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e), \ + w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e), \ + w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94), \ + w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf), \ + w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68), \ + w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) \ + } + +#define isb_data(w) \ + { /* inverse S Box data values */ \ + w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38), \ + w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb), \ + w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87), \ + w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb), \ + w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d), \ + w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e), \ + w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2), \ + w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25), \ + w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16), \ + w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92), \ + w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda), \ + w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84), \ + w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a), \ + w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06), \ + w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02), \ + w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b), \ + w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea), \ + w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73), \ + w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85), \ + w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e), \ + w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89), \ + w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b), \ + w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20), \ + w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4), \ + w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31), \ + w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f), \ + w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d), \ + w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef), \ + w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0), \ + w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61), \ + w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26), \ + w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) \ + } + +#define mm_data(w) \ + { /* basic data for forming finite field tables */ \ + w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07), \ + w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f), \ + w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17), \ + w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f), \ + w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27), \ + w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f), \ + w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37), \ + w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f), \ + w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47), \ + w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f), \ + w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57), \ + w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f), \ + w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67), \ + w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f), \ + w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77), \ + w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f), \ + w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87), \ + w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f), \ + w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97), \ + w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f), \ + w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7), \ + w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf), \ + w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7), \ + w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf), \ + w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7), \ + w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf), \ + w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7), \ + w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf), \ + w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7), \ + w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef), \ + w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7), \ + w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) \ + } + +static const uint8_t sbox[256] = sb_data(f1); + +#if defined(AES_DEC_PREKEYED) +static const uint8_t isbox[256] = isb_data(f1); +#endif + +static const uint8_t gfm2_sbox[256] = sb_data(f2); +static const uint8_t gfm3_sbox[256] = sb_data(f3); + +#if defined(AES_DEC_PREKEYED) +static const uint8_t gfmul_9[256] = mm_data(f9); +static const uint8_t gfmul_b[256] = mm_data(fb); +static const uint8_t gfmul_d[256] = mm_data(fd); +static const uint8_t gfmul_e[256] = mm_data(fe); +#endif + +#define s_box(x) sbox[(x)] +#if defined(AES_DEC_PREKEYED) +#define is_box(x) isbox[(x)] +#endif +#define gfm2_sb(x) gfm2_sbox[(x)] +#define gfm3_sb(x) gfm3_sbox[(x)] +#if defined(AES_DEC_PREKEYED) +#define gfm_9(x) gfmul_9[(x)] +#define gfm_b(x) gfmul_b[(x)] +#define gfm_d(x) gfmul_d[(x)] +#define gfm_e(x) gfmul_e[(x)] +#endif +#else + +/* this is the high bit of x right shifted by 1 */ +/* position. Since the starting polynomial has */ +/* 9 bits (0x11b), this right shift keeps the */ +/* values of all top bits within a byte */ + +static uint8_t hibit(const uint8_t x) +{ + uint8_t r = (uint8_t)((x >> 1) | (x >> 2)); + + r |= (r >> 2); + r |= (r >> 4); + return (r + 1) >> 1; +} + +/* return the inverse of the finite field element x */ + +static uint8_t gf_inv(const uint8_t x) +{ + uint8_t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; + + if (x < 2) + return x; + + for (;;) + { + if (n1) + while (n2 >= n1) /* divide polynomial p2 by p1 */ + { + n2 /= n1; /* shift smaller polynomial left */ + p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */ + v2 ^= (v1 * n2); /* shift accumulated value and */ + n2 = hibit(p2); /* add into result */ + } + else + return v1; + + if (n2) /* repeat with values swapped */ + while (n1 >= n2) + { + n1 /= n2; + p1 ^= p2 * n1; + v1 ^= v2 * n1; + n1 = hibit(p1); + } + else + return v2; + } +} + +/* The forward and inverse affine transformations used in the S-box */ +uint8_t fwd_affine(const uint8_t x) +{ +#if defined(HAVE_UINT_32T) + uint32_t w = x; + w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4); + return 0x63 ^ ((w ^ (w >> 8)) & 0xff); +#else + return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4) ^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4); +#endif +} + +uint8_t inv_affine(const uint8_t x) +{ +#if defined(HAVE_UINT_32T) + uint32_t w = x; + w = (w << 1) ^ (w << 3) ^ (w << 6); + return 0x05 ^ ((w ^ (w >> 8)) & 0xff); +#else + return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6) ^ (x >> 7) ^ (x >> 5) ^ (x >> 2); +#endif +} + +#define s_box(x) fwd_affine(gf_inv(x)) +#define is_box(x) gf_inv(inv_affine(x)) +#define gfm2_sb(x) f2(s_box(x)) +#define gfm3_sb(x) f3(s_box(x)) +#define gfm_9(x) f9(x) +#define gfm_b(x) fb(x) +#define gfm_d(x) fd(x) +#define gfm_e(x) fe(x) + +#endif + +#if defined(HAVE_MEMCPY) +#define block_copy_nn(d, s, l) memcpy(d, s, l) +#define block_copy(d, s) memcpy(d, s, N_BLOCK) +#else +#define block_copy_nn(d, s, l) copy_block_nn(d, s, l) +#define block_copy(d, s) copy_block(d, s) +#endif + +static void copy_block(void *d, const void *s) +{ +#if defined(HAVE_UINT_32T) + ((uint32_t *)d)[0] = ((uint32_t *)s)[0]; + ((uint32_t *)d)[1] = ((uint32_t *)s)[1]; + ((uint32_t *)d)[2] = ((uint32_t *)s)[2]; + ((uint32_t *)d)[3] = ((uint32_t *)s)[3]; +#else + ((uint8_t *)d)[0] = ((uint8_t *)s)[0]; + ((uint8_t *)d)[1] = ((uint8_t *)s)[1]; + ((uint8_t *)d)[2] = ((uint8_t *)s)[2]; + ((uint8_t *)d)[3] = ((uint8_t *)s)[3]; + ((uint8_t *)d)[4] = ((uint8_t *)s)[4]; + ((uint8_t *)d)[5] = ((uint8_t *)s)[5]; + ((uint8_t *)d)[6] = ((uint8_t *)s)[6]; + ((uint8_t *)d)[7] = ((uint8_t *)s)[7]; + ((uint8_t *)d)[8] = ((uint8_t *)s)[8]; + ((uint8_t *)d)[9] = ((uint8_t *)s)[9]; + ((uint8_t *)d)[10] = ((uint8_t *)s)[10]; + ((uint8_t *)d)[11] = ((uint8_t *)s)[11]; + ((uint8_t *)d)[12] = ((uint8_t *)s)[12]; + ((uint8_t *)d)[13] = ((uint8_t *)s)[13]; + ((uint8_t *)d)[14] = ((uint8_t *)s)[14]; + ((uint8_t *)d)[15] = ((uint8_t *)s)[15]; +#endif +} + +static void copy_block_nn(uint8_t *d, const uint8_t *s, uint8_t nn) +{ + while (nn--) + //*((uint8_t*)d)++ = *((uint8_t*)s)++; + *d++ = *s++; +} + +static void xor_block(void *d, const void *s) +{ +#if defined(HAVE_UINT_32T) + ((uint32_t *)d)[0] ^= ((uint32_t *)s)[0]; + ((uint32_t *)d)[1] ^= ((uint32_t *)s)[1]; + ((uint32_t *)d)[2] ^= ((uint32_t *)s)[2]; + ((uint32_t *)d)[3] ^= ((uint32_t *)s)[3]; +#else + ((uint8_t *)d)[0] ^= ((uint8_t *)s)[0]; + ((uint8_t *)d)[1] ^= ((uint8_t *)s)[1]; + ((uint8_t *)d)[2] ^= ((uint8_t *)s)[2]; + ((uint8_t *)d)[3] ^= ((uint8_t *)s)[3]; + ((uint8_t *)d)[4] ^= ((uint8_t *)s)[4]; + ((uint8_t *)d)[5] ^= ((uint8_t *)s)[5]; + ((uint8_t *)d)[6] ^= ((uint8_t *)s)[6]; + ((uint8_t *)d)[7] ^= ((uint8_t *)s)[7]; + ((uint8_t *)d)[8] ^= ((uint8_t *)s)[8]; + ((uint8_t *)d)[9] ^= ((uint8_t *)s)[9]; + ((uint8_t *)d)[10] ^= ((uint8_t *)s)[10]; + ((uint8_t *)d)[11] ^= ((uint8_t *)s)[11]; + ((uint8_t *)d)[12] ^= ((uint8_t *)s)[12]; + ((uint8_t *)d)[13] ^= ((uint8_t *)s)[13]; + ((uint8_t *)d)[14] ^= ((uint8_t *)s)[14]; + ((uint8_t *)d)[15] ^= ((uint8_t *)s)[15]; +#endif +} + +static void copy_and_key(void *d, const void *s, const void *k) +{ +#if defined(HAVE_UINT_32T) + ((uint32_t *)d)[0] = ((uint32_t *)s)[0] ^ ((uint32_t *)k)[0]; + ((uint32_t *)d)[1] = ((uint32_t *)s)[1] ^ ((uint32_t *)k)[1]; + ((uint32_t *)d)[2] = ((uint32_t *)s)[2] ^ ((uint32_t *)k)[2]; + ((uint32_t *)d)[3] = ((uint32_t *)s)[3] ^ ((uint32_t *)k)[3]; +#elif 1 + ((uint8_t *)d)[0] = ((uint8_t *)s)[0] ^ ((uint8_t *)k)[0]; + ((uint8_t *)d)[1] = ((uint8_t *)s)[1] ^ ((uint8_t *)k)[1]; + ((uint8_t *)d)[2] = ((uint8_t *)s)[2] ^ ((uint8_t *)k)[2]; + ((uint8_t *)d)[3] = ((uint8_t *)s)[3] ^ ((uint8_t *)k)[3]; + ((uint8_t *)d)[4] = ((uint8_t *)s)[4] ^ ((uint8_t *)k)[4]; + ((uint8_t *)d)[5] = ((uint8_t *)s)[5] ^ ((uint8_t *)k)[5]; + ((uint8_t *)d)[6] = ((uint8_t *)s)[6] ^ ((uint8_t *)k)[6]; + ((uint8_t *)d)[7] = ((uint8_t *)s)[7] ^ ((uint8_t *)k)[7]; + ((uint8_t *)d)[8] = ((uint8_t *)s)[8] ^ ((uint8_t *)k)[8]; + ((uint8_t *)d)[9] = ((uint8_t *)s)[9] ^ ((uint8_t *)k)[9]; + ((uint8_t *)d)[10] = ((uint8_t *)s)[10] ^ ((uint8_t *)k)[10]; + ((uint8_t *)d)[11] = ((uint8_t *)s)[11] ^ ((uint8_t *)k)[11]; + ((uint8_t *)d)[12] = ((uint8_t *)s)[12] ^ ((uint8_t *)k)[12]; + ((uint8_t *)d)[13] = ((uint8_t *)s)[13] ^ ((uint8_t *)k)[13]; + ((uint8_t *)d)[14] = ((uint8_t *)s)[14] ^ ((uint8_t *)k)[14]; + ((uint8_t *)d)[15] = ((uint8_t *)s)[15] ^ ((uint8_t *)k)[15]; +#else + block_copy(d, s); + xor_block(d, k); +#endif +} + +static void add_round_key(uint8_t d[N_BLOCK], const uint8_t k[N_BLOCK]) +{ + xor_block(d, k); +} + +static void shift_sub_rows(uint8_t st[N_BLOCK]) +{ + uint8_t tt; + + st[0] = s_box(st[0]); + st[4] = s_box(st[4]); + st[8] = s_box(st[8]); + st[12] = s_box(st[12]); + + tt = st[1]; + st[1] = s_box(st[5]); + st[5] = s_box(st[9]); + st[9] = s_box(st[13]); + st[13] = s_box(tt); + + tt = st[2]; + st[2] = s_box(st[10]); + st[10] = s_box(tt); + tt = st[6]; + st[6] = s_box(st[14]); + st[14] = s_box(tt); + + tt = st[15]; + st[15] = s_box(st[11]); + st[11] = s_box(st[7]); + st[7] = s_box(st[3]); + st[3] = s_box(tt); +} + +#if defined(AES_DEC_PREKEYED) + +static void inv_shift_sub_rows(uint8_t st[N_BLOCK]) +{ + uint8_t tt; + + st[0] = is_box(st[0]); + st[4] = is_box(st[4]); + st[8] = is_box(st[8]); + st[12] = is_box(st[12]); + + tt = st[13]; + st[13] = is_box(st[9]); + st[9] = is_box(st[5]); + st[5] = is_box(st[1]); + st[1] = is_box(tt); + + tt = st[2]; + st[2] = is_box(st[10]); + st[10] = is_box(tt); + tt = st[6]; + st[6] = is_box(st[14]); + st[14] = is_box(tt); + + tt = st[3]; + st[3] = is_box(st[7]); + st[7] = is_box(st[11]); + st[11] = is_box(st[15]); + st[15] = is_box(tt); +} + +#endif + +#if defined(VERSION_1) +static void mix_sub_columns(uint8_t dt[N_BLOCK]) +{ + uint8_t st[N_BLOCK]; + block_copy(st, dt); +#else +static void mix_sub_columns(uint8_t dt[N_BLOCK], uint8_t st[N_BLOCK]) +{ +#endif + dt[0] = gfm2_sb(st[0]) ^ gfm3_sb(st[5]) ^ s_box(st[10]) ^ s_box(st[15]); + dt[1] = s_box(st[0]) ^ gfm2_sb(st[5]) ^ gfm3_sb(st[10]) ^ s_box(st[15]); + dt[2] = s_box(st[0]) ^ s_box(st[5]) ^ gfm2_sb(st[10]) ^ gfm3_sb(st[15]); + dt[3] = gfm3_sb(st[0]) ^ s_box(st[5]) ^ s_box(st[10]) ^ gfm2_sb(st[15]); + + dt[4] = gfm2_sb(st[4]) ^ gfm3_sb(st[9]) ^ s_box(st[14]) ^ s_box(st[3]); + dt[5] = s_box(st[4]) ^ gfm2_sb(st[9]) ^ gfm3_sb(st[14]) ^ s_box(st[3]); + dt[6] = s_box(st[4]) ^ s_box(st[9]) ^ gfm2_sb(st[14]) ^ gfm3_sb(st[3]); + dt[7] = gfm3_sb(st[4]) ^ s_box(st[9]) ^ s_box(st[14]) ^ gfm2_sb(st[3]); + + dt[8] = gfm2_sb(st[8]) ^ gfm3_sb(st[13]) ^ s_box(st[2]) ^ s_box(st[7]); + dt[9] = s_box(st[8]) ^ gfm2_sb(st[13]) ^ gfm3_sb(st[2]) ^ s_box(st[7]); + dt[10] = s_box(st[8]) ^ s_box(st[13]) ^ gfm2_sb(st[2]) ^ gfm3_sb(st[7]); + dt[11] = gfm3_sb(st[8]) ^ s_box(st[13]) ^ s_box(st[2]) ^ gfm2_sb(st[7]); + + dt[12] = gfm2_sb(st[12]) ^ gfm3_sb(st[1]) ^ s_box(st[6]) ^ s_box(st[11]); + dt[13] = s_box(st[12]) ^ gfm2_sb(st[1]) ^ gfm3_sb(st[6]) ^ s_box(st[11]); + dt[14] = s_box(st[12]) ^ s_box(st[1]) ^ gfm2_sb(st[6]) ^ gfm3_sb(st[11]); + dt[15] = gfm3_sb(st[12]) ^ s_box(st[1]) ^ s_box(st[6]) ^ gfm2_sb(st[11]); +} + +#if defined(AES_DEC_PREKEYED) + +#if defined(VERSION_1) +static void inv_mix_sub_columns(uint8_t dt[N_BLOCK]) +{ + uint8_t st[N_BLOCK]; + block_copy(st, dt); +#else +static void inv_mix_sub_columns(uint8_t dt[N_BLOCK], uint8_t st[N_BLOCK]) +{ +#endif + dt[0] = is_box(gfm_e(st[0]) ^ gfm_b(st[1]) ^ gfm_d(st[2]) ^ gfm_9(st[3])); + dt[5] = is_box(gfm_9(st[0]) ^ gfm_e(st[1]) ^ gfm_b(st[2]) ^ gfm_d(st[3])); + dt[10] = is_box(gfm_d(st[0]) ^ gfm_9(st[1]) ^ gfm_e(st[2]) ^ gfm_b(st[3])); + dt[15] = is_box(gfm_b(st[0]) ^ gfm_d(st[1]) ^ gfm_9(st[2]) ^ gfm_e(st[3])); + + dt[4] = is_box(gfm_e(st[4]) ^ gfm_b(st[5]) ^ gfm_d(st[6]) ^ gfm_9(st[7])); + dt[9] = is_box(gfm_9(st[4]) ^ gfm_e(st[5]) ^ gfm_b(st[6]) ^ gfm_d(st[7])); + dt[14] = is_box(gfm_d(st[4]) ^ gfm_9(st[5]) ^ gfm_e(st[6]) ^ gfm_b(st[7])); + dt[3] = is_box(gfm_b(st[4]) ^ gfm_d(st[5]) ^ gfm_9(st[6]) ^ gfm_e(st[7])); + + dt[8] = is_box(gfm_e(st[8]) ^ gfm_b(st[9]) ^ gfm_d(st[10]) ^ gfm_9(st[11])); + dt[13] = is_box(gfm_9(st[8]) ^ gfm_e(st[9]) ^ gfm_b(st[10]) ^ gfm_d(st[11])); + dt[2] = is_box(gfm_d(st[8]) ^ gfm_9(st[9]) ^ gfm_e(st[10]) ^ gfm_b(st[11])); + dt[7] = is_box(gfm_b(st[8]) ^ gfm_d(st[9]) ^ gfm_9(st[10]) ^ gfm_e(st[11])); + + dt[12] = is_box(gfm_e(st[12]) ^ gfm_b(st[13]) ^ gfm_d(st[14]) ^ gfm_9(st[15])); + dt[1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15])); + dt[6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15])); + dt[11] = is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15])); +} + +#endif + +#if defined(AES_ENC_PREKEYED) || defined(AES_DEC_PREKEYED) + +/* Set the cipher key for the pre-keyed version */ + +return_type aes_set_key(const uint8_t key[], length_type keylen, aes_context ctx[1]) +{ + uint8_t cc, rc, hi; + + switch (keylen) + { + case 16: + case 24: + case 32: + break; + default: + ctx->rnd = 0; + return (uint8_t)-1; + } + block_copy_nn(ctx->ksch, key, keylen); + hi = (keylen + 28) << 2; + ctx->rnd = (hi >> 4) - 1; + for (cc = keylen, rc = 1; cc < hi; cc += 4) + { + uint8_t tt, t0, t1, t2, t3; + + t0 = ctx->ksch[cc - 4]; + t1 = ctx->ksch[cc - 3]; + t2 = ctx->ksch[cc - 2]; + t3 = ctx->ksch[cc - 1]; + if (cc % keylen == 0) + { + tt = t0; + t0 = s_box(t1) ^ rc; + t1 = s_box(t2); + t2 = s_box(t3); + t3 = s_box(tt); + rc = f2(rc); + } + else if (keylen > 24 && cc % keylen == 16) + { + t0 = s_box(t0); + t1 = s_box(t1); + t2 = s_box(t2); + t3 = s_box(t3); + } + tt = cc - keylen; + ctx->ksch[cc + 0] = ctx->ksch[tt + 0] ^ t0; + ctx->ksch[cc + 1] = ctx->ksch[tt + 1] ^ t1; + ctx->ksch[cc + 2] = ctx->ksch[tt + 2] ^ t2; + ctx->ksch[cc + 3] = ctx->ksch[tt + 3] ^ t3; + } + return 0; +} + +#endif + +#if defined(AES_ENC_PREKEYED) + +/* Encrypt a single block of 16 bytes */ + +return_type aes_encrypt(const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], const aes_context ctx[1]) +{ + if (ctx->rnd) + { + uint8_t s1[N_BLOCK], r; + copy_and_key(s1, in, ctx->ksch); + + for (r = 1; r < ctx->rnd; ++r) +#if defined(VERSION_1) + { + mix_sub_columns(s1); + add_round_key(s1, ctx->ksch + r * N_BLOCK); + } +#else + { + uint8_t s2[N_BLOCK]; + mix_sub_columns(s2, s1); + copy_and_key(s1, s2, ctx->ksch + r * N_BLOCK); + } +#endif + shift_sub_rows(s1); + copy_and_key(out, s1, ctx->ksch + r * N_BLOCK); + } + else + return (uint8_t)-1; + return 0; +} + +/* CBC encrypt a number of blocks (input and return an IV) */ + +return_type aes_cbc_encrypt(const uint8_t *in, uint8_t *out, + int32_t n_block, uint8_t iv[N_BLOCK], const aes_context ctx[1]) +{ + + while (n_block--) + { + xor_block(iv, in); + if (aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + // memcpy(out, iv, N_BLOCK); + block_copy(out, iv); + in += N_BLOCK; + out += N_BLOCK; + } + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_DEC_PREKEYED) + +/* Decrypt a single block of 16 bytes */ + +return_type aes_decrypt(const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], const aes_context ctx[1]) +{ + if (ctx->rnd) + { + uint8_t s1[N_BLOCK], r; + copy_and_key(s1, in, ctx->ksch + ctx->rnd * N_BLOCK); + inv_shift_sub_rows(s1); + + for (r = ctx->rnd; --r;) +#if defined(VERSION_1) + { + add_round_key(s1, ctx->ksch + r * N_BLOCK); + inv_mix_sub_columns(s1); + } +#else + { + uint8_t s2[N_BLOCK]; + copy_and_key(s2, s1, ctx->ksch + r * N_BLOCK); + inv_mix_sub_columns(s1, s2); + } +#endif + copy_and_key(out, s1, ctx->ksch); + return 0; + } + else + return 1; +} + +/* CBC decrypt a number of blocks (input and return an IV) */ + +return_type aes_cbc_decrypt(const uint8_t *in, uint8_t *out, + int32_t n_block, uint8_t iv[N_BLOCK], const aes_context ctx[1]) +{ + while (n_block--) + { + uint8_t tmp[N_BLOCK]; + + // memcpy(tmp, in, N_BLOCK); + block_copy(tmp, in); + if (aes_decrypt(in, out, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + xor_block(out, iv); + // memcpy(iv, tmp, N_BLOCK); + block_copy(iv, tmp); + in += N_BLOCK; + out += N_BLOCK; + } + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_ENC_128_OTFK) + +/* The 'on the fly' encryption key update for for 128 bit keys */ + +static void update_encrypt_key_128(uint8_t k[N_BLOCK], uint8_t *rc) +{ + uint8_t cc; + + k[0] ^= s_box(k[13]) ^ *rc; + k[1] ^= s_box(k[14]); + k[2] ^= s_box(k[15]); + k[3] ^= s_box(k[12]); + *rc = f2(*rc); + + for (cc = 4; cc < 16; cc += 4) + { + k[cc + 0] ^= k[cc - 4]; + k[cc + 1] ^= k[cc - 3]; + k[cc + 2] ^= k[cc - 2]; + k[cc + 3] ^= k[cc - 1]; + } +} + +/* Encrypt a single block of 16 bytes with 'on the fly' 128 bit keying */ + +void aes_encrypt_128(const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], + const uint8_t key[N_BLOCK], uint8_t o_key[N_BLOCK]) +{ + uint8_t s1[N_BLOCK], r, rc = 1; + + if (o_key != key) + block_copy(o_key, key); + copy_and_key(s1, in, o_key); + + for (r = 1; r < 10; ++r) +#if defined(VERSION_1) + { + mix_sub_columns(s1); + update_encrypt_key_128(o_key, &rc); + add_round_key(s1, o_key); + } +#else + { + uint8_t s2[N_BLOCK]; + mix_sub_columns(s2, s1); + update_encrypt_key_128(o_key, &rc); + copy_and_key(s1, s2, o_key); + } +#endif + + shift_sub_rows(s1); + update_encrypt_key_128(o_key, &rc); + copy_and_key(out, s1, o_key); +} + +#endif + +#if defined(AES_DEC_128_OTFK) + +/* The 'on the fly' decryption key update for for 128 bit keys */ + +static void update_decrypt_key_128(uint8_t k[N_BLOCK], uint8_t *rc) +{ + uint8_t cc; + + for (cc = 12; cc > 0; cc -= 4) + { + k[cc + 0] ^= k[cc - 4]; + k[cc + 1] ^= k[cc - 3]; + k[cc + 2] ^= k[cc - 2]; + k[cc + 3] ^= k[cc - 1]; + } + *rc = d2(*rc); + k[0] ^= s_box(k[13]) ^ *rc; + k[1] ^= s_box(k[14]); + k[2] ^= s_box(k[15]); + k[3] ^= s_box(k[12]); +} + +/* Decrypt a single block of 16 bytes with 'on the fly' 128 bit keying */ + +void aes_decrypt_128(const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], + const uint8_t key[N_BLOCK], uint8_t o_key[N_BLOCK]) +{ + uint8_t s1[N_BLOCK], r, rc = 0x6c; + if (o_key != key) + block_copy(o_key, key); + + copy_and_key(s1, in, o_key); + inv_shift_sub_rows(s1); + + for (r = 10; --r;) +#if defined(VERSION_1) + { + update_decrypt_key_128(o_key, &rc); + add_round_key(s1, o_key); + inv_mix_sub_columns(s1); + } +#else + { + uint8_t s2[N_BLOCK]; + update_decrypt_key_128(o_key, &rc); + copy_and_key(s2, s1, o_key); + inv_mix_sub_columns(s1, s2); + } +#endif + update_decrypt_key_128(o_key, &rc); + copy_and_key(out, s1, o_key); +} + +#endif + +#if defined(AES_ENC_256_OTFK) + +/* The 'on the fly' encryption key update for for 256 bit keys */ + +static void update_encrypt_key_256(uint8_t k[2 * N_BLOCK], uint8_t *rc) +{ + uint8_t cc; + + k[0] ^= s_box(k[29]) ^ *rc; + k[1] ^= s_box(k[30]); + k[2] ^= s_box(k[31]); + k[3] ^= s_box(k[28]); + *rc = f2(*rc); + + for (cc = 4; cc < 16; cc += 4) + { + k[cc + 0] ^= k[cc - 4]; + k[cc + 1] ^= k[cc - 3]; + k[cc + 2] ^= k[cc - 2]; + k[cc + 3] ^= k[cc - 1]; + } + + k[16] ^= s_box(k[12]); + k[17] ^= s_box(k[13]); + k[18] ^= s_box(k[14]); + k[19] ^= s_box(k[15]); + + for (cc = 20; cc < 32; cc += 4) + { + k[cc + 0] ^= k[cc - 4]; + k[cc + 1] ^= k[cc - 3]; + k[cc + 2] ^= k[cc - 2]; + k[cc + 3] ^= k[cc - 1]; + } +} + +/* Encrypt a single block of 16 bytes with 'on the fly' 256 bit keying */ + +void aes_encrypt_256(const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], + const uint8_t key[2 * N_BLOCK], uint8_t o_key[2 * N_BLOCK]) +{ + uint8_t s1[N_BLOCK], r, rc = 1; + if (o_key != key) + { + block_copy(o_key, key); + block_copy(o_key + 16, key + 16); + } + copy_and_key(s1, in, o_key); + + for (r = 1; r < 14; ++r) +#if defined(VERSION_1) + { + mix_sub_columns(s1); + if (r & 1) + add_round_key(s1, o_key + 16); + else + { + update_encrypt_key_256(o_key, &rc); + add_round_key(s1, o_key); + } + } +#else + { + uint8_t s2[N_BLOCK]; + mix_sub_columns(s2, s1); + if (r & 1) + copy_and_key(s1, s2, o_key + 16); + else + { + update_encrypt_key_256(o_key, &rc); + copy_and_key(s1, s2, o_key); + } + } +#endif + + shift_sub_rows(s1); + update_encrypt_key_256(o_key, &rc); + copy_and_key(out, s1, o_key); +} + +#endif + +#if defined(AES_DEC_256_OTFK) + +/* The 'on the fly' encryption key update for for 256 bit keys */ + +static void update_decrypt_key_256(uint8_t k[2 * N_BLOCK], uint8_t *rc) +{ + uint8_t cc; + + for (cc = 28; cc > 16; cc -= 4) + { + k[cc + 0] ^= k[cc - 4]; + k[cc + 1] ^= k[cc - 3]; + k[cc + 2] ^= k[cc - 2]; + k[cc + 3] ^= k[cc - 1]; + } + + k[16] ^= s_box(k[12]); + k[17] ^= s_box(k[13]); + k[18] ^= s_box(k[14]); + k[19] ^= s_box(k[15]); + + for (cc = 12; cc > 0; cc -= 4) + { + k[cc + 0] ^= k[cc - 4]; + k[cc + 1] ^= k[cc - 3]; + k[cc + 2] ^= k[cc - 2]; + k[cc + 3] ^= k[cc - 1]; + } + + *rc = d2(*rc); + k[0] ^= s_box(k[29]) ^ *rc; + k[1] ^= s_box(k[30]); + k[2] ^= s_box(k[31]); + k[3] ^= s_box(k[28]); +} + +/* Decrypt a single block of 16 bytes with 'on the fly' + 256 bit keying +*/ +void aes_decrypt_256(const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], + const uint8_t key[2 * N_BLOCK], uint8_t o_key[2 * N_BLOCK]) +{ + uint8_t s1[N_BLOCK], r, rc = 0x80; + + if (o_key != key) + { + block_copy(o_key, key); + block_copy(o_key + 16, key + 16); + } + + copy_and_key(s1, in, o_key); + inv_shift_sub_rows(s1); + + for (r = 14; --r;) +#if defined(VERSION_1) + { + if ((r & 1)) + { + update_decrypt_key_256(o_key, &rc); + add_round_key(s1, o_key + 16); + } + else + add_round_key(s1, o_key); + inv_mix_sub_columns(s1); + } +#else + { + uint8_t s2[N_BLOCK]; + if ((r & 1)) + { + update_decrypt_key_256(o_key, &rc); + copy_and_key(s2, s1, o_key + 16); + } + else + copy_and_key(s2, s1, o_key); + inv_mix_sub_columns(s1, s2); + } +#endif + copy_and_key(out, s1, o_key); +} + +#endif diff --git a/User/system/lib/src/clist.c b/User/system/lib/src/clist.c new file mode 100644 index 0000000..fb54261 --- /dev/null +++ b/User/system/lib/src/clist.c @@ -0,0 +1,338 @@ +/** + * @file clist.c + * @author xxx + * @date 2023-08-08 23:18:09 + * @brief + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "clist.h" + +/** + * @brief 初始化链表 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @return void + * @note 初始化链表,将链表头节点设置为空 + */ +void clist_init(clist_node_t **ppFirst) +{ + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + *ppFirst = NULL; +} + +/** + * @brief 打印链表 + * @param {clist_node_t} First 链表头节点 + * @return void + * @note 打印链表中的所有节点数据 + */ +void clist_print(clist_node_t *First) +{ + LOG_PRINT("list: "); + for (clist_node_t *p = First; p != NULL; p = p->Next) + LOG_PRINT("%d-->", p->data); + LOG_PRINT("\n"); +} + +/** + * @brief 获取链表节点数 + * @param {clist_node_t} First 链表头节点 + * @return {uint32_t} 链表节点数 + * @note 遍历链表,计算节点数 + */ +uint32_t clist_node_count(clist_node_t *First) +{ + int32_t count = 0; + for (clist_node_t *p = First; p != NULL; p = p->Next) + count++; + return count; +} + +/** + * @brief 申请新节点 + * @param {cnode} data 节点数据 + * @return {clist_node_t *} 新节点指针 + * @note 分配内存,创建新节点 + */ +static clist_node_t *CreateNode(cnode data) +{ + clist_node_t *node = (clist_node_t *)osel_mem_alloc(sizeof(clist_node_t)); + node->data = data; + node->Next = NULL; + return node; +} + +/** + * @brief 尾部插入 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @param {cnode} data 要插入的节点数据 + * @return void + * @note 在链表末尾插入一个新节点,新节点数据为data + */ +void clist_push_back(clist_node_t **ppFirst, cnode data) +{ + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + clist_node_t *node = CreateNode(data); + if (*ppFirst == NULL) // 判断链表不为空 + { + *ppFirst = node; + return; + } + // 找链表中的最后一个节点 + clist_node_t *p = *ppFirst; + while (p->Next != NULL) + p = p->Next; + p->Next = node; // 插入新申请的节点 +} + +/** + * @brief 头部插入 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @param {cnode} data 要插入的节点数据 + * @return void + * @note 在链表头部插入一个新节点,新节点数据为data + */ +void clist_push_front(clist_node_t **ppFirst, cnode data) +{ + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + clist_node_t *node = CreateNode(data); + node->Next = *ppFirst; + *ppFirst = node; +} + +/** + * @brief 尾部删除 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @return void + * @note 删除链表中最后一个节点 + */ +void clist_pop_back(clist_node_t **ppFirst) // 尾部删除 +{ + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + DBG_ASSERT(*ppFirst != NULL __DBG_LINE); + if ((*ppFirst)->Next == NULL) + { + osel_mem_free(*ppFirst); + *ppFirst = NULL; + return; + } + clist_node_t *p = *ppFirst; + while (p->Next->Next != NULL) + p = p->Next; + osel_mem_free(p->Next); + p->Next = NULL; +} + +/** + * @brief 头部删除 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @return void + * @note 删除链表中第一个节点 + */ +void clist_pop_front(clist_node_t **ppFirst) +{ + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + DBG_ASSERT(*ppFirst != NULL __DBG_LINE); // 链表不是空链表 + clist_node_t *first = *ppFirst; + *ppFirst = (*ppFirst)->Next; + osel_mem_free(first); +} +/** + * @brief 按节点指针插入 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @param {clist_node_t} *pPos 要插入的节点位置 + * @param {cnode} data 要插入的节点数据 + * @return void + * @note 在指定节点位置插入一个新节点,新节点数据为data + */ +void clist_insert_for_node(clist_node_t **ppFirst, clist_node_t *pPos, cnode data) +{ + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + if (*ppFirst == pPos) + { + clist_push_front(ppFirst, data); + return; + } + clist_node_t *newNode = CreateNode(data); + clist_node_t *p; + + for (p = *ppFirst; p->Next != pPos; p = p->Next) + { + } // 找到pos前的一个节点 + p->Next = newNode; // 改变的是字段内的值,而不是指针的值 + newNode->Next = pPos; +} +/** + * @brief 按位置插入 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @param {int32_t} Pos 插入位置 + * @param {cnode} data 要插入的节点数据 + * @return {int32_t} 插入成功返回1,否则返回0 + * @note 在指定位置插入一个新节点,新节点数据为data + */ +int32_t clist_insert(clist_node_t **ppFirst, int32_t Pos, cnode data) // 按位置插入 +{ + clist_node_t *p = *ppFirst; + for (int32_t i = 0; i < Pos; i++) + { + if (p == NULL) + return 0; + p = p->Next; + } + clist_insert_for_node(ppFirst, p, data); + return 1; +} + +/** + * @brief 按位置删除 + * @param {clist_node_t} **ppFirst 指向链表头节点的指针 + * @param {int32_t} Pos 要删除的节点位置 + * @return {int32_t} 删除成功返回1,否则返回0 + * @note 从指定位置删除一个节点 + */ +int32_t cListErase(clist_node_t **ppFirst, int32_t Pos) +{ + clist_node_t *p = *ppFirst; + for (int32_t i = 0; i < Pos; i++) + { + if (p == NULL) + return 0; + p = p->Next; + } + clist_erase_for_node(ppFirst, p); + return 1; +} + +/** + * @brief 删除给定结点之后的所有结点 + * @param {clist_node_t **} ppFirst 指向链表头结点的指针 + * @param {clist_node_t *} pPos 要删除的结点 + * @return void + * @note + */ +void clist_erase_for_node(clist_node_t **ppFirst, clist_node_t *pPos) +{ + if (*ppFirst == pPos) + { + clist_pop_front(ppFirst); + return; + } + clist_node_t *p = *ppFirst; + while (p->Next != pPos) + p = p->Next; + p->Next = pPos->Next; + osel_mem_free(pPos); +} + +/** + * @brief 删除指定值的结点 + * @param {clist_node_t **} ppFirst 指向链表头结点的指针 + * @param {cnode} data 要删除的结点数据 + * @return void + * @note + */ +void clist_remove(clist_node_t **ppFirst, cnode data) +{ + clist_node_t *p = *ppFirst; + clist_node_t *prev = NULL; + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + if (*ppFirst == NULL) + return; + while (p) + { + if (p->data == data) + { + if (*ppFirst == p) // 删除的是第一个节点 + { + *ppFirst = p->Next; + osel_mem_free(p); + p = NULL; + } + else // 删除中间节点 + { + prev->Next = p->Next; + osel_mem_free(p); + p = NULL; + } + break; + } + prev = p; + p = p->Next; + } +} + +/** + * @brief 删除指定值的所有结点 + * @param {clist_node_t **} ppFirst 指向链表头结点的指针 + * @param {cnode} data 要删除的结点数据 + * @return void + * @note + */ +void clist_remove_all(clist_node_t **ppFirst, cnode data) +{ + clist_node_t *p = NULL; + clist_node_t *prev = NULL; + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + if (*ppFirst == NULL) + return; + p = *ppFirst; + while (p) + { + if (p->data == data) + { + if (*ppFirst == p) // 删除的是第一个节点 + { + *ppFirst = p->Next; + osel_mem_free(p); + p = *ppFirst; + } + else // 删除中间节点 + { + prev->Next = p->Next; + osel_mem_free(p); + p = prev; + } + } + prev = p; + p = p->Next; + } +} + +/** + * @brief 销毁链表,每个节点都要销毁 + * @param {clist_node_t **} ppFirst 指向链表头结点的指针 + * @return void + * @note + */ +void clist_destroy(clist_node_t **ppFirst) +{ + clist_node_t *p = NULL; + clist_node_t *del = NULL; + DBG_ASSERT(ppFirst != NULL __DBG_LINE); + p = *ppFirst; + while (p) + { + del = p; + p = p->Next; + osel_mem_free(del); + del = NULL; + } + *ppFirst = NULL; +} + +/** + * @brief 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL + * @param {clist_node_t *} pFirst 指向链表头结点的指针 + * @param {cnode} data 要查找的结点数据 + * @return {clist_node_t *} 找到的结点指针,如果没有找到,返回 NULL + * @note + */ +clist_node_t *clist_find(clist_node_t *pFirst, cnode data) +{ + for (clist_node_t *p = pFirst; p != NULL; p = p->Next) + { + if (p->data == data) + return p; + } + return NULL; +} diff --git a/User/system/lib/src/cmac.c b/User/system/lib/src/cmac.c new file mode 100644 index 0000000..3d7f81d --- /dev/null +++ b/User/system/lib/src/cmac.c @@ -0,0 +1,159 @@ +/************************************************************************** +Copyright (C) 2009 Lander Casado, Philippas Tsigas + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files +(the "Software"), to deal with the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimers. Redistributions in +binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimers in the documentation and/or +other materials provided with the distribution. + +In no event shall the authors or copyright holders be liable for any special, +incidental, indirect or consequential damages of any kind, or any damages +whatsoever resulting from loss of use, data or profits, whether or not +advised of the possibility of damage, and on any theory of liability, +arising out of or in connection with the use or performance of this software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS WITH THE SOFTWARE + +*****************************************************************************/ +// #include +// #include +#include +#include "aes.h" +#include "cmac.h" +#include "osel_arch.h" + +#define LSHIFT(v, r) \ + do \ + { \ + int32_t i; \ + for (i = 0; i < 15; i++) \ + (r)[i] = (v)[i] << 1 | (v)[i + 1] >> 7; \ + (r)[15] = (v)[15] << 1; \ + } while (0) + +#define XOR(v, r) \ + do \ + { \ + int32_t i; \ + for (i = 0; i < 16; i++) \ + { \ + (r)[i] = (r)[i] ^ (v)[i]; \ + } \ + } while (0) + +void AES_CMAC_Init(AES_CMAC_CTX *ctx) +{ + osel_memset(ctx->X, 0, sizeof ctx->X); + ctx->M_n = 0; + osel_memset(ctx->rijndael.ksch, '\0', 240); +} + +void AES_CMAC_SetKey(AES_CMAC_CTX *ctx, const uint8_t key[AES_CMAC_KEY_LENGTH]) +{ + // rijndael_set_key_enc_only(&ctx->rijndael, key, 128); + aes_set_key(key, AES_CMAC_KEY_LENGTH, &ctx->rijndael); +} + +void AES_CMAC_Update(AES_CMAC_CTX *ctx, const uint8_t *data, uint32_t len) +{ + uint32_t mlen; + uint8_t in[16]; + + if (ctx->M_n > 0) + { + mlen = MIN(16 - ctx->M_n, len); + osel_memcpy(ctx->M_last + ctx->M_n, data, mlen); + ctx->M_n += mlen; + if (ctx->M_n < 16 || len == mlen) + return; + XOR(ctx->M_last, ctx->X); + // rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X); + aes_encrypt(ctx->X, ctx->X, &ctx->rijndael); + data += mlen; + len -= mlen; + } + while (len > 16) /* not last block */ + { + + XOR(data, ctx->X); + // rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X); + + osel_memcpy(in, &ctx->X[0], 16); // Bestela ez du ondo iten + aes_encrypt(in, in, &ctx->rijndael); + osel_memcpy(&ctx->X[0], in, 16); + + data += 16; + len -= 16; + } + /* potential last block, save it */ + osel_memcpy(ctx->M_last, data, len); + ctx->M_n = len; +} + +void AES_CMAC_Final(uint8_t digest[AES_CMAC_DIGEST_LENGTH], AES_CMAC_CTX *ctx) +{ + uint8_t K[16]; + uint8_t in[16]; + /* generate subkey K1 */ + osel_memset(K, '\0', 16); + + // rijndael_encrypt(&ctx->rijndael, K, K); + + aes_encrypt(K, K, &ctx->rijndael); + + if (K[0] & 0x80) + { + LSHIFT(K, K); + K[15] ^= 0x87; + } + else + LSHIFT(K, K); + + if (ctx->M_n == 16) + { + /* last block was a complete block */ + XOR(K, ctx->M_last); + } + else + { + /* generate subkey K2 */ + if (K[0] & 0x80) + { + LSHIFT(K, K); + K[15] ^= 0x87; + } + else + LSHIFT(K, K); + + /* padding(M_last) */ + ctx->M_last[ctx->M_n] = 0x80; + while (++ctx->M_n < 16) + ctx->M_last[ctx->M_n] = 0; + + XOR(K, ctx->M_last); + } + XOR(ctx->M_last, ctx->X); + + // rijndael_encrypt(&ctx->rijndael, ctx->X, digest); + + osel_memcpy(in, &ctx->X[0], 16); // Bestela ez du ondo iten + aes_encrypt(in, digest, &ctx->rijndael); + osel_memset(K, 0, sizeof K); +} diff --git a/User/system/lib/src/cmd.c b/User/system/lib/src/cmd.c new file mode 100644 index 0000000..8a8a26d --- /dev/null +++ b/User/system/lib/src/cmd.c @@ -0,0 +1,111 @@ +/** + * @file cmd.c + * @author xxx + * @date 2023-06-25 13:07:02 + * @brief 命令解析器 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "cmd.h" + +#include + +static cmd_t *_cmd_begin, *_cmd_end; + +static int _cmd_to_lower(int c) +{ + if ((c >= 'A') && (c <= 'Z')) + return c + ('a' - 'A'); + return c; +} + +static unsigned int _cmd_hash(const char *str) +{ + int tmp, c = *str; + unsigned int seed = CMD_HASH; /* 'jiejie' string hash */ + unsigned int hash = 0; + + while (*str) + { + tmp = _cmd_to_lower(c); + hash = (hash ^ seed) + tmp; + str++; + c = *str; + } + return hash; +} + +static void _cmd_init(const void *begin, const void *end) +{ + _cmd_begin = (cmd_t *)begin; + _cmd_end = (cmd_t *)end; +} + +static cmd_t *_get_next_cmd(cmd_t *cmd) +{ + unsigned int *ptr; + ptr = (unsigned int *)(cmd + 1); + while ((*ptr == 0) && ((unsigned int *)ptr < (unsigned int *)_cmd_end)) + ptr++; + + return (cmd_t *)ptr; +} + +static int _cmd_match(const char *str, const char *cmd) +{ + int c1, c2; + + do + { + c1 = _cmd_to_lower(*str++); + c2 = _cmd_to_lower(*cmd++); + } while ((c1 == c2) && c1); + + return c1 - c2; +} + +static void _list(void) +{ + cmd_t *index; + for (index = _cmd_begin; index < _cmd_end; index = _get_next_cmd(index)) + { + // printf("%s -->%s\n", index->cmd, index->cmd_mess); + } +} +REGISTER_CMD(_list, _list, list all command); + +void cmd_init(void) +{ + cmd_t *index; + +#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM C Compiler */ + extern const int CMDS$$Base; + extern const int CMDS$$Limit; + _cmd_init(&CMDS$$Base, &CMDS$$Limit); +#elif defined(__ICCARM__) || defined(__ICCRX__) /* for IAR Compiler */ + _cmd_init(__section_begin("CMDS"), __section_end("CMDS")); +#endif + + for (index = _cmd_begin; index < _cmd_end; index = _get_next_cmd(index)) + { + index->hash = _cmd_hash(index->cmd); + } +} + +void cmd_parsing(char *str) +{ + cmd_t *index; + unsigned int hash = _cmd_hash(str); + + for (index = _cmd_begin; index < _cmd_end; index = _get_next_cmd(index)) + { + if (hash == index->hash) + { + if (_cmd_match(str, index->cmd) == 0) + { + index->handler(); + break; + } + } + } +} diff --git a/User/system/lib/src/data_analysis.c b/User/system/lib/src/data_analysis.c new file mode 100644 index 0000000..76993f4 --- /dev/null +++ b/User/system/lib/src/data_analysis.c @@ -0,0 +1,468 @@ +/** + * @file data_analysis.c + * @author xxx + * @date 2023-06-25 13:07:02 + * @brief 处理传输层的数据 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include +#include "../inc/data_analysis.h" +#include "../inc/sqqueue.h" +#include "../inc/debug.h" + +typedef uint8_t data_entry_t; +typedef void (*state_t)(uint8_t data_id, uint8_t sig, uint8_t ch); + +typedef enum _event /* enumeration */ +{ + SD_SIG, + LD_SIG, + CHAR_SIG, + ED_SIG, +} sig_event; + +typedef struct _fsm_t_ +{ + state_t current_state; +} fsm_t; + +typedef struct _DATA_frm_t_ +{ + uint8_t sd_index; + + struct + { + uint8_t data[DATA_LD_LEN_MAX]; + uint8_t index; + uint16_t frm_len; + } ld; // length describe + + uint16_t payload_len; // actually len of recvived data + uint8_t ed_index; + + uint16_t last_enter_q_num; // record the num of frames has entered the queue + uint8_t locked; + uint8_t sig; +} data_frm_t; + +#define TRAN(state) (fsm[data_id].current_state = (state_t)(state)) +#define FSM_DISPATCH(data_id, sig, ch) (fsm[data_id].current_state((data_id), (sig), (ch))) + +static fsm_t fsm[DATA_NUM] = {0}; + +static data_frm_t data_frm_array[DATA_NUM]; +static data_reg_t data_reg_array[DATA_NUM]; + +static sqqueue_ctrl_t data_recv_sqq[DATA_NUM]; + +static void wait_sd_state(uint8_t data_id, uint8_t sig, uint8_t ch); +/** + * @brief 加锁数据 + * @param {uint8_t} data_id + * @note + */ +void lock_data(uint8_t data_id) +{ + data_frm_array[data_id].locked = TRUE; // 设置数据帧结构体的锁定标志为TRUE + for (uint8_t i = 0; i < data_frm_array[data_id].last_enter_q_num; i++) // 遍历数据接收缓冲区,删除所有已入队项 + { + data_recv_sqq[data_id].revoke(&data_recv_sqq[data_id]); // 删除项 + } + + data_frm_array[data_id].last_enter_q_num = 0; // 重置最后进入队列的项数量 + data_frm_array[data_id].sd_index = 0; // 重置SD索引 + data_frm_array[data_id].ed_index = 0; // 重置ED索引 + data_frm_array[data_id].ld.frm_len = 0; // 重置数据帧长度 + data_frm_array[data_id].payload_len = 0; // 重置负载长度 + + TRAN(wait_sd_state); // 切换到等待SD状态 +} + +/** + * @brief 解锁数据 + * @param {uint8_t} data_id + * @note + */ +void unlock_data(uint8_t data_id) +{ + TRAN(wait_sd_state); // 切换到等待SD状态 + + data_frm_array[data_id].last_enter_q_num = 0; // 重置最后进入队列的项数量 + data_frm_array[data_id].sd_index = 0; // 重置SD索引 + data_frm_array[data_id].ed_index = 0; // 重置ED索引 + data_frm_array[data_id].ld.frm_len = 0; // 重置数据帧长度 + data_frm_array[data_id].payload_len = 0; // 重置负载长度 + + data_frm_array[data_id].locked = FALSE; // 设置数据帧结构体的锁定标志为FALSE +} + +/** + * @brief 处理结束状态 + * @param {uint8_t} data_id + * @param {uint8_t} sig + * @param {uint8_t} ch + * @note + */ +static void end_state_handle(uint8_t data_id, uint8_t sig, uint8_t ch) +{ + TRAN(wait_sd_state); // 切换到等待SD状态 + data_frm_array[data_id].ld.frm_len = 0; // 重置数据帧长度 + data_frm_array[data_id].payload_len = 0; // 重置负载长度 + data_frm_array[data_id].last_enter_q_num = 0; // 重置最后进入队列的项数量 + if (data_reg_array[data_id].func_ptr != NULL) // 如果数据项注册了处理函数 + { + (*(data_reg_array[data_id].func_ptr))(); // 调用处理函数 + } +} + +/** + * @brief 这个函数处理等待结束状态。 + * @param {uint8_t} data_id - 数据的ID。 + * @param {uint8_t} sig - 信号。 + * @param {uint8_t} ch - 通道。 + * @return {*} + * @note + */ +static void wait_end_state(uint8_t data_id, uint8_t sig, uint8_t ch) +{ + // 如果数据寄存器数组无效 + if (!data_reg_array[data_id].ed.valid) + { + // 如果数据帧数组的帧长度为0 + if (data_frm_array[data_id].ld.frm_len == 0) + { + // 转换到等待SD状态 + TRAN(wait_sd_state); + + // 处理结束状态 + end_state_handle(data_id, sig, ch); + + // 对于数据帧数组的最后一个进入队列的数量,撤销数据接收队列 + for (uint8_t i = 0; i < data_frm_array[data_id].last_enter_q_num; i++) + { + data_recv_sqq[data_id].revoke(&data_recv_sqq[data_id]); + } + // 将数据帧数组的最后一个进入队列的数量设置为0 + data_frm_array[data_id].last_enter_q_num = 0; + } + else + { + // 如果数据接收队列进入成功 + if (data_recv_sqq[data_id].enter(&data_recv_sqq[data_id], (void *)&ch)) + { + // 增加数据帧数组的最后一个进入队列的数量 + data_frm_array[data_id].last_enter_q_num++; + // 如果增加的数据帧数组的有效载荷长度等于数据帧数组的帧长度 + if (++data_frm_array[data_id].payload_len == + data_frm_array[data_id].ld.frm_len) + { + // 处理结束状态 + end_state_handle(data_id, sig, ch); + } + } + else + { + // 锁定数据 + lock_data(data_id); + } + } + } + else + { + // 如果数据帧数组的帧长度为0 + if (data_frm_array[data_id].ld.frm_len == 0) + { + // 如果数据接收队列进入成功 + if (data_recv_sqq[data_id].enter(&data_recv_sqq[data_id], (void *)&ch)) + { + // 增加数据帧数组的最后一个进入队列的数量 + data_frm_array[data_id].last_enter_q_num++; + // 如果数据寄存器数组的数据等于通道 + if (data_reg_array[data_id].ed.data[0] == ch) + { + // 处理结束状态 + end_state_handle(data_id, sig, ch); + } + } + else + { + // 锁定数据 + lock_data(data_id); + } + } + else + { + // 如果数据接收队列进入成功 + if (data_recv_sqq[data_id].enter(&data_recv_sqq[data_id], (void *)&ch)) + { + // 增加数据帧数组的最后一个进入队列的数量 + data_frm_array[data_id].last_enter_q_num++; + // 如果增加的数据帧数组的有效载荷长度大于等于数据帧数组的帧长度减去数据寄存器数组的位置 + if (++data_frm_array[data_id].payload_len >= + data_frm_array[data_id].ld.frm_len - data_reg_array[data_id].ld.pos) + { + // 如果数据寄存器数组的数据等于通道 + if (data_reg_array[data_id].ed.data[0] == ch) + { + // 处理结束状态 + end_state_handle(data_id, sig, ch); + } + } + } + else + { + // 锁定数据 + lock_data(data_id); + } + } + } +} + +/** + * @brief 处理等待LD状态 + * @param {uint8_t} data_id + * @param {uint8_t} sig + * @param {uint8_t} ch + * @return {*} + * @note + */ +static void wait_ld_state(uint8_t data_id, uint8_t sig, uint8_t ch) +{ + if (!data_reg_array[data_id].ld.valid) // 如果数据项未注册LD状态 + { + TRAN(wait_end_state); // 切换到等待结束状态 + FSM_DISPATCH(data_id, data_frm_array[data_id].sig, ch); // 调用FSM处理函数 + return; + } + data_frm_array[data_id].ld.data[data_frm_array[data_id].ld.index++] = ch; // 将字符添加到数据帧中 + if (data_recv_sqq[data_id].enter(&data_recv_sqq[data_id], (void *)&ch)) // 尝试进入队列 + { + data_frm_array[data_id].last_enter_q_num++; // 增加最后进入队列的项数量 + if (data_frm_array[data_id].ld.index == data_reg_array[data_id].ld.len) // 如果索引等于数据项长度 + { + if (data_reg_array[data_id].ld.little_endian == TRUE) // 如果小端存储 + { + data_frm_array[data_id].ld.frm_len = + data_frm_array[data_id].ld.data[DATA_LD_LEN_MAX - 1] * 256 + + data_frm_array[data_id].ld.data[DATA_LD_LEN_MAX - 2]; + } + else + { + data_frm_array[data_id].ld.frm_len = + data_frm_array[data_id].ld.data[DATA_LD_LEN_MAX - 2] * 256 + + data_frm_array[data_id].ld.data[DATA_LD_LEN_MAX - 1]; + } + + if (data_reg_array[data_id].ld.len == 1) // 如果是只有1个字节长度的数据 + { + data_frm_array[data_id].ld.frm_len = data_frm_array[data_id].ld.data[0]; + } + + if ((data_frm_array[data_id].ld.frm_len > data_reg_array[data_id].argu.len_max) || (data_frm_array[data_id].ld.frm_len < data_reg_array[data_id].argu.len_min)) + { + data_frm_array[data_id].ld.index = 0; + TRAN(wait_sd_state); // 切换到等待SD状态 + + for (uint8_t i = 0; i < data_frm_array[data_id].last_enter_q_num; i++) + { + data_recv_sqq[data_id].revoke(&data_recv_sqq[data_id]); // 删除项 + } + + data_frm_array[data_id].ld.frm_len = 0; + data_frm_array[data_id].last_enter_q_num = 0; + } + else + { + data_frm_array[data_id].ld.index = 0; + TRAN(wait_end_state); // 切换到等待结束状态 + } + } + } + else + { + lock_data(data_id); // 锁定数据 + } +} +/** + * @brief 等待SD状态处理函数 + * @param {uint8_t} data_id 数据ID + * @param {uint8_t} sig 信号 + * @param {uint8_t} ch 字符 + * @return {*} + * @note + */ +static void wait_sd_state(uint8_t data_id, uint8_t sig, uint8_t ch) +{ + // 如果数据寄存器中的SD数据无效 + if (!data_reg_array[data_id].sd.valid) + { + // transition to wait_ld_state状态 + TRAN(wait_ld_state); + // 调用数据帧数组中对应的数据帧处理函数 + FSM_DISPATCH(data_id, data_frm_array[data_id].sig, ch); + return; + } + // 如果数据寄存器中的SD数据中的当前字节等于输入的字节 + if (data_reg_array[data_id].sd.data[data_frm_array[data_id].sd_index++] == ch) + { + // 如果输入字符串成功进入队列 + if (data_recv_sqq[data_id].enter(&data_recv_sqq[data_id], (void *)&ch)) + { + // 更新数据帧数组中对应的数据帧的最后一个进入队列的队列号 + data_frm_array[data_id].last_enter_q_num++; + // 如果数据帧中的SD数据索引等于数据寄存器中的SD数据长度 + if (data_frm_array[data_id].sd_index == data_reg_array[data_id].sd.len) + { + // 更新数据帧中的SD数据索引为0 + data_frm_array[data_id].sd_index = 0; + // transition to wait_ld_state状态 + TRAN(wait_ld_state); + } + } + // 如果输入字符串无法进入队列 + else + { + // 锁定数据 + lock_data(data_id); + } + } + // 如果数据寄存器中的SD数据中的当前字节不等于输入的字节 + else + { + // 遍历并删除队列中的输入字符串 + for (uint8_t i = 0; i < data_frm_array[data_id].last_enter_q_num; i++) + { + data_recv_sqq[data_id].revoke(&data_recv_sqq[data_id]); + } + + // 更新数据帧中的SD数据索引为0 + data_frm_array[data_id].sd_index = 0; + // 更新数据帧中的最后一个进入队列的队列号为0 + data_frm_array[data_id].last_enter_q_num = 0; + } +} + +/** + * @brief 处理数据字符 + * @param {uint8_t} data_id + * @param {uint8_t} ch + * @return {*} + * @note + */ +static void data_char_handle(uint8_t data_id, uint8_t ch) +{ + // 如果数据ID对应的数据寄存器的回显使能标志为真 + if (data_reg_array[data_id].echo_en) + { + // 将输入字符写入数据寄存器 + data_write(data_id, &ch, 1); + } + + // 调用数据帧数组中对应的数据帧处理函数 + FSM_DISPATCH(data_id, data_frm_array[data_id].sig, ch); +} + +/** + * @brief 初始化数据帧处理机 + * @param {uint8_t} data_id + * @return {*} + * @note + */ +data_interupt_cb_t data_fsm_init(uint8_t data_id) +{ + TRAN(wait_sd_state); // 切换到等待SD状态 + data_reg_array[data_id].func_ptr = NULL; // 设置数据ID寄存器的回调函数为空 + memset(&data_frm_array[data_id], 0, sizeof(data_frm_t)); // 初始化数据帧结构体 + data_frm_array[data_id].sig = CHAR_SIG; // 设置数据帧签名 + + if (sqqueue_ctrl_init(&data_recv_sqq[data_id], + sizeof(data_entry_t), + DATA_BUF_RECV_SQQ_LEN) == FALSE) // 初始化数据接收缓冲区 + { + DBG_ASSERT(FALSE __DBG_LINE); // 如果初始化失败,输出调试信息 + } + + return data_char_handle; // 返回数据处理回调函数指针 +} +/** + * @brief 读取数据 + * @param {uint8_t} id + * @param {void} *buffer + * @param {uint16_t} len + * @return {*} + * @note + */ +uint8_t data_read(uint8_t id, void *buffer, uint16_t len) +{ + uint8_t i = 0; + data_entry_t e; + uint8_t *buf = (uint8_t *)buffer; + + // 如果接收队列中存在长度大于等于输入长度的数据项 + if (data_recv_sqq[id].get_len(&data_recv_sqq[id]) >= len) + { + // 遍历接收队列并读取数据项到缓冲区 + for (i = 0; i < len; i++) + { + e = *((data_entry_t *)data_recv_sqq[id].del(&data_recv_sqq[id])); + buf[i] = e; + } + } + // 如果接收队列中不存在长度大于等于输入长度的数据项 + else + { + // 遍历接收队列并读取数据项到缓冲区 + while ((data_recv_sqq[id].get_len(&data_recv_sqq[id]) != 0) && (i < len)) + { + e = *((data_entry_t *)data_recv_sqq[id].del(&data_recv_sqq[id])); + buf[i++] = e; + } + } + + // 如果数据帧数组中对应的数据帧被锁定 + if (data_frm_array[id].locked) + { + // 解锁数据 + unlock_data(id); + } + + return i; +} + +/** + * @brief + * @param {uint8_t} id + * @param {uint8_t} *string + * @param {uint16_t} len + * @return {*} + * @note + */ +void data_write(uint8_t id, uint8_t *const string, uint16_t len) +{ +} + +/** + * @brief 设置数据寄存器 + * @param {uint8_t} id + * @param {data_reg_t} reg + * @return {*} + * @note + */ +BOOL data_reg(uint8_t id, data_reg_t reg) +{ + if (data_reg_array[id].func_ptr == NULL) + { + memcpy((void *)&data_reg_array[id], (void *)®, sizeof(reg)); + return TRUE; + } + else + { + return FALSE; + } +} +void data_unreg(uint8_t id) +{ + memset((void *)&data_reg_array[id], 0, sizeof(data_reg_t)); + data_reg_array[id].func_ptr = NULL; +} diff --git a/User/system/lib/src/debug.c b/User/system/lib/src/debug.c new file mode 100644 index 0000000..74d76d2 --- /dev/null +++ b/User/system/lib/src/debug.c @@ -0,0 +1,48 @@ +/* + * @File: debug.c + * @Descripttion: + * @Version: 1.0 + * @Author: + * @Date: 2022-12-10 20:15:01 + * @LastEditors: xxx + * @LastEditTime: 2023-08-08 14:39:18 + */ +#include "../inc/debug.h" + +#ifndef STM32 +BOOL DBG_ASSERT(uint8_t cond _DBG_LINE_) +{ + do + { + if ((cond) == FALSE) + { + LOG_ERR("DBG_ASSERT:%d", line); + return FALSE; + } + } while (__LINE__ == -1); + return TRUE; +} + +#else +#include "board.h" +#include "sys.h" +BOOL DBG_ASSERT(uint8_t cond _DBG_LINE_) +{ + do + { + if ((cond) == FALSE) + { +// dbg_assert_line = line; +#if DEBUG_ENABLE == FALSE + // sys_soft_reset(); +#endif + // leds_on(LEDS_ORANGE); + while (1) + { + LOG_ERR("DBG_ASSERT:%d", line); + } + } + } while (__LINE__ == -1); + return TRUE; +} +#endif diff --git a/User/system/lib/src/filter.c b/User/system/lib/src/filter.c new file mode 100644 index 0000000..1a907ce --- /dev/null +++ b/User/system/lib/src/filter.c @@ -0,0 +1,156 @@ +#include "filter.h" +#include +#include "osel_arch.h" + +/** + * @brief 初始化卡尔曼滤波器 + * + * 初始化给定的卡尔曼滤波器配置结构体,并设置初始参数。 + * + * @param cfg 卡尔曼滤波器配置结构体指针 + * @param change_max 最大变化量 + */ +void kalman_init(kalman_t *cfg, float32 change_max) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + // 初始化卡尔曼滤波器配置 + cfg->x = 0; // 初始状态估计值 + cfg->p = 5; // 初始估计误差协方差 + cfg->a = 1; // 状态转移矩阵 + cfg->h = 1; // 观测矩阵 + cfg->q = 0.25; // 过程噪声协方差 + cfg->r = 1; // 观测噪声协方差 + cfg->change_max = change_max; // 最大变化值 +} + +/** + * @brief 卡尔曼滤波器更新函数 + * + * 根据输入的观测值和卡尔曼滤波器的配置参数,更新滤波器的状态和估计值。 + * + * @param cfg 卡尔曼滤波器配置指针 + * @param input 输入的观测值 + * + * @return 更新后的卡尔曼滤波器估计值 + */ +float32 kalman_update(kalman_t *cfg, float32 input) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + // 计算变化值 + float32 delta = input - cfg->x; + // 如果变化值超过0.5,直接返回输入值 + if (ABS(delta) > cfg->change_max) + { + cfg->x = input; + return cfg->x; + } + cfg->x = cfg->a * cfg->x; + cfg->p = cfg->a * cfg->a * cfg->p + cfg->q; + + cfg->gain = cfg->p * cfg->h / (cfg->p * cfg->h * cfg->h + cfg->r); + cfg->x = cfg->x + cfg->gain * (input - cfg->h * cfg->x); + cfg->p = (1 - cfg->gain * cfg->h) * cfg->p; + + return cfg->x; +} + +// 一阶滞后滤波法 +void lpf_init(lpf_t *cfg) +{ + cfg->fisrt_flag = TRUE; + cfg->last_value = 0; + if (cfg->alpha <= 0 || cfg->alpha > 1) + { + cfg->alpha = 0.3f; + } +} + +float32 lpf_update(lpf_t *cfg, float32 input) +{ + float32 out; + + /***************** 如果第一次进入,则给 out_last 赋值 ******************/ + if (TRUE == cfg->fisrt_flag) + { + cfg->fisrt_flag = FALSE; + cfg->last_value = input; + } + + /*************************** 一阶滤波 *********************************/ + out = cfg->alpha * input + (1 - cfg->alpha) * cfg->last_value; + cfg->last_value = out; + + return out; +} + +void lpf_reset(lpf_t *cfg) +{ + cfg->fisrt_flag = TRUE; +} + +/** + * 滑动平均窗口滤波 + */ +void lpf_window_init(lpf_window_t *cfg, uint16_t size) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + if (cfg->window != NULL) + { + osel_mem_free(cfg->window); + } + osel_memset((uint8_t *)cfg, 0, sizeof(lpf_window_t)); + cfg->size = size; + cfg->window = (float32 *)osel_mem_alloc(sizeof(float32) * size); + DBG_ASSERT(cfg->window != NULL __DBG_LINE); + cfg->index = 0; + cfg->sum = 0; +} + +void lpf_window_dinit(lpf_window_t *cfg) +{ + if (cfg != NULL) + { + if (cfg->window != NULL) + { + osel_mem_free(cfg->window); + } + osel_mem_free(cfg); + } +} + +// 滑动平均窗口重置 +void lpf_window_reset(lpf_window_t *cfg) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + cfg->index = 0; + cfg->sum = 0; + osel_memset((uint8_t *)cfg->window, 0, sizeof(float32) * cfg->size); +} + +float32 lpf_window_update(lpf_window_t *cfg, float32 input) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + cfg->sum = 0; + // 如果窗口未满,直接添加新值到当前索引位置 + if (cfg->index < cfg->size) + { + cfg->window[cfg->index++] = input; + } + else + { + // 如果窗口已满,替换最旧的值 + for (uint16_t i = 0; i < cfg->size - 1; i++) + { + cfg->window[i] = cfg->window[i + 1]; + } + cfg->window[cfg->size - 1] = input; + } + // 计算窗口中所有值的和 + for (uint16_t i = 0; i < cfg->index; i++) + { + cfg->sum += cfg->window[i]; + } + // 计算平均值 + cfg->out = cfg->sum / cfg->index; + return cfg->out; +} diff --git a/User/system/lib/src/lib.c b/User/system/lib/src/lib.c new file mode 100644 index 0000000..35aa939 --- /dev/null +++ b/User/system/lib/src/lib.c @@ -0,0 +1,860 @@ +/* + * @Author: + * @day: 2023-04-11 08:21:19 + * @LastEditors: xxx + * @LastEditTime: 2023-08-15 10:14:58 + * @Description: + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "../inc/lib.h" +#include +#include +#include "math.h" +#include "cmac.h" +const uint8_t _days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +const uint16_t _month_days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; +static uint32_t crc32_table[256]; // CRC32表 + +// ASSIC码数组转字符串 +void assic_to_str(uint8_t *assic, uint8_t len, uint8_t *str) +{ + for (uint8_t i = 0; i < len; i++) + { + if (assic[i] == 0) + { + str[i] = 48; + } + else + { + str[i] = (char)assic[i]; + } + } +} + +// 每隔三位数加逗号,将数字转为每隔3位整数由逗号“,”分隔的字符串 +void add_commas(uint32_t num, char *result) +{ + char temp[64]; + sprintf(temp, "%d", num); + + int32_t len = strlen(temp); + int32_t commas = (len - 1) / 3; + + int32_t index = 0; + int32_t resultIndex = 0; + for (int32_t i = len - 1; i >= 0; i--) + { + result[resultIndex++] = temp[i]; + index++; + if (index % 3 == 0 && commas > 0) + { + result[resultIndex++] = ','; + commas--; + } + } + result[resultIndex] = '\0'; + + // Reverse the result string + int32_t start = 0; + int32_t end = resultIndex - 1; + while (start < end) + { + char temp = result[start]; + result[start] = result[end]; + result[end] = temp; + start++; + end--; + } +} + +void get_cpu_id(uint32_t *id) +{ +#ifdef STM32 + // 获取CPU唯一的ID + id[0] = *(uint32_t *)(UID_BASE); + id[1] = *(uint32_t *)(UID_BASE + 4); + id[2] = *(uint32_t *)(UID_BASE + 8); +#endif +} + +uint32_t cpu_encrypt(void) +{ + uint32_t cpuid[3]; +#ifdef STM32 + // 获取CPU唯一的ID + cpuid[0] = *(uint32_t *)(UID_BASE); + cpuid[1] = *(uint32_t *)(UID_BASE + 4); + cpuid[2] = *(uint32_t *)(UID_BASE + 8); +#endif + // 加密算法,很简单的加密算法 + uint32_t encrypt_code = (cpuid[0] >> 3) + (cpuid[1] >> 1) + (cpuid[2] >> 2); + return encrypt_code; +} + +// 判断加密 +BOOL cpu_judge_encrypt(uint32_t cupid_encrypt) +{ + uint32_t cpuid[4]; +#ifdef STM32 + // 获取CPU唯一的ID + cpuid[0] = *(uint32_t *)(UID_BASE); + cpuid[1] = *(uint32_t *)(UID_BASE + 4); + cpuid[2] = *(uint32_t *)(UID_BASE + 8); +#endif + // 加密算法,很简单的加密算法 + cpuid[3] = (cpuid[0] >> 3) + (cpuid[1] >> 1) + (cpuid[2] >> 2); + // 检查Flash中的UID是否合法 + return (cupid_encrypt == cpuid[3]); +} + +void convert_seconds(uint32_t total_seconds, char *date) +{ + uint32_t days = total_seconds / 86400; + uint32_t hours = (total_seconds % 86400) / 3600; + uint32_t minutes = (total_seconds % 3600) / 60; + uint32_t seconds = total_seconds % 60; + if (days > 0) + { + if (days > 1000) + { + sprintf(date, "%02d d %02d h", days, hours); + } + else + { + sprintf(date, "%02d d %02d h %02d m", days, hours, minutes); + } + } + else if (hours > 0) + { + sprintf(date, "%02d h %02d m %02d s", hours, minutes, seconds); + } + else if (minutes > 0) + { + sprintf(date, "%02d m %02d s", minutes, seconds); + } + else + { + sprintf(date, "%02d s", seconds); + } +} + +/** + * @brief Generate the CRC32 lookup table. + * + * This function generates the CRC32 lookup table used for fast computation of the + * CRC32 checksum. The table is generated using the polynomial 0xEDB88320, which is a + * common polynomial used in CRC32 calculations. + */ +static void generate_crc32_table() +{ + static BOOL is_init = FALSE; + if (is_init) + { + return; + } + uint32_t polynomial = 0xEDB88320; + for (uint32_t i = 0; i < 256; i++) + { + uint32_t crc = i; + for (uint32_t j = 0; j < 8; j++) + { + crc = (crc & 1) ? (crc >> 1) ^ polynomial : crc >> 1; + } + crc32_table[i] = crc; + } + is_init = TRUE; +} + +/** + * @brief 版本号1.0拆解成1和0 + * @param {uint8_t} *version_str + * @param {uint8_t} *hi + * @param {uint8_t} *lo + * @return {*} + */ +void version_split(uint8_t *version_str, uint8_t *hi, uint8_t *lo) +{ + uint8_t flag = 1; + + for (uint8_t i = 0; version_str[i] != '\0'; i++) + { + if (version_str[i] == '.') + { + flag = 0; + continue; + } + + if (flag) + { + *hi = *hi * 10 + (version_str[i] - '0'); + } + else + { + *lo = *lo * 10 + (version_str[i] - '0'); + } + } +} + +// 反序数组 +void reverse(uint8_t *buf, uint16_t len) +{ + uint8_t tmp; + uint16_t i; + for (i = 0; i < len / 2; i++) + { + tmp = buf[i]; + buf[i] = buf[len - i - 1]; + buf[len - i - 1] = tmp; + } +} + +/*** + * @brief 判断是否在数组中 + * @param {uint8_t} *arr 数组 + * @param {uint8_t} len 数组长度 + * @param {uint8_t} val 要判断的值 + * @return {*} TRUE: 在数组中 + */ +BOOL is_in_array(uint16_t *arr, uint16_t len, uint16_t val) +{ + uint16_t i; + for (i = 0; i < len; i++) + { + if (arr[i] == val) + { + return TRUE; + } + } + return FALSE; +} + +/** + * 计算并返回指定数据区域crc的值 + * + * @param data: 待计算的数据区首地址 + * @param length: 待计算的数据区长度 + * + * @return crc计算的结果 + */ +uint16_t crc16_compute(const uint8_t *const data, uint16_t length) +{ + uint16_t crcVal = 0xffff; + const uint8_t *ptr = data; + + for (uint16_t i = 0; i < length; i++) + { + crcVal ^= (uint16_t)*ptr++; + + for (uint8_t j = 0; j < 8; j++) + { + if (crcVal & 0x0001) + { + crcVal = (crcVal >> 1) ^ 0x8401; + } + else + { + crcVal >>= 1; + } + } + } + + return crcVal; +} + +/** + * @brief Calculate the CRC32 value of a data buffer. + * + * This function calculates the CRC32 value of a data buffer using the lookup table method. + * The lookup table is generated using the polynomial 0xEDB88320, which is a common polynomial used in CRC32 calculations. + * + * @param data The data buffer to calculate the CRC32 value of. + * @param length The length of the data buffer in bytes. + * @return The CRC32 value of the data buffer. + */ +uint32_t crc32_compute(const uint8_t *const data, uint16_t length) +{ + generate_crc32_table(); + uint32_t crc = 0xFFFFFFFF; + for (size_t i = 0; i < length; i++) + { + crc = (crc >> 8) ^ crc32_table[(crc ^ data[i]) & 0xFF]; + } + return crc ^ 0xFFFFFFFF; +} + +/** + * @brief 计算 64 位 CRC 值 + * + * 根据给定的数据块和长度,使用 AES-CMAC 算法和 CRC32 算法计算 64 位 CRC 值。 + * 使用这个函数heap设置0x800 + * + * @param data 数据块指针 + * @param length 数据块长度 + * + * @return 返回计算得到的 64 位 CRC 值 + */ +uint64_t crc64_compute(const uint8_t *const data, const uint16_t length) +{ + uint8_t cmac_key[] = { + 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C}; // 密钥 + uint8_t dst[4]; + uint8_t mic[16]; + uint8_t *p; + uint32_t lo = 0, hi = 0; + AES_CMAC_CTX AesCmacCtx[1]; // 密钥扩展表 + AES_CMAC_Init(AesCmacCtx); // 完成密钥扩展表的初始化 + AES_CMAC_SetKey(AesCmacCtx, cmac_key); // 完成密钥扩展表数据 // 存放生成校验数据的数组 + AES_CMAC_Update(AesCmacCtx, data, length & 0xFF); // 完成数据的奇偶校验 + AES_CMAC_Final(mic, AesCmacCtx); // 生成16个字节的校验表 + uint32_t xor_vol = (uint32_t)((uint32_t)mic[3] << 24 | (uint32_t)mic[2] << 16 | (uint32_t)mic[1] << 8 | (uint32_t)mic[0]); // 取表4个字节作为校验码 + p = (uint8_t *)&xor_vol; + osel_memcpy(dst, p, 4); + lo = (uint32_t)dst[0] << 24 | (uint32_t)dst[1] << 16 | (uint32_t)dst[2] << 8 | (uint32_t)dst[3]; + hi = crc32_compute(data, length); + return ((uint64_t)hi << 32) | lo; +} + +/** + * 计算并返回指定数据区域异或的值 + * + * @param data: 待计算的数据区首地址 + * @param length: 待计算的数据区长度 + * + * @return 异或计算的结果 + */ +uint8_t xor_compute(const uint8_t *const data, uint16_t length) +{ + uint16_t i; + const uint8_t *ptr = data; + uint8_t xor = 0; + for (i = 0; i < length; i++) + { + xor ^= *ptr; + ptr++; + } + return xor; +} + +// 通过bit位获取置1个数量 +uint8_t get_bit_num(uint8_t bit) +{ + uint8_t num = 0; + while (bit) + { + if (bit & 0x01) + { + num++; + } + bit >>= 1; + } + return num; +} + +// 通过bit位获取置1的位置 +BOOL is_bit_set(int32_t x, int32_t k) +{ + int32_t mask = 1 << k; + return (x & mask) != 0; +} + +// 判断数组是否全是同一个值 +BOOL is_same_value(uint8_t *buf, uint16_t len, uint8_t value) +{ + uint16_t i; + for (i = 0; i < len; i++) + { + if (buf[i] != value) + { + return FALSE; + } + } + return TRUE; +} + +// 检查是否是闰年 +uint8_t is_leap_year(uint16_t year) +{ + return (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0); +} + +// 检查日期是否合法 +BOOL is_valid_date(uint8_t year, uint8_t month, uint8_t day) +{ + if (year < 1 || month < 1 || month > 12 || day < 1) + { + return false; + } + + uint8_t days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + // 如果是闰年,2月有29天 + if (is_leap_year(year)) + { + days_in_month[1] = 29; + } + + return day <= days_in_month[month - 1]; +} + +// 检查时间是否合法 +BOOL is_valid_time(uint8_t hour, uint8_t minute, uint8_t second) +{ + return (hour < 24) && + (minute < 60) && + (second < 60); +} + +// 检查日期和时间是否合法 +BOOL is_valid_datetime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) +{ + return is_valid_date(year, month, day) && is_valid_time(hour, minute, second); +} + +// 计算从1970年1月1日到给定年月日的天数 +uint32_t days_since_1970(uint16_t year, uint8_t month, uint8_t day) +{ + static const uint8_t month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + uint32_t days = 0; + uint16_t y = 1970; + + // 计算整年过去的天数 + while (y < year) + { + days += is_leap_year(y) ? 366 : 365; + y++; + } + + // 计算当前年份中过去的天数 + for (int32_t m = 0; m < month - 1; m++) + { + days += month_days[m]; + if (m == 1 && is_leap_year(year)) + { // 如果是2月且是闰年,多加一天 + days++; + } + } + + // 加上当前月的天数 + days += day - 1; // 因为day是从1开始的,而我们需要的是从0开始的偏移量 + + return days; +} + +// 将日期转换为秒数 +uint32_t date_to_seconds(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) +{ + uint32_t secs = 0; + uint32_t days = days_since_1970(year, month, day); + secs = days * 24 * 60 * 60; // 一天有24小时,每小时有60分钟,每分钟有60秒 + secs += hour * 60 * 60 + minute * 60 + second; + return secs; +} + +// 函数用于将秒数转换为日期和时间,年份4位 +void seconds_to_date(uint32_t total_seconds, rtc_date_t *date, rtc_time_t *time) +{ + uint16_t year = 1970; // Unix时间戳的起始年份 + uint8_t month = 1; + uint8_t day = 1; + uint32_t seconds = total_seconds; + uint8_t hours, minutes, secs; + + // 正确处理小时、分钟和秒 + hours = (seconds / 3600) % 24; + minutes = (seconds / 60) % 60; + secs = seconds % 60; + + // 计算日期 + uint32_t days = total_seconds / (24 * 3600); + seconds = total_seconds % (24 * 3600); // 更新seconds为剩余秒数 + + for (; days > 0; days--) + { + // 当前月份的天数 + uint8_t days_in_month = 31; + if (month == 2) + { + days_in_month = is_leap_year(year) ? 29 : 28; + } + else if (month == 4 || month == 6 || month == 9 || month == 11) + { + days_in_month = 30; + } + + if (++day > days_in_month) + { + day = 1; + if (++month > 12) + { + month = 1; + year++; + } + } + } + + // 将结果存储到结构体中 + date->year = year; + date->month = month; + date->day = day; + time->hour = hours; + time->minute = minutes; + time->second = secs; +} + +// 计算一年中的第几天 +uint16_t dayOfyear(uint16_t year, uint8_t month, uint8_t day) +{ + uint8_t month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + uint16_t total; + total = day; + if (month > 2 && is_leap_year(year)) + total += 1; + for (uint8_t i = 0; i < month - 1; i++) + { + total += month_days[i]; + } + return total; +} + +// 计算一年中的第几周 +uint16_t weekOfyear(uint16_t year, uint8_t month, uint8_t day) +{ + uint16_t day_of_year = dayOfyear(year, month, day); + return (day_of_year - 1) / 7 + 1; +} + +// 获取今天星期几 +uint8_t get_weekday(uint16_t year, uint8_t month, uint8_t day) +{ + uint8_t w = 0; + if (month == 1 || month == 2) + { + month += 12; + year--; + } + w = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7; + return w + 1; +} + +// 传入十六进制0x23 返回十进制23 +uint8_t hex_format_dec(uint8_t hex) +{ + char buf[4]; + osel_memset((uint8_t *)buf, 0, 4); + sprintf(buf, "%x", hex); + int32_t dec = 0; + int32_t weight = 1; + int32_t len = strlen(buf); + for (int32_t i = len - 1; i >= 0; i--) + { + if (buf[i] >= '0' && buf[i] <= '9') + { + dec += (buf[i] - '0') * weight; + } + else if (buf[i] >= 'A' && buf[i] <= 'F') + { + dec += (buf[i] - 'A' + 10) * weight; + } + else if (buf[i] >= 'a' && buf[i] <= 'f') + { + dec += (buf[i] - 'a' + 10) * weight; + } + weight *= 10; + } + return dec; +} + +// 传入十进制23 返回十六进制0x23 +uint8_t dec_format_hex(uint8_t dec) +{ + char buf[4]; + osel_memset((uint8_t *)buf, 0, 4); + sprintf(buf, "%d", dec); + uint8_t hex = 0; + uint8_t len = strlen(buf); + for (uint8_t i = 0; i < len; i++) + { + char c = buf[i]; + if (c >= '0' && c <= '9') + { + hex = hex * 16 + (c - '0'); + } + else + { + continue; + } + } + return hex; +} + +/** + * @brief 日期时间转时间戳 + * @param {rtc_date_t} date + * @param {rtc_time_t} time + * @return {*} + * @note 年份是从2000年开始的 + */ +uint32_t time2stamp(const rtc_date_t *const date, const rtc_time_t *const time) +{ + uint32_t result; + uint16_t year = date->year + 2000; + // (time->hour - 0) * 3600 中的0改成8是北京时间的时区 + result = (year - 1970) * 365 * 24 * 3600 + (_month_days[date->month - 1] + date->day - 1) * 24 * 3600 + (time->hour - 0) * 3600 + time->minute * 60 + time->second; + result += (date->month > 2 && (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) * 24 * 3600; // 闰月 + year -= 1969; + result += (year / 4 - year / 100 + year / 400) * 24 * 3600; // 闰年 + return result; +} + +/** + * @brief 时间戳转日期时间 + * @param {uint32_t} stamp + * @param {rtc_date_t} *date + * @param {rtc_time_t} *time + * @return {*} + * @note + */ +void stamp2time(uint32_t stamp, rtc_date_t *date, rtc_time_t *time) +{ + uint32_t days; + uint16_t leap_num; + + time->second = stamp % 60; + stamp /= 60; // 获取分 + time->minute = stamp % 60; + // stamp += 8 * 60; // 不需要加8小时 + stamp /= 60; // 获取小时 + time->hour = stamp % 24; + days = stamp / 24; + leap_num = (days + 365) / 1461; + if (((days + 366) % 1461) == 0) + { + date->year = (days / 366) + 1970 - 2000; + date->month = 12; + date->day = 31; + } + else + { + days -= leap_num; + date->year = (days / 365) + 1970 - 2000; + days %= 365; + days += 1; + if (((date->year % 4) == 0) && (days == 60)) + { + date->month = 2; + date->day = 29; + } + else + { + if (((date->year % 4) == 0) && (days > 60)) + --days; + for (date->month = 0; _days[date->month] < days; date->month++) + { + days -= _days[date->month]; + } + ++date->month; + date->day = days; + } + } +} + +/**************************排序**************************/ +static void swap(uint16_t *a, uint16_t *b) +{ + uint16_t t = *a; + *a = *b; + *b = t; +} + +static int32_t partition(uint16_t arr[], int32_t low, int32_t high) +{ + uint16_t pivot = arr[high]; + int32_t i = (low - 1); + for (int32_t j = low; j <= high - 1; j++) + { + if (arr[j] < pivot) + { + i++; + swap(&arr[i], &arr[j]); + } + } + swap(&arr[i + 1], &arr[high]); + return (i + 1); +} + +// 快速排序 +void quicksort(uint16_t arr[], int32_t low, int32_t high) +{ + if (low < high) + { + int32_t pi = partition(arr, low, high); + quicksort(arr, low, pi - 1); + quicksort(arr, pi + 1, high); + } +} + +// 插入排序 数据集小的时候效率高 +void insertion_sort(uint16_t arr[], uint16_t n) +{ + uint16_t i, j; + uint16_t key; + for (i = 1; i < n; i++) + { + key = arr[i]; + j = i; + + // 将大于key的元素向后移动一个位置 + while (j > 0 && arr[j - 1] > key) + { + arr[j] = arr[j - 1]; + j = j - 1; + } + arr[j] = key; + } +} + +/**************************线性拟合**************************/ +/** + * @brief 计算平均值 + * + * 根据给定的点集和指示标志,计算 X 或 Y 坐标的平均值。 + * + * @param points 点集指针 + * @param count 点集数量 + * @param isX 是否计算 X 坐标的平均值,为 1 则计算 X 坐标的平均值,为 0 则计算 Y 坐标的平均值 + * + * @return 返回计算得到的平均值 + */ +static float32 average(const point_t *points, int32_t count, int32_t isX) +{ + float32 sum = 0.0f; + for (int32_t i = 0; i < count; ++i) + { + sum += isX ? points[i].x : points[i].y; + } + return sum / count; +} + +/** + * @brief 计算线性回归函数值 + * + * 根据给定的 x 值和线性函数参数,计算并返回线性回归函数的值。 y = a * x + b + * + * @param x 输入的 x 值 + * @param param 线性函数参数结构体,包含斜率 a 和截距 b + * + * @return 线性回归函数的值 + */ +static float32 calculate_linear_regression_func(float32 x, linear_func_param_t param) +{ + return param.a * x + param.b; +} + +/** + * @brief 计算线性回归参数 + * + * 根据给定的数据点集合,计算线性回归的参数。 + * + * @param points 数据点集合指针 + * @param count 数据点数量 + * + * @return 线性回归参数结构体 + * + * @note 如果数据点数量少于2,则会输出错误日志并断言失败 + */ +linear_func_param_t calculate_linear_regression(const point_t *points, int32_t count) +{ + if (count < 2) + { + LOG_PRINT("参数points至少需要两组数据\n"); + DBG_ASSERT(FALSE __DBG_LINE); + } + + float32 xAverage = average(points, count, 1); + float32 yAverage = average(points, count, 0); + float32 sumXY = 0.0, sumXX = 0.0; + + for (int32_t i = 0; i < count; ++i) + { + float32 dX = points[i].x - xAverage; + float32 dY = points[i].y - yAverage; + sumXY += dX * dY; + sumXX += dX * dX; + } + + linear_func_param_t result; + result.a = sumXY / sumXX; + result.b = yAverage - result.a * xAverage; + return result; +} + +// 求线性度 公式 dYmax / Y * 100% +float32 get_linearity_value(const point_t *points, int32_t count, linear_func_param_t param) +{ + float32 dYMax = 0.0f; + for (int32_t i = 0; i < count; ++i) + { + float32 y = calculate_linear_regression_func(points[i].x, param); + float32 dY = ABS(y - points[i].y); + if (dY > dYMax) + dYMax = dY; + } + + float32 yFirst = calculate_linear_regression_func(points[0].x, param); + float32 yLast = calculate_linear_regression_func(points[count - 1].x, param); + return dYMax / ABS(yLast - yFirst) * 100; +} + +void s_curve_generator_init(s_curve_generator_t *gen, float32 start) +{ + gen->start = start; + gen->end = 0; + gen->current = start; + gen->index = 0; + for (uint16_t i = 0; i < S_CURVE_POINTS; i++) + { + gen->t[i] = (float32)i / (S_CURVE_POINTS - 1); + } +} + +float32 s_curve_generate_point(s_curve_generator_t *gen, float32 target) +{ + if (gen->end != target) + { + gen->start = gen->current; + gen->end = target; + gen->index = 0; + } + + if (gen->index == S_CURVE_POINTS) + { + gen->start = gen->current; + gen->index = 0; + } + + float32 t = gen->t[gen->index]; + float32 s_curve_value = gen->start + (gen->end - gen->start) * (10 * pow(t, 3) - 15 * pow(t, 4) + 6 * pow(t, 5)); + gen->index++; + gen->current = gen->start + (gen->end - gen->start) * ((float32)gen->index / S_CURVE_POINTS); + return s_curve_value; +} +/** + // 示例使用 +int main() +{ + point_t points[] = {{1, 2}, {2, 3}, {3, 4}}; // 示例点数组 + int count = sizeof(points) / sizeof(points[0]); + linear_func_param_t param = calculate_linear_regression(points, count); + printf("Linear Regression: y = %f * x + %f\n", param.a, param.b); + + float32 linearity = get_linearity_value(points, count, param); + printf("Linearity Value: %f%%\n", linearity); + + return 0; +} + */ + +/**************************线性拟合**************************/ diff --git a/User/system/lib/src/malloc.c b/User/system/lib/src/malloc.c new file mode 100644 index 0000000..0acb00d --- /dev/null +++ b/User/system/lib/src/malloc.c @@ -0,0 +1,338 @@ +/* + * @Author: + * @Date: 2023-04-11 08:50:25 + * @LastEditors: xxx + * @LastEditTime: 2023-06-15 10:23:12 + * @Description: + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ +#include "../inc/data_type_def.h" +#include "../inc/malloc.h" + +/***************************************************************************** +* 科普C语言 * +****************************************************************************** +*__align 作用 :对齐跟数据在内存中的位置有关,也就是内存字节对齐。有点 +* 难理解,需要通过以下举例来理解 +*__attribute__作用:可以设置函数属性、变量属性和类型属性。在这里我们用来绝 +* 对定位地址,即专门指点内存地址 +* +*实例一: +* __align(32) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); +* 意思:定义一个数组,数组大小为MEM2_MAX_SIZE,数组所占的空间能被32整除,其数组 +* 的起始内存地址为0X68000000。 +* 如果MEM2_MAX_SIZE为2,则数组内存空间大小为32字节;如果MEM2_MAX_SIZE为33,则数 +* 组内存空间大小为64字节。 +* +*实例二: +struct A{ + char a; + unsigned int b; + unsigned char c; + char d; +}; + +另一个结构体是: +structB{ + char a; + unsigned int b; + unsigned char c; + char d; +}__attribute__((align(8))); + +sizeof(A) = 12(内存空间大小12个字节) +sizeof(B) = 8(内存空间大小8个字节) +********************************************************************************/ +// 内存池(32字节对齐) +// 可控制的内存大小 +__attribute__((aligned(32))) uint8_t mem1base[MEM1_MAX_SIZE]; // 内部SRAM内存池 +__attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((section(".sram2"))); +// __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); // 外部SRAM内存池 +// 内存管理表 +// 可控制的内存控制块个数(每个内存块大小为32字节) +uint16_t mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; // 内部SRAM内存池MAP +uint16_t mem2mapbase[MEM2_ALLOC_TABLE_SIZE]; +// uint16_t mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000 + MEM2_MAX_SIZE))); // 外部SRAM内存池MAP + +// 内存管理参数 +// const 定义的变量的值是不允许改变的 +// 因为有内部SRAM和外部SRAM,所以用数组 +const uint32_t memtblsize[SRAMBANK] = {MEM1_ALLOC_TABLE_SIZE, MEM2_ALLOC_TABLE_SIZE}; // 内存表大小(即控制多少内存块) +const uint32_t memblksize[SRAMBANK] = {MEM1_BLOCK_SIZE, MEM2_BLOCK_SIZE}; // 内存分块大小(一块内存块占多少字节内存空间) +const uint32_t memsize[SRAMBANK] = {MEM1_MAX_SIZE, MEM2_MAX_SIZE}; // 内存池大小(即可以分配的内存空间大小) + +// 内存管理控制器 +struct _m_mallco_dev mallco_dev = + { + my_mem_init, // 内存初始化 + my_mem_perused, // 内存使用率 + mem1base, mem2base, // 内存池 + mem1mapbase, mem2mapbase, // 内存管理状态表 + 0, 0, // 内存管理未就绪 +}; + +/******************************************* + *函数功能 :复制内存里面的数据(从一个内存空间里拷贝数据到另一内存空间里) + *函数名 :mymemcpy + *函数参数 :void *des void *src uint32_t n + *函数返回值:void + *描述 : + * *des :目标地址 + * *src :源地址 + * n :要复制的长度(字节为单位) + *********************************************/ +void mymemcpy(void *des, void *src, uint32_t n) +{ + // 一般我们不会对要操作的参数指针进行操作 + // 而是通过一个变量指针作为中介,这样是为了出于安全保证 + uint8_t *xdes = des; + uint8_t *xsrc = src; + // 变量在++之前,则先用,后++ + // 变量在++之后,先++,后使用 + while (n--) + *xdes++ = *xsrc++; +} + +/***************************************************** + *函数功能 :设置内存(设置内存空间的值,一般用来对空间清0) + *函数名 :mymemset + *函数参数 :void *s uint8_t c uint32_t count + *函数返回值:void + *描述 : + * *s :内存首地址 + * c :要设置的值 + * count :需要设置的内存大小(字节为单位) + ******************************************************/ +void mymemset(void *s, uint8_t c, uint32_t count) +{ + // 一般我们不会对要操作的参数指针进行操作 + // 而是通过一个变量指针作为中介,这样是为了出于安全保证 + uint8_t *xs = s; + // 变量在++之前,则先用,后++ + // 变量在++之后,先++,后使用 + while (count--) + *xs++ = c; +} + +/***************************************************************** + *函数功能 :内存管理初始化 + *函数名 :my_mem_init + *函数参数 :uint8_t memx + *函数返回值:void + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * + * 其实所谓的初始化就是把内存池和内存表(他们的本质就是数组)清0 + ******************************************************************/ +void my_mem_init(uint8_t memx) +{ + mymemset(mallco_dev.memmap[memx], 0, memtblsize[memx] * 2); // 内存状态表数据清零 + mymemset(mallco_dev.membase[memx], 0, memsize[memx]); // 内存池所有数据清零 + mallco_dev.memrdy[memx] = 1; // 内存管理初始化OK,即内存池和内存表都清0了 +} + +/***************************************************************** + *函数功能 :获取内存使用率 + *函数名 :my_mem_perused + *函数参数 :uint8_t memx + *函数返回值:void + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * + * 是否占用是通过判断mem1mapbase或mem2mapbase的数组成员是否非0,如果 + * 非0则被占用,之中数组成员值有一定意义,代表占了多少块,如值为10,则表示 + * 该申请了连续10个内存块 + ******************************************************************/ +uint8_t my_mem_perused(uint8_t memx) +{ + uint32_t used = 0; + uint32_t i; + // memtblsize:内存表大小(一共内存块数) + // 遍历内存表数组 + for (i = 0; i < memtblsize[memx]; i++) + { + // mallco_dev.memmap[memx]:内存表数组 + // 取出每个成员判断是否非0 + // 非0则是用了 + if (mallco_dev.memmap[memx][i]) + used++; + } + + // 使用数量/数量总数*100 = 使用率 + return (used * 100) / (memtblsize[memx]); +} + +/***************************************************************** + *函数功能 :内存分配(内部调用)------确定在内存池的偏移量 + *函数名 :my_mem_malloc + *函数参数 :uint8_t memx,uint32_t size + *函数返回值:uint32_t + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * size:要分配的内存大小(字节) + * 返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址 + * + * 注意:内存表的遍历是从后往前的 + ******************************************************************/ +uint32_t my_mem_malloc(uint8_t memx, uint32_t size) +{ + signed long offset = 0; // 偏移量变量 + uint32_t nmemb; // 需要的内存块数 + uint32_t cmemb = 0; // 连续空内存块数,保证我们申请的内存块是连续的 + uint32_t i; + // 判断是否已执行了初始化 + if (!mallco_dev.memrdy[memx]) + mallco_dev.init(memx); // 未初始化,先执行初始化 + if (size == 0) + return 0XFFFFFFFF; // 不需要分配 + // 内存块数 = 申请空间大小(字节单位) / t一个内存块大小(字节单位) + nmemb = size / memblksize[memx]; // 获取需要分配的连续内存块数 + // 申请空间大小(字节单位) / t一个内存块大小(字节单位) != 0 + // 如果非0则要多申请一块内存块 + if (size % memblksize[memx]) + nmemb++; + // 内存表的遍历是从后往前的 + for (offset = memtblsize[memx] - 1; offset >= 0; offset--) // 搜索整个内存控制区 + { + // 判断该内存块是否被占用了 + if (!mallco_dev.memmap[memx][offset]) + cmemb++; // 连续空内存块数增加 + // 保证内存块的连续性 + else + cmemb = 0; // 连续内存块清零 + // 确定好所有内存块位置后 + if (cmemb == nmemb) // 找到了连续nmemb个空内存块 + { + for (i = 0; i < nmemb; i++) // 标注内存块非空 + { + // 开始往内存块在内存表数组的位置标记该内存块被占用 + mallco_dev.memmap[memx][offset + i] = nmemb; + } + + // 确定申请空间在内存池数组位置 在内存表数组位置*一个内存块大小(32字节) + return (offset * memblksize[memx]); // 返回偏移地址 + } + } + return 0XFFFFFFFF; // 未找到符合分配条件的内存块 +} + +/***************************************************************** + *函数功能 :释放内存(内部调用)------内存池偏移量清除申请空间在内存表的占用标志 + *函数名 :my_mem_free + *函数参数 :uint8_t memx,uint32_t offset + *函数返回值:uint32_t + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * size:内存地址偏移(字节)--------也就是在内存池数组的位置 + * 返回值:0,释放成功;1,释放失败; + * + ******************************************************************/ +uint8_t my_mem_free(uint8_t memx, uint32_t offset) +{ + int i; + int index; + int nmemb; + + // 判断是否初始化 + if (!mallco_dev.memrdy[memx]) // 未初始化,先执行初始化 + { + mallco_dev.init(memx); + return 1; // 未初始化 + } + + // 判断这个偏移量是否超出了内存池的大小 + if (offset < memsize[memx]) // 偏移在内存池内. + { + // 内存表偏移量 = 内存池偏移量/一块内存块大小 + index = offset / memblksize[memx]; // 偏移所在内存块号码 + // 内存表数组成员的值就是申请的块数 + nmemb = mallco_dev.memmap[memx][index]; // 内存块数量 + + for (i = 0; i < nmemb; i++) // 内存块清零 + { + // 清除申请空间在内存表的标记 + mallco_dev.memmap[memx][index + i] = 0; + } + return 0; + } + else + return 1; // 偏移超区了. +} + +/***************************************************************** + *函数功能 :分配内存(外部调用) + *函数名 :mymalloc + *函数参数 :uint8_t memx,uint32_t size + *函数返回值:void * + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * size:内存大小(字节) + * 返回值:分配到的内存首地址 + ******************************************************************/ +void *mymalloc(uint8_t memx, uint32_t size) +{ + uint32_t offset; // 在内存池数组的偏移量变量 + // 获取在内存池数组的偏移量 + offset = my_mem_malloc(memx, size); + // 如果申请错误,则返回空地址 + if (offset == 0XFFFFFFFF) + return NULL; + // 如果申请成功,则返回申请空间首地址 + else + return (void *)((uint32_t)mallco_dev.membase[memx] + offset); +} + +/***************************************************************** + *函数功能 :释放内存(外部调用) + *函数名 :myfree + *函数参数 :uint8_t memx,void *ptr + *函数返回值:uint32_t + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * ptr :要释放的内存空间首地址 + ******************************************************************/ +void myfree(uint8_t memx, void *ptr) +{ + uint32_t offset; + uint32_t n; // 该要释放的空间的空间大小 + if (ptr == NULL) + return; // 地址为0. + // 确定申请空间的内存池偏移量 + offset = (uint32_t)ptr - (uint32_t)mallco_dev.membase[memx]; + // 空间占内存池空间的大小 + n = mallco_dev.memmap[memx][offset / memblksize[memx]] * memblksize[memx]; + // 释放内存池对应空间的数据 + mymemset(ptr, 0, n); + // 释放内存表 + my_mem_free(memx, offset); // 释放内存 +} + +/***************************************************************** + *函数功能 :重新分配内存(外部调用) + *函数名 :myfree + *函数参数 :uint8_t memx,void *ptr + *函数返回值:uint32_t + *描述 : + * memx:所属内存块,即是内部SRAM还是外部SRAM的内存块 + * ptr :旧内存空间地址首地址 + * size:要重新分配的内存大小(字节) + ******************************************************************/ +void *myrealloc(uint8_t memx, void *ptr, uint32_t size) +{ + uint32_t offset; + + // 申请一个新的空间 + offset = my_mem_malloc(memx, size); + if (offset == 0XFFFFFFFF) + return NULL; + else + { + // 把旧空间的数据复制到新空间里 + mymemcpy((void *)((uint32_t)mallco_dev.membase[memx] + offset), ptr, size); // 拷贝旧内存内容到新内存 + // 删掉旧空间 + myfree(memx, ptr); // 释放旧内存 + // 返回新空间地址 + return (void *)((uint32_t)mallco_dev.membase[memx] + offset); // 返回新内存首地址 + } +} diff --git a/User/system/lib/src/mlist.c b/User/system/lib/src/mlist.c new file mode 100644 index 0000000..38db5e4 --- /dev/null +++ b/User/system/lib/src/mlist.c @@ -0,0 +1,149 @@ +/* + * @Author: + * @Date: 2023-04-04 08:39:23 + * @LastEditors: xxx + * @LastEditTime: 2023-04-21 12:08:31 + * @Description: + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "../inc/mlist.h" + +#ifndef NULL +#define NULL ((void *)0) +#endif + +void list_init(list_head_t *const ptr) +{ + (ptr)->next = (ptr); + (ptr)->prev = (ptr); +} + +/* + * 在两个连续的链表元素中插入一个新的元素 + */ +static void __list_add(list_head_t *const new_entry, + list_head_t *const prev, + list_head_t *const next) +{ + next->prev = new_entry; + new_entry->next = next; + new_entry->prev = prev; + prev->next = new_entry; +} + +/** + * 在指定的位置之前插入一个元素 + */ +void list_insert_forwards(list_head_t *const new_entry, list_head_t *const pos) +{ + __list_add(new_entry, pos->prev, pos); +} + +/** + * 在指定的位置之后插入一个元素 + */ +void list_insert_backwards(list_head_t *const new_entry, list_head_t *const pos) +{ + __list_add(new_entry, pos, pos->next); +} + +/** + * 在链表尾部插入新的元素 + */ +void list_add_to_tail(list_head_t *const new_entry, list_head_t *const list) +{ + __list_add(new_entry, list->prev, list); +} + +/** + * 在链表头后插入新的元素 + */ +void list_add_to_head(list_head_t *const new_entry, list_head_t *const list) +{ + __list_add(new_entry, list, list->next); +} + +static void __list_del(list_head_t *const prev, list_head_t *const next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * 删除指定的链表元素 + */ +void list_del(list_head_t *const elem) +{ + __list_del(elem->prev, elem->next); + elem->next = (list_head_t *)NULL; + elem->prev = (list_head_t *)NULL; +} + +/* + * 删除并返回链表尾元素 + */ +list_head_t *list_curtail(const list_head_t *const head) +{ + list_head_t *tail = head->prev; + list_del(tail); + return tail; +} + +/** + * 判断链表是否为空 + */ +bool list_empty(const list_head_t *const head) +{ + return (((head)->next == head) || (head->next == NULL)); +} + +/** + * 获取链表第一个元素 + */ +list_head_t *list_first_elem_look(const list_head_t *const head) +{ + if (!list_empty(head)) + { + return head->next; + } + return NULL; +} + +/** + * 从制定位置后取出并删除该元素 + */ +list_head_t *list_next_elem_get(const list_head_t *const pos) +{ + if (pos == NULL) + { + return NULL; + } + + list_head_t *temp = (pos)->next; + if (temp != NULL) + { + list_del(temp); + } + + return temp; +} + +/** + * 将链表元素从一个队列移出,再添加到另外一个队列中 + */ +void list_move_to_another_head(list_head_t *const elem, list_head_t *const head) +{ + __list_del(elem->prev, elem->next); + list_add_to_head(elem, head); +} + +/** + * 将元素从一个队列中取出,然后再放入另外一个队列的尾部; + */ +void list_move_to_another_tail(list_head_t *const elem, list_head_t *const head) +{ + __list_del(elem->prev, elem->next); + list_add_to_tail(elem, head); +} diff --git a/User/system/lib/src/pbuf.c b/User/system/lib/src/pbuf.c new file mode 100644 index 0000000..24c6906 --- /dev/null +++ b/User/system/lib/src/pbuf.c @@ -0,0 +1,401 @@ +/* + * pbuf.c + * + * Created on: 2022年12月5日 + * Author: xushenghao + */ +#include "../inc/debug.h" +#include "../inc/pbuf.h" +#include "../inc/osel_arch.h" +#define PBUF_DATA_SIZE(pbuf) (pbuf->end - pbuf->head) + +typedef struct _pbuf_type_t +{ + uint8_t type; + uint16_t size; + uint8_t num; +} pbuf_type_t; + +static list_head_t pbuf_freez_blocks[PBUF_TYPE_MAX_NUM]; +uint8_t pbuf_cnt[PBUF_TYPE_MAX_NUM] = {0}; + +#if PBUF_DBG_EN > 0 +static pbuf_t *pbuf_used_p[PBUF_TYPE_MAX_NUM][PBUF_NUM_MAX]; +#endif + +static void poly_type_pbuf_init(uint8_t type, uint16_t pkt_len, uint8_t num) +{ + void *mem = NULL; + pbuf_t *pbuf = NULL; + + list_init(&pbuf_freez_blocks[type]); + + if (num == 0) + { + return; + } + + mem = osel_mem_alloc((sizeof(pbuf_t) + pkt_len) * num); + DBG_ASSERT(mem != NULL __DBG_LINE); + + for (uint8_t i = 0; i < num; i++) + { + pbuf = (pbuf_t *)((uint8_t *)mem + i * (sizeof(pbuf_t) + pkt_len)); + pbuf->head = (uint8_t *)pbuf + sizeof(pbuf_t); + pbuf->end = (uint8_t *)pbuf + sizeof(pbuf_t) + pkt_len; + pbuf->data_p = pbuf->head; + list_add_to_head(&pbuf->list, &pbuf_freez_blocks[type]); + } + + pbuf_cnt[type] = num; +} + +void pbuf_initz(void) +{ + poly_type_pbuf_init(SMALL_PBUF, + SMALL_PBUF_BUFFER_SIZE, + SMALL_PBUF_NUM); + + poly_type_pbuf_init(MEDIUM_PBUF, + MEDIUM_PBUF_BUFFER_SIZE, + MEDIUM_PBUF_NUM); + + poly_type_pbuf_init(LARGE_PBUF, + LARGE_PBUF_BUFFER_SIZE, + LARGE_PBUF_NUM); +} + +static pbuf_type_t search_free_pbuf(uint8_t pbuf_type) +{ + pbuf_type_t free_pbuf_temp; + + switch (pbuf_type) + { // 没有break让代码顺序执行 + case SMALL_PBUF: + if (!list_empty(&pbuf_freez_blocks[SMALL_PBUF])) + { + free_pbuf_temp.type = SMALL_PBUF; + free_pbuf_temp.size = SMALL_PBUF_BUFFER_SIZE; + free_pbuf_temp.num = SMALL_PBUF_NUM; + } + break; + case MEDIUM_PBUF: + if (!list_empty(&pbuf_freez_blocks[MEDIUM_PBUF])) + { + free_pbuf_temp.type = MEDIUM_PBUF; + free_pbuf_temp.size = MEDIUM_PBUF_BUFFER_SIZE; + free_pbuf_temp.num = MEDIUM_PBUF_NUM; + } + break; + case LARGE_PBUF: + if (!list_empty(&pbuf_freez_blocks[LARGE_PBUF])) + { + free_pbuf_temp.type = LARGE_PBUF; + free_pbuf_temp.size = LARGE_PBUF_BUFFER_SIZE; + free_pbuf_temp.num = LARGE_PBUF_NUM; + } + break; + default: + free_pbuf_temp.type = PBUF_TYPE_INVALID; + } + return free_pbuf_temp; +} + +static pbuf_type_t pbuf_type_select(uint16_t size) +{ + pbuf_type_t free_pbuf; + if (size <= SMALL_PBUF_BUFFER_SIZE) + { + free_pbuf = search_free_pbuf(SMALL_PBUF); + } + else if ((size > SMALL_PBUF_BUFFER_SIZE) && (size <= MEDIUM_PBUF_BUFFER_SIZE)) + { + free_pbuf = search_free_pbuf(MEDIUM_PBUF); + } + else if ((size > MEDIUM_PBUF_BUFFER_SIZE) && (size <= LARGE_PBUF_BUFFER_SIZE)) + { + free_pbuf = search_free_pbuf(LARGE_PBUF); + } + else + { + DBG_ASSERT(false __DBG_LINE); + } + + if (free_pbuf.type == PBUF_TYPE_INVALID) + { + // DBG_ASSERT(false __DBG_LINE); + } + + return free_pbuf; +} + +#if PBUF_DBG_EN > 0 +static void add_to_pbuf_used_ptr(pbuf_t *pbuf, pbuf_type_t pbuf_type) +{ + // hal_int_state_t s; + // HAL_ENTER_CRITICAL(s); + for (uint8_t i = 0; i < PBUF_NUM_MAX; i++) + { + if (pbuf_used_p[pbuf_type.type][i] == NULL) + { + pbuf_used_p[pbuf_type.type][i] = pbuf; + break; + } + } + // HAL_EXIT_CRITICAL(s); +} +#endif + +pbuf_t *pbuf_allocz(uint16_t size _PLINE1_) +{ + + pbuf_type_t avilable_pbuf_type; + pbuf_t *pbuf = NULL; + // hal_int_state_t s; + // HAL_ENTER_CRITICAL(s); + avilable_pbuf_type = pbuf_type_select(size); + if (avilable_pbuf_type.type == PBUF_TYPE_INVALID) + { + return NULL; + } + pbuf = list_entry_decap(&pbuf_freez_blocks[avilable_pbuf_type.type], + pbuf_t, + list); + pbuf_cnt[avilable_pbuf_type.type]--; + // HAL_EXIT_CRITICAL(s); + + DBG_ASSERT(pbuf != NULL __DBG_LINE); + if (pbuf == NULL) + { + return NULL; + } + + osel_memset(pbuf->head, 0, avilable_pbuf_type.size); + osel_memset((uint8_t *)&pbuf->attri, 0, sizeof(pbuf->attri)); + + // HAL_ENTER_CRITICAL(s); + pbuf->used = true; + pbuf->data_len = 0; + pbuf->data_p = pbuf->head; + list_init(&pbuf->list); + // HAL_EXIT_CRITICAL(s); + +#if PBUF_DBG_EN > 0 + pbuf->alloc_line = line; + pbuf->free_line = 0; + add_to_pbuf_used_ptr(pbuf, avilable_pbuf_type); +#endif + return pbuf; +} + +static pbuf_type_t get_pbuf_type(pbuf_t **pbuf) +{ + pbuf_type_t current_pbuf_type; + uint16_t size_temp; + + DBG_ASSERT(*pbuf != NULL __DBG_LINE); + DBG_ASSERT(pbuf != NULL __DBG_LINE); + + size_temp = (*pbuf)->end - (*pbuf)->head; + + if (size_temp == SMALL_PBUF_BUFFER_SIZE) + { + current_pbuf_type.type = SMALL_PBUF; + current_pbuf_type.size = SMALL_PBUF_BUFFER_SIZE; + current_pbuf_type.num = SMALL_PBUF_NUM; + } + + else if (size_temp == MEDIUM_PBUF_BUFFER_SIZE) + { + current_pbuf_type.type = MEDIUM_PBUF; + current_pbuf_type.size = MEDIUM_PBUF_BUFFER_SIZE; + current_pbuf_type.num = MEDIUM_PBUF_NUM; + } + + else if (size_temp == LARGE_PBUF_BUFFER_SIZE) + { + current_pbuf_type.type = LARGE_PBUF; + current_pbuf_type.size = LARGE_PBUF_BUFFER_SIZE; + current_pbuf_type.num = LARGE_PBUF_NUM; + } + else + { + DBG_ASSERT(false __DBG_LINE); + } + + return current_pbuf_type; +} + +#if PBUF_DBG_EN > 0 +static void delete_from_pbuf_used_ptr(pbuf_t **pbuf, pbuf_type_t pbuf_type_temp) +{ + // hal_int_state_t s; + // HAL_ENTER_CRITICAL(s); + + for (uint8_t i = 0; i < PBUF_NUM_MAX; i++) + { + if (pbuf_used_p[pbuf_type_temp.type][i] == *pbuf) + { + pbuf_used_p[pbuf_type_temp.type][i] = NULL; + break; + } + } + + // HAL_EXIT_CRITICAL(s); +} +#endif + +void pbuf_freez(pbuf_t **const pbuf _PLINE2_) +{ + + pbuf_type_t pbuf_type; + // hal_int_state_t s; + DBG_ASSERT(*pbuf != NULL __DBG_LINE); + DBG_ASSERT(pbuf != NULL __DBG_LINE); + DBG_ASSERT((*pbuf)->used == true __DBG_LINE); // 用于检测嵌套的重复释放 + + if (pbuf == NULL || *pbuf == NULL || (*pbuf)->used == false) + { + return; + } + + pbuf_type = get_pbuf_type(pbuf); + +#if PBUF_DBG_EN > 0 + delete_from_pbuf_used_ptr(pbuf, pbuf_type); + (*pbuf)->free_line = line; +#endif + osel_memset((*pbuf)->head, 0, pbuf_type.size); + osel_memset((uint8_t *)&((*pbuf)->attri), 0, sizeof((*pbuf)->attri)); + + // HAL_ENTER_CRITICAL(s); + + if ((*pbuf)->data_len > ((*pbuf)->end - (*pbuf)->head)) + { + DBG_ASSERT(false __DBG_LINE); + } + + (*pbuf)->used = false; + (*pbuf)->data_len = 0; + (*pbuf)->data_p = (*pbuf)->head; + list_init(&(*pbuf)->list); + + list_add_to_tail(&(*pbuf)->list, &pbuf_freez_blocks[pbuf_type.type]); + +#if PBUF_DBG_EN > 0 + uint8_t list_cnt = 0; + list_count(&pbuf_freez_blocks[pbuf_type.type], list_cnt); + DBG_ASSERT(list_cnt != 0 __DBG_LINE); +#endif + + pbuf_cnt[pbuf_type.type]++; + +#if PBUF_DBG_EN > 0 + (*pbuf)->alloc_line = 0; +#endif + + // HAL_EXIT_CRITICAL(s); + + *pbuf = NULL; +} + +uint8_t *pbuf_skip_datap_forward(pbuf_t *const pbuf, uint8_t len) +{ + uint8_t *datap_tmp = NULL; + // hal_int_state_t s; + DBG_ASSERT(pbuf != NULL __DBG_LINE); + if (pbuf == NULL) + { + return NULL; + } + + // HAL_ENTER_CRITICAL(s); + + if ((pbuf->data_p + len) > pbuf->end) + { + // HAL_EXIT_CRITICAL(s); + return NULL; + } + + pbuf->data_p += len; + datap_tmp = pbuf->data_p; + + // HAL_EXIT_CRITICAL(s); + return datap_tmp; +} + +uint8_t *pbuf_skip_datap_backward(pbuf_t *const pbuf, uint8_t len) +{ + uint8_t *datap_tmp = NULL; + // hal_int_state_t s; + DBG_ASSERT(pbuf != NULL __DBG_LINE); + if (pbuf == NULL) + { + return NULL; + } + + // HAL_ENTER_CRITICAL(s); + + if ((pbuf->data_p - len) < pbuf->head) + { + // HAL_EXIT_CRITICAL(s); + return NULL; + } + + pbuf->data_p -= len; + datap_tmp = pbuf->data_p; + + // HAL_EXIT_CRITICAL(s); + return datap_tmp; +} + +bool pbuf_copy_data_in(pbuf_t *const pbuf, const uint8_t *const src, uint8_t len) +{ + DBG_ASSERT(pbuf != NULL __DBG_LINE); + if (pbuf == NULL) + { + return false; + } + // hal_int_state_t s; + // HAL_ENTER_CRITICAL(s); + + if ((pbuf->data_p + len) > pbuf->end) + { + // HAL_EXIT_CRITICAL(s); + return false; + } + else + { + osel_memcpy(pbuf->data_p, src, len); + pbuf->data_p += len; + pbuf->data_len += len; + + // HAL_EXIT_CRITICAL(s); + return true; + } +} + +bool pbuf_copy_data_out(uint8_t *const dst, pbuf_t *const pbuf, uint8_t len) +{ + DBG_ASSERT(pbuf != NULL __DBG_LINE); + if (pbuf == NULL) + { + return false; + } + // hal_int_state_t s; + // HAL_ENTER_CRITICAL(s); + + if ((pbuf->data_p + len) > pbuf->end) + { + // HAL_EXIT_CRITICAL(s); + return false; + } + else + { + osel_memcpy(dst, pbuf->data_p, len); + pbuf->data_p += len; + + // HAL_EXIT_CRITICAL(s); + return true; + } +} diff --git a/User/system/lib/src/sqqueue.c b/User/system/lib/src/sqqueue.c new file mode 100644 index 0000000..dc5d1a8 --- /dev/null +++ b/User/system/lib/src/sqqueue.c @@ -0,0 +1,450 @@ +/** + * @file sqqueue.c + * @author xxx + * @date 2023-06-25 13:07:02 + * @brief 提供循环队列功能 + * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "../inc/sqqueue.h" +#include "../inc/osel_arch.h" + +#define SQQ_ENTRY_SIZE (queue_ptr->entry_size) +#define SQQ_LEN (queue_ptr->sqq_len) + +/** + * @brief 初始化队列控制结构体 + * @param p_this 队列控制结构体的指针 + * @param entry_size 队列中每个元素的大小 + * @param sqq_len 队列的最大长度 + * @return {BOOL} 初始化成功返回true,否则返回false + * @note 此函数用于初始化队列控制结构体,确保队列有足够的空间存储元素 + */ +static BOOL sqqueue_init(sqqueue_ctrl_t *const p_this, + uint8_t entry_size, + uint16_t sqq_len) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + sqqueue_t *queue_ptr = &(p_this->sqq); + + if (queue_ptr != NULL) + { + queue_ptr->entry_size = entry_size; + queue_ptr->sqq_len = sqq_len + 1; + if (queue_ptr->base != NULL) + { + osel_mem_free(queue_ptr->base); + queue_ptr->base = NULL; + } + + queue_ptr->base = (uint8_t *)osel_mem_alloc(SQQ_LEN * SQQ_ENTRY_SIZE); + if (queue_ptr->base == NULL) + { + return FALSE; + } + queue_ptr->front = 0; + queue_ptr->rear = 0; + + return TRUE; + } + + return FALSE; +} + +/** + * @brief 销毁顺序队列 + * + * 销毁给定的顺序队列,释放其占用的内存空间。 + * + * @param p_this 顺序队列控制块指针 + */ +void sqqueue_dinit(sqqueue_ctrl_t *const p_this) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + sqqueue_t *queue_ptr = &(p_this->sqq); + + if (queue_ptr != NULL) + { + if (queue_ptr->base != NULL) + { + osel_mem_free(queue_ptr->base); + queue_ptr->base = NULL; + } + } +} + +/** + * @brief 获取队列的长度 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @return {uint16_t} 队列的长度 + * @note 此函数用于获取队列的长度,包括队列中元素的数量和最大长度 + */ +static uint16_t sqqueue_length(const sqqueue_ctrl_t *const p_this) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + const sqqueue_t *const queue_ptr = &(p_this->sqq); + uint16_t length = 0; + if (p_this != NULL) + { + length = (queue_ptr->rear + SQQ_LEN - queue_ptr->front); + + if (length >= SQQ_LEN) + { + length -= SQQ_LEN; + } + } + + return length; +} + +/** + * @brief 获取队列的长度 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @return {uint16_t} 队列的长度 + * @note 此函数用于获取队列的长度,包括队列中元素的数量和最大长度 + */ +static BOOL sqqueue_full(const sqqueue_ctrl_t *const p_this) +{ + uint16_t rear = 0; + + DBG_ASSERT(p_this != NULL __DBG_LINE); + + if (p_this != NULL) + { + const sqqueue_t *const queue_ptr = &(p_this->sqq); + rear = queue_ptr->rear + 1; + if (rear >= SQQ_LEN) + { + rear -= SQQ_LEN; + } + if (rear == queue_ptr->front) + { + return TRUE; + } + } + + return FALSE; +} + +/** + * @brief 将元素添加到队列中 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @param {void} *e 要添加的元素 + * @return {BOOL} 添加成功返回true,否则返回false + * @note 此函数用于将元素添加到队列中,确保队列有足够的空间存储元素 + */ +static BOOL enter_sqqueue(sqqueue_ctrl_t *const p_this, const void *const e) +{ + uint16_t rear = 0; + sqqueue_t *queue_ptr = &(p_this->sqq); + + if ((p_this != NULL) && (e != NULL)) + { + rear = queue_ptr->rear + 1; + if (rear >= SQQ_LEN) + { + rear -= SQQ_LEN; + } + + if (rear == queue_ptr->front) + { + return FALSE; + } + + /* 根据e的长度进行内存拷贝 */ + DBG_ASSERT(queue_ptr->rear != SQQ_LEN __DBG_LINE); + osel_memcpy(queue_ptr->base + (queue_ptr->rear * SQQ_ENTRY_SIZE), + e, + SQQ_ENTRY_SIZE); + queue_ptr->rear = rear; + + return TRUE; + } + return FALSE; +} + +/** + * @brief 将字符串添加到队列中 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @param {const void} *string 要添加的字符串 + * @param {uint16_t} cnt 要添加的字符串的长度 + * @return {BOOL} 添加成功返回true,否则返回false + * @note 此函数用于将字符串添加到队列中,确保队列有足够的空间存储字符串 + */ +static BOOL string_enter_sqqueue(sqqueue_ctrl_t *const p_this, + const void *const string, + uint16_t cnt) +{ + uint16_t rear = 0; + uint16_t length = 0; + sqqueue_t *queue_ptr = &(p_this->sqq); + + if ((p_this != NULL) && (string != NULL)) + { + /* 判断是否超出队列长度 */ + length = sqqueue_length(p_this); // 已有元素个数 + if (length == 0xFFFF) + { + return FALSE; + } + + length = (SQQ_LEN - 1) - length; // 可写入个数 + if (length < cnt) + { + return FALSE; + } + + rear = queue_ptr->rear + cnt; + if (rear >= SQQ_LEN) + { + rear -= SQQ_LEN; + uint8_t half = SQQ_LEN - queue_ptr->rear; + osel_memcpy(queue_ptr->base + (queue_ptr->rear * SQQ_ENTRY_SIZE), + string, half * SQQ_ENTRY_SIZE); + uint8_t *half_p = (uint8_t *)string; + osel_memcpy(queue_ptr->base, (uint8_t *)&half_p[half], rear * SQQ_ENTRY_SIZE); + } + else + { + osel_memcpy(queue_ptr->base + (queue_ptr->rear * SQQ_ENTRY_SIZE), + string, SQQ_ENTRY_SIZE * cnt); + } + + queue_ptr->rear = rear; + + return TRUE; + } + return FALSE; +} + +/** + * @brief 从队列中删除元素 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @return {void *} 删除的元素,如果队列为空则返回NULL + * @note 此函数用于从队列中删除元素,确保队列中有足够的空间存储元素 + */ +static void *delete_sqqueue(sqqueue_ctrl_t *const p_this) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + uint16_t front = 0; + + sqqueue_t *queue_ptr = NULL; + + if (p_this != NULL) + { + void *p_elem = NULL; + queue_ptr = &(p_this->sqq); + if (queue_ptr->rear == queue_ptr->front) + { + return NULL; + } + /* 根据元素类型大小计算出偏移量,得到该元素首地址 */ + p_elem = (void *)((queue_ptr->base) + (queue_ptr->front * SQQ_ENTRY_SIZE)); + front = queue_ptr->front + 1; + if (front >= SQQ_LEN) + { + front -= SQQ_LEN; + } + queue_ptr->front = front; + + return p_elem; + } + return NULL; +} + +/** + * @brief 撤销队列中的一个元素 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @return {*} 返回被撤销的元素,如果队列为空则返回NULL + * @note + */ +static void *revoke_sqqueue(sqqueue_ctrl_t *const p_this) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + uint16_t rear = 0; + sqqueue_t *queue_ptr = NULL; + + if (p_this != NULL) + { + void *p_elem = NULL; + + queue_ptr = &(p_this->sqq); + if (queue_ptr->rear == queue_ptr->front) + { + return NULL; + } + + rear = queue_ptr->rear; + if (rear == 0) + { + rear = SQQ_LEN - 1; + } + else + { + rear--; + } + queue_ptr->rear = rear; + /* 根据元素类型大小计算出偏移量,得到该元素首地址*/ + p_elem = (void *)((queue_ptr->base) + (queue_ptr->rear * SQQ_ENTRY_SIZE)); + + return p_elem; + } + return NULL; +} + +/** + * @brief 清空队列 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @return {void} + * @note + */ +static void clear_sqq(sqqueue_ctrl_t *const p_this) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + + sqqueue_t *queue_ptr = &(p_this->sqq); + if (p_this != NULL) + { + queue_ptr->front = 0; + queue_ptr->rear = 0; + } +} + +/** + * @brief 遍历队列 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @param {void (*)(const void *e)} vi 遍历函数,参数为队列中的一个元素 + * @return {void} + * @note + */ +static void traverse(sqqueue_ctrl_t *const p_this, void (*vi)(const void *e)) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + sqqueue_t *queue_ptr = NULL; + uint16_t i = 0; + + if (p_this != NULL) + { + queue_ptr = &(p_this->sqq); + + if (queue_ptr->rear == queue_ptr->front) + { + return; + } + + i = queue_ptr->front; + while (i != queue_ptr->rear) + { + vi((void *)((queue_ptr->base) + (i * SQQ_ENTRY_SIZE))); + if (++i >= SQQ_LEN) + { + i = 0; + } + } + } +} + +/** + * @brief 从队列中删除一个元素 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @param {uint16_t} offset_to_front 要删除的元素在队列中的偏移量,从队头开始 + * @return {void} + * @note + */ +static void qremove(sqqueue_ctrl_t *const p_this, uint16_t offset_to_front) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + sqqueue_t *queue_ptr = NULL; + uint16_t i = 0; + + if (p_this != NULL) + { + queue_ptr = &(p_this->sqq); + DBG_ASSERT(offset_to_front < SQQ_LEN __DBG_LINE); + + if (queue_ptr->rear == queue_ptr->front) + { + return; + } + + uint16_t j = 0; + + for (i = offset_to_front; i > 0; i--) + { + /* 定位待删除元素在队列中的位置 */ + j = queue_ptr->front + i; + + if (j >= SQQ_LEN) + { + j -= SQQ_LEN; + } + + if (j == 0) // 在翻转位置特殊处理拷贝的源地址 + { + osel_memcpy(queue_ptr->base + (0 * SQQ_ENTRY_SIZE), + queue_ptr->base + ((SQQ_LEN - 1) * SQQ_ENTRY_SIZE), + SQQ_ENTRY_SIZE); + } + else + { + osel_memcpy(queue_ptr->base + (j * SQQ_ENTRY_SIZE), + queue_ptr->base + ((j - 1) * SQQ_ENTRY_SIZE), + SQQ_ENTRY_SIZE); + } + } + + /* 减少队列长度 */ + uint16_t front = queue_ptr->front + 1; + if (front >= SQQ_LEN) + { + front -= SQQ_LEN; + } + + queue_ptr->front = front; + } +} + +/** + * @brief 初始化队列控制结构体 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @param {uint8_t} entry_size 队列中每个元素的类型大小 + * @param {uint16_t} sqq_len 队列的最大长度 + * @return {BOOL} 初始化成功返回true,否则返回false + * @note + */ +BOOL sqqueue_ctrl_init(sqqueue_ctrl_t *const p_this, + uint8_t entry_size, + uint16_t sqq_len) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + + if (p_this != NULL) + { + if (sqqueue_init(p_this, entry_size, sqq_len) != FALSE) + { + p_this->enter = enter_sqqueue; + p_this->string_enter = string_enter_sqqueue; + p_this->del = delete_sqqueue; + p_this->revoke = revoke_sqqueue; + p_this->get_len = sqqueue_length; + p_this->full = sqqueue_full; + p_this->clear_sqq = clear_sqq; + p_this->traverse = traverse; + p_this->remove = qremove; + return TRUE; + } + } + return FALSE; +} + +/** + * @brief 销毁队列控制结构体 + * @param {sqqueue_ctrl_t} *p_this 队列控制结构体的指针 + * @return {void} + * @note + */ +void sqqueue_ctrl_dinit(sqqueue_ctrl_t *const p_this) +{ + DBG_ASSERT(p_this != NULL __DBG_LINE); + sqqueue_dinit(p_this); +} diff --git a/User/system/lib/src/storage.c b/User/system/lib/src/storage.c new file mode 100644 index 0000000..cf67317 --- /dev/null +++ b/User/system/lib/src/storage.c @@ -0,0 +1,252 @@ +#include "storage.h" + +/** + * @brief 根据索引查找存储节点 + * + * 在给定的存储结构中,根据索引查找对应的存储节点。 + * + * @param storage 存储结构指针 + * @param index 要查找的索引值 + * + * @return 指向找到的存储节点的指针,如果未找到则返回 NULL + */ +static storage_node_t *storage_node_find(storage_t *storage, uint16_t index) +{ + storage_node_t *node = NULL; + for (clist_node_t *p = storage->head; p != NULL; p = p->Next) + { + node = (storage_node_t *)p->data; + if (node->index == index) + { + break; + } + else + { + node = NULL; + } + } + + return node; +} +/** + * @brief 初始化存储结构 + * + * 根据给定的基地址和页大小,初始化存储结构。 + * + * @param base_addr 存储的基地址 + * @param page_size 存储的页大小 + * + * @return 指向存储结构的指针 + */ +storage_t *storage_init(uint32_t base_addr, uint16_t page_size) +{ + storage_t *storage = (storage_t *)osel_mem_alloc(sizeof(storage_t)); + DBG_ASSERT(storage != NULL __DBG_LINE); + osel_memset((uint8_t *)storage, 0, sizeof(storage_t)); + clist_init(&storage->head); + + storage->params.base_addr = base_addr; + storage->params.page_size = page_size; + return storage; +} + +/** + * @brief 销毁存储结构 + * + * 销毁给定的存储结构,并释放其占用的内存。 + * + * @param storage 指向存储结构的指针 + */ +void storage_destroy(storage_t *storage) +{ + if (storage != NULL) + { + clist_destroy(&storage->head); + osel_mem_free(storage); + } +} + +/** + * @brief 向存储结构中添加一个新的节点 + * + * 在给定的存储结构中添加一个新的节点。节点的索引和大小由参数指定。 + * + * @param storage 指向存储结构的指针 + * @param index 新节点的索引 + * @param size 新节点的大小 + */ +void storage_add_node(storage_t *storage, uint16_t index, uint16_t size) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + storage_node_t *node = (storage_node_t *)osel_mem_alloc(sizeof(storage_node_t)); + node->index = index; + node->size = size; + node->address = storage->params.base_addr + storage->params.variable_size; + storage->params.variable_size += size; + storage->params.variable_count++; + storage->params.page_count = storage->params.variable_size / storage->params.page_size; + if (storage->params.variable_size % storage->params.page_size != 0) + { + storage->params.page_count++; + } + clist_push_back(&storage->head, (cnode)node); +} + +/** + * @brief 将缓冲区中的所有数据写入存储设备 + * + * 将指定缓冲区中的数据写入存储设备。 + * + * @param storage 存储设备的指针 + * @param buf 待写入数据的缓冲区指针 + * + * @return 如果写入成功,则返回TRUE;否则返回FALSE + */ +BOOL storage_write_all(storage_t *storage, const uint8_t *buf) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(storage->ops.write != NULL __DBG_LINE); + return storage->ops.write(storage->params.base_addr, (uint8_t *)buf, storage->params.variable_size); +} + +/** + * @brief 向存储设备写入数据 + * + * 将指定的数据写入到存储设备中指定的索引位置。 + * + * @param storage 存储设备指针 + * @param index 索引位置 + * @param buf 要写入的数据缓冲区指针 + * + * @return 写入成功返回TRUE,失败返回FALSE + */ +BOOL storage_write(storage_t *storage, uint16_t index, const uint8_t *buf) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(storage->ops.write != NULL __DBG_LINE); + storage_node_t *node = storage_node_find(storage, index); + if (node == NULL) + { + return FALSE; + } + + return storage->ops.write(node->address, (uint8_t *)buf, node->size); +} + +/** + * @brief 从存储设备中读取所有数据到缓冲区 + * + * 从指定的存储设备中读取数据,并将数据存储在提供的缓冲区中。 + * + * @param storage 存储设备的指针 + * @param buf 用于存储读取数据的缓冲区指针 + * + * @return 如果读取成功,则返回 TRUE;否则返回 FALSE + * + * @note 必须在调用此函数之前,确保提供的存储设备和缓冲区指针均不为空,且要读取的数据大小不为零。 + * 此外,存储设备的读取操作函数也必须不为空。 + */ +BOOL storage_read_all(storage_t *storage, uint8_t *buf) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(storage->ops.read != NULL __DBG_LINE); + return storage->ops.read(storage->params.base_addr, buf, storage->params.variable_size); +} + +/** + * @brief 从存储中读取数据 + * + * 从指定的存储位置读取数据到缓冲区中。 + * + * @param storage 存储指针,指向存储结构的指针 + * @param index 要读取的数据的索引 + * @param buf 指向存储读取数据的缓冲区的指针 + * + * @return 如果读取成功,返回TRUE;否则返回FALSE + */ +BOOL storage_read(storage_t *storage, uint16_t index, uint8_t *buf) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(storage->ops.read != NULL __DBG_LINE); + storage_node_t *node = storage_node_find(storage, index); + if (node == NULL) + { + return FALSE; + } + + return storage->ops.read(node->address, buf, node->size); +} + +/** + * @brief 检查存储中的数据是否与给定的缓冲区内容相同 + * + * 检查给定索引位置的存储节点中的数据是否与给定的缓冲区内容相同。 + * + * @param storage 存储对象指针 + * @param index 要检查的存储节点的索引 + * @param buf 要比较的缓冲区指针 + * + * @return 如果存储节点中的数据与缓冲区内容相同,则返回 TRUE;否则返回 FALSE + */ +BOOL storage_check(storage_t *storage, uint16_t index, uint8_t *buf) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(storage->ops.read != NULL __DBG_LINE); + BOOL ret = FALSE; + storage_node_t *node = storage_node_find(storage, index); + if (node == NULL) + { + return FALSE; + } + uint8_t *tmp = (uint8_t *)osel_mem_alloc(node->size); + DBG_ASSERT(tmp != NULL __DBG_LINE); + if (storage->ops.read(node->address, tmp, node->size) == TRUE) + { + if (osel_memcmp(tmp, buf, node->size) == 0) + { + ret = TRUE; + } + } + osel_mem_free(tmp); + return ret; +} + +/** + * @brief 检查存储区内容是否与给定的缓冲区内容一致 + * + * 该函数会检查存储区(由storage参数指定)的内容是否与给定的缓冲区(由buf参数指定)内容一致。 + * + * @param storage 存储区指针,指向一个存储区结构体 + * @param buf 缓冲区指针,指向要比较的缓冲区 + * + * @return 如果存储区内容与缓冲区内容一致,则返回TRUE;否则返回FALSE + * + * @note 调用此函数前,需要确保storage和buf均不为NULL,且storage->ops.read指向有效的读操作函数。 + */ +BOOL storage_check_all(storage_t *storage, uint8_t *buf) +{ + DBG_ASSERT(storage != NULL __DBG_LINE); + DBG_ASSERT(buf != NULL __DBG_LINE); + DBG_ASSERT(storage->ops.read != NULL __DBG_LINE); + BOOL ret = FALSE; + uint8_t *tmp = (uint8_t *)osel_mem_alloc(storage->params.variable_size); + DBG_ASSERT(tmp != NULL __DBG_LINE); + if (storage->ops.read(storage->params.base_addr, tmp, storage->params.variable_size) == TRUE) + { + if (osel_memcmp(tmp, buf, storage->params.variable_size) == 0) + { + ret = TRUE; + } + else + { + __NOP(); + } + } + osel_mem_free(tmp); + return ret; +} diff --git a/User/system/lib/src/wl_flash.c b/User/system/lib/src/wl_flash.c new file mode 100644 index 0000000..10cd9eb --- /dev/null +++ b/User/system/lib/src/wl_flash.c @@ -0,0 +1,314 @@ +#include "wl_flash.h" +#include +static BOOL flash_is_written(wl_flash_t *cfg, uint32_t address, uint16_t length); + +/** + * @brief 初始化闪存 + * + * 根据给定的闪存配置信息,初始化闪存的相关参数和状态。 + * + * @param cfg 闪存配置结构体指针 + * + * @note 该函数会检查cfg是否为空,并断言cfg中的srand、read、write、erase_page操作均不为空。 + * @note 同时还会检查FLASH页大小是否为2的幂次方,FLASH长度是否为页大小的整数倍,以及FLASH长度是否大于等于data_size。 + * @note 如果data_size不是write_gran的整数倍,则会向上取整。 + * @note 初始化完成后,将更新起始地址、起始页号、总页数、数据块所占页数和剩余大小等参数。 + */ +void wl_flash_init(wl_flash_t *cfg) +{ + // 断言cfg不为空 + DBG_ASSERT(cfg != NULL __DBG_LINE); + + // 断言cfg中的srand操作不为空 + DBG_ASSERT(cfg->ops.srand != NULL __DBG_LINE); + // 断言cfg中的read操作不为空 + DBG_ASSERT(cfg->ops.read != NULL __DBG_LINE); + // 断言cfg中的write操作不为空 + DBG_ASSERT(cfg->ops.write != NULL __DBG_LINE); + // 断言cfg中的erase_page操作不为空 + DBG_ASSERT(cfg->ops.erase_page != NULL __DBG_LINE); + + // 检查FLASH页大小是否为2的幂次方 + // 检查FLASH页大小 + DBG_ASSERT((cfg->page_size & (cfg->page_size - 1)) == 0 __DBG_LINE); + + // 检查FLASH长度是否为页大小的整数倍 + // 检查FLASH长度 + DBG_ASSERT(cfg->len % cfg->page_size == 0 __DBG_LINE); + + // 如果data_size不是write_gran的整数倍,则向上取整 + if (cfg->data_size % cfg->write_gran != 0) + { + cfg->data_size = (cfg->data_size / cfg->write_gran + 1) * cfg->write_gran; + } + + // 断言FLASH长度大于等于data_size + DBG_ASSERT(cfg->len >= cfg->data_size __DBG_LINE); + + // 初始化起始地址、起始页号、总页数、数据块所占页数和剩余大小 + cfg->private.current_address = cfg->addr; + cfg->private.start_page = cfg->addr / cfg->page_size; + cfg->private.page_total = cfg->len / cfg->page_size; + if (cfg->wl_flag == TRUE) + { + cfg->private.block_page = cfg->data_size / cfg->page_size + (cfg->data_size % cfg->page_size != 0 ? 1 : 0); + } + else + { + cfg->private.block_page = cfg->private.page_total; + } + + cfg->private.residue_size = cfg->private.block_page * cfg->page_size; +} + +/** + * @brief 擦除指定范围内的闪存 + * + * 根据给定的闪存配置信息,擦除指定范围内的闪存页面。 + * + * @param cfg 闪存配置结构体指针 + * + * @note 调用此函数前,请确保 cfg 不为 NULL,并且 cfg 中的 srand、erase_page 函数指针不为 NULL, + * write_gran 不为 0。 + * + * @see DBG_ASSERT 宏定义用于断言条件 + */ +void wl_flash_erase(wl_flash_t *cfg) +{ + // 断言cfg不为空 + DBG_ASSERT(cfg != NULL __DBG_LINE); + // 断言cfg->ops.srand不为空 + DBG_ASSERT(cfg->ops.srand != NULL __DBG_LINE); + // 断言cfg->ops.erase_page不为空 + DBG_ASSERT(cfg->ops.erase_page != NULL __DBG_LINE); + // 断言cfg->write_gran不为0 + DBG_ASSERT(cfg->write_gran != 0 __DBG_LINE); + // 断言cfg->private.page_total不为0 + DBG_ASSERT(cfg->private.page_total != 0 __DBG_LINE); + + // 计算起始页号 + uint16_t start_page = cfg->addr / cfg->page_size; + // 计算结束页号 + uint16_t end_page = (cfg->addr + cfg->len) / cfg->page_size; + + // 遍历起始页号到结束页号的每个页 + for (uint16_t i = start_page; i < end_page; i++) + { + // 如果该页已被写入 + if (flash_is_written(cfg, i * cfg->page_size, cfg->page_size) == TRUE) + { + // 擦除该页 + cfg->ops.erase_page(i); + } + } + + // 如果wl_flag为TRUE + if (cfg->wl_flag == TRUE) + { + // 调用srand函数 + cfg->ops.srand(); + // 计算最大值,这里减去一是为了防止超出范围 + uint16_t max = cfg->private.page_total / cfg->private.block_page - 1; // 这里减去一是为了防止超出范围 + // 计算当前地址 + cfg->private.current_address = cfg->addr + (rand() % max) * cfg->private.block_page * cfg->page_size; + // 设置剩余大小为block_page个页的大小 + cfg->private.residue_size = cfg->private.block_page * cfg->page_size; + } + else + { + // 否则,将当前地址设置为cfg->addr + cfg->private.current_address = cfg->addr; + // 设置剩余大小为block_page个页的大小 + cfg->private.residue_size = cfg->private.block_page * cfg->page_size; + } +} + +/** + * @brief 获取当前闪存地址 + * + * 从给定的闪存配置结构体中获取当前闪存的地址。 + * + * @param cfg 闪存配置结构体指针 + * + * @return 当前闪存的地址值 + */ +uint32_t wl_flash_get_current_address(wl_flash_t *cfg) +{ + return cfg->private.current_address; +} + +/** + * @brief 设置下一个闪存地址 + * + * 根据给定的闪存配置信息,设置下一个要写入数据的闪存地址。 + * + * @param cfg 闪存配置指针 + * + * @note 传入参数不能为空 + */ +void wl_flash_set_next_address(wl_flash_t *cfg) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + // 断言cfg->private.page_total不为0 + DBG_ASSERT(cfg->private.page_total != 0 __DBG_LINE); + BOOL switch_page = FALSE; + uint16_t current_page = cfg->private.current_address / cfg->page_size; + if (cfg->wl_flag == TRUE) + { + // 判断是否需要换到下一个block + if ((cfg->private.residue_size - cfg->data_size) < cfg->data_size) + { + current_page += cfg->private.block_page; + cfg->private.current_address = current_page * cfg->page_size; + cfg->private.residue_size = cfg->private.block_page * cfg->page_size; + switch_page = TRUE; + } + else + { + // 有空间可以写入,当前写入地址偏移 + cfg->private.current_address += cfg->data_size; + cfg->private.residue_size -= cfg->data_size; + } + + if (cfg->private.current_address + cfg->data_size > cfg->addr + cfg->len) + { + cfg->private.current_address = cfg->addr; + cfg->private.residue_size = cfg->private.block_page * cfg->page_size; + switch_page = TRUE; + } + } + else + { + // 不使用平衡擦写默认都使用第一页 + cfg->private.current_address = cfg->addr; + cfg->private.residue_size = cfg->private.block_page * cfg->page_size; + switch_page = TRUE; + } + + // 如果写入区域切换到下一个block,则判断是否需要擦除 + if (switch_page == TRUE) + { + // 判断准备写入的区域是否已经写入过数据 + for (uint8_t i = 0; i < cfg->private.block_page; i++) + { + uint32_t current_address = cfg->private.current_address + (i * cfg->page_size); + if (flash_is_written(cfg, current_address, cfg->page_size) == TRUE) + { + cfg->ops.erase_page(current_address / cfg->page_size); + } + } + } +} + +/** + * @brief 设置当前 Flash 地址 + * + * 将给定的地址设置为 Flash 设备的当前地址。 + * + * @param cfg Flash 配置结构体指针 + * @param address 要设置的 Flash 地址 + */ +void wl_flash_set_current_address(wl_flash_t *cfg, uint32_t address) +{ + uint16_t current_page = address / cfg->page_size; + uint16_t current_block_page_num = (current_page - cfg->private.start_page) / cfg->private.block_page; // 确定当前的地址在第几个block_page中 + uint32_t current_page_start_address = cfg->addr + current_block_page_num * cfg->page_size * cfg->private.block_page; // 当前block_page的起始地址 + cfg->private.current_address = address; + // 根据当前地址更新剩余可写字节 + cfg->private.residue_size = cfg->private.block_page * cfg->page_size - (address - current_page_start_address); +} + +/** + * @brief 写入数据到闪存 + * + * 根据给定的配置,将数据写入到闪存中。 + * + * @param cfg 闪存配置结构体指针 + * @param buf 要写入的数据缓冲区指针 + * @param size 要写入的数据大小(字节) + * + * @return 如果写入成功,则返回 TRUE;否则返回 FALSE + */ +BOOL wl_flash_write(wl_flash_t *cfg, const uint8_t *buf, uint16_t size) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + DBG_ASSERT(cfg->ops.write != NULL __DBG_LINE); + DBG_ASSERT(cfg->write_gran != 0 __DBG_LINE); + DBG_ASSERT(size <= cfg->data_size __DBG_LINE); + // 断言cfg->private.page_total不为0 + DBG_ASSERT(cfg->private.page_total != 0 __DBG_LINE); + BOOL res = FALSE; + + res = cfg->ops.write(cfg->private.current_address, buf, size); + return res; +} + +/** + * @brief 从指定 Flash 设备中读取数据 + * + * 根据给定的 Flash 设备配置参数,从 Flash 设备的当前地址开始,读取指定长度的数据到缓冲区中。 + * + * @param cfg Flash 设备配置指针 + * @param buf 存储读取数据的缓冲区指针 + * @param size 要读取的数据大小(以字节为单位) + * + * @return 读取操作是否成功,成功返回 TRUE,否则返回 FALSE + * + * @note 调用此函数前,需要确保 Flash 设备配置正确,并且 read 操作函数已设置 + * + * @warning 请注意检查函数返回结果,以确保数据读取操作成功 + */ +BOOL wl_flash_read(wl_flash_t *cfg, uint8_t *buf, uint16_t size) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + // 断言cfg->private.page_total不为0 + DBG_ASSERT(cfg->private.page_total != 0 __DBG_LINE); + DBG_ASSERT(cfg->ops.read != NULL __DBG_LINE); + return cfg->ops.read(cfg->private.current_address, buf, size); +} + +static BOOL flash_is_written(wl_flash_t *cfg, uint32_t address, uint16_t length) +{ + DBG_ASSERT(cfg != NULL __DBG_LINE); + DBG_ASSERT(cfg->ops.read != NULL __DBG_LINE); + uint8_t *data; + uint16_t count = 0; + BOOL res = FALSE, ret = FALSE; + count = length / cfg->page_size; + if (length % cfg->page_size != 0) + { + count++; + } + data = osel_mem_alloc(cfg->page_size); + DBG_ASSERT(data != NULL __DBG_LINE); + + for (uint16_t i = 0; i < count; i++) + { + ret = cfg->ops.read(address + i * cfg->page_size, data, cfg->page_size); + if (ret == TRUE) + { + for (uint16_t j = 0; j < cfg->page_size; j++) + { + if (data[j] != 0xff) + { + res = TRUE; + break; + } + } + } + else + { + res = FALSE; + break; + } + + if (res == TRUE) + { + break; + } + res = FALSE; + ret = FALSE; + } + osel_mem_free(data); + return res; +} diff --git a/User/system/lib/unity/unity.c b/User/system/lib/unity/unity.c new file mode 100644 index 0000000..be6ae2e --- /dev/null +++ b/User/system/lib/unity/unity.c @@ -0,0 +1,2582 @@ +/* ========================================================================= + Unity Project - A Test Framework for C + Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +============================================================================ */ + +#include "unity.h" + +#ifndef UNITY_PROGMEM +#define UNITY_PROGMEM +#endif + +/* If omitted from header, declare overrideable prototypes here so they're ready for use */ +#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +void UNITY_OUTPUT_CHAR(int); +#endif + +/* Helpful macros for us to use here in Assert functions */ +#define UNITY_FAIL_AND_BAIL \ + do \ + { \ + Unity.CurrentTestFailed = 1; \ + UNITY_OUTPUT_FLUSH(); \ + TEST_ABORT(); \ + }while (0) +#define UNITY_IGNORE_AND_BAIL \ + do \ + { \ + Unity.CurrentTestIgnored = 1; \ + UNITY_OUTPUT_FLUSH(); \ + TEST_ABORT(); \ + } while (0) +#define RETURN_IF_FAIL_OR_IGNORE \ + do \ + { \ + if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) \ + { \ + TEST_ABORT(); \ + } \ + } while (0) + + struct UNITY_STORAGE_T Unity; + +#ifdef UNITY_OUTPUT_COLOR +const char UNITY_PROGMEM UnityStrOk[] = "\033[42mOK\033[0m"; +const char UNITY_PROGMEM UnityStrPass[] = "\033[42mPASS\033[0m"; +const char UNITY_PROGMEM UnityStrFail[] = "\033[41mFAIL\033[0m"; +const char UNITY_PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[0m"; +#else +const char UNITY_PROGMEM UnityStrOk[] = "OK"; +const char UNITY_PROGMEM UnityStrPass[] = "PASS"; +const char UNITY_PROGMEM UnityStrFail[] = "FAIL"; +const char UNITY_PROGMEM UnityStrIgnore[] = "IGNORE"; +#endif +static const char UNITY_PROGMEM UnityStrNull[] = "NULL"; +static const char UNITY_PROGMEM UnityStrSpacer[] = ". "; +static const char UNITY_PROGMEM UnityStrExpected[] = " Expected "; +static const char UNITY_PROGMEM UnityStrWas[] = " Was "; +static const char UNITY_PROGMEM UnityStrGt[] = " to be greater than "; +static const char UNITY_PROGMEM UnityStrLt[] = " to be less than "; +static const char UNITY_PROGMEM UnityStrOrEqual[] = "or equal to "; +static const char UNITY_PROGMEM UnityStrNotEqual[] = " to be not equal to "; +static const char UNITY_PROGMEM UnityStrElement[] = " Element "; +static const char UNITY_PROGMEM UnityStrByte[] = " Byte "; +static const char UNITY_PROGMEM UnityStrMemory[] = " Memory Mismatch."; +static const char UNITY_PROGMEM UnityStrDelta[] = " Values Not Within Delta "; +static const char UNITY_PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; +static const char UNITY_PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; +static const char UNITY_PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL"; +#ifndef UNITY_EXCLUDE_FLOAT +static const char UNITY_PROGMEM UnityStrNot[] = "Not "; +static const char UNITY_PROGMEM UnityStrInf[] = "Infinity"; +static const char UNITY_PROGMEM UnityStrNegInf[] = "Negative Infinity"; +static const char UNITY_PROGMEM UnityStrNaN[] = "NaN"; +static const char UNITY_PROGMEM UnityStrDet[] = "Determinate"; +static const char UNITY_PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; +#endif +const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled"; +const char UNITY_PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled"; +const char UNITY_PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled"; +const char UNITY_PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled"; +static const char UNITY_PROGMEM UnityStrBreaker[] = "-----------------------"; +static const char UNITY_PROGMEM UnityStrResultsTests[] = " Tests "; +static const char UNITY_PROGMEM UnityStrResultsFailures[] = " Failures "; +static const char UNITY_PROGMEM UnityStrResultsIgnored[] = " Ignored "; +#ifndef UNITY_EXCLUDE_DETAILS +static const char UNITY_PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; +static const char UNITY_PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; +#endif +/*----------------------------------------------- + * Pretty Printers & Test Result Output Handlers + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +/* Local helper function to print characters. */ +static void UnityPrintChar(const char *pch) +{ + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); + } +} + +/*-----------------------------------------------*/ +/* Local helper function to print ANSI escape strings e.g. "\033[42m". */ +#ifdef UNITY_OUTPUT_COLOR +static UNITY_UINT UnityPrintAnsiEscapeString(const char *string) +{ + const char *pch = string; + UNITY_UINT count = 0; + + while (*pch && (*pch != 'm')) + { + UNITY_OUTPUT_CHAR(*pch); + pch++; + count++; + } + UNITY_OUTPUT_CHAR('m'); + count++; + + return count; +} +#endif + +/*-----------------------------------------------*/ +void UnityPrint(const char *string) +{ + const char *pch = string; + + if (pch != NULL) + { + while (*pch) + { +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + if ((*pch == 27) && (*(pch + 1) == '[')) + { + pch += UnityPrintAnsiEscapeString(pch); + continue; + } +#endif + UnityPrintChar(pch); + pch++; + } + } +} +/*-----------------------------------------------*/ +void UnityPrintLen(const char *string, const UNITY_UINT32 length) +{ + const char *pch = string; + + if (pch != NULL) + { + while (*pch && ((UNITY_UINT32)(pch - string) < length)) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); + } + pch++; + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) +{ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (style == UNITY_DISPLAY_STYLE_CHAR) + { + /* printable characters plus CR & LF are printed */ + UNITY_OUTPUT_CHAR('\''); + if ((number <= 126) && (number >= 32)) + { + UNITY_OUTPUT_CHAR((int)number); + } + /* write escaped carriage returns */ + else if (number == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (number == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, 2); + } + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrintNumber(number); + } + } + else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) + { + UnityPrintNumberUnsigned((UNITY_UINT)number); + } + else + { + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumber(const UNITY_INT number_to_print) +{ + UNITY_UINT number = (UNITY_UINT)number_to_print; + + if (number_to_print < 0) + { + /* A negative number, including MIN negative */ + UNITY_OUTPUT_CHAR('-'); + number = (~number) + 1; + } + UnityPrintNumberUnsigned(number); +} + +/*----------------------------------------------- + * basically do an itoa using as little ram as possible */ +void UnityPrintNumberUnsigned(const UNITY_UINT number) +{ + UNITY_UINT divisor = 1; + + /* figure out initial divisor */ + while (number / divisor > 9) + { + divisor *= 10; + } + + /* now mod and print, then divide divisor */ + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } while (divisor > 0); +} + +/*-----------------------------------------------*/ +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) +{ + int nibble; + char nibbles = nibbles_to_print; + + if ((unsigned)nibbles > UNITY_MAX_NIBBLES) + { + nibbles = UNITY_MAX_NIBBLES; + } + + while (nibbles > 0) + { + nibbles--; + nibble = (int)(number >> (nibbles * 4)) & 0x0F; + if (nibble <= 9) + { + UNITY_OUTPUT_CHAR((char)('0' + nibble)); + } + else + { + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) +{ + UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); + UNITY_INT32 i; + + for (i = 0; i < UNITY_INT_WIDTH; i++) + { + if (current_bit & mask) + { + if (current_bit & number) + { + UNITY_OUTPUT_CHAR('1'); + } + else + { + UNITY_OUTPUT_CHAR('0'); + } + } + else + { + UNITY_OUTPUT_CHAR('X'); + } + current_bit = current_bit >> 1; + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +/* + * This function prints a floating-point value in a format similar to + * printf("%.7g") on a single-precision machine or printf("%.9g") on a + * double-precision machine. The 7th digit won't always be totally correct + * in single-precision operation (for that level of accuracy, a more + * complicated algorithm would be needed). + */ +void UnityPrintFloat(const UNITY_DOUBLE input_number) +{ +#ifdef UNITY_INCLUDE_DOUBLE + static const int sig_digits = 9; + static const UNITY_INT32 min_scaled = 100000000; + static const UNITY_INT32 max_scaled = 1000000000; +#else + static const int sig_digits = 7; + static const UNITY_INT32 min_scaled = 1000000; + static const UNITY_INT32 max_scaled = 10000000; +#endif + + UNITY_DOUBLE number = input_number; + + /* print minus sign (does not handle negative zero) */ + if (number < 0.0f) + { + UNITY_OUTPUT_CHAR('-'); + number = -number; + } + + /* handle zero, NaN, and +/- infinity */ + if (number == 0.0f) + { + UnityPrint("0"); + } + else if (isnan(number)) + { + UnityPrint("nan"); + } + else if (isinf(number)) + { + UnityPrint("inf"); + } + else + { + UNITY_INT32 n_int = 0; + UNITY_INT32 n; + int exponent = 0; + int decimals; + int digits; + char buf[16] = {0}; + + /* + * Scale up or down by powers of 10. To minimize rounding error, + * start with a factor/divisor of 10^10, which is the largest + * power of 10 that can be represented exactly. Finally, compute + * (exactly) the remaining power of 10 and perform one more + * multiplication or division. + */ + if (number < 1.0f) + { + UNITY_DOUBLE factor = 1.0f; + + while (number < (UNITY_DOUBLE)max_scaled / 1e10f) + { + number *= 1e10f; + exponent -= 10; + } + while (number * factor < (UNITY_DOUBLE)min_scaled) + { + factor *= 10.0f; + exponent--; + } + + number *= factor; + } + else if (number > (UNITY_DOUBLE)max_scaled) + { + UNITY_DOUBLE divisor = 1.0f; + + while (number > (UNITY_DOUBLE)min_scaled * 1e10f) + { + number /= 1e10f; + exponent += 10; + } + while (number / divisor > (UNITY_DOUBLE)max_scaled) + { + divisor *= 10.0f; + exponent++; + } + + number /= divisor; + } + else + { + /* + * In this range, we can split off the integer part before + * doing any multiplications. This reduces rounding error by + * freeing up significant bits in the fractional part. + */ + UNITY_DOUBLE factor = 1.0f; + n_int = (UNITY_INT32)number; + number -= (UNITY_DOUBLE)n_int; + + while (n_int < min_scaled) + { + n_int *= 10; + factor *= 10.0f; + exponent--; + } + + number *= factor; + } + + /* round to nearest integer */ + n = ((UNITY_INT32)(number + number) + 1) / 2; + +#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO + /* round to even if exactly between two integers */ + if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f)) + n--; +#endif + + n += n_int; + + if (n >= max_scaled) + { + n = min_scaled; + exponent++; + } + + /* determine where to place decimal point */ + decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1); + exponent += decimals; + + /* truncate trailing zeroes after decimal point */ + while ((decimals > 0) && ((n % 10) == 0)) + { + n /= 10; + decimals--; + } + + /* build up buffer in reverse order */ + digits = 0; + while ((n != 0) || (digits <= decimals)) + { + buf[digits++] = (char)('0' + n % 10); + n /= 10; + } + + /* print out buffer (backwards) */ + while (digits > 0) + { + if (digits == decimals) + { + UNITY_OUTPUT_CHAR('.'); + } + UNITY_OUTPUT_CHAR(buf[--digits]); + } + + /* print exponent if needed */ + if (exponent != 0) + { + UNITY_OUTPUT_CHAR('e'); + + if (exponent < 0) + { + UNITY_OUTPUT_CHAR('-'); + exponent = -exponent; + } + else + { + UNITY_OUTPUT_CHAR('+'); + } + + digits = 0; + while ((exponent != 0) || (digits < 2)) + { + buf[digits++] = (char)('0' + exponent % 10); + exponent /= 10; + } + while (digits > 0) + { + UNITY_OUTPUT_CHAR(buf[--digits]); + } + } + } +} +#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ + +/*-----------------------------------------------*/ +static void UnityTestResultsBegin(const char *file, const UNITY_LINE_TYPE line) +{ +#ifdef UNITY_OUTPUT_FOR_ECLIPSE + UNITY_OUTPUT_CHAR('('); + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(')'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else +#ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH + UnityPrint("'); + UnityPrint(Unity.CurrentTestName); + UnityPrint(" "); +#else +#ifdef UNITY_OUTPUT_FOR_QT_CREATOR + UnityPrint("file://"); + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(':'); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#endif +#endif +#endif +} + +/*-----------------------------------------------*/ +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrFail); + UNITY_OUTPUT_CHAR(':'); +} + +/*-----------------------------------------------*/ +void UnityConcludeTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + } + else if (!Unity.CurrentTestFailed) + { + UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); + UnityPrint(UnityStrPass); + } + else + { + Unity.TestFailures++; + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + UNITY_PRINT_EXEC_TIME(); + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); +} + +/*-----------------------------------------------*/ +static void UnityAddMsgIfSpecified(const char *msg) +{ +#ifdef UNITY_PRINT_TEST_CONTEXT + UnityPrint(UnityStrSpacer); + UNITY_PRINT_TEST_CONTEXT(); +#endif +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrSpacer); + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + } +#endif + if (msg) + { + UnityPrint(UnityStrSpacer); + UnityPrint(msg); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStrings(const char *expected, const char *actual) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(expected); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(actual); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStringsLen(const char *expected, + const char *actual, + const UNITY_UINT32 length) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(expected, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(actual, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*----------------------------------------------- + * Assertion & Control Helpers + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_LINE_TYPE lineNumber, + const char *msg) +{ + /* Both are NULL or same pointer */ + if (expected == actual) + { + return 0; + } + + /* print and return true if just expected is NULL */ + if (expected == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForExpected); + UnityAddMsgIfSpecified(msg); + return 1; + } + + /* print and return true if just actual is NULL */ + if (actual == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForActual); + UnityAddMsgIfSpecified(msg); + return 1; + } + + return 0; /* return false if neither is NULL */ +} + +/*----------------------------------------------- + * Assertion Functions + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if ((mask & expected) != (mask & actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); + UnityPrint(UnityStrWas); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (expected != actual) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + int failed = 0; + RETURN_IF_FAIL_OR_IGNORE; + + if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) + { + return; + } + if ((threshold == actual)) + { + failed = 1; + } + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) + { + failed = 1; + } + if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) + { + failed = 1; + } + } + else /* UINT or HEX */ + { + if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) + { + failed = 1; + } + if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) + { + failed = 1; + } + } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(actual, style); + if (compare & UNITY_GREATER_THAN) + { + UnityPrint(UnityStrGt); + } + if (compare & UNITY_SMALLER_THAN) + { + UnityPrint(UnityStrLt); + } + if (compare & UNITY_EQUAL_TO) + { + UnityPrint(UnityStrOrEqual); + } + if (compare == UNITY_NOT_EQUAL) + { + UnityPrint(UnityStrNotEqual); + } + UnityPrintNumberByStyle(threshold, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#define UnityPrintPointlessAndBail() \ + do \ + { \ + UnityTestResultsFailBegin(lineNumber); \ + UnityPrint(UnityStrPointless); \ + UnityAddMsgIfSpecified(msg); \ + UNITY_FAIL_AND_BAIL; \ + } while (0) + +/*-----------------------------------------------*/ +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + unsigned int length = style & 0xF; + unsigned int increment = 0; + + RETURN_IF_FAIL_OR_IGNORE; + + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while ((elements > 0) && (elements--)) + { + UNITY_INT expect_val; + UNITY_INT actual_val; + + switch (length) + { + case 1: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8 *)actual; + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x000000FF; + actual_val &= 0x000000FF; + } + increment = sizeof(UNITY_INT8); + break; + + case 2: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16 *)actual; + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x0000FFFF; + actual_val &= 0x0000FFFF; + } + increment = sizeof(UNITY_INT16); + break; + +#ifdef UNITY_SUPPORT_64 + case 8: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64 *)actual; + increment = sizeof(UNITY_INT64); + break; +#endif + + default: /* default is length 4 bytes */ + case 4: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32 *)actual; +#ifdef UNITY_SUPPORT_64 + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x00000000FFFFFFFF; + actual_val &= 0x00000000FFFFFFFF; + } +#endif + increment = sizeof(UNITY_INT32); + length = 4; + break; + } + + if (expect_val != actual_val) + { + if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + /* Walk through array by incrementing the pointers */ + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)((const char *)expected + increment); + } + actual = (UNITY_INTERNAL_PTR)((const char *)actual + increment); + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT +/* Wrap this define in a function with variable types as float or double */ +#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ + if (isinf(expected) && isinf(actual) && (((expected) < 0) == ((actual) < 0))) \ + return 1; \ + if (UNITY_NAN_CHECK) \ + return 1; \ + (diff) = (actual) - (expected); \ + if ((diff) < 0) \ + (diff) = -(diff); \ + if ((delta) < 0) \ + (delta) = -(delta); \ + return !(isnan(diff) || isinf(diff) || ((diff) > (delta))) +/* This first part of this condition will catch any NaN or Infinite values */ +#ifndef UNITY_NAN_NOT_EQUAL_NAN +#define UNITY_NAN_CHECK isnan(expected) && isnan(actual) +#else +#define UNITY_NAN_CHECK 0 +#endif + +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +#define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + do \ + { \ + UnityPrint(UnityStrExpected); \ + UnityPrintFloat(expected); \ + UnityPrint(UnityStrWas); \ + UnityPrintFloat(actual); \ + } while (0) +#else +#define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + UnityPrint(UnityStrDelta) +#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ + +/*-----------------------------------------------*/ +static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) +{ + UNITY_FLOAT diff; + UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); +} + +/*-----------------------------------------------*/ +void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT *expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT *actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT *ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT *ptr_actual = actual; + UNITY_FLOAT in_delta = delta; + UNITY_FLOAT current_element_delta = delta; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (isinf(in_delta)) + { + return; /* Arrays will be force equal with infinite delta */ + } + + if (isnan(in_delta)) + { + /* Delta must be correct number */ + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + /* fix delta sign if need */ + if (in_delta < 0) + { + in_delta = -in_delta; + } + + while (elements--) + { + current_element_delta = *ptr_expected * UNITY_FLOAT_PRECISION; + + if (current_element_delta < 0) + { + /* fix delta sign for correct calculations */ + current_element_delta = -current_element_delta; + } + + if (!UnityFloatsWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (!UnityFloatsWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (UnityFloatsWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat((UNITY_DOUBLE)expected); + UnityPrint(UnityStrNotEqual); + UnityPrintFloat((UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, + const UNITY_FLOAT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + int failed; + + RETURN_IF_FAIL_OR_IGNORE; + + failed = 0; + + /* Checking for "not success" rather than failure to get the right result for NaN */ + if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) + { + failed = 1; + } + if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) + { + failed = 1; + } + + if ((compare & UNITY_EQUAL_TO) && UnityFloatsWithin(threshold * UNITY_FLOAT_PRECISION, threshold, actual)) + { + failed = 0; + } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat(actual); + if (compare & UNITY_GREATER_THAN) + { + UnityPrint(UnityStrGt); + } + if (compare & UNITY_SMALLER_THAN) + { + UnityPrint(UnityStrLt); + } + if (compare & UNITY_EQUAL_TO) + { + UnityPrint(UnityStrOrEqual); + } + UnityPrintFloat(threshold); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char *trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); + + RETURN_IF_FAIL_OR_IGNORE; + + switch (style) + { + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) && (actual > 0); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) && (actual < 0); + break; + + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual) ? 1 : 0; + break; + + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ + case UNITY_FLOAT_IS_NOT_DET: + is_trait = !isinf(actual) && !isnan(actual); + break; + + default: /* including UNITY_FLOAT_INVALID_TRAIT */ + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + UnityPrintFloat((UNITY_DOUBLE)actual); +#else + if (should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_FLOAT */ + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_DOUBLE +static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) +{ + UNITY_DOUBLE diff; + UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); +} + +/*-----------------------------------------------*/ +void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE *expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE *actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE *ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE *ptr_actual = actual; + UNITY_DOUBLE in_delta = delta; + UNITY_DOUBLE current_element_delta = delta; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (isinf(in_delta)) + { + return; /* Arrays will be force equal with infinite delta */ + } + + if (isnan(in_delta)) + { + /* Delta must be correct number */ + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + /* fix delta sign if need */ + if (in_delta < 0) + { + in_delta = -in_delta; + } + + while (elements--) + { + current_element_delta = *ptr_expected * UNITY_DOUBLE_PRECISION; + + if (current_element_delta < 0) + { + /* fix delta sign for correct calculations */ + current_element_delta = -current_element_delta; + } + + if (!UnityDoublesWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (!UnityDoublesWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (UnityDoublesWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat((UNITY_DOUBLE)expected); + UnityPrint(UnityStrNotEqual); + UnityPrintFloat((UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, + const UNITY_DOUBLE actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + int failed; + + RETURN_IF_FAIL_OR_IGNORE; + + failed = 0; + + /* Checking for "not success" rather than failure to get the right result for NaN */ + if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) + { + failed = 1; + } + if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) + { + failed = 1; + } + + if ((compare & UNITY_EQUAL_TO) && UnityDoublesWithin(threshold * UNITY_DOUBLE_PRECISION, threshold, actual)) + { + failed = 0; + } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat(actual); + if (compare & UNITY_GREATER_THAN) + { + UnityPrint(UnityStrGt); + } + if (compare & UNITY_SMALLER_THAN) + { + UnityPrint(UnityStrLt); + } + if (compare & UNITY_EQUAL_TO) + { + UnityPrint(UnityStrOrEqual); + } + UnityPrintFloat(threshold); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char *trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); + + RETURN_IF_FAIL_OR_IGNORE; + + switch (style) + { + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) && (actual > 0); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) && (actual < 0); + break; + + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual) ? 1 : 0; + break; + + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ + case UNITY_FLOAT_IS_NOT_DET: + is_trait = !isinf(actual) && !isnan(actual); + break; + + default: /* including UNITY_FLOAT_INVALID_TRAIT */ + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + UnityPrintFloat(actual); +#else + if (should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_DOUBLE */ + +/*-----------------------------------------------*/ +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > expected) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); + } + } + else + { + if ((UNITY_UINT)actual > (UNITY_UINT)expected) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((UNITY_INT)delta, style); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, + UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + unsigned int length = style & 0xF; + unsigned int increment = 0; + + RETURN_IF_FAIL_OR_IGNORE; + + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while ((elements > 0) && (elements--)) + { + UNITY_INT expect_val; + UNITY_INT actual_val; + + switch (length) + { + case 1: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8 *)actual; + increment = sizeof(UNITY_INT8); + } + else + { + expect_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT8 *)expected; + actual_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT8 *)actual; + increment = sizeof(UNITY_UINT8); + } + break; + + case 2: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16 *)actual; + increment = sizeof(UNITY_INT16); + } + else + { + expect_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT16 *)expected; + actual_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT16 *)actual; + increment = sizeof(UNITY_UINT16); + } + break; + +#ifdef UNITY_SUPPORT_64 + case 8: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64 *)actual; + increment = sizeof(UNITY_INT64); + } + else + { + expect_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT64 *)expected; + actual_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT64 *)actual; + increment = sizeof(UNITY_UINT64); + } + break; +#endif + + default: /* default is length 4 bytes */ + case 4: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32 *)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32 *)actual; + increment = sizeof(UNITY_INT32); + } + else + { + expect_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT32 *)expected; + actual_val = (UNITY_INT) * (UNITY_PTR_ATTRIBUTE const UNITY_UINT32 *)actual; + increment = sizeof(UNITY_UINT32); + } + length = 4; + break; + } + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual_val > expect_val) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); + } + } + else + { + if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); + } + } + + if (Unity.CurrentTestFailed) + { + if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((UNITY_INT)delta, style); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + /* Walk through array by incrementing the pointers */ + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)((const char *)expected + increment); + } + actual = (UNITY_INTERNAL_PTR)((const char *)actual + increment); + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualString(const char *expected, + const char *actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_UINT32 i; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; expected[i] || actual[i]; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringLen(const char *expected, + const char *actual, + const UNITY_UINT32 length, + const char *msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_UINT32 i; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; (i < length) && (expected[i] || actual[i]); i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, + const char **actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 i = 0; + UNITY_UINT32 j = 0; + const char *expd = NULL; + const char *act = NULL; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if no elements, it's an error */ + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if ((const void *)expected == (const void *)actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + if (flags != UNITY_ARRAY_TO_ARRAY) + { + expd = (const char *)expected; + } + + do + { + act = actual[j]; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expd = ((const char *const *)expected)[j]; + } + + /* if both pointers not null compare the strings */ + if (expd && act) + { + for (i = 0; expd[i] || act[i]; i++) + { + if (expd[i] != act[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expd != act) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(j); + } + UnityPrintExpectedAndActualStrings(expd, act); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + } while (++j < num_elements); +} + +/*-----------------------------------------------*/ +void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_PTR_ATTRIBUTE const unsigned char *ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char *)expected; + UNITY_PTR_ATTRIBUTE const unsigned char *ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char *)actual; + UNITY_UINT32 elements = num_elements; + UNITY_UINT32 bytes; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + if (length == 0) + { + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while (elements--) + { + bytes = length; + while (bytes--) + { + if (*ptr_exp != *ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrMemory); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + } + UnityPrint(UnityStrByte); + UnityPrintNumberUnsigned(length - bytes - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp++; + ptr_act++; + } + if (flags == UNITY_ARRAY_TO_VAL) + { + ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char *)expected; + } + } +} + +/*-----------------------------------------------*/ + +static union +{ + UNITY_INT8 i8; + UNITY_INT16 i16; + UNITY_INT32 i32; +#ifdef UNITY_SUPPORT_64 + UNITY_INT64 i64; +#endif +#ifndef UNITY_EXCLUDE_FLOAT + float f; +#endif +#ifndef UNITY_EXCLUDE_DOUBLE + double d; +#endif +} UnityQuickCompare; + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) +{ + switch (size) + { + case 1: + UnityQuickCompare.i8 = (UNITY_INT8)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); + + case 2: + UnityQuickCompare.i16 = (UNITY_INT16)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); + +#ifdef UNITY_SUPPORT_64 + case 8: + UnityQuickCompare.i64 = (UNITY_INT64)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); +#endif + + default: /* 4 bytes */ + UnityQuickCompare.i32 = (UNITY_INT32)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); + } +} + +#ifndef UNITY_EXCLUDE_FLOAT +/*-----------------------------------------------*/ +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) +{ + UnityQuickCompare.f = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); +} +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +/*-----------------------------------------------*/ +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) +{ + UnityQuickCompare.d = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); +} +#endif + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED + +/*----------------------------------------------- + * printf length modifier helpers + *-----------------------------------------------*/ + +enum UnityLengthModifier +{ + UNITY_LENGTH_MODIFIER_NONE, + UNITY_LENGTH_MODIFIER_LONG_LONG, + UNITY_LENGTH_MODIFIER_LONG, +}; + +#define UNITY_EXTRACT_ARG(NUMBER_T, NUMBER, LENGTH_MOD, VA, ARG_T) \ + do \ + { \ + switch (LENGTH_MOD) \ + { \ + case UNITY_LENGTH_MODIFIER_LONG_LONG: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, long long ARG_T); \ + break; \ + } \ + case UNITY_LENGTH_MODIFIER_LONG: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, long ARG_T); \ + break; \ + } \ + case UNITY_LENGTH_MODIFIER_NONE: \ + default: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, ARG_T); \ + break; \ + } \ + } \ + } while (0) + +static enum UnityLengthModifier UnityLengthModifierGet(const char *pch, int *length) +{ + enum UnityLengthModifier length_mod; + switch (pch[0]) + { + case 'l': + { + if (pch[1] == 'l') + { + *length = 2; + length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; + } + else + { + *length = 1; + length_mod = UNITY_LENGTH_MODIFIER_LONG; + } + break; + } + case 'h': + { + // short and char are converted to int + length_mod = UNITY_LENGTH_MODIFIER_NONE; + if (pch[1] == 'h') + { + *length = 2; + } + else + { + *length = 1; + } + break; + } + case 'j': + case 'z': + case 't': + case 'L': + { + // Not supported, but should gobble up the length specifier anyway + length_mod = UNITY_LENGTH_MODIFIER_NONE; + *length = 1; + break; + } + default: + { + length_mod = UNITY_LENGTH_MODIFIER_NONE; + *length = 0; + } + } + return length_mod; +} + +/*----------------------------------------------- + * printf helper function + *-----------------------------------------------*/ +static void UnityPrintFVA(const char *format, va_list va) +{ + const char *pch = format; + if (pch != NULL) + { + while (*pch) + { + /* format identification character */ + if (*pch == '%') + { + pch++; + + if (pch != NULL) + { + int length_mod_size; + enum UnityLengthModifier length_mod = UnityLengthModifierGet(pch, &length_mod_size); + pch += length_mod_size; + + switch (*pch) + { + case 'd': + case 'i': + { + UNITY_INT number; + UNITY_EXTRACT_ARG(UNITY_INT, number, length_mod, va, int); + UnityPrintNumber((UNITY_INT)number); + break; + } +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + case 'f': + case 'g': + { + const double number = va_arg(va, double); + UnityPrintFloat((UNITY_DOUBLE)number); + break; + } +#endif + case 'u': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UnityPrintNumberUnsigned(number); + break; + } + case 'b': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1; + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('b'); + UnityPrintMask(mask, number); + break; + } + case 'x': + case 'X': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex(number, 8); + break; + } + case 'p': + { + const unsigned int number = va_arg(va, unsigned int); + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, 8); + break; + } + case 'c': + { + const int ch = va_arg(va, int); + UnityPrintChar((const char *)&ch); + break; + } + case 's': + { + const char *string = va_arg(va, const char *); + UnityPrint(string); + break; + } + case '%': + { + UnityPrintChar(pch); + break; + } + default: + { + /* print the unknown format character */ + UNITY_OUTPUT_CHAR('%'); + UnityPrintChar(pch); + break; + } + } + } + } +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + else if ((*pch == 27) && (*(pch + 1) == '[')) + { + pch += UnityPrintAnsiEscapeString(pch); + continue; + } +#endif + else if (*pch == '\n') + { + UNITY_PRINT_EOL(); + } + else + { + UnityPrintChar(pch); + } + + pch++; + } + } +} + +void UnityPrintF(const UNITY_LINE_TYPE line, const char *format, ...) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint("INFO"); + if (format != NULL) + { + UnityPrint(": "); + va_list va; + va_start(va, format); + UnityPrintFVA(format, va); + va_end(va); + } + UNITY_PRINT_EOL(); +} +#endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */ + +/*----------------------------------------------- + * Control Functions + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +void UnityFail(const char *msg, const UNITY_LINE_TYPE line) +{ + RETURN_IF_FAIL_OR_IGNORE; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrFail); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + +#ifdef UNITY_PRINT_TEST_CONTEXT + UNITY_PRINT_TEST_CONTEXT(); +#endif +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + if (msg[0] != ' ') + { + UNITY_OUTPUT_CHAR(' '); + } + UnityPrint(msg); + } + + UNITY_FAIL_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityIgnore(const char *msg, const UNITY_LINE_TYPE line) +{ + RETURN_IF_FAIL_OR_IGNORE; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrIgnore); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_IGNORE_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityMessage(const char *msg, const UNITY_LINE_TYPE line) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint("INFO"); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_PRINT_EOL(); +} + +/*-----------------------------------------------*/ +/* If we have not defined our own test runner, then include our default test runner to make life easier */ +#ifndef UNITY_SKIP_DEFAULT_RUNNER +void UnityDefaultTestRun(UnityTestFunction Func, const char *FuncName, const int FuncLineNum) +{ + Unity.CurrentTestName = FuncName; + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + UNITY_EXEC_TIME_START(); + if (TEST_PROTECT()) + { + setUp(); + Func(); + } + if (TEST_PROTECT()) + { + tearDown(); + } + UNITY_EXEC_TIME_STOP(); + UnityConcludeTest(); +} +#endif + +/*-----------------------------------------------*/ +void UnitySetTestFile(const char *filename) +{ + Unity.TestFile = filename; +} + +/*-----------------------------------------------*/ +void UnityBegin(const char *filename) +{ + Unity.TestFile = filename; + Unity.CurrentTestName = NULL; + Unity.CurrentTestLineNumber = 0; + Unity.NumberOfTests = 0; + Unity.TestFailures = 0; + Unity.TestIgnores = 0; + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + + UNITY_CLR_DETAILS(); + UNITY_OUTPUT_START(); +} + +/*-----------------------------------------------*/ +int UnityEnd(void) +{ + UNITY_PRINT_EOL(); + UnityPrint(UnityStrBreaker); + UNITY_PRINT_EOL(); + UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); + UnityPrint(UnityStrResultsTests); + UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); + UnityPrint(UnityStrResultsFailures); + UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); + UnityPrint(UnityStrResultsIgnored); + UNITY_PRINT_EOL(); + if (Unity.TestFailures == 0U) + { + UnityPrint(UnityStrOk); + } + else + { + UnityPrint(UnityStrFail); +#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL + UNITY_OUTPUT_CHAR('E'); + UNITY_OUTPUT_CHAR('D'); +#endif + } + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); + UNITY_OUTPUT_COMPLETE(); + return (int)(Unity.TestFailures); +} + +/*----------------------------------------------- + * Command Line Argument Support + *-----------------------------------------------*/ +#ifdef UNITY_USE_COMMAND_LINE_ARGS + +char *UnityOptionIncludeNamed = NULL; +char *UnityOptionExcludeNamed = NULL; +int UnityVerbosity = 1; + +/*-----------------------------------------------*/ +int UnityParseOptions(int argc, char **argv) +{ + int i; + UnityOptionIncludeNamed = NULL; + UnityOptionExcludeNamed = NULL; + + for (i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'l': /* list tests */ + return -1; + case 'n': /* include tests with name including this string */ + case 'f': /* an alias for -n */ + if (argv[i][2] == '=') + { + UnityOptionIncludeNamed = &argv[i][3]; + } + else if (++i < argc) + { + UnityOptionIncludeNamed = argv[i]; + } + else + { + UnityPrint("ERROR: No Test String to Include Matches For"); + UNITY_PRINT_EOL(); + return 1; + } + break; + case 'q': /* quiet */ + UnityVerbosity = 0; + break; + case 'v': /* verbose */ + UnityVerbosity = 2; + break; + case 'x': /* exclude tests with name including this string */ + if (argv[i][2] == '=') + { + UnityOptionExcludeNamed = &argv[i][3]; + } + else if (++i < argc) + { + UnityOptionExcludeNamed = argv[i]; + } + else + { + UnityPrint("ERROR: No Test String to Exclude Matches For"); + UNITY_PRINT_EOL(); + return 1; + } + break; + default: + UnityPrint("ERROR: Unknown Option "); + UNITY_OUTPUT_CHAR(argv[i][1]); + UNITY_PRINT_EOL(); + return 1; + } + } + } + + return 0; +} + +/*-----------------------------------------------*/ +int IsStringInBiggerString(const char *longstring, const char *shortstring) +{ + const char *lptr = longstring; + const char *sptr = shortstring; + const char *lnext = lptr; + + if (*sptr == '*') + { + return 1; + } + + while (*lptr) + { + lnext = lptr + 1; + + /* If they current bytes match, go on to the next bytes */ + while (*lptr && *sptr && (*lptr == *sptr)) + { + lptr++; + sptr++; + + /* We're done if we match the entire string or up to a wildcard */ + if (*sptr == '*') + return 1; + if (*sptr == ',') + return 1; + if (*sptr == '"') + return 1; + if (*sptr == '\'') + return 1; + if (*sptr == ':') + return 2; + if (*sptr == 0) + return 1; + } + + /* Otherwise we start in the long pointer 1 character further and try again */ + lptr = lnext; + sptr = shortstring; + } + + return 0; +} + +/*-----------------------------------------------*/ +int UnityStringArgumentMatches(const char *str) +{ + int retval; + const char *ptr1; + const char *ptr2; + const char *ptrf; + + /* Go through the options and get the substrings for matching one at a time */ + ptr1 = str; + while (ptr1[0] != 0) + { + if ((ptr1[0] == '"') || (ptr1[0] == '\'')) + { + ptr1++; + } + + /* look for the start of the next partial */ + ptr2 = ptr1; + ptrf = 0; + do + { + ptr2++; + if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) + { + ptrf = &ptr2[1]; + } + } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); + + while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) + { + ptr2++; + } + + /* done if complete filename match */ + retval = IsStringInBiggerString(Unity.TestFile, ptr1); + if (retval == 1) + { + return retval; + } + + /* done if testname match after filename partial match */ + if ((retval == 2) && (ptrf != 0)) + { + if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) + { + return 1; + } + } + + /* done if complete testname match */ + if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) + { + return 1; + } + + ptr1 = ptr2; + } + + /* we couldn't find a match for any substrings */ + return 0; +} + +/*-----------------------------------------------*/ +int UnityTestMatches(void) +{ + /* Check if this test name matches the included test pattern */ + int retval; + if (UnityOptionIncludeNamed) + { + retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); + } + else + { + retval = 1; + } + + /* Check if this test name matches the excluded test pattern */ + if (UnityOptionExcludeNamed) + { + if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) + { + retval = 0; + } + } + + return retval; +} + +#endif /* UNITY_USE_COMMAND_LINE_ARGS */ +/*-----------------------------------------------*/ diff --git a/User/system/lib/unity/unity.h b/User/system/lib/unity/unity.h new file mode 100644 index 0000000..e321a1d --- /dev/null +++ b/User/system/lib/unity/unity.h @@ -0,0 +1,687 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FRAMEWORK_H +#define UNITY_FRAMEWORK_H +#define UNITY + +#define UNITY_VERSION_MAJOR 2 +#define UNITY_VERSION_MINOR 5 +#define UNITY_VERSION_BUILD 4 +#define UNITY_VERSION ((UNITY_VERSION_MAJOR << 16) | (UNITY_VERSION_MINOR << 8) | UNITY_VERSION_BUILD) + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "unity_internals.h" + +/*------------------------------------------------------- + * Test Setup / Teardown + *-------------------------------------------------------*/ + +/* These functions are intended to be called before and after each test. + * If using unity directly, these will need to be provided for each test + * executable built. If you are using the test runner generator and/or + * Ceedling, these are optional. */ +void setUp(void); +void tearDown(void); + +/* These functions are intended to be called at the beginning and end of an + * entire test suite. suiteTearDown() is passed the number of tests that + * failed, and its return value becomes the exit code of main(). If using + * Unity directly, you're in charge of calling these if they are desired. + * If using Ceedling or the test runner generator, these will be called + * automatically if they exist. */ +void suiteSetUp(void); +int suiteTearDown(int num_failures); + +/*------------------------------------------------------- + * Test Reset and Verify + *-------------------------------------------------------*/ + +/* These functions are intended to be called before during tests in order + * to support complex test loops, etc. Both are NOT built into Unity. Instead + * the test runner generator will create them. resetTest will run teardown and + * setup again, verifying any end-of-test needs between. verifyTest will only + * run the verification. */ +void resetTest(void); +void verifyTest(void); + +/*------------------------------------------------------- + * Configuration Options + *------------------------------------------------------- + * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. + + * Integers/longs/pointers + * - Unity attempts to automatically discover your integer sizes + * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in + * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in + * - If you cannot use the automatic methods above, you can force Unity by using these options: + * - define UNITY_SUPPORT_64 + * - set UNITY_INT_WIDTH + * - set UNITY_LONG_WIDTH + * - set UNITY_POINTER_WIDTH + + * Floats + * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons + * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT + * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats + * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons + * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) + * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE + * - define UNITY_DOUBLE_TYPE to specify something other than double + * - define UNITY_EXCLUDE_FLOAT_PRINT to trim binary size, won't print floating point values in errors + + * Output + * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired + * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure + + * Optimization + * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge + * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. + + * Test Cases + * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script + + * Parameterized Tests + * - you'll want to create a define of TEST_CASE(...) and/or TEST_RANGE(...) which basically evaluates to nothing + + * Tests with Arguments + * - you'll want to define UNITY_USE_COMMAND_LINE_ARGS if you have the test runner passing arguments to Unity + + *------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) +#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) +#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) +#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) +#define TEST_MESSAGE(message) UnityMessage((message), __LINE__) +#define TEST_ONLY() +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +#define TEST_PRINTF(message, ...) UnityPrintF(__LINE__, (message), __VA_ARGS__) +#endif + +/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. + * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ +#define TEST_PASS() TEST_ABORT() +#define TEST_PASS_MESSAGE(message) do { UnityMessage((message), __LINE__); TEST_ABORT(); } while (0) + +/* This macro does nothing, but it is useful for build tools (like Ceedling) to make use of this to figure out + * which files should be linked to in order to perform a test. Use it like TEST_FILE("sandwiches.c") */ +#define TEST_FILE(a) + +/*------------------------------------------------------- + * Test Asserts (simple) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") +#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") +#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") +#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") +#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") +#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") +#define TEST_ASSERT_EMPTY(pointer) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, " Expected Empty") +#define TEST_ASSERT_NOT_EMPTY(pointer) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, " Expected Non-Empty") + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_size_t(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_CHAR(expected, actual) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(0), (actual), __LINE__, NULL) + +/* Integer Not Equal To (of all sizes) */ +#define TEST_ASSERT_NOT_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +/* Integer Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_size_t_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_CHAR_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, NULL) + +/* Integer Array Ranges (of all sizes) */ +#define TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_size_t_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) + + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_size_t_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) + +/* Arrays Compared To Single Value */ +#define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_size_t(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, NULL) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Shorthand */ +#ifdef UNITY_SHORTHAND_AS_OLD +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#endif +#ifdef UNITY_SHORTHAND_AS_INT +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_MEM +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_RAW +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, " Expected Equal") +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#endif +#ifdef UNITY_SHORTHAND_AS_NONE +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif + +/*------------------------------------------------------- + * Test Asserts (with additional messages) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) +#define TEST_ASSERT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, (message)) + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_size_t_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_CHAR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, (message)) + +/* Integer Not Equal To (of all sizes) */ +#define TEST_ASSERT_NOT_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + + +/* Integer Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_size_t_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_CHAR_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, (message)) + +/* Integer Array Ranges (of all sizes) */ +#define TEST_ASSERT_INT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_size_t_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_CHAR_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) + + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_size_t_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_CHAR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) + +/* Arrays Compared To Single Value*/ +#define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_size_t_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_CHAR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, (message)) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Shorthand */ +#ifdef UNITY_SHORTHAND_AS_OLD +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) +#endif +#ifdef UNITY_SHORTHAND_AS_INT +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_MEM +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_RAW +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, message) +#endif +#ifdef UNITY_SHORTHAND_AS_NONE +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif + +/* end of UNITY_FRAMEWORK_H */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/User/system/lib/unity/unity_config.h b/User/system/lib/unity/unity_config.h new file mode 100644 index 0000000..f246a51 --- /dev/null +++ b/User/system/lib/unity/unity_config.h @@ -0,0 +1,241 @@ +/* Unity Configuration + * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 + * Update: December 29th, 2016 + * See Also: Unity/docs/UnityConfigurationGuide.pdf + * + * Unity is designed to run on almost anything that is targeted by a C compiler. + * It would be awesome if this could be done with zero configuration. While + * there are some targets that come close to this dream, it is sadly not + * universal. It is likely that you are going to need at least a couple of the + * configuration options described in this document. + * + * All of Unity's configuration options are `#defines`. Most of these are simple + * definitions. A couple are macros with arguments. They live inside the + * unity_internals.h header file. We don't necessarily recommend opening that + * file unless you really need to. That file is proof that a cross-platform + * library is challenging to build. From a more positive perspective, it is also + * proof that a great deal of complexity can be centralized primarily to one + * place in order to provide a more consistent and simple experience elsewhere. + * + * Using These Options + * It doesn't matter if you're using a target-specific compiler and a simulator + * or a native compiler. In either case, you've got a couple choices for + * configuring these options: + * + * 1. Because these options are specified via C defines, you can pass most of + * these options to your compiler through command line compiler flags. Even + * if you're using an embedded target that forces you to use their + * overbearing IDE for all configuration, there will be a place somewhere in + * your project to configure defines for your compiler. + * 2. You can create a custom `unity_config.h` configuration file (present in + * your toolchain's search paths). In this file, you will list definitions + * and macros specific to your target. All you must do is define + * `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any + * further definitions it may need. + */ + +#ifndef UNITY_CONFIG_H +#define UNITY_CONFIG_H + +/* ************************* AUTOMATIC INTEGER TYPES *************************** + * C's concept of an integer varies from target to target. The C Standard has + * rules about the `int` matching the register size of the target + * microprocessor. It has rules about the `int` and how its size relates to + * other integer types. An `int` on one target might be 16 bits while on another + * target it might be 64. There are more specific types in compilers compliant + * with C99 or later, but that's certainly not every compiler you are likely to + * encounter. Therefore, Unity has a number of features for helping to adjust + * itself to match your required integer sizes. It starts off by trying to do it + * automatically. + **************************************************************************** */ + +/* The first attempt to guess your types is to check `limits.h`. Some compilers + * that don't support `stdint.h` could include `limits.h`. If you don't + * want Unity to check this file, define this to make it skip the inclusion. + * Unity looks at UINT_MAX & ULONG_MAX, which were available since C89. + */ +#define UNITY_EXCLUDE_LIMITS_H + +/* The second thing that Unity does to guess your types is check `stdint.h`. + * This file defines `UINTPTR_MAX`, since C99, that Unity can make use of to + * learn about your system. It's possible you don't want it to do this or it's + * possible that your system doesn't support `stdint.h`. If that's the case, + * you're going to want to define this. That way, Unity will know to skip the + * inclusion of this file and you won't be left with a compiler error. + */ +/* #define UNITY_EXCLUDE_STDINT_H */ + +/* ********************** MANUAL INTEGER TYPE DEFINITION *********************** + * If you've disabled all of the automatic options above, you're going to have + * to do the configuration yourself. There are just a handful of defines that + * you are going to specify if you don't like the defaults. + **************************************************************************** */ + +/* Define this to be the number of bits an `int` takes up on your system. The + * default, if not auto-detected, is 32 bits. + * + * Example: + */ +/* #define UNITY_INT_WIDTH 16 */ + +/* Define this to be the number of bits a `long` takes up on your system. The + * default, if not autodetected, is 32 bits. This is used to figure out what + * kind of 64-bit support your system can handle. Does it need to specify a + * `long` or a `long long` to get a 64-bit value. On 16-bit systems, this option + * is going to be ignored. + * + * Example: + */ +/* #define UNITY_LONG_WIDTH 16 */ + +/* Define this to be the number of bits a pointer takes up on your system. The + * default, if not autodetected, is 32-bits. If you're getting ugly compiler + * warnings about casting from pointers, this is the one to look at. + * + * Example: + */ +#define UNITY_POINTER_WIDTH 64 + +/* Unity will automatically include 64-bit support if it auto-detects it, or if + * your `int`, `long`, or pointer widths are greater than 32-bits. Define this + * to enable 64-bit support if none of the other options already did it for you. + * There can be a significant size and speed impact to enabling 64-bit support + * on small targets, so don't define it if you don't need it. + */ +/* #define UNITY_INCLUDE_64 */ + +/* *************************** FLOATING POINT TYPES **************************** + * In the embedded world, it's not uncommon for targets to have no support for + * floating point operations at all or to have support that is limited to only + * single precision. We are able to guess integer sizes on the fly because + * integers are always available in at least one size. Floating point, on the + * other hand, is sometimes not available at all. Trying to include `float.h` on + * these platforms would result in an error. This leaves manual configuration as + * the only option. + **************************************************************************** */ + +/* By default, Unity guesses that you will want single precision floating point + * support, but not double precision. It's easy to change either of these using + * the include and exclude options here. You may include neither, just float, + * or both, as suits your needs. + */ +#define UNITY_EXCLUDE_FLOAT +#define UNITY_INCLUDE_DOUBLE +/* #define UNITY_EXCLUDE_DOUBLE */ + +/* For features that are enabled, the following floating point options also + * become available. + */ + +/* Unity aims for as small of a footprint as possible and avoids most standard + * library calls (some embedded platforms don't have a standard library!). + * Because of this, its routines for printing integer values are minimalist and + * hand-coded. To keep Unity universal, though, we eventually chose to develop + * our own floating point print routines. Still, the display of floating point + * values during a failure are optional. By default, Unity will print the + * actual results of floating point assertion failures. So a failed assertion + * will produce a message like "Expected 4.0 Was 4.25". If you would like less + * verbose failure messages for floating point assertions, use this option to + * give a failure message `"Values Not Within Delta"` and trim the binary size. + */ +/* #define UNITY_EXCLUDE_FLOAT_PRINT */ + +/* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C + * floats. If your compiler supports a specialty floating point type, you can + * always override this behavior by using this definition. + * + * Example: + */ +/* #define UNITY_FLOAT_TYPE float16_t */ + +/* If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard + * C doubles. If you would like to change this, you can specify something else + * by using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long + * double` could enable gargantuan floating point types on your 64-bit processor + * instead of the standard `double`. + * + * Example: + */ +/* #define UNITY_DOUBLE_TYPE long double */ + +/* If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as + * documented in the Unity Assertion Guide, you will learn that they are not + * really asserting that two values are equal but rather that two values are + * "close enough" to equal. "Close enough" is controlled by these precision + * configuration options. If you are working with 32-bit floats and/or 64-bit + * doubles (the normal on most processors), you should have no need to change + * these options. They are both set to give you approximately 1 significant bit + * in either direction. The float precision is 0.00001 while the double is + * 10^-12. For further details on how this works, see the appendix of the Unity + * Assertion Guide. + * + * Example: + */ +/* #define UNITY_FLOAT_PRECISION 0.001f */ +/* #define UNITY_DOUBLE_PRECISION 0.001f */ + +/* *************************** MISCELLANEOUS *********************************** + * Miscellaneous configuration options for Unity + **************************************************************************** */ + +/* Unity uses the stddef.h header included in the C standard library for the + * "NULL" macro. Define this in order to disable the include of stddef.h. If you + * do this, you have to make sure to provide your own "NULL" definition. + */ +/* #define UNITY_EXCLUDE_STDDEF_H */ + +/* Define this to enable the unity formatted print macro: + * "TEST_PRINTF" + */ +/* #define UNITY_INCLUDE_PRINT_FORMATTED */ + +/* *************************** TOOLSET CUSTOMIZATION *************************** + * In addition to the options listed above, there are a number of other options + * which will come in handy to customize Unity's behavior for your specific + * toolchain. It is possible that you may not need to touch any of these but + * certain platforms, particularly those running in simulators, may need to jump + * through extra hoops to operate properly. These macros will help in those + * situations. + **************************************************************************** */ + +/* By default, Unity prints its results to `stdout` as it runs. This works + * perfectly fine in most situations where you are using a native compiler for + * testing. It works on some simulators as well so long as they have `stdout` + * routed back to the command line. There are times, however, where the + * simulator will lack support for dumping results or you will want to route + * results elsewhere for other reasons. In these cases, you should define the + * `UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time + * (as an `int`, since this is the parameter type of the standard C `putchar` + * function most commonly used). You may replace this with whatever function + * call you like. + * + * Example: + * Say you are forced to run your test suite on an embedded processor with no + * `stdout` option. You decide to route your test result output to a custom + * serial `RS232_putc()` function you wrote like thus: + */ +/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ +/* #define UNITY_OUTPUT_CHAR_HEADER_DECLARATION RS232_putc(int) */ +/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ +/* #define UNITY_OUTPUT_FLUSH_HEADER_DECLARATION RS232_flush(void) */ +/* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ +/* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ + +/* Some compilers require a custom attribute to be assigned to pointers, like + * `near` or `far`. In these cases, you can give Unity a safe default for these + * by defining this option with the attribute you would like. + * + * Example: + */ +/* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ +/* #define UNITY_PTR_ATTRIBUTE near */ + +/* Print execution time of each test when executed in verbose mode + * + * Example: + * + * TEST - PASS (10 ms) + */ +/* #define UNITY_INCLUDE_EXEC_TIME */ + +#endif /* UNITY_CONFIG_H */ diff --git a/User/system/lib/unity/unity_internals.h b/User/system/lib/unity/unity_internals.h new file mode 100644 index 0000000..6075b9a --- /dev/null +++ b/User/system/lib/unity/unity_internals.h @@ -0,0 +1,1181 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_INTERNALS_H +#define UNITY_INTERNALS_H + +#ifdef UNITY_INCLUDE_CONFIG_H +#include "unity_config.h" +#endif + +#ifndef UNITY_EXCLUDE_SETJMP_H +#include +#endif + +#ifndef UNITY_EXCLUDE_MATH_H +#include +#endif + +#ifndef UNITY_EXCLUDE_STDDEF_H +#include +#endif + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +#include +#endif + +/* Unity Attempts to Auto-Detect Integer Types + * Attempt 1: UINT_MAX, ULONG_MAX in , or default to 32 bits + * Attempt 2: UINTPTR_MAX in , or default to same size as long + * The user may override any of these derived constants: + * UNITY_INT_WIDTH, UNITY_LONG_WIDTH, UNITY_POINTER_WIDTH */ +#ifndef UNITY_EXCLUDE_STDINT_H +#include +#endif + +#ifndef UNITY_EXCLUDE_LIMITS_H +#include +#endif + +#if !defined(STM32) || defined(__clang__) +#define UNITY_FUNCTION_ATTR(a) __attribute__((a)) +#else +#define UNITY_FUNCTION_ATTR(a) /* ignore */ +#endif + +#ifndef UNITY_NORETURN +#if defined(__cplusplus) +#if __cplusplus >= 201103L +#define UNITY_NORETURN [[noreturn]] +#endif +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#if defined(_WIN32) && defined(_MSC_VER) +/* We are using MSVC compiler on Windows platform. */ +/* Not all Windows SDKs supports , but compiler can support C11: */ +/* https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/ */ +/* Not sure, that Mingw compilers has Windows SDK headers at all. */ +#include +#endif + +/* Using Windows SDK predefined macro for detecting supported SDK with MSVC compiler. */ +/* Mingw GCC should work without that fixes. */ +/* Based on: */ +/* https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 */ +/* NTDDI_WIN10_FE is equal to Windows 10 SDK 2104 */ +#if defined(_MSC_VER) && ((!defined(NTDDI_WIN10_FE)) || WDK_NTDDI_VERSION < NTDDI_WIN10_FE) +/* Based on tests and: */ +/* https://docs.microsoft.com/en-us/cpp/c-language/noreturn?view=msvc-170 */ +/* https://en.cppreference.com/w/c/language/_Noreturn */ +#define UNITY_NORETURN _Noreturn +#else /* Using newer Windows SDK or not MSVC compiler */ +#include +#define UNITY_NORETURN noreturn +#endif +#endif +#endif +#ifndef UNITY_NORETURN +#define UNITY_NORETURN UNITY_FUNCTION_ATTR(__noreturn__) +#endif + +/*------------------------------------------------------- + * Guess Widths If Not Specified + *-------------------------------------------------------*/ + +/* Determine the size of an int, if not already specified. + * We cannot use sizeof(int), because it is not yet defined + * at this stage in the translation of the C program. + * Also sizeof(int) does return the size in addressable units on all platforms, + * which may not necessarily be the size in bytes. + * Therefore, infer it from UINT_MAX if possible. */ +#ifndef UNITY_INT_WIDTH +#ifdef UINT_MAX +#if (UINT_MAX == 0xFFFF) +#define UNITY_INT_WIDTH (16) +#elif (UINT_MAX == 0xFFFFFFFF) +#define UNITY_INT_WIDTH (32) +#elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF) +#define UNITY_INT_WIDTH (64) +#endif +#else /* Set to default */ +#define UNITY_INT_WIDTH (32) +#endif /* UINT_MAX */ +#endif + +/* Determine the size of a long, if not already specified. */ +#ifndef UNITY_LONG_WIDTH +#ifdef ULONG_MAX +#if (ULONG_MAX == 0xFFFF) +#define UNITY_LONG_WIDTH (16) +#elif (ULONG_MAX == 0xFFFFFFFF) +#define UNITY_LONG_WIDTH (32) +#elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF) +#define UNITY_LONG_WIDTH (64) +#endif +#else /* Set to default */ +#define UNITY_LONG_WIDTH (32) +#endif /* ULONG_MAX */ +#endif + +/* Determine the size of a pointer, if not already specified. */ +#ifndef UNITY_POINTER_WIDTH +#ifdef UINTPTR_MAX +#if (UINTPTR_MAX <= 0xFFFF) +#define UNITY_POINTER_WIDTH (16) +#elif (UINTPTR_MAX <= 0xFFFFFFFF) +#define UNITY_POINTER_WIDTH (32) +#elif (UINTPTR_MAX <= 0xFFFFFFFFFFFFFFFF) +#define UNITY_POINTER_WIDTH (64) +#endif +#else /* Set to default */ +#define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH +#endif /* UINTPTR_MAX */ +#endif + +/*------------------------------------------------------- + * Int Support (Define types based on detected sizes) + *-------------------------------------------------------*/ + +#if (UNITY_INT_WIDTH == 32) +typedef unsigned char UNITY_UINT8; +typedef unsigned short UNITY_UINT16; +typedef unsigned int UNITY_UINT32; +typedef signed char UNITY_INT8; +typedef signed short UNITY_INT16; +typedef signed int UNITY_INT32; +#elif (UNITY_INT_WIDTH == 16) +typedef unsigned char UNITY_UINT8; +typedef unsigned int UNITY_UINT16; +typedef unsigned long UNITY_UINT32; +typedef signed char UNITY_INT8; +typedef signed int UNITY_INT16; +typedef signed long UNITY_INT32; +#else +#error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) +#endif + +/*------------------------------------------------------- + * 64-bit Support + *-------------------------------------------------------*/ + +/* Auto-detect 64 Bit Support */ +#ifndef UNITY_SUPPORT_64 +#if UNITY_LONG_WIDTH == 64 || UNITY_POINTER_WIDTH == 64 +#define UNITY_SUPPORT_64 +#endif +#endif + +/* 64-Bit Support Dependent Configuration */ +#ifndef UNITY_SUPPORT_64 +/* No 64-bit Support */ +typedef UNITY_UINT32 UNITY_UINT; +typedef UNITY_INT32 UNITY_INT; +#define UNITY_MAX_NIBBLES (8) /* Maximum number of nibbles in a UNITY_(U)INT */ +#else +/* 64-bit Support */ +#if (UNITY_LONG_WIDTH == 32) +typedef unsigned long long UNITY_UINT64; +typedef signed long long UNITY_INT64; +#elif (UNITY_LONG_WIDTH == 64) +typedef unsigned long UNITY_UINT64; +typedef signed long UNITY_INT64; +#else +#error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) +#endif +typedef UNITY_UINT64 UNITY_UINT; +typedef UNITY_INT64 UNITY_INT; +#define UNITY_MAX_NIBBLES (16) /* Maximum number of nibbles in a UNITY_(U)INT */ +#endif + +/*------------------------------------------------------- + * Pointer Support + *-------------------------------------------------------*/ + +#if (UNITY_POINTER_WIDTH == 32) +#define UNITY_PTR_TO_INT UNITY_INT32 +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 +#elif (UNITY_POINTER_WIDTH == 64) +#define UNITY_PTR_TO_INT UNITY_INT64 +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 +#elif (UNITY_POINTER_WIDTH == 16) +#define UNITY_PTR_TO_INT UNITY_INT16 +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 +#else +#error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) +#endif + +#ifndef UNITY_PTR_ATTRIBUTE +#define UNITY_PTR_ATTRIBUTE +#endif + +#ifndef UNITY_INTERNAL_PTR +#define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void * +#endif + +/* optionally define UNITY_COMPARE_PTRS_ON_ZERO_ARRAY */ + +/*------------------------------------------------------- + * Float Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_FLOAT + +/* No Floating Point Support */ +#ifndef UNITY_EXCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE /* Remove double when excluding float support */ +#endif +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +#define UNITY_EXCLUDE_FLOAT_PRINT +#endif + +#else + +/* Floating Point Support */ +#ifndef UNITY_FLOAT_PRECISION +#define UNITY_FLOAT_PRECISION (0.00001f) +#endif +#ifndef UNITY_FLOAT_TYPE +#define UNITY_FLOAT_TYPE float +#endif +typedef UNITY_FLOAT_TYPE UNITY_FLOAT; + +/* isinf & isnan macros should be provided by math.h */ +#ifndef isinf +/* The value of Inf - Inf is NaN */ +#define isinf(n) (isnan((n) - (n)) && !isnan(n)) +#endif + +#ifndef isnan +/* NaN is the only floating point value that does NOT equal itself. + * Therefore if n != n, then it is NaN. */ +#define isnan(n) ((n != n) ? 1 : 0) +#endif + +#endif + +/*------------------------------------------------------- + * Double Float Support + *-------------------------------------------------------*/ + +/* unlike float, we DON'T include by default */ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(UNITY_INCLUDE_DOUBLE) + +/* No Floating Point Support */ +#ifndef UNITY_EXCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE +#else +#undef UNITY_INCLUDE_DOUBLE +#endif + +#ifndef UNITY_EXCLUDE_FLOAT +#ifndef UNITY_DOUBLE_TYPE +#define UNITY_DOUBLE_TYPE double +#endif +typedef UNITY_FLOAT UNITY_DOUBLE; +/* For parameter in UnityPrintFloat(UNITY_DOUBLE), which aliases to double or float */ +#endif + +#else + +/* Double Floating Point Support */ +#ifndef UNITY_DOUBLE_PRECISION +#define UNITY_DOUBLE_PRECISION (1e-12) +#endif + +#ifndef UNITY_DOUBLE_TYPE +#define UNITY_DOUBLE_TYPE double +#endif +typedef UNITY_DOUBLE_TYPE UNITY_DOUBLE; + +#endif + +/*------------------------------------------------------- + * Output Method: stdout (DEFAULT) + *-------------------------------------------------------*/ +#ifndef UNITY_OUTPUT_CHAR +/* Default to using putchar, which is defined in stdio.h */ +#include +#define UNITY_OUTPUT_CHAR(a) (void)putchar(a) +#else +/* If defined as something else, make sure we declare it here so it's ready for use */ +#ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION +extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; +#endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +#ifdef UNITY_USE_FLUSH_STDOUT +/* We want to use the stdout flush utility */ +#include +#define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) +#else +/* We've specified nothing, therefore flush should just be ignored */ +#define UNITY_OUTPUT_FLUSH() (void)0 +#endif +#else +/* If defined as something else, make sure we declare it here so it's ready for use */ +#ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION +extern void UNITY_OUTPUT_FLUSH_HEADER_DECLARATION; +#endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +#define UNITY_FLUSH_CALL() +#else +#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH() +#endif + +#ifndef UNITY_PRINT_EOL +#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n') +#endif + +#ifndef UNITY_OUTPUT_START +#define UNITY_OUTPUT_START() +#endif + +#ifndef UNITY_OUTPUT_COMPLETE +#define UNITY_OUTPUT_COMPLETE() +#endif + +#ifdef UNITY_INCLUDE_EXEC_TIME +#if !defined(UNITY_EXEC_TIME_START) && \ + !defined(UNITY_EXEC_TIME_STOP) && \ + !defined(UNITY_PRINT_EXEC_TIME) && \ + !defined(UNITY_TIME_TYPE) +/* If none any of these macros are defined then try to provide a default implementation */ + +#if defined(UNITY_CLOCK_MS) +/* This is a simple way to get a default implementation on platforms that support getting a millisecond counter */ +#define UNITY_TIME_TYPE UNITY_UINT +#define UNITY_EXEC_TIME_START() Unity.CurrentTestStartTime = UNITY_CLOCK_MS() +#define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS() +#define UNITY_PRINT_EXEC_TIME() \ + { \ + UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } +#elif defined(_WIN32) +#include +#define UNITY_TIME_TYPE clock_t +#define UNITY_GET_TIME(t) t = (clock_t)((clock() * 1000) / CLOCKS_PER_SEC) +#define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) +#define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) +#define UNITY_PRINT_EXEC_TIME() \ + { \ + UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } +#elif defined(__unix__) || defined(__APPLE__) +#include +#define UNITY_TIME_TYPE struct timespec +#define UNITY_GET_TIME(t) clock_gettime(CLOCK_MONOTONIC, &t) +#define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) +#define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) +#define UNITY_PRINT_EXEC_TIME() \ + { \ + UNITY_UINT execTimeMs = ((Unity.CurrentTestStopTime.tv_sec - Unity.CurrentTestStartTime.tv_sec) * 1000L); \ + execTimeMs += ((Unity.CurrentTestStopTime.tv_nsec - Unity.CurrentTestStartTime.tv_nsec) / 1000000L); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } +#endif +#endif +#endif + +#ifndef UNITY_EXEC_TIME_START +#define UNITY_EXEC_TIME_START() \ + do \ + { /* nothing*/ \ + } while (0) +#endif + +#ifndef UNITY_EXEC_TIME_STOP +#define UNITY_EXEC_TIME_STOP() \ + do \ + { /* nothing*/ \ + } while (0) +#endif + +#ifndef UNITY_TIME_TYPE +#define UNITY_TIME_TYPE UNITY_UINT +#endif + +#ifndef UNITY_PRINT_EXEC_TIME +#define UNITY_PRINT_EXEC_TIME() \ + do \ + { /* nothing*/ \ + } while (0) +#endif + +/*------------------------------------------------------- + * Footprint + *-------------------------------------------------------*/ + +#ifndef UNITY_LINE_TYPE +#define UNITY_LINE_TYPE UNITY_UINT +#endif + +#ifndef UNITY_COUNTER_TYPE +#define UNITY_COUNTER_TYPE UNITY_UINT +#endif + +/*------------------------------------------------------- + * Internal Structs Needed + *-------------------------------------------------------*/ + +typedef void (*UnityTestFunction)(void); + +#define UNITY_DISPLAY_RANGE_INT (0x10) +#define UNITY_DISPLAY_RANGE_UINT (0x20) +#define UNITY_DISPLAY_RANGE_HEX (0x40) +#define UNITY_DISPLAY_RANGE_CHAR (0x80) + +typedef enum +{ + UNITY_DISPLAY_STYLE_INT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, +#endif + + UNITY_DISPLAY_STYLE_UINT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT, +#endif + + UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX, +#endif + + UNITY_DISPLAY_STYLE_CHAR = 1 + UNITY_DISPLAY_RANGE_CHAR + UNITY_DISPLAY_RANGE_INT, + + UNITY_DISPLAY_STYLE_UNKNOWN +} UNITY_DISPLAY_STYLE_T; + +typedef enum +{ + UNITY_WITHIN = 0x0, + UNITY_EQUAL_TO = 0x1, + UNITY_GREATER_THAN = 0x2, + UNITY_GREATER_OR_EQUAL = 0x2 + UNITY_EQUAL_TO, + UNITY_SMALLER_THAN = 0x4, + UNITY_SMALLER_OR_EQUAL = 0x4 + UNITY_EQUAL_TO, + UNITY_NOT_EQUAL = 0x0, + UNITY_UNKNOWN +} UNITY_COMPARISON_T; + +#ifndef UNITY_EXCLUDE_FLOAT +typedef enum UNITY_FLOAT_TRAIT +{ + UNITY_FLOAT_IS_NOT_INF = 0, + UNITY_FLOAT_IS_INF, + UNITY_FLOAT_IS_NOT_NEG_INF, + UNITY_FLOAT_IS_NEG_INF, + UNITY_FLOAT_IS_NOT_NAN, + UNITY_FLOAT_IS_NAN, + UNITY_FLOAT_IS_NOT_DET, + UNITY_FLOAT_IS_DET, + UNITY_FLOAT_INVALID_TRAIT +} UNITY_FLOAT_TRAIT_T; +#endif + +typedef enum +{ + UNITY_ARRAY_TO_VAL = 0, + UNITY_ARRAY_TO_ARRAY, + UNITY_ARRAY_UNKNOWN +} UNITY_FLAGS_T; + +struct UNITY_STORAGE_T +{ + const char *TestFile; + const char *CurrentTestName; +#ifndef UNITY_EXCLUDE_DETAILS + const char *CurrentDetail1; + const char *CurrentDetail2; +#endif + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifdef UNITY_INCLUDE_EXEC_TIME + UNITY_TIME_TYPE CurrentTestStartTime; + UNITY_TIME_TYPE CurrentTestStopTime; +#endif +#ifndef UNITY_EXCLUDE_SETJMP_H + jmp_buf AbortFrame; +#endif +}; + +extern struct UNITY_STORAGE_T Unity; + +/*------------------------------------------------------- + * Test Suite Management + *-------------------------------------------------------*/ + +void UnityBegin(const char *filename); +int UnityEnd(void); +void UnitySetTestFile(const char *filename); +void UnityConcludeTest(void); + +#ifndef RUN_TEST +void UnityDefaultTestRun(UnityTestFunction Func, const char *FuncName, const int FuncLineNum); +#else +#define UNITY_SKIP_DEFAULT_RUNNER +#endif + +/*------------------------------------------------------- + * Details Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_DETAILS +#define UNITY_CLR_DETAILS() +#define UNITY_SET_DETAIL(d1) +#define UNITY_SET_DETAILS(d1, d2) +#else +#define UNITY_CLR_DETAILS() \ + do \ + { \ + Unity.CurrentDetail1 = 0; \ + Unity.CurrentDetail2 = 0; \ + } while (0) +#define UNITY_SET_DETAIL(d1) \ + do \ + { \ + Unity.CurrentDetail1 = (d1); \ + Unity.CurrentDetail2 = 0; \ + } while (0) +#define UNITY_SET_DETAILS(d1, d2) \ + do \ + { \ + Unity.CurrentDetail1 = (d1); \ + Unity.CurrentDetail2 = (d2); \ + } while (0) + +#ifndef UNITY_DETAIL1_NAME +#define UNITY_DETAIL1_NAME "Function" +#endif + +#ifndef UNITY_DETAIL2_NAME +#define UNITY_DETAIL2_NAME "Argument" +#endif +#endif + +#ifdef UNITY_PRINT_TEST_CONTEXT +void UNITY_PRINT_TEST_CONTEXT(void); +#endif + +/*------------------------------------------------------- + * Test Output + *-------------------------------------------------------*/ + +void UnityPrint(const char *string); + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +void UnityPrintF(const UNITY_LINE_TYPE line, const char *format, ...); +#endif + +void UnityPrintLen(const char *string, const UNITY_UINT32 length); +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); +void UnityPrintNumber(const UNITY_INT number_to_print); +void UnityPrintNumberUnsigned(const UNITY_UINT number); +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print); + +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +void UnityPrintFloat(const UNITY_DOUBLE input_number); +#endif + +/*------------------------------------------------------- + * Test Assertion Functions + *------------------------------------------------------- + * Use the macros below this section instead of calling + * these directly. The macros have a consistent naming + * convention and will pull in file and line information + * for you. */ + +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); + +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualString(const char *expected, + const char *actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringLen(const char *expected, + const char *actual, + const UNITY_UINT32 length, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, + const char **actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, + UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); + +#ifndef UNITY_EXCLUDE_SETJMP_H +UNITY_NORETURN void UnityFail(const char *message, const UNITY_LINE_TYPE line); +UNITY_NORETURN void UnityIgnore(const char *message, const UNITY_LINE_TYPE line); +#else +void UnityFail(const char *message, const UNITY_LINE_TYPE line); +void UnityIgnore(const char *message, const UNITY_LINE_TYPE line); +#endif + +void UnityMessage(const char *message, const UNITY_LINE_TYPE line); + +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, + const UNITY_FLOAT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE linenumber); + +void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT *expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT *actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, + const UNITY_DOUBLE actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE linenumber); + +void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE *expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE *actual, + const UNITY_UINT32 num_elements, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +/*------------------------------------------------------- + * Helpers + *-------------------------------------------------------*/ + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num); +#endif +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num); +#endif + +/*------------------------------------------------------- + * Error Strings We Might Need + *-------------------------------------------------------*/ + +extern const char UnityStrOk[]; +extern const char UnityStrPass[]; +extern const char UnityStrFail[]; +extern const char UnityStrIgnore[]; + +extern const char UnityStrErrFloat[]; +extern const char UnityStrErrDouble[]; +extern const char UnityStrErr64[]; +extern const char UnityStrErrShorthand[]; + +/*------------------------------------------------------- + * Test Running Macros + *-------------------------------------------------------*/ + +#ifndef UNITY_EXCLUDE_SETJMP_H +#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) +#define TEST_ABORT() longjmp(Unity.AbortFrame, 1) +#else +#define TEST_PROTECT() 1 +#define TEST_ABORT() return +#endif + +/* Automatically enable variadic macros support, if it not enabled before */ +#ifndef UNITY_SUPPORT_VARIADIC_MACROS +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ >= 199901L +#define UNITY_SUPPORT_VARIADIC_MACROS +#endif +#endif +#endif + +/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ +#ifndef RUN_TEST +#ifdef UNITY_SUPPORT_VARIADIC_MACROS +#define RUN_TEST(...) RUN_TEST_AT_LINE(__VA_ARGS__, __LINE__, throwaway) +#define RUN_TEST_AT_LINE(func, line, ...) UnityDefaultTestRun(func, #func, line) +#endif +#endif + +/* Enable default macros for masking param tests test cases */ +#ifdef UNITY_SUPPORT_TEST_CASES +#ifdef UNITY_SUPPORT_VARIADIC_MACROS +#if !defined(TEST_CASE) && !defined(UNITY_EXCLUDE_TEST_CASE) +#define TEST_CASE(...) +#endif +#if !defined(TEST_RANGE) && !defined(UNITY_EXCLUDE_TEST_RANGE) +#define TEST_RANGE(...) +#endif +#endif +#endif + +/* If we can't do the tricky version, we'll just have to require them to always include the line number */ +#ifndef RUN_TEST +#ifdef CMOCK +#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num) +#else +#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__) +#endif +#endif + +#define TEST_LINE_NUM (Unity.CurrentTestLineNumber) +#define TEST_IS_IGNORED (Unity.CurrentTestIgnored) +#define UNITY_NEW_TEST(a) \ + Unity.CurrentTestName = (a); \ + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \ + Unity.NumberOfTests++; + +#ifndef UNITY_BEGIN +#define UNITY_BEGIN() UnityBegin(__FILE__) +#endif + +#ifndef UNITY_END +#define UNITY_END() UnityEnd() +#endif + +#ifndef UNITY_SHORTHAND_AS_INT +#ifndef UNITY_SHORTHAND_AS_MEM +#ifndef UNITY_SHORTHAND_AS_NONE +#ifndef UNITY_SHORTHAND_AS_RAW +#define UNITY_SHORTHAND_AS_OLD +#endif +#endif +#endif +#endif + +/*----------------------------------------------- + * Command Line Argument Support + *-----------------------------------------------*/ + +#ifdef UNITY_USE_COMMAND_LINE_ARGS +int UnityParseOptions(int argc, char **argv); +int UnityTestMatches(void); +#endif + +/*------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define UNITY_TEST_FAIL(line, message) UnityFail((message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_IGNORE(line, message) UnityIgnore((message), (UNITY_LINE_TYPE)(line)) + +/*------------------------------------------------------- + * Test Asserts + *-------------------------------------------------------*/ + +#define UNITY_TEST_ASSERT(condition, line, message) \ + do \ + { \ + if (condition) \ + { /* nothing*/ \ + } \ + else \ + { \ + UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message)); \ + } \ + } while (0) +#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) == 0), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) != 0), (UNITY_LINE_TYPE)(line), (message)) + +#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8)(expected), (UNITY_INT)(UNITY_INT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT8)(expected), (UNITY_INT)(UNITY_UINT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8)(expected), (UNITY_INT)(UNITY_INT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_EQUAL_CHAR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8)(expected), (UNITY_INT)(UNITY_INT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) +#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((UNITY_INT)(mask), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8)(threshold), (UNITY_INT)(UNITY_UINT8)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8)(threshold), (UNITY_INT)(UNITY_INT8)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8)(delta), (UNITY_INT)(UNITY_INT8)(expected), (UNITY_INT)(UNITY_INT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_CHAR_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8)(delta), (UNITY_INT)(UNITY_INT8)(expected), (UNITY_INT)(UNITY_INT8)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char *)(expected), (const char *)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char *)(expected), (const char *)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char **)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8)(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8)(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8)(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT)(expected), (UNITY_POINTER_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char **)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8)(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_VAL) + +#ifdef UNITY_SUPPORT_64 +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#else +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#endif + +#ifdef UNITY_EXCLUDE_FLOAT +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#else +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsNotWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)(delta), (const UNITY_FLOAT *)(expected), (const UNITY_FLOAT *)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, (const UNITY_FLOAT *)(expected), (const UNITY_FLOAT *)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, UnityFloatToPtr(expected), (const UNITY_FLOAT *)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#else +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesNotWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)(delta), (const UNITY_DOUBLE *)(expected), (const UNITY_DOUBLE *)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, (const UNITY_DOUBLE *)(expected), (const UNITY_DOUBLE *)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, UnityDoubleToPtr(expected), (const UNITY_DOUBLE *)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +/* End of UNITY_INTERNALS_H */ +#endif diff --git a/User/system/os.h b/User/system/os.h new file mode 100644 index 0000000..fce74b6 --- /dev/null +++ b/User/system/os.h @@ -0,0 +1,34 @@ +#ifndef __OS_H__ +#define __OS_H__ +#include "FreeRTOSConfig.h" +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +typedef struct +{ + uint32_t free_heap_size; ///< 空闲堆大小 + uint32_t min_free_heap_size; ///< 最小空闲堆大小 + uint32_t min_free_stack_size; ///< 最小空闲栈大小 +} os_t; + +static inline void os_read(os_t *os) +{ + os->free_heap_size = xPortGetFreeHeapSize(); + os->min_free_heap_size = xPortGetMinimumEverFreeHeapSize(); + os->min_free_stack_size = uxTaskGetStackHighWaterMark(NULL); +} + +// 禁止任务抢占 +static inline void os_task_preemption_disable(void) +{ + taskENTER_CRITICAL(); +} + +// 允许任务抢占 +static inline void os_task_preemption_enable(void) +{ + taskEXIT_CRITICAL(); +} + +#endif // __OS_H__ diff --git a/User/system/readme.txt b/User/system/readme.txt new file mode 100644 index 0000000..65bff25 --- /dev/null +++ b/User/system/readme.txt @@ -0,0 +1,4 @@ +1,delay文件夹:存放延时相关的驱动代码。 +2,sys文件夹:存放系统相关驱动代码。 +3,uart文件夹:存放串口相关代码。 +4,rt-thread:https://zhuanlan.zhihu.com/p/653746487?utm_campaign=shareopn&utm_medium=social&utm_psn=1827650748781039617&utm_source=wechat_session diff --git a/User/system/sys.c b/User/system/sys.c new file mode 100644 index 0000000..643082a --- /dev/null +++ b/User/system/sys.c @@ -0,0 +1,272 @@ +/* + * @Author: + * @Date: 2023-04-11 18:46:58 + * @LastEditors: xxx + * @LastEditTime: 2023-08-25 11:31:06 + * @Description: + * email: + * Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#include "sys.h" +#include "delay.h" +clock_config_t original_clock_config; // 原始时钟配置 +__IO uint32_t uw_tick; +__IO uint32_t scheduler_start_time; // 调度器开始时间 +__IO uint32_t scheduler_end_time; // 调度器结束时间 +__IO uint32_t scheduler_occupancy_time = 0; // 调度器占用时间 +/** + * @brief 设置中断向量表偏移地址 + * @param baseaddr : 基址 + * @param offset : 偏移量 + * @retval 无 + */ +void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset) +{ + /* 设置NVIC的向量表偏移寄存器,VTOR低9位保留,即[8:0]保留 */ + SCB->VTOR = baseaddr | (offset & (uint32_t)0xFFFFFE00); +} + +/** + * @brief 执行: WFI指令(执行完该指令进入低功耗状态, 等待中断唤醒) + * @param 无 + * @retval 无 + */ +void sys_wfi_set(void) +{ + __ASM __IO("wfi"); +} + +/** + * @brief 关闭所有中断(但是不包括fault和NMI中断) + * @param 无 + * @retval 无 + */ +void sys_intx_disable(void) +{ + __ASM __IO("cpsid i"); +} + +/** + * @brief 开启所有中断 + * @param 无 + * @retval 无 + */ +void sys_intx_enable(void) +{ + __ASM __IO("cpsie i"); +} + +/** + * @brief 设置栈顶地址 + * @note 左侧若有红X, 属于MDK误报, 实际是没问题的 + * @param addr: 栈顶地址 + * @retval 无 + */ +void sys_msr_msp(uint32_t addr) +{ + __set_MSP(addr); /* 设置栈顶地址 */ +} + +/** + * @brief 进入待机模式 + * @param 无 + * @retval 无 + */ +void sys_standby(void) +{ +} + +/** + * @brief 系统软复位 + * @param 无 + * @retval 无 + */ +void sys_soft_reset(void) +{ + NVIC_SystemReset(); +} + +/** + * @brief 10ms滴答定时器,需要单独放到定时器中断中执行 + * @param 无 + * @retval 提供给sys_millis()函数使用,之前放在SysTick_Handler中执行影响精度 + */ +__weak void LL_IncTick(void) +{ + uw_tick += 1; +} + +/** + * @brief 获取系统当前滴答计数 + * @param 无 + * @retval 当前滴答计数 + */ +uint32_t sys_get_tick(void) +{ + return uw_tick; +} + +/** + * @brief 获取系统当前毫秒级时间戳。 + * @return {uint32_t} 当前毫秒级时间戳 + * @note: 请注意,这个函数仅用于模拟硬件延时,实际应用中可能需要使用其他时钟源,如RTC或外部时钟。 + */ +uint32_t sys_millis(void) +{ + return uw_tick * 10; +} + +/** + * @brief 系统计时器重新开始 + * @return {*} + * @note + */ +void sys_millis_reset(void) +{ + uw_tick = 0; +} + +/** + * @brief 将系统时间戳转换为秒级时间戳。 + * @param {uint32_t} start_time 开始时间戳 + * @return {uint32_t} 秒级时间戳 + * @note: 请注意,这个函数仅用于模拟硬件延时,实际应用中可能需要使用其他时钟源,如RTC或外部时钟。 + */ +uint32_t sys_to_seconds(uint32_t start_time) +{ + return (sys_millis() - start_time) / 1000; +} + +/** + * @brief 记录调度器开始时间 + * @return {*} + * @note + */ +void scheduler_time_start(void) +{ + scheduler_start_time = sys_millis(); +} + +/** + * @brief 返回调度器运行时间 + * @return {*} + * @note + */ +uint32_t scheduler_time_stop(void) +{ + uint32_t scheduler_end_time = sys_millis() - scheduler_start_time; + scheduler_occupancy_time += scheduler_end_time; + return scheduler_end_time; +} + +/** + * @brief 计算任务占用时间百分比 + * @param {uint32_t} run_time 运行时间 + * @return {*} 任务占用时间百分比,单位为% + * @note + */ +uint32_t scheduler_time_occupancy_get(uint32_t run_time) +{ + float32 percent = 0.0f; + percent = (float32)(scheduler_occupancy_time) / (float32)run_time; + scheduler_occupancy_time = 0; + return (uint32_t)(percent * 100); +} + +// 切换到新的时钟配置 +void change_system_clock(clock_config_t *new_config) +{ +#if CLOCK_CHANGE_ENABLE == TRUE + // 1. 切换到HSE作为临时时钟源,根据你的硬件配置来调整 + LL_RCC_HSE_Enable(); + while (LL_RCC_HSE_IsReady() != 1) + { + } + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE); + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE) + { + } + + // 2. 关闭PLL + LL_RCC_PLL_Disable(); + while (LL_RCC_PLL_IsReady() != 0) + { + } + + // 3. 配置新的PLL参数 + // 注意:这里假设HSE作为PLL的时钟源,你需要根据你的硬件配置来调整 + LL_RCC_PLL_ConfigDomain_SYS(new_config->pll_source, new_config->pll_m, new_config->pll_n, new_config->pll_r); + + // 4. 重新启用PLL + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + while (LL_RCC_PLL_IsReady() != 1) + { + } + + // 5. 切换回PLL作为系统时钟源 + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + } + + // 6. 更新时钟分频器 + LL_RCC_SetAHBPrescaler(new_config->ahb_div); + LL_RCC_SetAPB1Prescaler(new_config->apb1_div); + LL_RCC_SetAPB2Prescaler(new_config->apb2_div); + + // 7. 更新SystemCoreClock变量 + LL_Init1msTick(new_config->sysclk); + LL_SetSystemCoreClock(new_config->sysclk); + original_clock_config.sysclk_change = new_config->sysclk; + + delay_init((SystemCoreClock / 1000000)); +#endif +} + +// 恢复到原始时钟配置 +void restore_system_clock(void) +{ +#if CLOCK_CHANGE_ENABLE == TRUE + change_system_clock(&original_clock_config); +#endif +} + +// 获取原始时钟配置 +clock_config_t *get_original_clock_config(void) +{ + return &original_clock_config; +} + +// 在系统启动时调用此函数来初始化时钟并保存原始配置 +void system_clock_read(void) +{ +#if CLOCK_CHANGE_ENABLE == TRUE + // 保存原始时钟配置 + original_clock_config.pll_source = LL_RCC_PLL_GetMainSource(); + original_clock_config.pll_m = LL_RCC_PLL_GetDivider(); + original_clock_config.pll_n = LL_RCC_PLL_GetN(); + original_clock_config.pll_r = LL_RCC_PLL_GetR(); + + original_clock_config.ahb_div = LL_RCC_GetAHBPrescaler(); + original_clock_config.apb1_div = LL_RCC_GetAPB1Prescaler(); + original_clock_config.apb2_div = LL_RCC_GetAPB2Prescaler(); + original_clock_config.sysclk = SystemCoreClock; +#endif +} + +/** + * @brief Write a character to a file stream, used for FLASHDB printf + * + * Writes the specified character to the given file stream and returns the written character. + * + * @param ch The character to be written + * @param stream Pointer to the file stream + * + * @return The written character + */ +int fputc(int ch, FILE *stream) +{ + return ch; +} diff --git a/User/system/sys.h b/User/system/sys.h new file mode 100644 index 0000000..07102e5 --- /dev/null +++ b/User/system/sys.h @@ -0,0 +1,75 @@ +/*** + * @Author: + * @Date: 2023-04-11 18:46:58 + * @LastEditors: xxx + * @LastEditTime: 2023-04-11 22:16:47 + * @Description: + * @email: + * @Copyright (c) 2023 by xxx, All Rights Reserved. + */ + +#ifndef _SYS_H +#define _SYS_H + +#include "main.h" +#include "lib.h" + +#define CLOCK_CHANGE_ENABLE FALSE ///< 时钟切换使能 +#define LOCK() __disable_irq() ///< 系统关全局中断 +#define UNLOCK() __enable_irq() ///< 系统开全局中断 + +#ifndef __NOP +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile("nop") +#endif + +typedef struct +{ + uint32_t pll_source; + uint32_t pll_m; + uint32_t pll_n; + uint32_t pll_r; + + uint32_t ahb_div; + uint32_t apb1_div; + uint32_t apb2_div; + uint32_t sysclk; + + // private: + uint32_t sysclk_change; // 改变后的系统时钟 这个参数由change_system_clock函数设置,作为内部观察使用 +} clock_config_t; /* 时钟配置结构体 */ + +typedef struct +{ + uint32_t ticks_max; // 最大ticks + uint32_t ticks_current; // 当前使用的ticks + uint32_t uticks; // 使用的ticks,用于计算 +} utime_ticks_t; + +void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset); /* 设置中断偏移量 */ +void sys_standby(void); /* 进入待机模式 */ +void sys_soft_reset(void); /* 系统软复位 */ +void LL_IncTick(void); /* 系统滴答时钟 */ +void sys_millis_reset(void); /* 系统计时器重新开始 */ +uint32_t sys_get_tick(void); /* 获取系统滴答时钟 */ +uint32_t sys_millis(void); /* 获取系统时间 */ +uint32_t sys_to_seconds(uint32_t start_time); /* 将系统时间转换为秒 */ + +// 以下为汇编函数 +void sys_wfi_set(void); /* 执行WFI指令 */ +void sys_intx_disable(void); /* 关闭所有中断 */ +void sys_intx_enable(void); /* 开启所有中断 */ +void sys_msr_msp(uint32_t addr); /* 设置栈顶地址 */ + +void scheduler_time_start(void); +uint32_t scheduler_time_stop(void); +uint32_t scheduler_time_occupancy_get(uint32_t run_time); + +void system_clock_read(void); +void restore_system_clock(void); +clock_config_t *get_original_clock_config(void); +void change_system_clock(clock_config_t *new_config); +#endif